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/SkipCutBuffer.h>
     26 #include <OMX_Audio.h>
     27 
     28 #define TRACK_BUFFER_TIMING     0
     29 
     30 namespace android {
     31 
     32 struct ABuffer;
     33 struct MemoryDealer;
     34 
     35 struct ACodec : public AHierarchicalStateMachine {
     36     enum {
     37         kWhatFillThisBuffer      = 'fill',
     38         kWhatDrainThisBuffer     = 'drai',
     39         kWhatEOS                 = 'eos ',
     40         kWhatShutdownCompleted   = 'scom',
     41         kWhatFlushCompleted      = 'fcom',
     42         kWhatOutputFormatChanged = 'outC',
     43         kWhatError               = 'erro',
     44         kWhatComponentAllocated  = 'cAll',
     45         kWhatComponentConfigured = 'cCon',
     46         kWhatInputSurfaceCreated = 'isfc',
     47         kWhatSignaledInputEOS    = 'seos',
     48         kWhatBuffersAllocated    = 'allc',
     49         kWhatOMXDied             = 'OMXd',
     50     };
     51 
     52     ACodec();
     53 
     54     void setNotificationMessage(const sp<AMessage> &msg);
     55     void initiateSetup(const sp<AMessage> &msg);
     56     void signalFlush();
     57     void signalResume();
     58     void initiateShutdown(bool keepComponentAllocated = false);
     59 
     60     void signalSetParameters(const sp<AMessage> &msg);
     61     void signalEndOfInputStream();
     62 
     63     void initiateAllocateComponent(const sp<AMessage> &msg);
     64     void initiateConfigureComponent(const sp<AMessage> &msg);
     65     void initiateCreateInputSurface();
     66     void initiateStart();
     67 
     68     void signalRequestIDRFrame();
     69 
     70     struct PortDescription : public RefBase {
     71         size_t countBuffers();
     72         IOMX::buffer_id bufferIDAt(size_t index) const;
     73         sp<ABuffer> bufferAt(size_t index) const;
     74 
     75     private:
     76         friend struct ACodec;
     77 
     78         Vector<IOMX::buffer_id> mBufferIDs;
     79         Vector<sp<ABuffer> > mBuffers;
     80 
     81         PortDescription();
     82         void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
     83 
     84         DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
     85     };
     86 
     87 protected:
     88     virtual ~ACodec();
     89 
     90 private:
     91     struct BaseState;
     92     struct UninitializedState;
     93     struct LoadedState;
     94     struct LoadedToIdleState;
     95     struct IdleToExecutingState;
     96     struct ExecutingState;
     97     struct OutputPortSettingsChangedState;
     98     struct ExecutingToIdleState;
     99     struct IdleToLoadedState;
    100     struct FlushingState;
    101     struct DeathNotifier;
    102 
    103     enum {
    104         kWhatSetup                   = 'setu',
    105         kWhatOMXMessage              = 'omx ',
    106         kWhatInputBufferFilled       = 'inpF',
    107         kWhatOutputBufferDrained     = 'outD',
    108         kWhatShutdown                = 'shut',
    109         kWhatFlush                   = 'flus',
    110         kWhatResume                  = 'resm',
    111         kWhatDrainDeferredMessages   = 'drai',
    112         kWhatAllocateComponent       = 'allo',
    113         kWhatConfigureComponent      = 'conf',
    114         kWhatCreateInputSurface      = 'cisf',
    115         kWhatSignalEndOfInputStream  = 'eois',
    116         kWhatStart                   = 'star',
    117         kWhatRequestIDRFrame         = 'ridr',
    118         kWhatSetParameters           = 'setP',
    119     };
    120 
    121     enum {
    122         kPortIndexInput  = 0,
    123         kPortIndexOutput = 1
    124     };
    125 
    126     enum {
    127         kFlagIsSecure   = 1,
    128     };
    129 
    130     struct BufferInfo {
    131         enum Status {
    132             OWNED_BY_US,
    133             OWNED_BY_COMPONENT,
    134             OWNED_BY_UPSTREAM,
    135             OWNED_BY_DOWNSTREAM,
    136             OWNED_BY_NATIVE_WINDOW,
    137         };
    138 
    139         IOMX::buffer_id mBufferID;
    140         Status mStatus;
    141 
    142         sp<ABuffer> mData;
    143         sp<GraphicBuffer> mGraphicBuffer;
    144     };
    145 
    146 #if TRACK_BUFFER_TIMING
    147     struct BufferStats {
    148         int64_t mEmptyBufferTimeUs;
    149         int64_t mFillBufferDoneTimeUs;
    150     };
    151 
    152     KeyedVector<int64_t, BufferStats> mBufferStats;
    153 #endif
    154 
    155     sp<AMessage> mNotify;
    156 
    157     sp<UninitializedState> mUninitializedState;
    158     sp<LoadedState> mLoadedState;
    159     sp<LoadedToIdleState> mLoadedToIdleState;
    160     sp<IdleToExecutingState> mIdleToExecutingState;
    161     sp<ExecutingState> mExecutingState;
    162     sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
    163     sp<ExecutingToIdleState> mExecutingToIdleState;
    164     sp<IdleToLoadedState> mIdleToLoadedState;
    165     sp<FlushingState> mFlushingState;
    166     sp<SkipCutBuffer> mSkipCutBuffer;
    167 
    168     AString mComponentName;
    169     uint32_t mFlags;
    170     uint32_t mQuirks;
    171     sp<IOMX> mOMX;
    172     IOMX::node_id mNode;
    173     sp<MemoryDealer> mDealer[2];
    174 
    175     sp<ANativeWindow> mNativeWindow;
    176 
    177     Vector<BufferInfo> mBuffers[2];
    178     bool mPortEOS[2];
    179     status_t mInputEOSResult;
    180 
    181     List<sp<AMessage> > mDeferredQueue;
    182 
    183     bool mSentFormat;
    184     bool mIsEncoder;
    185 
    186     bool mShutdownInProgress;
    187 
    188     // If "mKeepComponentAllocated" we only transition back to Loaded state
    189     // and do not release the component instance.
    190     bool mKeepComponentAllocated;
    191 
    192     int32_t mEncoderDelay;
    193     int32_t mEncoderPadding;
    194 
    195     bool mChannelMaskPresent;
    196     int32_t mChannelMask;
    197 
    198     status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
    199     status_t allocateBuffersOnPort(OMX_U32 portIndex);
    200     status_t freeBuffersOnPort(OMX_U32 portIndex);
    201     status_t freeBuffer(OMX_U32 portIndex, size_t i);
    202 
    203     status_t allocateOutputBuffersFromNativeWindow();
    204     status_t cancelBufferToNativeWindow(BufferInfo *info);
    205     status_t freeOutputBuffersNotOwnedByComponent();
    206     BufferInfo *dequeueBufferFromNativeWindow();
    207 
    208     BufferInfo *findBufferByID(
    209             uint32_t portIndex, IOMX::buffer_id bufferID,
    210             ssize_t *index = NULL);
    211 
    212     status_t setComponentRole(bool isEncoder, const char *mime);
    213     status_t configureCodec(const char *mime, const sp<AMessage> &msg);
    214 
    215     status_t setVideoPortFormatType(
    216             OMX_U32 portIndex,
    217             OMX_VIDEO_CODINGTYPE compressionFormat,
    218             OMX_COLOR_FORMATTYPE colorFormat);
    219 
    220     status_t setSupportedOutputFormat();
    221 
    222     status_t setupVideoDecoder(
    223             const char *mime, int32_t width, int32_t height);
    224 
    225     status_t setupVideoEncoder(
    226             const char *mime, const sp<AMessage> &msg);
    227 
    228     status_t setVideoFormatOnPort(
    229             OMX_U32 portIndex,
    230             int32_t width, int32_t height,
    231             OMX_VIDEO_CODINGTYPE compressionFormat);
    232 
    233     status_t setupAACCodec(
    234             bool encoder,
    235             int32_t numChannels, int32_t sampleRate, int32_t bitRate,
    236             int32_t aacProfile, bool isADTS);
    237 
    238     status_t selectAudioPortFormat(
    239             OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
    240 
    241     status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
    242     status_t setupG711Codec(bool encoder, int32_t numChannels);
    243 
    244     status_t setupFlacCodec(
    245             bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
    246 
    247     status_t setupRawAudioFormat(
    248             OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
    249 
    250     status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
    251 
    252     status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
    253     status_t setupH263EncoderParameters(const sp<AMessage> &msg);
    254     status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
    255 
    256     status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
    257 
    258     status_t configureBitrate(
    259             int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
    260 
    261     status_t setupErrorCorrectionParameters();
    262 
    263     status_t initNativeWindow();
    264 
    265     status_t pushBlankBuffersToNativeWindow();
    266 
    267     // Returns true iff all buffers on the given port have status
    268     // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
    269     bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
    270 
    271     bool allYourBuffersAreBelongToUs();
    272 
    273     void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
    274 
    275     size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
    276     size_t countBuffersOwnedByNativeWindow() const;
    277 
    278     void deferMessage(const sp<AMessage> &msg);
    279     void processDeferredMessages();
    280 
    281     void sendFormatChange(const sp<AMessage> &reply);
    282 
    283     void signalError(
    284             OMX_ERRORTYPE error = OMX_ErrorUndefined,
    285             status_t internalError = UNKNOWN_ERROR);
    286 
    287     status_t requestIDRFrame();
    288     status_t setParameters(const sp<AMessage> &params);
    289 
    290     // Send EOS on input stream.
    291     void onSignalEndOfInputStream();
    292 
    293     DISALLOW_EVIL_CONSTRUCTORS(ACodec);
    294 };
    295 
    296 }  // namespace android
    297 
    298 #endif  // A_CODEC_H_
    299