2 * Copyright 2012 Michael Chen <omxcodec@gmail.com>
3 * Copyright 2015 The CyanogenMod Project
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #ifndef SOFT_FFMPEGAUDIO_H_
20 #define SOFT_FFMPEGAUDIO_H_
22 #include "SimpleSoftOMXComponent.h"
26 #error "__GNUC__ cflags should be enabled"
29 #include "utils/ffmpeg_utils.h"
31 #include <OMX_AudioExt.h>
32 #include <OMX_IndexExt.h>
34 const int AVCODEC_MAX_AUDIO_FRAME_SIZE = 192000; // Deprecated in ffmpeg
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,
45 OMX_COMPONENTTYPE **component);
48 static int64_t *sAudioClock;
49 static int64_t getAudioClock(void);
50 static void setAudioClock(int64_t value);
52 static SoftOMXComponent* createSoftOMXComponent(
53 const char *name, const OMX_CALLBACKTYPE *callbacks,
54 OMX_PTR appData, OMX_COMPONENTTYPE **component);
57 virtual ~SoftFFmpegAudio();
59 virtual OMX_ERRORTYPE internalGetParameter(
60 OMX_INDEXTYPE index, OMX_PTR params);
62 virtual OMX_ERRORTYPE internalSetParameter(
63 OMX_INDEXTYPE index, const OMX_PTR params);
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();
75 kNumOutputBuffers = 4,
76 kOutputBufferSize = 9216 * 2
82 OUTPUT_FRAMES_FLUSHED,
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
98 OMX_AUDIO_CODINGTYPE mCodingType;
99 bool mFFmpegAlreadyInited;
100 bool mCodecAlreadyOpened;
101 bool mExtradataReady;
102 bool mIgnoreExtradata;
103 AVCodecContext *mCtx;
104 struct SwrContext *mSwrCtx;
107 uint8_t *mVorbisHeaderStart[3];
108 int mVorbisHeaderLen[3];
110 EOSStatus mEOSStatus;
112 bool mSignalledError;
114 int32_t mInputBufferSize;
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];
122 uint8_t mSilenceBuffer[kOutputBufferSize];
123 uint8_t *mResampledData;
124 int32_t mResampledDataSize;
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;
139 } mOutputPortSettingsChange;
143 void setMode(const char *name);
144 void initInputFormat(uint32_t mode, OMX_PARAM_PORTDEFINITIONTYPE &def);
145 void setDefaultCtx(AVCodecContext *avctx, const AVCodec *codec);
147 OMX_ERRORTYPE isRoleSupported(const OMX_PARAM_COMPONENTROLETYPE *roleParams);
148 void adjustAudioParams();
152 status_t initDecoder(enum AVCodecID codecID);
153 void deInitDecoder();
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();
168 DISALLOW_EVIL_CONSTRUCTORS(SoftFFmpegAudio);
171 } // namespace android
173 #endif // SOFT_FFMPEGAUDIO_H_