ACodec.cpp revision a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 30afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 321173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 341065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 363a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 373a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 41496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 42f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer("node", omx_msg.node); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer("buffer", omx_msg.u.buffer_data.buffer); 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "platform_private", 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.platform_private); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setPointer( 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "data_ptr", 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.data_ptr); 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs, 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate, 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 169ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 170ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 171ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 172ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 173ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 174ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 175ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 176ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 177ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 178ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 179ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 180ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 181ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 182ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 183ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 184ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 185ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 186ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 192c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 196c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 198ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 199ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 205c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 206c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 207c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 208c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 209c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 210c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 211c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 212c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 213c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 214c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 215c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 222c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 223c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 224c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 258054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 259054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 266349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 267349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 268349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 277349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 278349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 359f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 360afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 361afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mNode(NULL), 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 363c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 364308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 3659806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 3669806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 3679806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 3689806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 369054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 370054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 371054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 372a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 373a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs(-1ll) { 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 375c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 388dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 400f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setTarget(id()); 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 406a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 407a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 408a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 409a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 410a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 411a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4125778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4185778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatCreateInputSurface, id()))->post(); 4267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 4297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatSignalEndOfInputStream, id()))->post(); 4307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4325778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage(kWhatStart, id()))->post(); 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 436f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 4377a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatFlush, id()))->post(); 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 441f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatResume, id()))->post(); 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 445c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 446c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatShutdown, id()); 447c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 448c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 451496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 452496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 453496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 454496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 463054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 464054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 465054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 466054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 467054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Allocating %lu buffers of size %lu on %s port", 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 489ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 490ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 492afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 493afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 494afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 495afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 4961065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 497308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 498308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 499ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 500ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 501ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 502ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 503ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 504ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 505ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 506308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 507308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 508308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 509308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 510ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 512ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 514ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 515ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 516ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 517ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 518ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5201065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 5221065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatBuffersAllocated); 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 534eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 535eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 536eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 538eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 540eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 543eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 549054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 550054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 551054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *minUndequeuedBuffers) { 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 57029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffers_geometry failed: %s (%d)", 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 5763c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis OMX_U32 usage = 0; 5773c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 5783c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis if (err != 0) { 5795ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("querying usage flags from OMX IL component failed: %d", err); 5803c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis // XXX: Currently this error is logged, but not fatal. 5813c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage = 0; 5823c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis } 5833c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis 584bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (mFlags & kFlagIsSecure) { 585bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber usage |= GRALLOC_USAGE_PROTECTED; 586bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 587bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 588bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Make sure to check whether either Stagefright or the video decoder 589bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // requested protected buffers. 590bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (usage & GRALLOC_USAGE_PROTECTED) { 591bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Verify that the ANativeWindow sends images directly to 592bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // SurfaceFlinger. 593bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int queuesToNativeWindow = 0; 594bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query( 595bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 596bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber &queuesToNativeWindow); 597bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != 0) { 598bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error authenticating native window: %d", err); 599bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 600bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 601bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (queuesToNativeWindow != 1) { 602bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("native window could not be authenticated"); 603bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return PERMISSION_DENIED; 604bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 605bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 606bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 6093c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 61229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 616054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 617258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 618258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 619054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 620258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 621258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 62229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 623258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 624258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 625258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 626258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 627258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis // XXX: Is this the right logic to use? It's not clear to me what the OMX 628258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis // buffer counts refer to - how do they account for the renderer holding on 629258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis // to buffers? 630054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (def.nBufferCountActual < def.nBufferCountMin + *minUndequeuedBuffers) { 631054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 newBufferCount = def.nBufferCountMin + *minUndequeuedBuffers; 632258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 633258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 634258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 635258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 636258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != OK) { 63729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] setting nBufferCountActual to %lu failed: %d", 638258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mComponentName.c_str(), newBufferCount, err); 639258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 640258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 641258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 642258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 64729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 652054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 653054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 654054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 655054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 656054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 657054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 658054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 659054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 660054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 661054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 662054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 663054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 6643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Allocating %lu buffers from a native window of size %lu on " 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 666054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 669054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 6708ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 6711e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 67329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 67874006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 67974006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 680054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 68174006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 68274006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 68374006804065941841883c4b46ee785070164023fJamie Gennis 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 68829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("registering GraphicBuffer %lu with OMX IL component failed: " 68974006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69374006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 69474006804065941841883c4b46ee785070164023fJamie Gennis 6953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Registered graphic buffer with ID %p (pointer = %p)", 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 70774006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 709054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 710054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 711054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelBufferToNativeWindow(info); 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 722054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 723054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 724054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 725054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 726054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 727054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 728054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 729054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("[%s] Allocating %lu meta buffers on output port", 730054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 731054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 732054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 733054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 734054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 735054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 736054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 737054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 738054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 739054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 740054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 741054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 742054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 743054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 744054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 745054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 746054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 747054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 748054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 749054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 750054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 751054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 752054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 753054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("[%s] allocated meta buffer with ID %p (pointer = %p)", 754054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 755054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 756054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 757054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 758054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 759054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 760054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 761054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 762054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 763054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 764054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 765054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 766054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 767054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 768054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 769054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 770054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("[%s] submitting output meta buffer ID %p for graphic buffer %p", 771054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 772054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 773054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 774054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 775054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 776054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 777054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 778054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 779054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 780054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 781f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Calling cancelBuffer on buffer %p", 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 7881e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, 0); 791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 797f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 7988ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 7991e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 800054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 8011e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 80229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 803c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 804c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 806054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 811054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 812054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 820054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 821054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 822054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 823054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 824054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 825054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 826054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 827054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 828054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 829054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 830054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 831054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 832054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 833054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 834054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 835054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 836054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 837d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 838d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 839d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 840054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 841d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 842d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 843d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 844d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 845d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 846d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 847054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest - &mBuffers[kPortIndexOutput][0], 848054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 849d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 850d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 851054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 852054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 860f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 870349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8752ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 8762ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 8772ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 8782ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info)); 895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 906f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9255778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 9362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 9372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 9382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 9392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 946729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 947729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 948c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 949c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 950c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 951c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 95894705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 95994705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 96094705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 96194705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 962ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 963ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 9642f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 9652f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 966ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 967ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 10025ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10125778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 10145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 10155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 10282f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 10292f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 10302f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1034d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1035d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1036d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1037d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1038d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1039d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1040d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1041308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1042308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1043d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1044308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1045308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1046308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1047d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1048308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 10493a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 10503a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 10513a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 10523a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 10533a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 10543a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 10553a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 10563a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 10573a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 10583a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 10593a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 10603a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 10613a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 10623a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 10633a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 10643a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 10653a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 10663a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 10673a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 10683a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 10693a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 10703a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 10713a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 10723a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 10733a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 10743a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1075308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1076308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1077308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1078308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 1079308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1080308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1081308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1082308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1083308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1084308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1085308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1086308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1087308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1088308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1089308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1090308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1091308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1092308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1093a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1094a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1095a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1096a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1097a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1098a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 1099308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1100308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1101054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Always try to enable dynamic output buffers on native surface 1102054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 1103054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar int32_t haveNativeWindow = msg->findObject("native-window", &obj) && 1104054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar obj != NULL; 1105054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1106054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (!encoder && video && haveNativeWindow) { 1107054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_TRUE); 1108054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != OK) { 1109054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // allow failure 1110054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1111054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), err); 1112054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = OK; 1113054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 1114054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("[%s] storeMetaDataInBuffers succeeded", mComponentName.c_str()); 1115054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = true; 1116054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1117054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1118054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1119308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height)) { 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoDecoder(mime, width, height); 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 113142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 113242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 113342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 113442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 113542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 113642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 113742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 113842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 113942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 114042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 114142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 114242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 114342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1150aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1151ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1152ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1153ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1154aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1155aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1156aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1157ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1158ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 11594471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 11604471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber isADTS != 0); 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1162729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1164729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1166729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1167729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1168729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1169729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1170729de186450f78c099637e1fce743fe531862c52Andreas Huber 1171729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupG711Codec(encoder, numChannels); 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11772f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 11782f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi int32_t numChannels, sampleRate, compressionLevel = -1; 11792f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 11802f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 11812f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 11822f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 11832f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 11842f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 11852f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1186516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1187516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 11882f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 5;// default FLAC compression level 11892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1190516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1191516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1192516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 11932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 11942f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1195516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1196516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1197516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 11982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 11992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 12002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1201516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1202516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 12032f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1204ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1205ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1206ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1207ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1208ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1209ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1210ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1211ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1212ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1214729de186450f78c099637e1fce743fe531862c52Andreas Huber 12154471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 12164471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 12174471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 12184471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 12198b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 12208b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 12218b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 12229806555d3930be43e11106281dee354820ac1c88Andreas Huber 12238b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 12248b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 12258b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 12268b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 12279806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 12289806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 12299806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 12309806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 12319806555d3930be43e11106281dee354820ac1c88Andreas Huber } 12329806555d3930be43e11106281dee354820ac1c88Andreas Huber 1233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1243f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 13035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13065778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1307aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 1308aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t bitRate, int32_t aacProfile, bool isADTS) { 1309ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1310ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1311ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1312ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13675778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 13685778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1373aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 13745778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 13755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 1387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 1388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 1389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 13905778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 1391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 1398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 1399ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1400ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 1401ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 1402ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 1403ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 1404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 14055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 1406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 14095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 14545778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 1455729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1456729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 1458729de186450f78c099637e1fce743fe531862c52Andreas Huber 1459729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 1460729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1461729de186450f78c099637e1fce743fe531862c52Andreas Huber 1462729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1463729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1464729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1465729de186450f78c099637e1fce743fe531862c52Andreas Huber 1466729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1471729de186450f78c099637e1fce743fe531862c52Andreas Huber 14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1475729de186450f78c099637e1fce743fe531862c52Andreas Huber 14765778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 14775778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 14785778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 14795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 1480729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1481729de186450f78c099637e1fce743fe531862c52Andreas Huber 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1485729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 1486729de186450f78c099637e1fce743fe531862c52Andreas Huber kPortIndexInput, 8000 /* sampleRate */, numChannels); 1487729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1488729de186450f78c099637e1fce743fe531862c52Andreas Huber 14892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 14902f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 14912f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 14922f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 14932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 14942f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 14952f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 14962f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 14972f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 14982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 14992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 15002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 15012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 15022f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 15032f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 15042f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 15052f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 15062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 15072f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 15082f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 15092f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 15102f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 15112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 15122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 15132f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 15142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 15152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 15162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 1517729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 1518729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 1519729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1520729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 1521729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 1522729de186450f78c099637e1fce743fe531862c52Andreas Huber 1523729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 1524729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1525729de186450f78c099637e1fce743fe531862c52Andreas Huber 1526729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1527729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1528729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1529729de186450f78c099637e1fce743fe531862c52Andreas Huber 1530729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 1531729de186450f78c099637e1fce743fe531862c52Andreas Huber 1532729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 1533729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1534729de186450f78c099637e1fce743fe531862c52Andreas Huber 1535729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1536729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1537729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1538729de186450f78c099637e1fce743fe531862c52Andreas Huber 1539729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 1540729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 1541729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 1542729de186450f78c099637e1fce743fe531862c52Andreas Huber 1543729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 1544729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1545729de186450f78c099637e1fce743fe531862c52Andreas Huber 1546729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1547729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1548729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1549729de186450f78c099637e1fce743fe531862c52Andreas Huber 1550729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 1551729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1552729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 1553729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 1554729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 1555729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1556729de186450f78c099637e1fce743fe531862c52Andreas Huber 1557c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 1558c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 1559729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1560729de186450f78c099637e1fce743fe531862c52Andreas Huber 1561729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 1562729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1563729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1564729de186450f78c099637e1fce743fe531862c52Andreas Huber 1565f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 1566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 1567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 1568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 1569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 1572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 1574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 1576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 1577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 1578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 1587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 1588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 1590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 1591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 1592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 1593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 1597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 1598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 1599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 1605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 1606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 1611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 1614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 1615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1624f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setSupportedOutputFormat() { 1625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 1628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 1634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)format.eCompressionFormat, (int)OMX_VIDEO_CodingUnused); 1635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 1637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1641e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 1642e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 1643e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 1644e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 1645e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 1646e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 1647e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 1648e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 164994705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 165094705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 1651e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 1652e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 1655e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 1656e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 1657e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 1658e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 1659e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 1660e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1661e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1664e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 1665e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1666e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 1667e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1668e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1669e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 1670e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 1671e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 1672e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 1673e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 1674e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 1675e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 1676e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1677e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1678e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1679e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1680e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 1681e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1682e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 16835778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, int32_t width, int32_t height) { 16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 1695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 1696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setSupportedOutputFormat(); 1702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 1708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, width, height, compressionFormat); 1709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 1715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 1716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17245778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 17255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 17265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 17275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 17285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17305778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 17315778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 17325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17335778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 17345778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 17355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 17705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17745778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 17775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 17785778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 17795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17815778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 17825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17835778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 17845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17855778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 17865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 17875778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 17885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 17895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 17905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17915778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 17925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17945778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 17955778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 17965778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = colorFormat; 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18025778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 18115778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 18125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18175778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 18185778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 18195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18215778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 18225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 18235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18275778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 18285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18295778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 18305778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 18315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18365778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 18375778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 18385778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 18395778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 18405778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 18415778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 18425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18435778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 18445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 18455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18475778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 18485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 18495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18535778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 18545778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 18555778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 18565778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 18575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18585778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 18595778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 18605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 18615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18625778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 18635778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 18645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 18655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18665778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 18675778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 18685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18705778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 18715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18735778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18750dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 18760dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 18770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 18780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 18790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 18800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 18810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 18820dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 18830dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 18840dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 18850dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 18860dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 18870dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 18880dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 18890dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 18900dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 18910dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 18920dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 18930dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 18940dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 18950dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 18960dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 18970dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 18980dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 18990dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 19000dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 19010dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 19020dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 19030dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 19040dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 19050dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 19060dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 19070dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 19080dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 19090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 19100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 19110dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 19125778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 19135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 19145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 19155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 19165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 19175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19185778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 19195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(ret > 1); 19205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 19215778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 19225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 192396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 192496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 192596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 192696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 192796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 192896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 192996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 193096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 193196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 19325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 19335778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 19345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 19355778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 19365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 19375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 193996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 194096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 19415778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 19425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 19435778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 19445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 19455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 19465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19475778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 19485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19505778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 19515778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 19525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 19535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19545778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 19555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 19565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 19625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 19635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 19645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 19665778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 19675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 19695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 19705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 19715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 19735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 19745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 19755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 19765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 19775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 19785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 19795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19805778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 19815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 19825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 19835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 19845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 19855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 19885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 19945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 19955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19975778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 19985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 19995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 200496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 20055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 20145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 20155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 20165778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 20175778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 20185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 202096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 202196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 20225778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 20235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 20245778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 20255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 20265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 20275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20285778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 20295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20315778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 20325778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 20335778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 20345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20355778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 20365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 20375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20425778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 20435778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 20445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20455778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 20465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 20475778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 20485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20495778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 20505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20515778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 20525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 20535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 20545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 20555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 20565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20585778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 20595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20645778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 20655778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 20665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20685778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 20695778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 20705778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 20715778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 20725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 20755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 208096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 20815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 20875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 20885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20895778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 20905778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 20915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 20925778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 20935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 20945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 209696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 209796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 20985778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 20995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 21005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 21015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 21025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21045778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 21055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21070dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 21080dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 21090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 21100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 21110dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 21120dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 21130dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 21140dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 21150dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 21160dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 21170dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 21185778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 21195778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 21205778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 21215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21220dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 21235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 21245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21295778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 21305778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 21315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21325778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 21335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 21345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 21355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 21365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21395778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 21405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21455778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 21465778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 21475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21495778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 21507c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 21517c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 21527c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 21535778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 21545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 21575778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 21585778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 21595778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 21605778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 21615778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 21625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 21635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 21645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21655778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 21665778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 21675778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 21685778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 21695778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 21705778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 21715778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 21725778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 21735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 21765778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 21775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21795778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 21805778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 21815778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 21825778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 21835778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 21845778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 21855778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 21865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 21885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 21895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 219496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 21955778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 21965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21975778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 21985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 21995778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 22005778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 22015778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 22025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22035778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 22045778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 22055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 22065778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 22075778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 22085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 22095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 22155778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 22165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22175778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 22185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 22195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22215778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 22225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 222396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 222496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 22255778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 22265778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 22275778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 22285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22295778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 22305778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 22315778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 22325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 223796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 22385778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 22395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 22415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 22425778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 22435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 22445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22455778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 22465778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 22475778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 22485778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 22495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22505778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 22515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 22525778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 22535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 22565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22585778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 22595778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 22605778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 22615778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 22625778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 22635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 22655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 22665778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 22675778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 22685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2269f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 2270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat) { 2272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 2274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 2275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 2282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 2285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 2286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 2287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 2288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 2292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 2294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 2295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 2298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 2299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 2302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2307f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 2308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 2309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 2310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 2313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2316d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 2317d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 2318d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2319d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2320d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 2321d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2322d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 2323d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 2324d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2325d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2326d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2327d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 2328d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 2329d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 23307e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 23317e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 23327e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23337e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 23347e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 23357e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23367e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 23377e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 23387e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 23397e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 23407e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23417e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 23427e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 23437e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23447e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 23457e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 23467e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 23477e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 23487e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23497e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber int minUndequeuedBufs = 0; 23507e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber status_t err = mNativeWindow->query( 23517e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 23527e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber &minUndequeuedBufs); 23537e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23547e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (err != OK) { 23557e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ALOGE("[%s] NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 23567e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mComponentName.c_str(), strerror(-err), -err); 23577e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23587e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber minUndequeuedBufs = 0; 23597e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 23607e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 23617e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber while (countBuffersOwnedByNativeWindow() > (size_t)minUndequeuedBufs 23627e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 23637e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 23647e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 23657e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 2366f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 2367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 2368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 2370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 2372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 23733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Buffer %p on port %ld still has status %d", 2374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 2375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 2376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 2377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2383f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 2384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 2385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 2386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2388f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 2389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool wasEmptyBefore = mDeferredQueue.empty(); 2390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 2391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2393f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 2394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 2395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 2396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 2398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 2399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 2400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2403577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 240431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sp<AMessage> notify = mNotify->dup(); 240531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->setInt32("what", kWhatOutputFormatChanged); 240631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 240731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 240831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 240931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber def.nPortIndex = kPortIndexOutput; 241031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 241131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 241231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 241331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 241431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 241531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ((int)def.eDir, (int)OMX_DirOutput); 241631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 241731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 241831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 241931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 242031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 242131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2422e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 2423e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!mIsEncoder) { 2424e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 2425e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else if (GetMimeTypeForVideoCoding( 2426e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber videoDef->eCompressionFormat, &mime) != OK) { 2427e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", "application/octet-stream"); 2428e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 2429e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", mime.c_str()); 2430e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2431e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 243231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->setInt32("width", videoDef->nFrameWidth); 243331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->setInt32("height", videoDef->nFrameHeight); 243431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2435e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!mIsEncoder) { 2436e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("stride", videoDef->nStride); 2437e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("slice-height", videoDef->nSliceHeight); 2438e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("color-format", videoDef->eColorFormat); 2439e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2440e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_CONFIG_RECTTYPE rect; 2441e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(&rect); 2442e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nPortIndex = kPortIndexOutput; 2443e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2444e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mOMX->getConfig( 2445e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexConfigCommonOutputCrop, 2446e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber &rect, sizeof(rect)) != OK) { 2447e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nLeft = 0; 2448e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nTop = 0; 2449e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nWidth = videoDef->nFrameWidth; 2450e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nHeight = videoDef->nFrameHeight; 2451e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2452e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2453e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_GE(rect.nLeft, 0); 2454e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_GE(rect.nTop, 0); 2455e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_GE(rect.nWidth, 0u); 2456e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_GE(rect.nHeight, 0u); 2457e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 2458e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 2459e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2460e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setRect( 2461e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "crop", 2462e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nLeft, 2463e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nTop, 2464e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nLeft + rect.nWidth - 1, 2465e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber rect.nTop + rect.nHeight - 1); 2466e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2467e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mNativeWindow != NULL) { 2468577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar reply->setRect( 2469577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 2470577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 2471577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 2472577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft + rect.nWidth, 2473577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop + rect.nHeight); 2474e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 247531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 247631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 247731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 247831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 247931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 248031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 248131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 248231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2483e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber switch (audioDef->eEncoding) { 2484e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 2485e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2486e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 2487e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2488e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber params.nPortIndex = kPortIndexOutput; 2489e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2490e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2491e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 2492e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2493e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2494e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 249514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 2496e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 2497e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 249814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 249914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 250014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 250114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 250214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 250314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 2504e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2505e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 2506e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2507e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 2508e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mEncoderDelay + mEncoderPadding) { 2509e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t frameSize = params.nChannels * sizeof(int16_t); 2510e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mSkipCutBuffer != NULL) { 2511e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t prevbufsize = mSkipCutBuffer->size(); 2512e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (prevbufsize != 0) { 251314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGW("Replacing SkipCutBuffer holding %d " 251414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber "bytes", 251514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber prevbufsize); 2516e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2517e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 251814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mSkipCutBuffer = new SkipCutBuffer( 251914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEncoderDelay * frameSize, 252014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mEncoderPadding * frameSize); 2521e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2522e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2523e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 2524e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 25258b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 2526e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 25278b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 25289806555d3930be43e11106281dee354820ac1c88Andreas Huber 2529e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 2530e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2531e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 2532e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2533e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber params.nPortIndex = kPortIndexOutput; 2534e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2535e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2536e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 2537e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2538e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2539e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2540e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 2541e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2542e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 2543e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2544e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2545e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2546e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 2547e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2548e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 2549e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2550e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber params.nPortIndex = kPortIndexOutput; 25519806555d3930be43e11106281dee354820ac1c88Andreas Huber 2552e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2553e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 2554e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2555e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2556e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2557e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 2558e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 2559e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 2560e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 2561e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2562e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 2563e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 2564e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 2565e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 2566e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2567e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 2568e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2569e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2570e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2571e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2572e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 2573e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2574e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 2575e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2576e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber params.nPortIndex = kPortIndexOutput; 2577e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2578e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2579e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 2580e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2581e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2582e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2583e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 2584e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2585e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 2586e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2587e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2588e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2589e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 2590e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 2591e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 259231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 259331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 259431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 259531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 259631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 259731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 259831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 259931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 260031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 260131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 260231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 260331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 26045778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 2605cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 2606cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->setInt32("what", ACodec::kWhatError); 2607cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->setInt32("omx-error", error); 26085778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 2609cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 2610cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 2611cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 2612bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huberstatus_t ACodec::pushBlankBuffersToNativeWindow() { 2613bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber status_t err = NO_ERROR; 2614bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ANativeWindowBuffer* anb = NULL; 2615bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int numBufs = 0; 2616bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int minUndequeuedBufs = 0; 2617bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2618bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We need to reconnect to the ANativeWindow as a CPU client to ensure that 2619bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // no frames get dropped by SurfaceFlinger assuming that these are video 2620bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // frames. 2621bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 2622bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 2623bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2624bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 2625bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2626bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2627bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2628bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2629bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 2630bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 2631bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2632bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 2633bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2634bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2635bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2636bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2637bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1, 2638bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber HAL_PIXEL_FORMAT_RGBX_8888); 2639bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2640bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)", 2641bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2642bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2643bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2644bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 264587eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin err = native_window_set_scaling_mode(mNativeWindow.get(), 264687eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 264787eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin if (err != NO_ERROR) { 264887eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin ALOGE("error pushing blank_frames: set_scaling_mode failed: %s (%d)", 264987eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin strerror(-err), -err); 265087eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin goto error; 2651bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2652bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2653bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_usage(mNativeWindow.get(), 2654bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber GRALLOC_USAGE_SW_WRITE_OFTEN); 2655bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2656bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_usage failed: %s (%d)", 2657bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2658bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2659bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2660bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2661bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query(mNativeWindow.get(), 2662bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 2663bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2664bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 2665bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber "failed: %s (%d)", strerror(-err), -err); 2666bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2667bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2668bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2669bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber numBufs = minUndequeuedBufs + 1; 2670bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffer_count(mNativeWindow.get(), numBufs); 2671bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2672bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", 2673bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2674bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2675bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2676bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2677bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push numBufs + 1 buffers to ensure that we've drawn into the same 2678bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // buffer twice. This should guarantee that the buffer has been displayed 2679bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // on the screen and then been replaced, so an previous video frames are 2680bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // guaranteed NOT to be currently displayed. 2681bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber for (int i = 0; i < numBufs + 1; i++) { 26821e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 26831e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb); 2684bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2685bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 2686bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2687bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2688bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2689bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2690bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 2691bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2692bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Fill the buffer with the a 1x1 checkerboard pattern ;) 2693bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber uint32_t* img = NULL; 2694bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 2695bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2696bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: lock failed: %s (%d)", 2697bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2698bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2699bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2700bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2701bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber *img = 0; 2702bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2703bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->unlock(); 2704bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2705bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: unlock failed: %s (%d)", 2706bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2707bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2708bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2709bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2710bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->queueBuffer(mNativeWindow.get(), 27111e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis buf->getNativeBuffer(), -1); 2712bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2713bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", 2714bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2715bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2716bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2717bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2718bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber anb = NULL; 2719bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2720bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2721bc098410be55f9d96f394b3981a0c482b83859b6Andreas Hubererror: 2722bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2723bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2724bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after an error. 2725bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (anb != NULL) { 27261e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow->cancelBuffer(mNativeWindow.get(), anb, -1); 2727bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2728bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2729bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_disconnect(mNativeWindow.get(), 2730bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 2731bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_connect(mNativeWindow.get(), 2732bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 2733bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2734bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2735bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } else { 2736bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after success. 2737bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 2738bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 2739bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2740bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 2741bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2742bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2743bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2744bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2745bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 2746bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 2747bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2748bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 2749bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2750bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2751bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2752bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2753bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return NO_ERROR; 2754bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2755bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber} 2756bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 2758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2759eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 2760eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 2761eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2762496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 2763496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 2764496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 2765496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 2766496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 2767496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 2768496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 2769496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 2770496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 2771496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 2772496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 2773496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 2774496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 2775496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 2776496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 2777496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 2778496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 2779496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 2780eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 2781eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 2782eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 2783eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 2784eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 2785eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2786eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 2787eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 2788eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 2789eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2790eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 2791eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 2792eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 2793eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2794eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 2795eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 2796eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 2797eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2798eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 2799eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 2800f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 2801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 2802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 2803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2805f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode(OMX_U32 portIndex) { 2806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 2807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2809f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 2810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 2811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 2812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 2814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 2818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 2820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 2824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 2826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 28297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 28307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 28317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 28327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 28337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 28347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 28357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2836ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 2837ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 2838ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 2839ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 2840ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 2841ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 2842ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 2843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 2844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 2845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2850f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 2851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 2852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 2853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 2855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("node", &nodeID)); 2856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 2857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 2859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 2860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 2862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 2863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 2864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 2865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28660af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 28670af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 28680af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 28690af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 28700af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 28710af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 28720af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 28730af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 28740af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 28750af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 28760af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 2877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 2878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 2879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 2880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 2881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 2884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 2886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer", &bufferID)); 2887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 2889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 2892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 2894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer", &bufferID)); 2895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 2897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 2898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate; 2899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr; 2900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 2902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 2903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 2904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 2905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("platform_private", &platformPrivate)); 2906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("data_ptr", &dataPtr)); 2907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 2909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 2910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 2911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 2912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs, 2913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber platformPrivate, 2914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber dataPtr); 2915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 2918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 2919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2923f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 2924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 2925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 29263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 2927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 2928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 2930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 293229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1); 2933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2934cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError((OMX_ERRORTYPE)data1); 2935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2939f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 29403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] onOMXEmptyBufferDone %p", 2941349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 2942349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 2943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 2944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 2945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 2947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 2948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2949d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<AMessage> &bufferMeta = info->mData->meta(); 2950d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void *mediaBuffer; 2951d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (bufferMeta->findPointer("mediaBuffer", &mediaBuffer) 2952d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && mediaBuffer != NULL) { 2953d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // We're in "store-metadata-in-buffers" mode, the underlying 2954d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // OMX component had access to data that's implicitly refcounted 2955d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // by this "mediaBuffer" object. Now that the OMX component has 2956d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // told us that it's done with the input buffer, we can decrement 2957d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // the mediaBuffer's reference count. 295896fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 295996fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("releasing mbuf %p", mediaBuffer); 296096fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 2961d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ((MediaBuffer *)mediaBuffer)->release(); 2962d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mediaBuffer = NULL; 2963d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 2964d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferMeta->setPointer("mediaBuffer", NULL); 2965d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 2966d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 2967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 2968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 2970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 2971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 2974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 2975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 2978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 2980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 2981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2988f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 2989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 2990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 2991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 2994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 2996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFillThisBuffer); 2997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setPointer("buffer-id", info->mBufferID); 2998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 30002d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 3001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id()); 3003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setPointer("buffer-id", info->mBufferID); 3004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 3006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 3010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3012f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 3013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 3015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30162d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 3017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 30185778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 30195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 3021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 3022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] saw error %d instead of an input buffer", 30243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mCodec->mComponentName.c_str(), err); 30253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 30262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 30275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30285778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 3029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30315778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 30325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 30335778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 30345778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 30355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 3038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 3039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 3043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 30475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 3048dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 3049dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 3050dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 3051dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 30585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 3059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 3060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 3061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 3063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 3065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 3066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 3067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 30705778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 30715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 3074d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGV("[%s] Needs to copy input data for buffer %p. (%p != %p)", 3075d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 3076d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 3077d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 3078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 3080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 3081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3083078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 30843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ codec specific data", 3085078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 30865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 30875778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling emptyBuffer %p w/ EOS", 30885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 3089078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 3090d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3091d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("[%s] calling emptyBuffer %p w/ time %lld us", 3092d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3093d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 30943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ time %lld us", 3095078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3096d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3097078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 3098349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3099d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3100d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 3101d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 3102d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 3103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 3104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3106054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 3107054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 3108054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 3109054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3110054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 3111054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 3112054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 3113054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 3114054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 3115054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mCodec->submitOutputMetaDataBuffer(), 3116054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 3117054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3118054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3119054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 3125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 3126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 3127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 31325778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 31335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 31345778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 31355778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 31365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 31385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 31395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 3141dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 31423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 3143dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 3144dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 3145dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 31463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 3147dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 3148dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p signalling EOS", 3151349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 3152349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 3159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 3160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 3165dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 3166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3176f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 3177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 3178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 3182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 3184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 3185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 3187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 3188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 3189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 3192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 3194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 3195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 3199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 3203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3205f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 3206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 3207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 3208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 3209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs, 3210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *platformPrivate, 3211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void *dataPtr) { 32125778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] onOMXFillBufferDone %p time %lld us, flags = 0x%08lx", 32135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 3214349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 3216d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3217d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3218d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 3219d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 3220d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 3221d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 3222d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3223d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 3224d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 3225d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 3226d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3227d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 3228d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 3229d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 3230d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3231d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 3234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 3236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3237054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 3238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 3241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 32485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (rangeLength == 0 && !(flags & OMX_BUFFERFLAG_EOS)) { 32495778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling fillBuffer %p", 32505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 3251349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 32525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 32535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 32545778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 3255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32565778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 32575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 32585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 325931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3260577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 3261577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec->id()); 3262577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 3263e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!mCodec->mSentFormat) { 3264577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 32655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3267308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 3268308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 3269308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 3270308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 3271308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 3272308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 3273308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 3274308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 3275308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 3276496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 327721ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 3278496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 3279496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 3280496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 32815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 328221ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 3283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32848b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 32858b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 32868b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 32875778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 3288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 32905778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatDrainThisBuffer); 32915778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setPointer("buffer-id", info->mBufferID); 32922d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 32935778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 3294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32955778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->setPointer("buffer-id", info->mBufferID); 3296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32975778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 3298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32995778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 33005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 33015778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 3302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 33045778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 33055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatEOS); 3308dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 3309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 3312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 3321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 3322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3329f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 3330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 3332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 3334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 3336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 3337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3338577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 3339577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 3340577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 3341577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 3342577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 3343577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 3344577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 3345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 3346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 33476aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 33486aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && (info->mData == NULL || info->mData->size() != 0)) { 3349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 3350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33515778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 33525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 3353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 33541e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 3355cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 3356cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 33575778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 3358cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3359cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 3360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 3365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 3370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 3373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 3374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 3376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 3383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 3385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 3386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 3388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 33913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 3392c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 3393349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3394c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 3395c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 3396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3397c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3398c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 3399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 3408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 3409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3416f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 3417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 3418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3420c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 3421c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 3422ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3423ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 3424ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); 3425ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 3426ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3427ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3428ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 3429ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNode = NULL; 3430ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 3431ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 3432ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 3433308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 3434ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 3435c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3436c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3437f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 3438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 3439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 3442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 3444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34495778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 34505778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 34515778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 34525778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 34535778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 34545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 34555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 3457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3458c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 3459c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 3460c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 3461c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(!keepComponentAllocated); 3462c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatShutdownCompleted); 3465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3468c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 3469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 3472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 3475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3478c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 3479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 3483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 3486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3488f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 3489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 3490c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 3491c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 3492c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 3493c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 34945778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 34955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3496c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 34975778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 34985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3499c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(mCodec->mNode == NULL); 35005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 3502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 3503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 3505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3506ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id()); 3507ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3508ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 3509ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { 3510ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 3511ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 3512ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 3513ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3514ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3515e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 35165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 3518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35195778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 3520d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 35215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 3522e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 3523e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 3524e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 3525afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 3526e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 3527e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 3528e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 3529afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 35305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 35315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 35325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 35335778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 35345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 35355778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 35365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 35375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 35385778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 35395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 35405778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 35415778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 35425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 3543e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 35445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 35451065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 35461065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 35471065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber IOMX::node_id node = NULL; 35481065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 35491065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 35501065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 3551e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 3552e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 3553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3554078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber pid_t tid = androidGetTid(); 3555078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 3556078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 35571065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber status_t err = omx->allocateNode(componentName.c_str(), observer, &node); 3558078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 3559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35601065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 35611065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 35621065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 35631065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 35641065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber node = NULL; 35651065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 35661065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 3567c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (node == NULL) { 35685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 35695778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Unable to instantiate a decoder for type '%s'.", 35705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str()); 35715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 35725778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Unable to instantiate decoder '%s'.", componentName.c_str()); 35735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3574c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 3575cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError(OMX_ErrorComponentNotFound); 3576c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 3577c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 3578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3579ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber notify = new AMessage(kWhatOMXMessage, mCodec->id()); 3580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 3581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 3583ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 3584ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3585ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 3586ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 3587ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 3588ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3589afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 3590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 3591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 3592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35935778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 35945778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 35955778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatComponentAllocated); 35965778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 35975778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 35985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3599c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3600c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 3601c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3602c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 36035778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 36045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3605c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3606c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3607c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 3608c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 3609c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3610c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3611c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 3612c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 3613c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3614f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 3615f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 3616f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 3617f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 3618f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 3619054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 3620054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 3621a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 3622054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3623c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 3624c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 3625c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3626c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 3627c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 3628c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3629c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 3630c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3631c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3632c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3633c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 3634c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 3635c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 3636c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3637c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 3638c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3639c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3640c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3641c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->setInt32("what", ACodec::kWhatShutdownCompleted); 3642c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 3643c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3644c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3645c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 3646c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 3647c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3648c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 3649c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 3650c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 3651c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 3652c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 3653c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 3654c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3655c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 36567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 36577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 36587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 36597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 36607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 36617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 36627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3663c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 3664c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 3665c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 3666c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 3667c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 3668c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3669c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3670c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 3671c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 3672c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 3673c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 3674c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 3675c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3676c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 3677c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3678c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 3679c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 3680c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3681c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3682c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 3683c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 3684c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3685c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 3686c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 3687c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3688c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 3689c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 3690c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3691c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3692c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 3693c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 3694c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3695c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3696c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 3697c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3698c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3699c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 37005778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 37015778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 37025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mCodec->mNode != NULL); 37045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37055778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 37065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 37075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37085778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 37095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 3711c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 3712c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 3713c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 37145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 3715c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 37165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 3719386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (msg->findObject("native-window", &obj) 37205778822d86b0337407514b9372562b86edfa91cdAndreas Huber && strncmp("OMX.google.", mCodec->mComponentName.c_str(), 11)) { 37211173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<NativeWindowWrapper> nativeWindow( 37221173118eace0e9e347cb007f0da817cee87579edGlenn Kasten static_cast<NativeWindowWrapper *>(obj.get())); 37231173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(nativeWindow != NULL); 37241173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mCodec->mNativeWindow = nativeWindow->getNativeWindow(); 37251ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber 37261ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber native_window_set_scaling_mode( 37271ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber mCodec->mNativeWindow.get(), 37281ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 3729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, mCodec->initNativeWindow()); 3731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 37325778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 37335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 37345778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatComponentConfigured); 37355778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 37365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3737c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3738c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 37395778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 37405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::LoadedState::onCreateInputSurface( 37427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden const sp<AMessage> &msg) { 37437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGV("onCreateInputSurface"); 37447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 37457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> notify = mCodec->mNotify->dup(); 37467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("what", ACodec::kWhatInputSurfaceCreated); 37477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 37487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> bufferProducer; 37497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 37507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 37517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden err = mCodec->mOMX->createInputSurface(mCodec->mNode, kPortIndexInput, 37527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden &bufferProducer); 3753a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 3754a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err == OK && mCodec->mRepeatFrameDelayUs > 0ll) { 3755a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 3756a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 3757a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 3758a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 3759a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 3760a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 3761a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 3762a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 3763a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 3764a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 3765a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 3766a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 3767a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 3768a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 3769a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 37707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 37717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 37727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 37737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 37747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 37757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 37767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 37777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 37787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 37797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 37807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 37817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 37827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 37837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3784c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 37855778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 37865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 37875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 37885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 3789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 3792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3796f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 3797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 3798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3800f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 38013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 3802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3803cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 3804cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 380529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 3806cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 3807cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 3808cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 38095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 381091bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 381191bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 3812cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 3813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3815f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 3816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 3817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 3819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 3820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 3823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3825f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 3826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 3828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 3830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38336507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 38346507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 38356507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 38366507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 38376507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 38386507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 38396463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 38406463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 38416463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 38426463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 38436463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 38446463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 38456463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 38466463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 38476463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 38486463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 38496463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->setInt32("what", ACodec::kWhatFlushCompleted); 38506463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 38516463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 38526463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 38536463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 3854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 3856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3859f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 3860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 3861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 3862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 3863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 3865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 3866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 3868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 3869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 3872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 3878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3883f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 3884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 3885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3887f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 38883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 3889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3891f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 3892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 3894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 3896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3899d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 3900d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 3901d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 3902d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 3903d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 3904d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 3905d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 3906d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 3907d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 3908d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3909d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 3910d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 3911d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 3912d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 3913d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 3914d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 39156507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 39166507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 39176507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 39186507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 39196507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 39206507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 3921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 3923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3926f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 3927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 3928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 3929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 3930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 3932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 3933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 3935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 3936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 3942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3947f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 3948349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 3949349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 3950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3952f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 3953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 3954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 3955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3957054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 3958054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 3959054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 3960054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 3961054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 3962054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3963054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 3964054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 3965054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 3966054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3968054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 3969054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3970054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 3971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 3972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 3973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 3975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 3976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 3977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 3980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 3983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 3986349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 3987349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 3989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3995054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 3996054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 3997054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 3998054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 3999054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitRegularOutputBuffers(); 4000054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4001054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 4002054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4003f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 4004349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 40053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 4006349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 4007349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4008349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 4009349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4010349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 4012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Post the first input buffer. 4014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 4015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(0); 4016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4018349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4019349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 4020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4022f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 40233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 4024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 4026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4028f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 4029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4034c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4035c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4036c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 4037c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4038c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 4039c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 4040c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4041349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4042349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 4045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 4048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 40557a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 4056d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber "(codec owns %d/%d input, %d/%d output).", 4057d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 4058d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 4059d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 4060d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 4061d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 4062d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4063349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4064349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 4067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 4070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 4075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 4077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4082496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 4083496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 4084496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 4085496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 4086496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 4087496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4088496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4089496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 4090496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 4091496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4092496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4093a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 4094a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 4095a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 4096a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 4097a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4098a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 4099a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4100a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 4101a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 4102a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 4103a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 4104a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4105a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4106a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 4107a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 4108a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4109a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 41107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 41117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 41126507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 41137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 41147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 41157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4125a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 4126a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 4127a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (params->findInt32("videoBitrate", &videoBitrate)) { 4128a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 4129a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 4130a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 4131a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 4132a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4133a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 4134a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 4135a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 4136a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 4137a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 4138a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4139a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 4140a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 4141a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 4142a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4143a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 4144a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4145a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4146a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4147e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 4148e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 4149e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 4150e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 4151e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber CHECK_EQ((status_t)OK, 4152e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mOMX->setInternalOption( 4153e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 4154e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 4155e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 4156e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 4157e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber sizeof(suspend))); 4158e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 4159e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 4160a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 4161a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 4162a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 41636507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 41646507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 41656507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("what", ACodec::kWhatSignaledInputEOS); 41666507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 41676507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 41686507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 41696507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 41706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 41716507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 41726507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 41736507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 4174f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 4175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 4180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 418131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 4182054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 4186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4188349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 4189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 419131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 419231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 4193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 41943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 4195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 4202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4213f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 4214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 4215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4218f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 4219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 4221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4236349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4238349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 42393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 4240349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4241349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4255f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 42563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 4257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 4261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 4266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 4267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 4269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 4272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 4276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4278cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 4279cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 4280cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 428129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 4282cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 4283cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 4284cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 42855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 4286d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4287755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 4288755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 4289755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 4290755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 4291755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 4292755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 4293755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 4294755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4295cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 4296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 430131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 430231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 43033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4306349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 4307349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 4308349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4309349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 4311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4325f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 43265778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 43275778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 4328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 4331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 4345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4358f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 43593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 436031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 43615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 436231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 4363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4365f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 4366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 4372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 43745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4380349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 4381349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 4382349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 4383349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 4384349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 4385349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4386349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 43910af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4392f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 43935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 4394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 4396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 4399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 4400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4401bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (mCodec->mFlags & kFlagIsSecure && mCodec->mNativeWindow != NULL) { 4402bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 4403bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 4404bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 4405bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 4406bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mCodec->pushBlankBuffersToNativeWindow(); 4407bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4408bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 4410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4413f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 4414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 4416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4420f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 4421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 4423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4429f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 4430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4433f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 4434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 4440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 4448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 4449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4461f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 44623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 4463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4465f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 4466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 4472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4473c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4485f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 44903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 4491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 4493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4495f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 4496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 4508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4520f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 4521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 45227a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] FlushingState onOMXEvent(%d,%ld)", 4523d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), event, data1); 4524d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 4529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 4531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 4532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 4533e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 4534e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 4535e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 4536e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 4537e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 4538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 4539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 4540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 4541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 4542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4549349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 4550349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 4551349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec->id()); 4552349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 4553349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setPointer("node", mCodec->mNode); 4554349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 4555349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 4556349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 4557349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 45583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 4559349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 4560349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4561349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 4562349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4563349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 4564349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4565349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4573f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 4574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 4575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4579f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 4580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 4581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4585f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 4586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 4587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 4588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 45897e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 45907e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 45917e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 45927e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 4593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 4595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4600dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 4601dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 4602f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 4603f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 4604f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 4605f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 4606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 4607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 4611