ACodec.h revision 2c2814b900a61fa07ddfff860b143fbbe9c740e9
1#ifndef A_CODEC_H_ 2 3#define A_CODEC_H_ 4 5#include <stdint.h> 6#include <android/native_window.h> 7#include <media/IOMX.h> 8#include <media/stagefright/foundation/AHierarchicalStateMachine.h> 9 10namespace android { 11 12struct ABuffer; 13struct MemoryDealer; 14 15struct ACodec : public AHierarchicalStateMachine { 16 enum { 17 kWhatFillThisBuffer = 'fill', 18 kWhatDrainThisBuffer = 'drai', 19 kWhatEOS = 'eos ', 20 kWhatShutdownCompleted = 'scom', 21 kWhatFlushCompleted = 'fcom', 22 kWhatOutputFormatChanged = 'outC', 23 }; 24 25 ACodec(); 26 27 void setNotificationMessage(const sp<AMessage> &msg); 28 void initiateSetup(const sp<AMessage> &msg); 29 void signalFlush(); 30 void signalResume(); 31 void initiateShutdown(); 32 33protected: 34 virtual ~ACodec(); 35 36private: 37 struct BaseState; 38 struct UninitializedState; 39 struct LoadedToIdleState; 40 struct IdleToExecutingState; 41 struct ExecutingState; 42 struct OutputPortSettingsChangedState; 43 struct ExecutingToIdleState; 44 struct IdleToLoadedState; 45 struct ErrorState; 46 struct FlushingState; 47 48 enum { 49 kWhatSetup = 'setu', 50 kWhatOMXMessage = 'omx ', 51 kWhatInputBufferFilled = 'inpF', 52 kWhatOutputBufferDrained = 'outD', 53 kWhatShutdown = 'shut', 54 kWhatFlush = 'flus', 55 kWhatResume = 'resm', 56 kWhatDrainDeferredMessages = 'drai', 57 }; 58 59 enum { 60 kPortIndexInput = 0, 61 kPortIndexOutput = 1 62 }; 63 64 struct BufferInfo { 65 enum Status { 66 OWNED_BY_US, 67 OWNED_BY_COMPONENT, 68 OWNED_BY_UPSTREAM, 69 OWNED_BY_DOWNSTREAM, 70 OWNED_BY_NATIVE_WINDOW, 71 }; 72 73 IOMX::buffer_id mBufferID; 74 Status mStatus; 75 76 sp<ABuffer> mData; 77 sp<GraphicBuffer> mGraphicBuffer; 78 }; 79 80 sp<AMessage> mNotify; 81 82 sp<UninitializedState> mUninitializedState; 83 sp<LoadedToIdleState> mLoadedToIdleState; 84 sp<IdleToExecutingState> mIdleToExecutingState; 85 sp<ExecutingState> mExecutingState; 86 sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState; 87 sp<ExecutingToIdleState> mExecutingToIdleState; 88 sp<IdleToLoadedState> mIdleToLoadedState; 89 sp<ErrorState> mErrorState; 90 sp<FlushingState> mFlushingState; 91 92 AString mComponentName; 93 sp<IOMX> mOMX; 94 IOMX::node_id mNode; 95 sp<MemoryDealer> mDealer[2]; 96 97 sp<ANativeWindow> mNativeWindow; 98 99 Vector<BufferInfo> mBuffers[2]; 100 bool mPortEOS[2]; 101 102 List<sp<AMessage> > mDeferredQueue; 103 104 status_t allocateBuffersOnPort(OMX_U32 portIndex); 105 status_t freeBuffersOnPort(OMX_U32 portIndex); 106 status_t freeBuffer(OMX_U32 portIndex, size_t i); 107 108 status_t allocateOutputBuffersFromNativeWindow(); 109 status_t cancelBufferToNativeWindow(BufferInfo *info); 110 status_t freeOutputBuffersOwnedByNativeWindow(); 111 BufferInfo *dequeueBufferFromNativeWindow(); 112 113 BufferInfo *findBufferByID( 114 uint32_t portIndex, IOMX::buffer_id bufferID, 115 ssize_t *index = NULL); 116 117 void setComponentRole(bool isEncoder, const char *mime); 118 void configureCodec(const char *mime, const sp<AMessage> &msg); 119 120 status_t setVideoPortFormatType( 121 OMX_U32 portIndex, 122 OMX_VIDEO_CODINGTYPE compressionFormat, 123 OMX_COLOR_FORMATTYPE colorFormat); 124 125 status_t setSupportedOutputFormat(); 126 127 status_t setupVideoDecoder( 128 const char *mime, int32_t width, int32_t height); 129 130 status_t setVideoFormatOnPort( 131 OMX_U32 portIndex, 132 int32_t width, int32_t height, 133 OMX_VIDEO_CODINGTYPE compressionFormat); 134 135 status_t setupAACDecoder(int32_t numChannels, int32_t sampleRate); 136 status_t setMinBufferSize(OMX_U32 portIndex, size_t size); 137 138 status_t initNativeWindow(); 139 140 // Returns true iff all buffers on the given port have status OWNED_BY_US. 141 bool allYourBuffersAreBelongToUs(OMX_U32 portIndex); 142 143 bool allYourBuffersAreBelongToUs(); 144 145 void deferMessage(const sp<AMessage> &msg); 146 void processDeferredMessages(); 147 148 DISALLOW_EVIL_CONSTRUCTORS(ACodec); 149}; 150 151} // namespace android 152 153#endif // A_CODEC_H_ 154