OSDN Git Service

stagefright-plugins: Fix timestamp calculation
[android-x86/external-stagefright-plugins.git] / omx / SoftFFmpegAudio.h
1 /*
2  * Copyright 2012 Michael Chen <omxcodec@gmail.com>
3  * Copyright 2015 The CyanogenMod Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef SOFT_FFMPEGAUDIO_H_
19
20 #define SOFT_FFMPEGAUDIO_H_
21
22 #include "SimpleSoftOMXComponent.h"
23
24 #ifndef __GNUC__
25 //fix DECLARE_ALIGNED
26 #error "__GNUC__ cflags should be enabled"
27 #endif
28
29 #include "utils/ffmpeg_utils.h"
30
31 #include <OMX_AudioExt.h>
32 #include <OMX_IndexExt.h>
33
34 const int AVCODEC_MAX_AUDIO_FRAME_SIZE = 192000; // Deprecated in ffmpeg
35
36 namespace android {
37
38 struct SoftFFmpegAudio : public SimpleSoftOMXComponent {
39     SoftFFmpegAudio(const char *name,
40             const char* componentRole,
41             OMX_AUDIO_CODINGTYPE codingType,
42             enum AVCodecID codecID,
43             const OMX_CALLBACKTYPE *callbacks,
44             OMX_PTR appData,
45             OMX_COMPONENTTYPE **component);
46
47 public:
48     static int64_t *sAudioClock;
49     static int64_t getAudioClock(void);
50     static void setAudioClock(int64_t value);
51
52     static SoftOMXComponent* createSoftOMXComponent(
53             const char *name, const OMX_CALLBACKTYPE *callbacks,
54             OMX_PTR appData, OMX_COMPONENTTYPE **component);
55
56 protected:
57     virtual ~SoftFFmpegAudio();
58
59     virtual OMX_ERRORTYPE internalGetParameter(
60             OMX_INDEXTYPE index, OMX_PTR params);
61
62     virtual OMX_ERRORTYPE internalSetParameter(
63             OMX_INDEXTYPE index, const OMX_PTR params);
64
65     virtual void onQueueFilled(OMX_U32 portIndex);
66     virtual void onPortFlushCompleted(OMX_U32 portIndex);
67     virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
68     virtual void onReset();
69
70 private:
71     enum {
72         kInputPortIndex   = 0,
73         kOutputPortIndex  = 1,
74         kNumInputBuffers  = 4,
75         kNumOutputBuffers = 4,
76         kOutputBufferSize = 9216 * 2
77     };
78
79     enum EOSStatus {
80         INPUT_DATA_AVAILABLE,
81         INPUT_EOS_SEEN,
82         OUTPUT_FRAMES_FLUSHED,
83     };
84
85     enum {
86         ERR_NO_FRM              = 2,
87         ERR_FLUSHED             = 1,
88         ERR_OK                  = 0,  //No errors
89         ERR_OOM                 = -1, //Out of memmory
90         ERR_INVALID_PARAM       = -2,
91         ERR_CODEC_NOT_FOUND     = -3,
92         ERR_DECODER_OPEN_FAILED = -4,
93         ERR_SWR_INIT_FAILED     = -5,
94         ERR_RESAMPLE_FAILED     = -6
95     };
96
97     const char* mRole;
98     OMX_AUDIO_CODINGTYPE mCodingType;
99     bool mFFmpegAlreadyInited;
100     bool mCodecAlreadyOpened;
101     bool mExtradataReady;
102     bool mIgnoreExtradata;
103     AVCodecContext *mCtx;
104     struct SwrContext *mSwrCtx;
105     AVFrame *mFrame;
106
107     uint8_t *mVorbisHeaderStart[3];
108     int mVorbisHeaderLen[3];
109
110     EOSStatus mEOSStatus;
111
112     bool mSignalledError;
113
114     int32_t mInputBufferSize;
115
116     //"Fatal signal 7 (SIGBUS)"!!! SIGBUS is because of an alignment exception
117     //LOCAL_CFLAGS += -D__GNUC__=1 in *.cpp file
118     //Don't malloc mAudioBuffer", because "NEON optimised stereo fltp to s16
119     //conversion" require byte alignment.
120     DECLARE_ALIGNED(16, uint8_t, mAudioBuffer)[AVCODEC_MAX_AUDIO_FRAME_SIZE * 4];
121
122     uint8_t mSilenceBuffer[kOutputBufferSize];
123     uint8_t *mResampledData;
124     int32_t mResampledDataSize;
125
126     uint32_t mAudioSrcFreq;
127     uint32_t mAudioTgtFreq;
128     uint32_t mAudioSrcChannels;
129     uint32_t mAudioTgtChannels;
130     int64_t mAudioSrcChannelLayout;
131     int64_t mAudioTgtChannelLayout;
132     enum AVSampleFormat mAudioSrcFmt;
133     enum AVSampleFormat mAudioTgtFmt;
134
135     enum {
136         NONE,
137         AWAITING_DISABLED,
138         AWAITING_ENABLED
139     } mOutputPortSettingsChange;
140
141     bool mReconfiguring;
142
143     void setMode(const char *name);
144     void initInputFormat(uint32_t mode, OMX_PARAM_PORTDEFINITIONTYPE &def);
145     void setDefaultCtx(AVCodecContext *avctx, const AVCodec *codec);
146     void resetCtx();
147     OMX_ERRORTYPE isRoleSupported(const OMX_PARAM_COMPONENTROLETYPE *roleParams);
148     void adjustAudioParams();
149     bool isConfigured();
150
151     void initPorts();
152     status_t initDecoder(enum AVCodecID codecID);
153     void deInitDecoder();
154
155     void    initVorbisHdr();
156     void    deinitVorbisHdr();
157     int32_t handleExtradata();
158     int32_t handleVorbisExtradata(OMX_BUFFERHEADERTYPE *inHeader);
159     int32_t openDecoder();
160     void    updateTimeStamp(OMX_BUFFERHEADERTYPE *inHeader);
161     void    initPacket(AVPacket *pkt, OMX_BUFFERHEADERTYPE *inHeader);
162     int32_t decodeAudio();
163     int32_t resampleAudio();
164     void    drainOneOutputBuffer();
165     void    drainEOSOutputBuffer();
166     void    drainAllOutputBuffers();
167
168     DISALLOW_EVIL_CONSTRUCTORS(SoftFFmpegAudio);
169 };
170
171 }  // namespace android
172
173 #endif  // SOFT_FFMPEGAUDIO_H_
174
175