ACodec.cpp revision f933441648ef6a71dee783d733aac17b9508b452
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec" 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer("node", omx_msg.node); 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer("buffer", omx_msg.u.buffer_data.buffer); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "platform_private", 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.platform_private); 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "data_ptr", 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.data_ptr); 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs, 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate, 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ErrorState : public ACodec::BaseState { 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ErrorState(ACodec *codec); 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ErrorState); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mNode(NULL) { 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mErrorState = new ErrorState(this); 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 321f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 328f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setTarget(id()); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 334f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatFlush, id()))->post(); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 338f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatResume, id()))->post(); 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 342f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateShutdown() { 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatShutdown, id()))->post(); 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allocateOutputBuffersFromNativeWindow(); 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Allocating %lu buffers of size %lu on %s port", 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferCountActual, def.nBufferSize, 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber portIndex == kPortIndexInput ? "input" : "output"); 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "OMXCodec"); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mem.get() != NULL); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id buffer; 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->allocateBufferWithBackup(mNode, portIndex, mem, &buffer); 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#else 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &buffer); 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo info; 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mBufferID = buffer; 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].push(info); 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("native_window_set_buffers_geometry failed: %s (%d)", 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Increase the buffer count by one to allow for the ANativeWindow to hold 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // on to one of the buffers. 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferCountActual++; 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX TODO: Get the gralloc usage flags from the OMX plugin! 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX TODO: Do something so the ANativeWindow knows that we'll need to get 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the same set of buffers. 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Allocating %lu buffers from a native window of size %lu on " 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), def.nBufferCountActual, def.nBufferSize); 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 i; 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < def.nBufferCountActual; i++) { 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber android_native_buffer_t *buf; 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf); 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Registered graphic buffer with ID %p (pointer = %p)", 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo info; 484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mBufferID = bufferId; 485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mData = new ABuffer(0); 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info.mGraphicBuffer = graphicBuffer; 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[kPortIndexOutput].push(info); 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelEnd = i; 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Return the last two buffers to the native window. 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX TODO: The number of buffers the native window owns should 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // probably be queried from it when we put the native window in 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // fixed buffer pool mode (which needs to be implemented). 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Currently it's hard-coded to 2. 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = def.nBufferCountActual - 2; 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelEnd = def.nBufferCountActual; 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelBufferToNativeWindow(info); 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Calling cancelBuffer on buffer %p", 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), info->mGraphicBuffer.get()); 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, 0); 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 533f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber android_native_buffer_t *buf; 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf), 0); 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mGraphicBuffer->handle == buf->handle) { 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeOutputBuffersOwnedByNativeWindow() { 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo::OWNED_BY_NATIVE_WINDOW) { 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info)); 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 600f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 619f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setComponentRole( 620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGW("[%s] Failed to set standard component role '%s'.", 677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 682f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::configureCodec( 683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber setComponentRole(false /* isEncoder */, mime); 685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strncasecmp(mime, "video/", 6)) { 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, height; 688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("width", &width)); 689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("height", &height)); 690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(setupVideoDecoder(mime, width, height), 692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("channel-count", &numChannels)); 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("sample-rate", &sampleRate)); 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(setupAACDecoder(numChannels, sampleRate), (status_t)OK); 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(setMinBufferSize(kPortIndexInput, (size_t)maxInputSize), 707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(setMinBufferSize(kPortIndexInput, 8192), // XXX 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 714f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setupAACDecoder(int32_t numChannels, int32_t sampleRate) { 752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; 766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 773f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setSupportedOutputFormat() { 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)format.eCompressionFormat, (int)OMX_VIDEO_CodingUnused); 843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00; 845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar 847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || format.eColorFormat == OMX_COLOR_FormatCbYCrY 849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar); 850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 856f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setupVideoDecoder( 857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, int32_t width, int32_t height) { 858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; 859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) { 860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber compressionFormat = OMX_VIDEO_CodingAVC; 861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { 862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber compressionFormat = OMX_VIDEO_CodingMPEG4; 863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { 864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber compressionFormat = OMX_VIDEO_CodingH263; 865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = setVideoPortFormatType( 870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setSupportedOutputFormat(); 877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, width, height, compressionFormat); 884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat) { 902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 937f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 946f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Buffer %p on port %ld still has status %d", 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 963f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 968f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool wasEmptyBefore = mDeferredQueue.empty(); 970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 973f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 985f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 990f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode(OMX_U32 portIndex) { 991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 994f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 1005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 1021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("node", &nodeID)); 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 1040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer", &bufferID)); 1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 1048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 1051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer", &bufferID)); 1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate; 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr; 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("platform_private", &platformPrivate)); 1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("data_ptr", &dataPtr)); 1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 1068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 1071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs, 1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber platformPrivate, 1073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber dataPtr); 1074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1082f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGE("[%s] ERROR(0x%08lx, 0x%08lx)", 1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data1, data2); 1093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mErrorState); 1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 1102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 1109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 1113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 1114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 1120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFillThisBuffer); 1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setPointer("buffer-id", info->mBufferID); 1137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setObject("buffer", info->mData); 1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id()); 1142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setPointer("buffer-id", info->mBufferID); 1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 1149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!msg->findObject("buffer", &obj)) { 1158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber obj.clear(); 1161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 1164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 1171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 1173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer == NULL) { 1176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 1177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 1182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != NULL) { 1184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mCodec->mPortEOS[kPortIndexInput]); 1185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 1187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 1188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 1190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 1192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 1193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 1194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 1197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 1198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Needs to copy input data.", 1199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 1200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 1203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 1204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 1207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 1208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 1209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 1210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 1211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 1212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 1213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber getMoreInputDataIfPossible(); 1218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 1219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Signalling EOS on the input port", 1220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 1221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 1223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 1224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 1225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 1226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 1227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 1228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 1229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 1234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 1239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1244f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 1245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 1246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 1250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 1252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 1253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 1255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 1257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 1260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 1262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 1263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 1267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 1271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 1274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 1275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 1276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 1277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs, 1278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate, 1279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr) { 1280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 1281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 1283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 1285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 1289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 1291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 1292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 1295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (rangeLength == 0) { 1297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!(flags & OMX_BUFFERFLAG_EOS)) { 1298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 1299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, info->mBufferID), 1300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 1305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow == NULL) { 1306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->setRange(rangeOffset, rangeLength); 1307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 1310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatDrainThisBuffer); 1313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setPointer("buffer-id", info->mBufferID); 1314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setObject("buffer", info->mData); 1315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = 1317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatOutputBufferDrained, mCodec->id()); 1318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setPointer("buffer-id", info->mBufferID); 1320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 1322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 1326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 1329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatEOS); 1331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 1334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 1341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 1343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 1344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1351f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 1352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 1353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 1354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 1356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 1358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 1359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 1361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 1362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && msg->findInt32("render", &render) && render != 0) { 1363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 1364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mNativeWindow->queueBuffer( 1366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 1367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mGraphicBuffer.get()), 1368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0); 1369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 1371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 1372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 1376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 1378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 1379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 1381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 1383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 1384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 1385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 1387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 1392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 1394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 1395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 1396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 1397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 1399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 1402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 1412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 1414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 1415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1422f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 1423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1426f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 1427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 1428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 1431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 1433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 1439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatShutdownCompleted); 1442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 1448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 1451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 1458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 1461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1463f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 1464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 1465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 1466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 1467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 1469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 1471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findString("mime", &mime)); 1472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString componentName; 1474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 1476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber componentName = "OMX.Nvidia.h264.decode"; 1477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) { 1478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber componentName = "OMX.Nvidia.aac.decoder"; 1479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_MPEG)) { 1480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber componentName = "OMX.Nvidia.mp3.decoder"; 1481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 1482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<CodecObserver> observer = new CodecObserver; 1486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id node; 1488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(omx->allocateNode(componentName.c_str(), observer, &node), 1489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = new AMessage(kWhatOMXMessage, mCodec->id()); 1492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 1493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 1495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 1496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 1497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->configureCodec(mime.c_str(), msg); 1499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findObject("surface", &obj)) { 1502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow = static_cast<Surface *>(obj.get()); 1503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, mCodec->initNativeWindow()); 1506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(omx->sendCommand(node, OMX_CommandStateSet, OMX_StateIdle), 1508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 1511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1515f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 1516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1519f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 1521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(allocateBuffers(), (status_t)OK); 1523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1525f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 1526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 1527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 1533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1535f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 1536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 1540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 1545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1548f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 1549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 1552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 1554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 1555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 1558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 1561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 1567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1572f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 1573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1576f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 1577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 1578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1580f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 1581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 1585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 1590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1593f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 1594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 1597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 1599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 1600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 1602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 1603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 1609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1614f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 1615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1618f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 1619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 1620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 1621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1623f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::submitOutputBuffers() { 1624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 1625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 1626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 1628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 1629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 1630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 1632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 1633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->mNativeWindow->lockBuffer( 1636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 1637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mGraphicBuffer.get()); 1638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 1639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 1640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 1641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 1644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1650f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 1651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 1652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Post the first input buffer. 1654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 1655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(0); 1656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 1658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1660f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 1661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Executing", mCodec->mComponentName.c_str()); 1662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 1664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1666f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 1667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 1668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 1674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 1677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 1683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 1686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 1689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 1695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 1697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 1704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 1708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1710f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 1711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 1714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 1716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == OMX_IndexParamPortDefinition) { 1718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 1720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 1721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 1724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 1725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeOutputBuffersOwnedByNativeWindow()); 1726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 1729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 1730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 1731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 1732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 1738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 1744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1749f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 1750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 1751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1754f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 1755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 1756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 1757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 1758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 1761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 1763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1765f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 1766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 1767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 1768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 1771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 1774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 1780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 1784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1786f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 1787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now handling output port settings change", 1788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 1789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1791f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 1792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 1795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 1797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 1798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Output port now disabled.", 1800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 1801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 1803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 1804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 1807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->allocateBuffersOnPort(kPortIndexOutput), 1810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 1814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 1815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGV("[%s] Output port now reenabled.", 1817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 1818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 1820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 1821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 1826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 1830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1835f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 1836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1839f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 1840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 1841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 1844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 1846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 1847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 1854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1867f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 1869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1871f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 1872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 1875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 1877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 1878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 1880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 1886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1888f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 1889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->allYourBuffersAreBelongToUs()) { 1890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 1891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 1892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 1895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 1896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 1898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1901f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 1902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 1903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 1904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 1906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1908f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 1909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 1910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 1911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 1913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1917f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 1918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1921f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 1922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 1923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 1925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 1926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 1928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 1930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 1934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 1936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 1937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 1943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 1947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1949f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 1950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 1951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1953f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 1954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 1955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 1956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 1957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 1959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 1960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Loaded", mCodec->mComponentName.c_str()); 1962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 1964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.clear(); 1966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = NULL; 1967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX.clear(); 1968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.clear(); 1969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 1971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 1973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatShutdownCompleted); 1974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 1975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 1977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 1980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 1981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1986f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ErrorState::ErrorState(ACodec *codec) 1987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 1988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1990f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ErrorState::onMessageReceived(const sp<AMessage> &msg) { 1991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 1992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1994f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ErrorState::stateEntered() { 1995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now in ErrorState", mCodec->mComponentName.c_str()); 1996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1998f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ErrorState::onOMXEvent( 1999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 2000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2); 2001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 2005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2006f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 2007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 2008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2010f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 2011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOGI("[%s] Now Flushing", mCodec->mComponentName.c_str()); 2012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 2014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2016f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 2017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 2018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 2020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 2021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 2023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 2027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 2029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 2030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 2034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 2035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 2039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2041f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 2042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 2043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 2044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 2045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 2047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 2049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 2050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 2051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 2052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 2053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 2054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 2055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 2057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 2063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 2064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2069f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 2070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 2071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 2073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2075f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 2076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 2077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 2079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2081f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 2082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 2083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 2084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 2085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 2086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 2087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 2088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 2090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 2091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 2093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 2097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2098