Home | History | Annotate | Download | only in stagefright
      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 
     31 namespace android {
     32 
     33 struct ABuffer;
     34 struct MemoryDealer;
     35 struct DescribeColorFormatParams;
     36 
     37 struct 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 
     79     static bool isFlexibleColorFormat(
     80             const sp<IOMX> &omx, IOMX::node_id node,
     81             uint32_t colorFormat, OMX_U32 *flexibleEquivalent);
     82 
     83     // Returns 0 if configuration is not supported.  NOTE: this is treated by
     84     // some OMX components as auto level, and by others as invalid level.
     85     static int /* OMX_VIDEO_AVCLEVELTYPE */ getAVCLevelFor(
     86             int width, int height, int rate, int bitrate,
     87             OMX_VIDEO_AVCPROFILETYPE profile = OMX_VIDEO_AVCProfileBaseline);
     88 
     89 protected:
     90     virtual ~ACodec();
     91 
     92 private:
     93     struct BaseState;
     94     struct UninitializedState;
     95     struct LoadedState;
     96     struct LoadedToIdleState;
     97     struct IdleToExecutingState;
     98     struct ExecutingState;
     99     struct OutputPortSettingsChangedState;
    100     struct ExecutingToIdleState;
    101     struct IdleToLoadedState;
    102     struct FlushingState;
    103     struct DeathNotifier;
    104 
    105     enum {
    106         kWhatSetup                   = 'setu',
    107         kWhatOMXMessage              = 'omx ',
    108         kWhatInputBufferFilled       = 'inpF',
    109         kWhatOutputBufferDrained     = 'outD',
    110         kWhatShutdown                = 'shut',
    111         kWhatFlush                   = 'flus',
    112         kWhatResume                  = 'resm',
    113         kWhatDrainDeferredMessages   = 'drai',
    114         kWhatAllocateComponent       = 'allo',
    115         kWhatConfigureComponent      = 'conf',
    116         kWhatCreateInputSurface      = 'cisf',
    117         kWhatSignalEndOfInputStream  = 'eois',
    118         kWhatStart                   = 'star',
    119         kWhatRequestIDRFrame         = 'ridr',
    120         kWhatSetParameters           = 'setP',
    121         kWhatSubmitOutputMetaDataBufferIfEOS = 'subm',
    122         kWhatOMXDied                 = 'OMXd',
    123         kWhatReleaseCodecInstance    = 'relC',
    124     };
    125 
    126     enum {
    127         kPortIndexInput  = 0,
    128         kPortIndexOutput = 1
    129     };
    130 
    131     enum {
    132         kFlagIsSecure                                 = 1,
    133         kFlagPushBlankBuffersToNativeWindowOnShutdown = 2,
    134     };
    135 
    136     struct BufferInfo {
    137         enum Status {
    138             OWNED_BY_US,
    139             OWNED_BY_COMPONENT,
    140             OWNED_BY_UPSTREAM,
    141             OWNED_BY_DOWNSTREAM,
    142             OWNED_BY_NATIVE_WINDOW,
    143         };
    144 
    145         IOMX::buffer_id mBufferID;
    146         Status mStatus;
    147         unsigned mDequeuedAt;
    148 
    149         sp<ABuffer> mData;
    150         sp<GraphicBuffer> mGraphicBuffer;
    151     };
    152 
    153 #if TRACK_BUFFER_TIMING
    154     struct BufferStats {
    155         int64_t mEmptyBufferTimeUs;
    156         int64_t mFillBufferDoneTimeUs;
    157     };
    158 
    159     KeyedVector<int64_t, BufferStats> mBufferStats;
    160 #endif
    161 
    162     sp<AMessage> mNotify;
    163 
    164     sp<UninitializedState> mUninitializedState;
    165     sp<LoadedState> mLoadedState;
    166     sp<LoadedToIdleState> mLoadedToIdleState;
    167     sp<IdleToExecutingState> mIdleToExecutingState;
    168     sp<ExecutingState> mExecutingState;
    169     sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
    170     sp<ExecutingToIdleState> mExecutingToIdleState;
    171     sp<IdleToLoadedState> mIdleToLoadedState;
    172     sp<FlushingState> mFlushingState;
    173     sp<SkipCutBuffer> mSkipCutBuffer;
    174 
    175     AString mComponentName;
    176     uint32_t mFlags;
    177     uint32_t mQuirks;
    178     sp<IOMX> mOMX;
    179     IOMX::node_id mNode;
    180     sp<MemoryDealer> mDealer[2];
    181 
    182     sp<ANativeWindow> mNativeWindow;
    183     sp<AMessage> mInputFormat;
    184     sp<AMessage> mOutputFormat;
    185 
    186     Vector<BufferInfo> mBuffers[2];
    187     bool mPortEOS[2];
    188     status_t mInputEOSResult;
    189 
    190     List<sp<AMessage> > mDeferredQueue;
    191 
    192     bool mSentFormat;
    193     bool mIsEncoder;
    194     bool mUseMetadataOnEncoderOutput;
    195     bool mShutdownInProgress;
    196     bool mExplicitShutdown;
    197 
    198     // If "mKeepComponentAllocated" we only transition back to Loaded state
    199     // and do not release the component instance.
    200     bool mKeepComponentAllocated;
    201 
    202     int32_t mEncoderDelay;
    203     int32_t mEncoderPadding;
    204     int32_t mRotationDegrees;
    205 
    206     bool mChannelMaskPresent;
    207     int32_t mChannelMask;
    208     unsigned mDequeueCounter;
    209     bool mStoreMetaDataInOutputBuffers;
    210     int32_t mMetaDataBuffersToSubmit;
    211     size_t mNumUndequeuedBuffers;
    212 
    213     int64_t mRepeatFrameDelayUs;
    214     int64_t mMaxPtsGapUs;
    215 
    216     int64_t mTimePerFrameUs;
    217     int64_t mTimePerCaptureUs;
    218 
    219     bool mCreateInputBuffersSuspended;
    220 
    221     bool mTunneled;
    222 
    223     status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
    224     status_t allocateBuffersOnPort(OMX_U32 portIndex);
    225     status_t freeBuffersOnPort(OMX_U32 portIndex);
    226     status_t freeBuffer(OMX_U32 portIndex, size_t i);
    227 
    228     status_t configureOutputBuffersFromNativeWindow(
    229             OMX_U32 *nBufferCount, OMX_U32 *nBufferSize,
    230             OMX_U32 *nMinUndequeuedBuffers);
    231     status_t allocateOutputMetaDataBuffers();
    232     status_t submitOutputMetaDataBuffer();
    233     void signalSubmitOutputMetaDataBufferIfEOS_workaround();
    234     status_t allocateOutputBuffersFromNativeWindow();
    235     status_t cancelBufferToNativeWindow(BufferInfo *info);
    236     status_t freeOutputBuffersNotOwnedByComponent();
    237     BufferInfo *dequeueBufferFromNativeWindow();
    238 
    239     BufferInfo *findBufferByID(
    240             uint32_t portIndex, IOMX::buffer_id bufferID,
    241             ssize_t *index = NULL);
    242 
    243     status_t setComponentRole(bool isEncoder, const char *mime);
    244     status_t configureCodec(const char *mime, const sp<AMessage> &msg);
    245 
    246     status_t configureTunneledVideoPlayback(int32_t audioHwSync,
    247             const sp<ANativeWindow> &nativeWindow);
    248 
    249     status_t setVideoPortFormatType(
    250             OMX_U32 portIndex,
    251             OMX_VIDEO_CODINGTYPE compressionFormat,
    252             OMX_COLOR_FORMATTYPE colorFormat);
    253 
    254     status_t setSupportedOutputFormat();
    255 
    256     status_t setupVideoDecoder(
    257             const char *mime, const sp<AMessage> &msg);
    258 
    259     status_t setupVideoEncoder(
    260             const char *mime, const sp<AMessage> &msg);
    261 
    262     status_t setVideoFormatOnPort(
    263             OMX_U32 portIndex,
    264             int32_t width, int32_t height,
    265             OMX_VIDEO_CODINGTYPE compressionFormat);
    266 
    267     typedef struct drcParams {
    268         int32_t drcCut;
    269         int32_t drcBoost;
    270         int32_t heavyCompression;
    271         int32_t targetRefLevel;
    272         int32_t encodedTargetLevel;
    273     } drcParams_t;
    274 
    275     status_t setupAACCodec(
    276             bool encoder,
    277             int32_t numChannels, int32_t sampleRate, int32_t bitRate,
    278             int32_t aacProfile, bool isADTS, int32_t sbrMode,
    279             int32_t maxOutputChannelCount, const drcParams_t& drc,
    280             int32_t pcmLimiterEnable);
    281 
    282     status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
    283 
    284     status_t selectAudioPortFormat(
    285             OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
    286 
    287     status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
    288     status_t setupG711Codec(bool encoder, int32_t numChannels);
    289 
    290     status_t setupFlacCodec(
    291             bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
    292 
    293     status_t setupRawAudioFormat(
    294             OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
    295 
    296     status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
    297 
    298     status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
    299     status_t setupH263EncoderParameters(const sp<AMessage> &msg);
    300     status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
    301     status_t setupHEVCEncoderParameters(const sp<AMessage> &msg);
    302     status_t setupVPXEncoderParameters(const sp<AMessage> &msg);
    303 
    304     status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
    305 
    306     status_t configureBitrate(
    307             int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
    308 
    309     status_t setupErrorCorrectionParameters();
    310 
    311     status_t initNativeWindow();
    312 
    313     status_t pushBlankBuffersToNativeWindow();
    314 
    315     // Returns true iff all buffers on the given port have status
    316     // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
    317     bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
    318 
    319     bool allYourBuffersAreBelongToUs();
    320 
    321     void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
    322 
    323     size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
    324     size_t countBuffersOwnedByNativeWindow() const;
    325 
    326     void deferMessage(const sp<AMessage> &msg);
    327     void processDeferredMessages();
    328 
    329     void sendFormatChange(const sp<AMessage> &reply);
    330     status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify);
    331 
    332     void signalError(
    333             OMX_ERRORTYPE error = OMX_ErrorUndefined,
    334             status_t internalError = UNKNOWN_ERROR);
    335 
    336     static bool describeDefaultColorFormat(DescribeColorFormatParams &describeParams);
    337     static bool describeColorFormat(
    338         const sp<IOMX> &omx, IOMX::node_id node,
    339         DescribeColorFormatParams &describeParams);
    340 
    341     status_t requestIDRFrame();
    342     status_t setParameters(const sp<AMessage> &params);
    343 
    344     // Send EOS on input stream.
    345     void onSignalEndOfInputStream();
    346 
    347     DISALLOW_EVIL_CONSTRUCTORS(ACodec);
    348 };
    349 
    350 }  // namespace android
    351 
    352 #endif  // A_CODEC_H_
    353