ACodec.h revision 054219874873b41f1c815552987c10465c34ba2b
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/hardware/MetadataBufferType.h> 24#include <media/IOMX.h> 25#include <media/stagefright/foundation/AHierarchicalStateMachine.h> 26#include <media/stagefright/CodecBase.h> 27#include <media/stagefright/SkipCutBuffer.h> 28#include <OMX_Audio.h> 29 30#define TRACK_BUFFER_TIMING 0 31 32namespace android { 33 34struct ABuffer; 35struct MemoryDealer; 36struct DescribeColorFormatParams; 37 38struct ACodec : public AHierarchicalStateMachine, public CodecBase { 39 ACodec(); 40 41 virtual void setNotificationMessage(const sp<AMessage> &msg); 42 43 void initiateSetup(const sp<AMessage> &msg); 44 45 virtual void initiateAllocateComponent(const sp<AMessage> &msg); 46 virtual void initiateConfigureComponent(const sp<AMessage> &msg); 47 virtual void initiateCreateInputSurface(); 48 virtual void initiateSetInputSurface(const sp<PersistentSurface> &surface); 49 virtual void initiateStart(); 50 virtual void initiateShutdown(bool keepComponentAllocated = false); 51 52 virtual status_t setSurface(const sp<Surface> &surface); 53 54 virtual void signalFlush(); 55 virtual void signalResume(); 56 57 virtual void signalSetParameters(const sp<AMessage> &msg); 58 virtual void signalEndOfInputStream(); 59 virtual void signalRequestIDRFrame(); 60 61 // AHierarchicalStateMachine implements the message handling 62 virtual void onMessageReceived(const sp<AMessage> &msg) { 63 handleMessage(msg); 64 } 65 66 struct PortDescription : public CodecBase::PortDescription { 67 size_t countBuffers(); 68 IOMX::buffer_id bufferIDAt(size_t index) const; 69 sp<ABuffer> bufferAt(size_t index) const; 70 71 private: 72 friend struct ACodec; 73 74 Vector<IOMX::buffer_id> mBufferIDs; 75 Vector<sp<ABuffer> > mBuffers; 76 77 PortDescription(); 78 void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer); 79 80 DISALLOW_EVIL_CONSTRUCTORS(PortDescription); 81 }; 82 83 static bool isFlexibleColorFormat( 84 const sp<IOMX> &omx, IOMX::node_id node, 85 uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent); 86 87 // Returns 0 if configuration is not supported. NOTE: this is treated by 88 // some OMX components as auto level, and by others as invalid level. 89 static int /* OMX_VIDEO_AVCLEVELTYPE */ getAVCLevelFor( 90 int width, int height, int rate, int bitrate, 91 OMX_VIDEO_AVCPROFILETYPE profile = OMX_VIDEO_AVCProfileBaseline); 92 93protected: 94 virtual ~ACodec(); 95 96private: 97 struct BaseState; 98 struct UninitializedState; 99 struct LoadedState; 100 struct LoadedToIdleState; 101 struct IdleToExecutingState; 102 struct ExecutingState; 103 struct OutputPortSettingsChangedState; 104 struct ExecutingToIdleState; 105 struct IdleToLoadedState; 106 struct FlushingState; 107 struct DeathNotifier; 108 109 enum { 110 kWhatSetup = 'setu', 111 kWhatOMXMessage = 'omx ', 112 kWhatInputBufferFilled = 'inpF', 113 kWhatOutputBufferDrained = 'outD', 114 kWhatShutdown = 'shut', 115 kWhatFlush = 'flus', 116 kWhatResume = 'resm', 117 kWhatDrainDeferredMessages = 'drai', 118 kWhatAllocateComponent = 'allo', 119 kWhatConfigureComponent = 'conf', 120 kWhatSetSurface = 'setS', 121 kWhatCreateInputSurface = 'cisf', 122 kWhatSetInputSurface = 'sisf', 123 kWhatSignalEndOfInputStream = 'eois', 124 kWhatStart = 'star', 125 kWhatRequestIDRFrame = 'ridr', 126 kWhatSetParameters = 'setP', 127 kWhatSubmitOutputMetadataBufferIfEOS = 'subm', 128 kWhatOMXDied = 'OMXd', 129 kWhatReleaseCodecInstance = 'relC', 130 }; 131 132 enum { 133 kPortIndexInput = 0, 134 kPortIndexOutput = 1 135 }; 136 137 enum { 138 kFlagIsSecure = 1, 139 kFlagPushBlankBuffersToNativeWindowOnShutdown = 2, 140 kFlagIsGrallocUsageProtected = 4, 141 }; 142 143 struct BufferInfo { 144 enum Status { 145 OWNED_BY_US, 146 OWNED_BY_COMPONENT, 147 OWNED_BY_UPSTREAM, 148 OWNED_BY_DOWNSTREAM, 149 OWNED_BY_NATIVE_WINDOW, 150 UNRECOGNIZED, // not a tracked buffer 151 }; 152 153 static inline Status getSafeStatus(BufferInfo *info) { 154 return info == NULL ? UNRECOGNIZED : info->mStatus; 155 } 156 157 IOMX::buffer_id mBufferID; 158 Status mStatus; 159 unsigned mDequeuedAt; 160 161 sp<ABuffer> mData; 162 sp<GraphicBuffer> mGraphicBuffer; 163 }; 164 165 static const char *_asString(BufferInfo::Status s); 166 void dumpBuffers(OMX_U32 portIndex); 167 168#if TRACK_BUFFER_TIMING 169 struct BufferStats { 170 int64_t mEmptyBufferTimeUs; 171 int64_t mFillBufferDoneTimeUs; 172 }; 173 174 KeyedVector<int64_t, BufferStats> mBufferStats; 175#endif 176 177 sp<AMessage> mNotify; 178 179 sp<UninitializedState> mUninitializedState; 180 sp<LoadedState> mLoadedState; 181 sp<LoadedToIdleState> mLoadedToIdleState; 182 sp<IdleToExecutingState> mIdleToExecutingState; 183 sp<ExecutingState> mExecutingState; 184 sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState; 185 sp<ExecutingToIdleState> mExecutingToIdleState; 186 sp<IdleToLoadedState> mIdleToLoadedState; 187 sp<FlushingState> mFlushingState; 188 sp<SkipCutBuffer> mSkipCutBuffer; 189 190 AString mComponentName; 191 uint32_t mFlags; 192 uint32_t mQuirks; 193 sp<IOMX> mOMX; 194 IOMX::node_id mNode; 195 sp<MemoryDealer> mDealer[2]; 196 197 sp<ANativeWindow> mNativeWindow; 198 sp<AMessage> mInputFormat; 199 sp<AMessage> mOutputFormat; 200 sp<AMessage> mBaseOutputFormat; 201 202 Vector<BufferInfo> mBuffers[2]; 203 bool mPortEOS[2]; 204 status_t mInputEOSResult; 205 206 List<sp<AMessage> > mDeferredQueue; 207 208 bool mSentFormat; 209 bool mIsVideo; 210 bool mIsEncoder; 211 bool mShutdownInProgress; 212 bool mExplicitShutdown; 213 214 // If "mKeepComponentAllocated" we only transition back to Loaded state 215 // and do not release the component instance. 216 bool mKeepComponentAllocated; 217 218 int32_t mEncoderDelay; 219 int32_t mEncoderPadding; 220 int32_t mRotationDegrees; 221 222 bool mChannelMaskPresent; 223 int32_t mChannelMask; 224 unsigned mDequeueCounter; 225 MetadataBufferType mInputMetadataType; 226 MetadataBufferType mOutputMetadataType; 227 bool mLegacyAdaptiveExperiment; 228 int32_t mMetadataBuffersToSubmit; 229 size_t mNumUndequeuedBuffers; 230 231 int64_t mRepeatFrameDelayUs; 232 int64_t mMaxPtsGapUs; 233 float mMaxFps; 234 235 int64_t mTimePerFrameUs; 236 int64_t mTimePerCaptureUs; 237 238 bool mCreateInputBuffersSuspended; 239 240 bool mTunneled; 241 242 status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode); 243 status_t allocateBuffersOnPort(OMX_U32 portIndex); 244 status_t freeBuffersOnPort(OMX_U32 portIndex); 245 status_t freeBuffer(OMX_U32 portIndex, size_t i); 246 247 status_t handleSetSurface(const sp<Surface> &surface); 248 status_t setupNativeWindowSizeFormatAndUsage(ANativeWindow *nativeWindow /* nonnull */); 249 250 status_t configureOutputBuffersFromNativeWindow( 251 OMX_U32 *nBufferCount, OMX_U32 *nBufferSize, 252 OMX_U32 *nMinUndequeuedBuffers); 253 status_t allocateOutputMetadataBuffers(); 254 status_t submitOutputMetadataBuffer(); 255 void signalSubmitOutputMetadataBufferIfEOS_workaround(); 256 status_t allocateOutputBuffersFromNativeWindow(); 257 status_t cancelBufferToNativeWindow(BufferInfo *info); 258 status_t freeOutputBuffersNotOwnedByComponent(); 259 BufferInfo *dequeueBufferFromNativeWindow(); 260 261 inline bool storingMetadataInDecodedBuffers() { 262 return mOutputMetadataType >= 0 && !mIsEncoder; 263 } 264 265 inline bool usingMetadataOnEncoderOutput() { 266 return mOutputMetadataType >= 0 && mIsEncoder; 267 } 268 269 BufferInfo *findBufferByID( 270 uint32_t portIndex, IOMX::buffer_id bufferID, 271 ssize_t *index = NULL); 272 273 status_t setComponentRole(bool isEncoder, const char *mime); 274 status_t configureCodec(const char *mime, const sp<AMessage> &msg); 275 276 status_t configureTunneledVideoPlayback(int32_t audioHwSync, 277 const sp<ANativeWindow> &nativeWindow); 278 279 status_t setVideoPortFormatType( 280 OMX_U32 portIndex, 281 OMX_VIDEO_CODINGTYPE compressionFormat, 282 OMX_COLOR_FORMATTYPE colorFormat, 283 bool usingNativeBuffers = false); 284 285 status_t setSupportedOutputFormat(bool getLegacyFlexibleFormat); 286 287 status_t setupVideoDecoder( 288 const char *mime, const sp<AMessage> &msg, bool usingNativeBuffers); 289 290 status_t setupVideoEncoder( 291 const char *mime, const sp<AMessage> &msg); 292 293 status_t setVideoFormatOnPort( 294 OMX_U32 portIndex, 295 int32_t width, int32_t height, 296 OMX_VIDEO_CODINGTYPE compressionFormat, float frameRate = -1.0); 297 298 typedef struct drcParams { 299 int32_t drcCut; 300 int32_t drcBoost; 301 int32_t heavyCompression; 302 int32_t targetRefLevel; 303 int32_t encodedTargetLevel; 304 } drcParams_t; 305 306 status_t setupAACCodec( 307 bool encoder, 308 int32_t numChannels, int32_t sampleRate, int32_t bitRate, 309 int32_t aacProfile, bool isADTS, int32_t sbrMode, 310 int32_t maxOutputChannelCount, const drcParams_t& drc, 311 int32_t pcmLimiterEnable); 312 313 status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate); 314 315 status_t setupEAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate); 316 317 status_t selectAudioPortFormat( 318 OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat); 319 320 status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate); 321 status_t setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels); 322 323 status_t setupFlacCodec( 324 bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel); 325 326 status_t setupRawAudioFormat( 327 OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels); 328 329 status_t setPriority(int32_t priority); 330 status_t setOperatingRate(float rateFloat, bool isVideo); 331 332 status_t setMinBufferSize(OMX_U32 portIndex, size_t size); 333 334 status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg); 335 status_t setupH263EncoderParameters(const sp<AMessage> &msg); 336 status_t setupAVCEncoderParameters(const sp<AMessage> &msg); 337 status_t setupHEVCEncoderParameters(const sp<AMessage> &msg); 338 status_t setupVPXEncoderParameters(const sp<AMessage> &msg); 339 340 status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level); 341 342 status_t configureBitrate( 343 int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode); 344 345 status_t setupErrorCorrectionParameters(); 346 347 status_t initNativeWindow(); 348 349 // Returns true iff all buffers on the given port have status 350 // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW. 351 bool allYourBuffersAreBelongToUs(OMX_U32 portIndex); 352 353 bool allYourBuffersAreBelongToUs(); 354 355 void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 356 357 size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const; 358 size_t countBuffersOwnedByNativeWindow() const; 359 360 void deferMessage(const sp<AMessage> &msg); 361 void processDeferredMessages(); 362 363 void sendFormatChange(const sp<AMessage> &reply); 364 status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify); 365 366 void signalError( 367 OMX_ERRORTYPE error = OMX_ErrorUndefined, 368 status_t internalError = UNKNOWN_ERROR); 369 370 static bool describeDefaultColorFormat(DescribeColorFormatParams &describeParams); 371 static bool describeColorFormat( 372 const sp<IOMX> &omx, IOMX::node_id node, 373 DescribeColorFormatParams &describeParams); 374 375 status_t requestIDRFrame(); 376 status_t setParameters(const sp<AMessage> ¶ms); 377 378 // Send EOS on input stream. 379 void onSignalEndOfInputStream(); 380 381 DISALLOW_EVIL_CONSTRUCTORS(ACodec); 382}; 383 384} // namespace android 385 386#endif // A_CODEC_H_ 387