ACodec.h revision b97cc6a9a3c81215e365c61b071a932073b56ff2
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef A_CODEC_H_ 18 19#define A_CODEC_H_ 20 21#include <stdint.h> 22#include <android/native_window.h> 23#include <media/IOMX.h> 24#include <media/stagefright/foundation/AHierarchicalStateMachine.h> 25#include <media/stagefright/CodecBase.h> 26#include <media/stagefright/SkipCutBuffer.h> 27#include <OMX_Audio.h> 28 29#define TRACK_BUFFER_TIMING 0 30 31namespace android { 32 33struct ABuffer; 34struct MemoryDealer; 35struct DescribeColorFormatParams; 36 37struct ACodec : public AHierarchicalStateMachine, public CodecBase { 38 ACodec(); 39 40 virtual void setNotificationMessage(const sp<AMessage> &msg); 41 42 void initiateSetup(const sp<AMessage> &msg); 43 44 virtual void initiateAllocateComponent(const sp<AMessage> &msg); 45 virtual void initiateConfigureComponent(const sp<AMessage> &msg); 46 virtual void initiateCreateInputSurface(); 47 virtual void initiateStart(); 48 virtual void initiateShutdown(bool keepComponentAllocated = false); 49 50 virtual void signalFlush(); 51 virtual void signalResume(); 52 53 virtual void signalSetParameters(const sp<AMessage> &msg); 54 virtual void signalEndOfInputStream(); 55 virtual void signalRequestIDRFrame(); 56 57 // AHierarchicalStateMachine implements the message handling 58 virtual void onMessageReceived(const sp<AMessage> &msg) { 59 handleMessage(msg); 60 } 61 62 struct PortDescription : public CodecBase::PortDescription { 63 size_t countBuffers(); 64 IOMX::buffer_id bufferIDAt(size_t index) const; 65 sp<ABuffer> bufferAt(size_t index) const; 66 67 private: 68 friend struct ACodec; 69 70 Vector<IOMX::buffer_id> mBufferIDs; 71 Vector<sp<ABuffer> > mBuffers; 72 73 PortDescription(); 74 void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer); 75 76 DISALLOW_EVIL_CONSTRUCTORS(PortDescription); 77 }; 78 79protected: 80 virtual ~ACodec(); 81 82private: 83 struct BaseState; 84 struct UninitializedState; 85 struct LoadedState; 86 struct LoadedToIdleState; 87 struct IdleToExecutingState; 88 struct ExecutingState; 89 struct OutputPortSettingsChangedState; 90 struct ExecutingToIdleState; 91 struct IdleToLoadedState; 92 struct FlushingState; 93 struct DeathNotifier; 94 95 enum { 96 kWhatSetup = 'setu', 97 kWhatOMXMessage = 'omx ', 98 kWhatInputBufferFilled = 'inpF', 99 kWhatOutputBufferDrained = 'outD', 100 kWhatShutdown = 'shut', 101 kWhatFlush = 'flus', 102 kWhatResume = 'resm', 103 kWhatDrainDeferredMessages = 'drai', 104 kWhatAllocateComponent = 'allo', 105 kWhatConfigureComponent = 'conf', 106 kWhatCreateInputSurface = 'cisf', 107 kWhatSignalEndOfInputStream = 'eois', 108 kWhatStart = 'star', 109 kWhatRequestIDRFrame = 'ridr', 110 kWhatSetParameters = 'setP', 111 kWhatSubmitOutputMetaDataBufferIfEOS = 'subm', 112 kWhatOMXDied = 'OMXd', 113 }; 114 115 enum { 116 kPortIndexInput = 0, 117 kPortIndexOutput = 1 118 }; 119 120 enum { 121 kFlagIsSecure = 1, 122 kFlagPushBlankBuffersToNativeWindowOnShutdown = 2, 123 }; 124 125 struct BufferInfo { 126 enum Status { 127 OWNED_BY_US, 128 OWNED_BY_COMPONENT, 129 OWNED_BY_UPSTREAM, 130 OWNED_BY_DOWNSTREAM, 131 OWNED_BY_NATIVE_WINDOW, 132 }; 133 134 IOMX::buffer_id mBufferID; 135 Status mStatus; 136 unsigned mDequeuedAt; 137 138 sp<ABuffer> mData; 139 sp<GraphicBuffer> mGraphicBuffer; 140 }; 141 142#if TRACK_BUFFER_TIMING 143 struct BufferStats { 144 int64_t mEmptyBufferTimeUs; 145 int64_t mFillBufferDoneTimeUs; 146 }; 147 148 KeyedVector<int64_t, BufferStats> mBufferStats; 149#endif 150 151 sp<AMessage> mNotify; 152 153 sp<UninitializedState> mUninitializedState; 154 sp<LoadedState> mLoadedState; 155 sp<LoadedToIdleState> mLoadedToIdleState; 156 sp<IdleToExecutingState> mIdleToExecutingState; 157 sp<ExecutingState> mExecutingState; 158 sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState; 159 sp<ExecutingToIdleState> mExecutingToIdleState; 160 sp<IdleToLoadedState> mIdleToLoadedState; 161 sp<FlushingState> mFlushingState; 162 sp<SkipCutBuffer> mSkipCutBuffer; 163 164 AString mComponentName; 165 uint32_t mFlags; 166 uint32_t mQuirks; 167 sp<IOMX> mOMX; 168 IOMX::node_id mNode; 169 sp<MemoryDealer> mDealer[2]; 170 171 sp<ANativeWindow> mNativeWindow; 172 sp<AMessage> mInputFormat; 173 sp<AMessage> mOutputFormat; 174 175 Vector<BufferInfo> mBuffers[2]; 176 bool mPortEOS[2]; 177 status_t mInputEOSResult; 178 179 List<sp<AMessage> > mDeferredQueue; 180 181 bool mSentFormat; 182 bool mIsEncoder; 183 bool mUseMetadataOnEncoderOutput; 184 bool mShutdownInProgress; 185 bool mExplicitShutdown; 186 187 // If "mKeepComponentAllocated" we only transition back to Loaded state 188 // and do not release the component instance. 189 bool mKeepComponentAllocated; 190 191 int32_t mEncoderDelay; 192 int32_t mEncoderPadding; 193 int32_t mRotationDegrees; 194 195 bool mChannelMaskPresent; 196 int32_t mChannelMask; 197 unsigned mDequeueCounter; 198 bool mStoreMetaDataInOutputBuffers; 199 int32_t mMetaDataBuffersToSubmit; 200 size_t mNumUndequeuedBuffers; 201 202 int64_t mRepeatFrameDelayUs; 203 int64_t mMaxPtsGapUs; 204 205 int64_t mTimePerFrameUs; 206 int64_t mTimePerCaptureUs; 207 208 bool mCreateInputBuffersSuspended; 209 210 status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode); 211 status_t allocateBuffersOnPort(OMX_U32 portIndex); 212 status_t freeBuffersOnPort(OMX_U32 portIndex); 213 status_t freeBuffer(OMX_U32 portIndex, size_t i); 214 215 status_t configureOutputBuffersFromNativeWindow( 216 OMX_U32 *nBufferCount, OMX_U32 *nBufferSize, 217 OMX_U32 *nMinUndequeuedBuffers); 218 status_t allocateOutputMetaDataBuffers(); 219 status_t submitOutputMetaDataBuffer(); 220 void signalSubmitOutputMetaDataBufferIfEOS_workaround(); 221 status_t allocateOutputBuffersFromNativeWindow(); 222 status_t cancelBufferToNativeWindow(BufferInfo *info); 223 status_t freeOutputBuffersNotOwnedByComponent(); 224 BufferInfo *dequeueBufferFromNativeWindow(); 225 226 BufferInfo *findBufferByID( 227 uint32_t portIndex, IOMX::buffer_id bufferID, 228 ssize_t *index = NULL); 229 230 status_t setComponentRole(bool isEncoder, const char *mime); 231 status_t configureCodec(const char *mime, const sp<AMessage> &msg); 232 233 status_t setVideoPortFormatType( 234 OMX_U32 portIndex, 235 OMX_VIDEO_CODINGTYPE compressionFormat, 236 OMX_COLOR_FORMATTYPE colorFormat); 237 238 status_t setSupportedOutputFormat(); 239 240 status_t setupVideoDecoder( 241 const char *mime, const sp<AMessage> &msg); 242 243 status_t setupVideoEncoder( 244 const char *mime, const sp<AMessage> &msg); 245 246 status_t setVideoFormatOnPort( 247 OMX_U32 portIndex, 248 int32_t width, int32_t height, 249 OMX_VIDEO_CODINGTYPE compressionFormat); 250 251 status_t setupAACCodec( 252 bool encoder, 253 int32_t numChannels, int32_t sampleRate, int32_t bitRate, 254 int32_t aacProfile, bool isADTS, int32_t sbrMode); 255 256 status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate); 257 258 status_t selectAudioPortFormat( 259 OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat); 260 261 status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate); 262 status_t setupG711Codec(bool encoder, int32_t numChannels); 263 264 status_t setupFlacCodec( 265 bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel); 266 267 status_t setupRawAudioFormat( 268 OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels); 269 270 status_t setMinBufferSize(OMX_U32 portIndex, size_t size); 271 272 status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg); 273 status_t setupH263EncoderParameters(const sp<AMessage> &msg); 274 status_t setupAVCEncoderParameters(const sp<AMessage> &msg); 275 status_t setupHEVCEncoderParameters(const sp<AMessage> &msg); 276 status_t setupVPXEncoderParameters(const sp<AMessage> &msg); 277 278 status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level); 279 280 status_t configureBitrate( 281 int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode); 282 283 status_t setupErrorCorrectionParameters(); 284 285 status_t initNativeWindow(); 286 287 status_t pushBlankBuffersToNativeWindow(); 288 289 // Returns true iff all buffers on the given port have status 290 // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW. 291 bool allYourBuffersAreBelongToUs(OMX_U32 portIndex); 292 293 bool allYourBuffersAreBelongToUs(); 294 295 void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 296 297 size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const; 298 size_t countBuffersOwnedByNativeWindow() const; 299 300 void deferMessage(const sp<AMessage> &msg); 301 void processDeferredMessages(); 302 303 void sendFormatChange(const sp<AMessage> &reply); 304 status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify); 305 306 void signalError( 307 OMX_ERRORTYPE error = OMX_ErrorUndefined, 308 status_t internalError = UNKNOWN_ERROR); 309 310 static void describeDefaultColorFormat(DescribeColorFormatParams &describeParams); 311 312 status_t requestIDRFrame(); 313 status_t setParameters(const sp<AMessage> ¶ms); 314 315 // Send EOS on input stream. 316 void onSignalEndOfInputStream(); 317 318 DISALLOW_EVIL_CONSTRUCTORS(ACodec); 319}; 320 321} // namespace android 322 323#endif // A_CODEC_H_ 324