ACodec.cpp revision 609b815a3131d22da38b2f452faa9f89daad4039
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 20609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#include <inttypes.h> 216fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar#include <utils/Trace.h> 226fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 33afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 351173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 371065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 403a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 4497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 47496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 71609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 84609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 90609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 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, 158784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 168ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 169ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 170ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 171ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 172ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 173ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 174ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 175ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 176ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 177ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 178ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 179ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 180ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 181ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 182ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 183ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 184ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 190c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 194c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 197ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 204c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 205c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 206c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 207c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 208c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 209c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 210c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 211c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 212c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 213c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 215c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 222c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 256054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 257054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 264349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 265349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 266349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 275349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 276349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 358afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 359609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 361c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 362308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 3639806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 36454b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 3659806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 3669806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 3679806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 368054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 369054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 370054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 371a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 37294ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 3732c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 3742c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 375609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 37672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended(false) { 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 378c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 391dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 403f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setTarget(id()); 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 409a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 410a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 411a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 412a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 413a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 414a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4155778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4215778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatCreateInputSurface, id()))->post(); 4297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 4327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatSignalEndOfInputStream, id()))->post(); 4337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4355778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage(kWhatStart, id()))->post(); 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 4407a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatFlush, id()))->post(); 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 444f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatResume, id()))->post(); 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 448c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 449c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatShutdown, id()); 450c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 451c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 454496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 455496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 456496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 457496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4584dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 4594dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 4604dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 4614dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 4624dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 4634dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 4644dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 4654dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 4664dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, id()))->post(); 4674dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 4684dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 4694dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 478054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 479054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 480054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 481054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 482054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 492609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 504ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 505ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 507afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 508afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 509afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 510afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 5111065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 512308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 513308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 514ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 515ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 516ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 517ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 518ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 519ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 520ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 521308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 522308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 523308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 524308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 525ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 527ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 529ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 530ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 531ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 532ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 533ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5351065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 5371065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5381065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatBuffersAllocated); 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 549eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 550eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 551eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 553eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 555eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 558eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 564054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 565054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 566054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *minUndequeuedBuffers) { 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 58529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffers_geometry failed: %s (%d)", 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 5913c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis OMX_U32 usage = 0; 5923c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 5933c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis if (err != 0) { 5945ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("querying usage flags from OMX IL component failed: %d", err); 5953c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis // XXX: Currently this error is logged, but not fatal. 5963c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage = 0; 5973c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis } 5983c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis 599bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (mFlags & kFlagIsSecure) { 600bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber usage |= GRALLOC_USAGE_PROTECTED; 601bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 602bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 603bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Make sure to check whether either Stagefright or the video decoder 604bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // requested protected buffers. 605bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (usage & GRALLOC_USAGE_PROTECTED) { 606bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Verify that the ANativeWindow sends images directly to 607bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // SurfaceFlinger. 608bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int queuesToNativeWindow = 0; 609bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query( 610bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 611bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber &queuesToNativeWindow); 612bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != 0) { 613bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error authenticating native window: %d", err); 614bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 615bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 616bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (queuesToNativeWindow != 1) { 617bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("native window could not be authenticated"); 618bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return PERMISSION_DENIED; 619bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 620bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 621bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 6243c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 62729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 631054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 632258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 633258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 634054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 635258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 636258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 63729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 638258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 639258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 640258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 641258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 642e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 643e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 6441faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 6451faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 646e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 647e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 648e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 649e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 650e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 651e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 652e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 6531faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 6541faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 655e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 656e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 657258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 658258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 659258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 660258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 661e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 662e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 663e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 664e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 665e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 666609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 667e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 668e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 669e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 670258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 671258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 672258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 673258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 67829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 683054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 684054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 685054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 686054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 687054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 688054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 689054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 690054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 691054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 692054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 693054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 694e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 695054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 696609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 698054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 701054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 7028ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 7031e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 70529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 71074006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 71174006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 712054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 71374006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 71474006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 71574006804065941841883c4b46ee785070164023fJamie Gennis 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 720609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 72174006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72574006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 72674006804065941841883c4b46ee785070164023fJamie Gennis 727609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 73974006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 741054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 742054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 743054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelBufferToNativeWindow(info); 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 754054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 755054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 756054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 757054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 758054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 759054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 760e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 761054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 762609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 763054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 764054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 765054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 766054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 767054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 768054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 769054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 770054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 771054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 772054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 773054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 774054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 775054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 776054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 777054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 778054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 779054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 780054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 781054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 782054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 783054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 784054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 785054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 786609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 787054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 788054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 789054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 790054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 791054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 792054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 793054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 794054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 795054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 796054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 797054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 798054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 799054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 800054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 801054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 802054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 803609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 804054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 805054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 806054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 807054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 808054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 809054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 810054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 811054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 812054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 813054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 814f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 817609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 8211e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, 0); 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 830f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 8318ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 8321e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 833054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 8341e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 83529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 836c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 837c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 839054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 844054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 845054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 853054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 854054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 855054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 856054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 857054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 858054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 859054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 860054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 861054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 862054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 863054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 864054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 865054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 866054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 867054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 868054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 869054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 870d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 871d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 872d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 873054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 874d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 875d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 876d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 877d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 878d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 879d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest - &mBuffers[kPortIndexOutput][0], 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 882d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 883d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 884054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 903349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9082ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 9092ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 9102ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 9112ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info)); 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 939f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 9692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 9702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 9712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 9722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 979729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 980729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 981bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 982bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 983c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 984c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 985c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 986c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 99394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 99494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 99594705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 99694705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 997ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 998ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 9992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 10002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1001ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1002ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1003774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1004774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 100597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 100697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 10415ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1058e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 1059e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> outputFormat = new AMessage(); 1060e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 10702f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 10712f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 10722f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1076d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1077d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1078d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1079d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1080d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1081d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1082d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1083308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1084308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1085d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1086308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1087308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1088308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1089d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1090308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 10913a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 10923a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 10933a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 10943a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 10953a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 10963a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 10973a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 10983a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 10993a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11003a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 11013a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 11023a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 11033a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 11043a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11053a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 11063a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 11073a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11083a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11093a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 11103a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 11113a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 11123a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11133a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 11143a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11153a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11163a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1117308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1118308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1119308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1120308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 1121308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1122308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1123308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1124308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1125308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1126308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1127308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1128308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1129308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1130308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1131308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1132308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1133308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1134308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1135a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1136a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1137a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1138a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1139a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1140a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 114194ee4b708acfa941581160b267afb79192b1d816Chong Zhang 114294ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 11432c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 11442c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 11452c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 11462c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 11472c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 114894ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 114972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 115072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 115172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 115272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 115372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 115472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1155308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1156308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1157054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Always try to enable dynamic output buffers on native surface 1158054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 1159054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar int32_t haveNativeWindow = msg->findObject("native-window", &obj) && 1160054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar obj != NULL; 1161054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1162e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1163e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 1164e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 1165054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (!encoder && video && haveNativeWindow) { 1166054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_TRUE); 1167054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != OK) { 1168054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1169054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), err); 1170fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1171fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // if adaptive playback has been requested, try JB fallback 1172fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 1173fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // LARGE MEMORY REQUIREMENT 1174fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1175fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // we will not do adaptive playback on software accessed 1176fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // surfaces as they never had to respond to changes in the 1177fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // crop window, and we don't trust that they will be able to. 1178fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar int usageBits = 0; 1179fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar bool canDoAdaptivePlayback; 1180fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1181fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar sp<NativeWindowWrapper> windowWrapper( 1182fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar static_cast<NativeWindowWrapper *>(obj.get())); 1183fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar sp<ANativeWindow> nativeWindow = windowWrapper->getNativeWindow(); 1184fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1185fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar if (nativeWindow->query( 1186fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar nativeWindow.get(), 1187fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar NATIVE_WINDOW_CONSUMER_USAGE_BITS, 1188fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar &usageBits) != OK) { 1189fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar canDoAdaptivePlayback = false; 1190fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } else { 1191fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar canDoAdaptivePlayback = 1192fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar (usageBits & 1193fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar (GRALLOC_USAGE_SW_READ_MASK | 1194fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 1195fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1196fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1197fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar int32_t maxWidth = 0, maxHeight = 0; 1198fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar if (canDoAdaptivePlayback && 1199fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar msg->findInt32("max-width", &maxWidth) && 1200fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar msg->findInt32("max-height", &maxHeight)) { 120184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 1202fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), maxWidth, maxHeight); 1203fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1204fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar err = mOMX->prepareForAdaptivePlayback( 1205fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mNode, kPortIndexOutput, OMX_TRUE, maxWidth, maxHeight); 1206fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar ALOGW_IF(err != OK, 1207fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar "[%s] prepareForAdaptivePlayback failed w/ err %d", 1208fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1209e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 1210e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (err == OK) { 1211e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("max-width", maxWidth); 1212e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("max-height", maxHeight); 1213e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", true); 1214e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 1215fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1216fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar // allow failure 1217054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = OK; 1218054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 1219054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("[%s] storeMetaDataInBuffers succeeded", mComponentName.c_str()); 1220054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = true; 1221e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", true); 1222054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 12230167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 12240167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber int32_t push; 12250167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 12260167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && push != 0) { 12270167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 12280167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1229054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1230054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1231308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height)) { 12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoDecoder(mime, width, height); 12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 124342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 124442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 124542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 124642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 124742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 124842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 124942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 125042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 125142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 125242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 125342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 125442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 125542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1262aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1263ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1264ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1265ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1266aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1267aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1268aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1269ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1270ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 12714471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 12724471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber isADTS != 0); 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1274729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1276729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1278729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1279729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1280729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1281729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1282729de186450f78c099637e1fce743fe531862c52Andreas Huber 1283729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupG711Codec(encoder, numChannels); 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 12902f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi int32_t numChannels, sampleRate, compressionLevel = -1; 12912f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 12922f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 12932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 12942f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 12952f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 12962f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 12972f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1298516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1299516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 13002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 5;// default FLAC compression level 13012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1302516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1303516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1304516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 13052f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 13062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1307516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1308516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1309516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 13102f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 13112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 13122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1313516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1314516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 13152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1316ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1317ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1318ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1319ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1320ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1321ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1322ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1323ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1324ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 132597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 132697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 132797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 132897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 132997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 133097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 133197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 133297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 133397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1335729de186450f78c099637e1fce743fe531862c52Andreas Huber 13364471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 13374471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 13384471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 13394471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 13408b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 13418b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 13428b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 13439806555d3930be43e11106281dee354820ac1c88Andreas Huber 13448b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 13458b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 13468b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 13478b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 13489806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 13499806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 13509806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 13519806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 13529806555d3930be43e11106281dee354820ac1c88Andreas Huber } 13539806555d3930be43e11106281dee354820ac1c88Andreas Huber 1354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1361e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1362e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1363e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1364e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1365e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1369f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 14065778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 14085778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1433aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 1434aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t bitRate, int32_t aacProfile, bool isADTS) { 1435ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1436ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1437ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1438ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 14565778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14765778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 14775778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 14785778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 14795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14875778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 14885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14895778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 14905778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 14915778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 14925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14935778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 14945778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 14955778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 14985778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1499aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 15005778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 1513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 1514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 1515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 15165778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 1517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 1524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 1525ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1526ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 1527ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 1528ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 1529ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 1530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 1532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 153697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 153797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 153897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 153997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 154097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 154197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 154297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 154397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 154497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 154597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 154697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 154797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 154897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 154997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 155097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 155197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 155297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 155397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 155497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 155597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 155697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 155797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 155897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 155997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 156097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 156197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 156297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 156397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 156497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 156597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 156697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 156797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 156897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 156997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 157097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 157197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 157297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 16015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 16025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 16035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 16045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 16055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 16085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 16095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 16105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 16115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16135778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 16145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 16155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16185778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 1619729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1620729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 1622729de186450f78c099637e1fce743fe531862c52Andreas Huber 1623729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 1624729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1625729de186450f78c099637e1fce743fe531862c52Andreas Huber 1626729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1627729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1628729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1629729de186450f78c099637e1fce743fe531862c52Andreas Huber 1630729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 16315778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 16325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16335778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1635729de186450f78c099637e1fce743fe531862c52Andreas Huber 16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1639729de186450f78c099637e1fce743fe531862c52Andreas Huber 16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 1644729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1645729de186450f78c099637e1fce743fe531862c52Andreas Huber 16465778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { 16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1649729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 1650729de186450f78c099637e1fce743fe531862c52Andreas Huber kPortIndexInput, 8000 /* sampleRate */, numChannels); 1651729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1652729de186450f78c099637e1fce743fe531862c52Andreas Huber 16532f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 16542f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 16552f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 16562f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 16572f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 16582f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 16592f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 16602f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 16612f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 16622f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 16632f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 16642f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 16652f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 16662f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 16672f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 16682f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 16692f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 16702f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 16712f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 16722f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 16732f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 16742f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 16752f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 16762f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 16772f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 16782f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 16792f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 16802f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 1681729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 1682729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 1683729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1684729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 1685729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 1686729de186450f78c099637e1fce743fe531862c52Andreas Huber 1687729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 1688729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1689729de186450f78c099637e1fce743fe531862c52Andreas Huber 1690729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1691729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1692729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1693729de186450f78c099637e1fce743fe531862c52Andreas Huber 1694729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 1695729de186450f78c099637e1fce743fe531862c52Andreas Huber 1696729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 1697729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1698729de186450f78c099637e1fce743fe531862c52Andreas Huber 1699729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1700729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1701729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1702729de186450f78c099637e1fce743fe531862c52Andreas Huber 1703729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 1704729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 1705729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 1706729de186450f78c099637e1fce743fe531862c52Andreas Huber 1707729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 1708729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1709729de186450f78c099637e1fce743fe531862c52Andreas Huber 1710729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1711729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1712729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1713729de186450f78c099637e1fce743fe531862c52Andreas Huber 1714729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 1715729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1716729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 1717729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 1718729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 1719729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1720729de186450f78c099637e1fce743fe531862c52Andreas Huber 1721c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 1722c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 1723729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1724729de186450f78c099637e1fce743fe531862c52Andreas Huber 1725729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 1726729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1727729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1728729de186450f78c099637e1fce743fe531862c52Andreas Huber 1729f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 1730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 1731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 1732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 1733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 1736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 1738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 1740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 1742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 1751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 1752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 1754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 1755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 1756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 1757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 1761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 1762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 1763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 1769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 1770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 1775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 1778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 1779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1788f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setSupportedOutputFormat() { 1789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 1792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 1798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)format.eCompressionFormat, (int)OMX_VIDEO_CodingUnused); 1799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 1801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 1806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 1807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 1808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 1809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 1810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 1811e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 1812e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 181394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 181494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 1815e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 1816e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 18175778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 18185778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 1819e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 1820e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 1821e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 1822e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 1823e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 1824e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1825e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1828e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 1829e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1830e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 1831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 1834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 1835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 1836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 1837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 1838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 1839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 1840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 1845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 18475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 18505778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, int32_t width, int32_t height) { 18515778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 18525778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 18535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18585778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 1860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setSupportedOutputFormat(); 1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 1872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, width, height, compressionFormat); 1873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 1879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 1880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18885778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 18895778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 18905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 18915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 18925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18945778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 18955778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 18965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18975778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 18985778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 18995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19015778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 19025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 19035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19075778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 19085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19095778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 19105778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 19115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19125778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 19135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19145778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 19155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19165778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 19245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 19255778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 19265778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 19275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 19285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19305778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 19315778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 19325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19335778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 19345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 19355778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 19365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19385778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 19395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19405778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 19415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 19425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 19435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19455778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 19465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19475778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 19485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19495778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 19505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 19515778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 19525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 19535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 19545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19555778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 19562c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 19575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19595778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 19605778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 19615778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = colorFormat; 19625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19635778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 19645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19675778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 19685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 19695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19735778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 19745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19755778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 19765778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 19775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 19835778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 19845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19865778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 19875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 19885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19925778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 19935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19945778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20015778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 20025778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 20035778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 20045778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 20055778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 20065778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 20075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20085778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 20145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20185778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 20195778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 20205778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 20215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 20225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20235778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 20245778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 20255778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 20265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20275778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 20285778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 20295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 20305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 203189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 203289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 203389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 203489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 203589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 20365778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 20375778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 20385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20405778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 20415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 20445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20450dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 20460dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 20470dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 20480dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 20490dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20500dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 20510dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20520dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 20530dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 20540dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 20550dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 20560dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 20570dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 20580dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 20590dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 20600dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20610dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 20620dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 20630dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 20640dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 20650dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 20660dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 20670dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 20680dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20690dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 20700dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 20710dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 20720dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 20730dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 20740dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 20750dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20760dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 20770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 20780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 20790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 20800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 20810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 20825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 20835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 20845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 20855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 20865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 20875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20885778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 20895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(ret > 1); 20905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 20915778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 20925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 209396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 209496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 209596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 209696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 209796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 209896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 209996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 210096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 210196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 21025778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 21035778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 21045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 21055778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 21065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 210996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 211096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 21115778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 21125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 21135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 21145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 21155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21175778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 21185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21205778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 21215778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 21225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 21235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21245778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 21255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 21265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 21325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 21335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 21345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21355778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 21365778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 21375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 21395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 21405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 21415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 21435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 21445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 21455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 21465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 21475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 21485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 21495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21505778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 21515778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 21525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 21535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 21545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21575778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 21585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 21645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 21655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21675778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 21685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 21695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 217496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 21755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 21815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 21825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 21845778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 21855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 21865778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 21875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 219096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 219196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 21925778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 21935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 21945778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 21955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 21965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21985778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 21995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22015778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 22025778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 22035778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 22045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22055778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 22065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 22075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22125778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 22135778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 22145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22155778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 22165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 22175778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 22185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22195778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 22205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22215778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 22225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 22235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 22245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 22255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 22265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22285778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 22295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22345778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 22355778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 22365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22385778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 22395778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 22405778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 22415778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 22425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22435778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 22445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 22455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 225096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 22515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 22575778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 22585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22595778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 22605778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 22615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 22625778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 22635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 22645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 226696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 226796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 22685778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 22695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 22705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 22715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 22725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 22735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22745778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 22755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 22780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 22790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 22800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 22810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 22820dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 22830dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 22840dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 22850dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22860dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22870dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22885778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 22895778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 22905778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 22915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22920dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 22935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 22945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22995778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 23005778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 23015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23025778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 23035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 23045778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 23055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 23065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 23075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23095778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 23105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23155778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 23165778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 23175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23195778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 23207c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 23217c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 23227c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 23235778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 23245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 23275778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 23285778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 23295778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 23305778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 23315778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 23325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 23335778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 23345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23355778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 23365778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 23375778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 23385778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 23395778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 23405778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 23415778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 23425778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 23435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 23465778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 23475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23495778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 23505778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 23515778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 23525778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 23535778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 23545778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 23555778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 23565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23575778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 23585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 23595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 236496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 23655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 23665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 236789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 236889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 23694154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 23704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 23714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 23724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 23734154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 23744154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 23754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 23764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 23774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 23784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 23794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 238089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 238189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 238289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 23834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 238489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 238589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 238689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 23874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 23884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 23894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 23904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 23914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 23924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 23934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 23944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 23954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 23964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 23974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 23984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 23994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 24004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 24014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 24024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 24034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 24044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 24054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 24064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 24074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 24084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 24094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 24124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 24134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 24144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 24154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 24164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 24174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 24184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 24194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 24204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 24214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 24224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 24244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 24254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 24264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 24274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 24284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 24294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 24324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 24334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 24344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 24364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 24374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 24384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 24394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 24404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 24414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 24434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 244489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 244589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 244689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 24475778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 24485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 24495778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 24505778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 24515778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 24525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24535778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 24545778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 24555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 24565778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 24575778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 24585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 24595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24645778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 24655778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 24665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 24685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 24695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 247396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 247496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 24755778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 24765778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 24775778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 24785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24795778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 24805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 24815778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 24825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 248796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 24885778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 24895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 24915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 24925778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 24935778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 24965778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 24975778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 24985778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 24995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25005778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 25015778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 25025778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 25035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 25065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25085778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 25095778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 25105778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 25115778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 25125778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 25135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 25155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 25165778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 25175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 25185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2519f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 2520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat) { 2522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 2524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 2525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 2532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 2535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 2536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 2537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 2538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 2542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 2544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 2545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 2548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 2549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 2552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2557f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 2558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 2559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 2560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 2563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2566d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 2567d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 2568d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2569d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2570d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 2571d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2572d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 2573d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 2574d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2575d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2576d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2577d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 2578d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 2579d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 25807e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 25817e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 25827e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 25837e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 25847e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 25857e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 25867e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 25877e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 25887e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 25897e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 25907e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 25917e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 25927e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 25937e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 25947e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 25957e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 25967e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 25977e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 25987e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 2599e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 26007e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 2601c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 2602c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 2603c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 2604c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 26057e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 26067e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 26077e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 2608f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 2609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 2610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 2612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 2614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 2615609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 2616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 2617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 2618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 2619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2625f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 2626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 2627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 2628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2630f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 2631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool wasEmptyBefore = mDeferredQueue.empty(); 2632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 2633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2635f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 2636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 2637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 2638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 2640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 2641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 2642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2645e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 2646e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 264731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 264831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 2649e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 265031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 265131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 265231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 265331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 265431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2655e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 2656e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 265731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 265831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 265931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 266031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 266131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 2662e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 2663e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 2664e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 2665e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 2666e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 2667e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2668e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 2669e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 2670e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 2671e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2672e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 2673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 2674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nPortIndex = kPortIndexOutput; 2675e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2676e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 2677e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexConfigCommonOutputCrop, 2678e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 2679e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 2680e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 2681e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 2682e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 2683e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 268431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2685e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 2686e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 2687e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 2688e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 2689e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 2690e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 2691e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2692e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 2693577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 2694577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 2695577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 2696e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 2697e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 2698e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2699e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 2700e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2701e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 2702e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 2703e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 2704e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 2705e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 2706e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 2707e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 2708e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 2709e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 2710e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2711e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 2712e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 271331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 2714e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2715e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 2716e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 271731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 271831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 271931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 272031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 272131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 272231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 272331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 272497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 2725e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 2726e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2727e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 2728e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2729e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 2730e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2731e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2732e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 2733e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2734e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2735e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 273614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 2737e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 2738e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 273914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 274014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 274114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 274214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 274314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 274414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 2745e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2746e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 2747e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2748e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 2749e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2750e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 2751e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 27528b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 2753e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 27548b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 27559806555d3930be43e11106281dee354820ac1c88Andreas Huber 2756e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 2757e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2758e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 2759e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2760e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 2761e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2762e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2763e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 2764e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2765e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2766e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2767e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 2768e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2769e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 2770e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2771e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2772e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2773e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 2774e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2775e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 2776e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2777e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 27789806555d3930be43e11106281dee354820ac1c88Andreas Huber 2779e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2780e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 2781e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2782e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2783e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2784e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 2785e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 2786e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 2787e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 2788e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2789e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 2790e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 2791e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 2792e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 2793e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2794e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 2795e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2796e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2797e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2798e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2799e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 2800e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 2801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 2802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 2803e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 2804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 2806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 2807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 2808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 2809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 2811e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 2812e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 2813e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 2814e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2815e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2816e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 2817e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 2818e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 2819e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 2820e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 2821e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2822e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 2823e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 2824e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 2825e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 2826e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2827e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 2828e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 2829e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 2830e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 2831e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2832e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2833e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 2834e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 2835e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 2836e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 2837e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 2838e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2839e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 2840e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 2841e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 2842e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 2843e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2844e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 2845e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 2846e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 2847e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 2848e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2849e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 285097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 285197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 285297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 285397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 2854e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 285597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 285697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 285797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 285897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 285997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 286097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 286197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 286297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 286397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 286497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 286597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 286697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 2867e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2868e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 2869e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 2870e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 2871e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 287231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 287331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 287431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 287531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 287631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 287731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 287831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 2879e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 2880e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 2881e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2882e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 2883e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> notify = mNotify->dup(); 2884e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 2885e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2886e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 2887e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2888e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 2889e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 2890e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 2891e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 2892e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 2893e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 2894e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 2895e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 2896e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 2897e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 2898e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 2899e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 2900e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 2901e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 2902e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 2903e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 2904e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 2905e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 2906e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGW("Replacing SkipCutBuffer holding %d " 2907e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar "bytes", 2908e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar prevbufsize); 2909e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2910e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2911e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 2912e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 2913e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 2914e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 2915e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 291631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 291731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 291831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 291931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 292031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 29215778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 2922cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 2923cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->setInt32("what", ACodec::kWhatError); 2924cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->setInt32("omx-error", error); 29255778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 2926cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 2927cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 2928cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 2929bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huberstatus_t ACodec::pushBlankBuffersToNativeWindow() { 2930bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber status_t err = NO_ERROR; 2931bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ANativeWindowBuffer* anb = NULL; 2932bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int numBufs = 0; 2933bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int minUndequeuedBufs = 0; 2934bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2935bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We need to reconnect to the ANativeWindow as a CPU client to ensure that 2936bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // no frames get dropped by SurfaceFlinger assuming that these are video 2937bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // frames. 2938bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 2939bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 2940bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2941bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 2942bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2943bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2944bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2945bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2946bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 2947bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 2948bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2949bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 2950bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2951bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 2952bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2953bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2954bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1, 2955bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber HAL_PIXEL_FORMAT_RGBX_8888); 2956bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2957bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)", 2958bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2959bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2960bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2961bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 296287eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin err = native_window_set_scaling_mode(mNativeWindow.get(), 296387eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 296487eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin if (err != NO_ERROR) { 296587eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin ALOGE("error pushing blank_frames: set_scaling_mode failed: %s (%d)", 296687eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin strerror(-err), -err); 296787eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin goto error; 2968bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2969bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2970bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_usage(mNativeWindow.get(), 2971bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber GRALLOC_USAGE_SW_WRITE_OFTEN); 2972bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2973bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_usage failed: %s (%d)", 2974bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2975bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2976bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2977bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2978bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query(mNativeWindow.get(), 2979bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 2980bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2981bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 2982bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber "failed: %s (%d)", strerror(-err), -err); 2983bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2984bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2985bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2986bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber numBufs = minUndequeuedBufs + 1; 2987bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffer_count(mNativeWindow.get(), numBufs); 2988bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 2989bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", 2990bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 2991bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 2992bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 2993bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 2994bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push numBufs + 1 buffers to ensure that we've drawn into the same 2995bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // buffer twice. This should guarantee that the buffer has been displayed 2996bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // on the screen and then been replaced, so an previous video frames are 2997bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // guaranteed NOT to be currently displayed. 2998bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber for (int i = 0; i < numBufs + 1; i++) { 29991e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 30001e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb); 3001bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3002bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 3003bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3004bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3005bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3006bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3007bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 3008bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3009bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Fill the buffer with the a 1x1 checkerboard pattern ;) 3010bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber uint32_t* img = NULL; 3011bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 3012bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3013bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: lock failed: %s (%d)", 3014bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3015bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3016bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3017bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3018bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber *img = 0; 3019bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3020bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->unlock(); 3021bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3022bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: unlock failed: %s (%d)", 3023bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3024bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3025bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3026bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3027bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->queueBuffer(mNativeWindow.get(), 30281e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis buf->getNativeBuffer(), -1); 3029bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3030bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", 3031bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3032bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3033bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3034bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3035bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber anb = NULL; 3036bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3037bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3038bc098410be55f9d96f394b3981a0c482b83859b6Andreas Hubererror: 3039bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3040bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3041bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after an error. 3042bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (anb != NULL) { 30431e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow->cancelBuffer(mNativeWindow.get(), anb, -1); 3044bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3045bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3046bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_disconnect(mNativeWindow.get(), 3047bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3048bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_connect(mNativeWindow.get(), 3049bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3050bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3051bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3052bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } else { 3053bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after success. 3054bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 3055bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3056bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3057bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 3058bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3059bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3060bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3061bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3062bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 3063bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3064bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3065bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 3066bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3067bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3068bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3069bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3070bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return NO_ERROR; 3071bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3072bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber} 3073bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3076eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 3077eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3078eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3079496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 3080496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 3081496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 3082496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 3083496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3084496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 3085496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 3086496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3087496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 3088496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 3089496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3090496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 3091496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 3092496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 3093496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 3094496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 3095496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 3096496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3097eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 3098eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 3099eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 3100eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 3101eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3102eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3103eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 3104eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 3105eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3106eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3107eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 3108eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 3109eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3110eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3111eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 3112eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 3113eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3114eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3115eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 3116eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3117f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 3118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 3119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 3120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3122ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 3123ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 3124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 3125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3127f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 3128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 3130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 3132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 3136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 3138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 3142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 3144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 31477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 31487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 31497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 31507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 31517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 31527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 31537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3154ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 3155ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 3156ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 3157ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 3158ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 3159ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3160ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3168f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 3169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 3170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 3171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31725e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 31735e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 31745e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar if (mCodec->mNode == NULL) { 31755e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 31765e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 31775e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 31785e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 31795e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 3180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 3181609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 3182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 3183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 3185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 3186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 3188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 3189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 3190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 3191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31920af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 31930af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 31940af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 31950af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 31960af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 31970af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 31980af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 31990af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 32000af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 32010af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 32020af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 3203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 3204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 3205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 3206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 3207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 3210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3212609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 3213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 3215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 3218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3220609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 3221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 3223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 3224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 3226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 3227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 3228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 3229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 3231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 3233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 3234784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 3235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 3239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3243f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 3244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 3245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 32463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 3247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 3248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 325229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1); 3253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3254cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError((OMX_ERRORTYPE)data1); 3255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3259f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 32603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] onOMXEmptyBufferDone %p", 3261349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 3262349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 3265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 3267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3269d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<AMessage> &bufferMeta = info->mData->meta(); 3270d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void *mediaBuffer; 3271d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (bufferMeta->findPointer("mediaBuffer", &mediaBuffer) 3272d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && mediaBuffer != NULL) { 3273d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // We're in "store-metadata-in-buffers" mode, the underlying 3274d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // OMX component had access to data that's implicitly refcounted 3275d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // by this "mediaBuffer" object. Now that the OMX component has 3276d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // told us that it's done with the input buffer, we can decrement 3277d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // the mediaBuffer's reference count. 327896fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 327996fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("releasing mbuf %p", mediaBuffer); 328096fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 3281d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ((MediaBuffer *)mediaBuffer)->release(); 3282d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mediaBuffer = NULL; 3283d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3284d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferMeta->setPointer("mediaBuffer", NULL); 3285d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 3286d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 3288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 3295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 3301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3308f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 3309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 3310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 3314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFillThisBuffer); 3317609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 3318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 33202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 3321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id()); 3323609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 3324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 3326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 3330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3332f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 3333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3334609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 33352d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 3336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 33375778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 3338a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 33395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 33402d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 3341a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 3342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 3343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33447fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 33457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 33467fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 33477fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 33487fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 33497fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 33507fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 33517fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 33523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 33532d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 3354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 33575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 33585778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 33595778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 33605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 33615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 3363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 3364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 33705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 3371dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 3372dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 3373dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 3374dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 33815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 3382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 3383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 3384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 3386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 3388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 3389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 3390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 33935778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 33945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 33955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 3397d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGV("[%s] Needs to copy input data for buffer %p. (%p != %p)", 3398d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 3399d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 3400d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 3401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 3403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 3404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3406078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 34073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ codec specific data", 3408078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 34095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 34105778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling emptyBuffer %p w/ EOS", 34115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 3412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 3413d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3414d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("[%s] calling emptyBuffer %p w/ time %lld us", 3415d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3416d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 34173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ time %lld us", 3418078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3419d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3420078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 3421349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3422d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3423d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 3424d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 3425d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 3426d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 3427d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3428d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3429054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 3430054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 3431054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 3432054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3433054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 3434054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 3435054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 3436054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 3437054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 3438054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mCodec->submitOutputMetaDataBuffer(), 3439054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 3440054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3441054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3442054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 3448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 3449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 3450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 34555778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 34565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 34575778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 34585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 34595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 34605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 34615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 34625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 3464dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 34653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 3466dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 3467dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 3468dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 34693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 3470dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 3471dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p signalling EOS", 3474349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 3475349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 3482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 3483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 3488dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 3489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3492625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 3493625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 3494625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3495625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 3496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3499f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 3500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 3501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 3505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 3507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 3508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 3510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 3511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 3512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 3515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 3517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 3518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 3522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 3526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3528f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 3529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 3530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 3531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 3532784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 3533609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 35345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 3535349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 3537d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3538d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3539d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 3540d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 3541d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 3542d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 3543d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3544d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 3545d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 3546d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 3547d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3548d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 3549d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 3550d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 3551d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3552d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 3555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 3557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3558054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 3559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 3562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 35695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (rangeLength == 0 && !(flags & OMX_BUFFERFLAG_EOS)) { 3570609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 35715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 3572349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 35735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 35745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 35755778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 3576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35775778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 35785778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 35795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 358031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3581577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 3582577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec->id()); 3583577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 35844bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 3585577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 35865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3588308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 3589308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 3590308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 3591308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 3592308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 3593308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 3594308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 3595308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 3596308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 3597496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 359821ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 3599496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 3600496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 3601496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 36025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 360321ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 3604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36058b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 36068b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 36078b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 36085778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 3609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 36115778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatDrainThisBuffer); 3612609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 36132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 36145778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 3615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3616609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 3617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36185778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 3619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36205778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 36215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 36225778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 3623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 36255778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 36265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatEOS); 3629dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 3630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 3633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 3642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 3643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3650f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 3651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3652609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 3653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 3654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 3656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 3657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3658577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 3659577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 3660577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 3661577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 3662577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 3663577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 3664577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 3665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 3666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 36676aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 366879ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 36696fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 3670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 3671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3672fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 3673fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 3674fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 3675fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 3676fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 3677fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 3678fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 3679fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 3680fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGI("using buffer PTS of %" PRId64, timestampNs); 3681fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 3682fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 3683fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 3684fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 3685fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 36865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3687fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 3688fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 3689fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 3690fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 3691fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGI("set PTS to %" PRId64, timestampNs); 3692fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 3693fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 36945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 3695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 36961e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 3697cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 3698cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 36995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 3700cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3701cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 3702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 37036fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 37046fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 37056fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 37066fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 3707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 3711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 3716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 3719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 3720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 3722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 3729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 3731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 3732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 3734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3736c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 3737609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 3738c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 3739349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3740c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 3741c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 3742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3743c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3744c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 3745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 3754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 3755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3762f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 3763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 3764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3766c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 3767c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 3768ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3769ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 3770ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); 3771ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 3772ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3773ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3774ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 3775ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNode = NULL; 3776ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 3777ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 3778ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 3779308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 3780ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 3781c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3782c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3783f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 3784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 3785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 3788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 3790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 37955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 37965778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 37975778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 37985778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 37995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 38005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 38015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 3803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3804c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 3805c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 3806c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 380754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 380854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 3809c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatShutdownCompleted); 3812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3815c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 3816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 3819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 3822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 3825c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 3826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 3830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 3833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3835f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 3836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 3837c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 3838c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 3839c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 3840c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 38415778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 38425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3843c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 38445778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 38455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3846c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(mCodec->mNode == NULL); 38475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 3849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 3850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 3852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3853ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id()); 3854ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3855ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 3856ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { 3857ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 3858ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 3859ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 3860ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3861ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3862e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 38635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 3865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38665778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 3867d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 38685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 3869e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 3870e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 3871e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 3872afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 3873e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 3874e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 3875e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 3876afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 38775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 38785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 38795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 38805778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 38815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 38825778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 38835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 38845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 38855778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 38865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 38875778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 38885778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 38895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 3890e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 38915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 38921065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 38931065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 38941065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber IOMX::node_id node = NULL; 38951065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 38961065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 38971065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 3898e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 3899e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 3900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3901078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber pid_t tid = androidGetTid(); 3902078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 3903078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 39041065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber status_t err = omx->allocateNode(componentName.c_str(), observer, &node); 3905078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 3906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39071065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 39081065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 39091065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 39101065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 39111065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber node = NULL; 39121065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 39131065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 3914c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (node == NULL) { 39155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 39165778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Unable to instantiate a decoder for type '%s'.", 39175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str()); 39185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 39195778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Unable to instantiate decoder '%s'.", componentName.c_str()); 39205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3921c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 3922cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError(OMX_ErrorComponentNotFound); 3923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 3924c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 3925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3926ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber notify = new AMessage(kWhatOMXMessage, mCodec->id()); 3927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 3928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 3930ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 3931ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3932ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 3933ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 39340167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 3935ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 3936ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3937afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 3938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 3939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 3940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39415778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 39425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 39435778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatComponentAllocated); 39445778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 39455778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 39465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3947c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3948c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 3949c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3950c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 39515778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 39525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3953c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3954c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3955c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 3956c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 3957c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3958c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3959c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 3960c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 3961c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3962f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 3963f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 3964f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 3965f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 3966f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 3967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 3968054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 3969a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 3970e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 3971e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 3972054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3973c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 3974c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 3975c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3976c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 3977c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 3978c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3979c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 3980c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 398154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 3982c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3983c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3984c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 3985c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 3986c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 3987c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3988c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 3989c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 3990c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 399154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 399254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 399354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->setInt32("what", ACodec::kWhatShutdownCompleted); 399454b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 399554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 399654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 3997c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 3998c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 3999c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 4000c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 4001c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4002c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 4003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 4004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 4006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4007c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 40107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 40117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 40127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 40137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 40147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 40157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 40167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4017c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 4018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 4020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 4025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4026c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4027c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4028c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 4029c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 403054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 4031c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4032c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4033c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4034c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4035c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4036c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4037c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 4038c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4039c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4040c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 4041c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 4042c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4043c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4044c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4045c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4046c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4047c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 4048c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 4049c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4050c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4051c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 4052c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4053c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4054c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 40555778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 40565778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 40575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 40585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mCodec->mNode != NULL); 40595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 40605778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 40615778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 40625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 40635778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 40645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 40655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 4066c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 4067c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 4068c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 40695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 4070c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 40715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 4074386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (msg->findObject("native-window", &obj) 40755778822d86b0337407514b9372562b86edfa91cdAndreas Huber && strncmp("OMX.google.", mCodec->mComponentName.c_str(), 11)) { 40761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<NativeWindowWrapper> nativeWindow( 40771173118eace0e9e347cb007f0da817cee87579edGlenn Kasten static_cast<NativeWindowWrapper *>(obj.get())); 40781173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(nativeWindow != NULL); 40791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mCodec->mNativeWindow = nativeWindow->getNativeWindow(); 40801ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber 40811ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber native_window_set_scaling_mode( 40821ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber mCodec->mNativeWindow.get(), 40831ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 4084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, mCodec->initNativeWindow()); 4086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40875778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 40885778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 40895778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("what", ACodec::kWhatComponentConfigured); 4090e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 4091e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 40925778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 40935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4094c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4095c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 40965778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 40975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 40987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::LoadedState::onCreateInputSurface( 4099ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber const sp<AMessage> & /* msg */) { 41007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGV("onCreateInputSurface"); 41017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 41027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> notify = mCodec->mNotify->dup(); 41037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("what", ACodec::kWhatInputSurfaceCreated); 41047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 41057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> bufferProducer; 41067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 41077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 41087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden err = mCodec->mOMX->createInputSurface(mCodec->mNode, kPortIndexInput, 41097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden &bufferProducer); 4110a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 4111a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err == OK && mCodec->mRepeatFrameDelayUs > 0ll) { 4112a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 4113a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 4114a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 4115a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 4116a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 4117a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 4118a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 4119a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 4120a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 4121a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 4122a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 4123a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 4124a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 4125a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 4126a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 41272c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mMaxPtsGapUs > 0ll) { 412894ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 412994ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 413094ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 413194ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 413294ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 413394ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 413494ee4b708acfa941581160b267afb79192b1d816Chong Zhang 413594ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 413694ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 413772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 413872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 41392c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 41402c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 41412c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 41422c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mTimePerCaptureUs > 0ll 41432c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 41442c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 41452c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 41462c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 41472c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 41482c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 41492c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 41502c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 41512c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 41522c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 41532c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 41542c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 41552c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 41562c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 41572c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 41582c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 41592c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 416072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 416172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err == OK && mCodec->mCreateInputBuffersSuspended) { 416272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 416372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 416472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 416572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 416672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 416772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 416872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 416972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 417072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 417172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 417294ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 417394ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 417494ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 417594ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 417694ee4b708acfa941581160b267afb79192b1d816Chong Zhang 41777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 41787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 41797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 41807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 41817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 41827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 41837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 41847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 41857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 41867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 41877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 41897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 41907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4191c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 41925778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 41935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 41945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 41955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 4199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4203f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 4204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4207f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 42083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 4209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4210cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 4211cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 421229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 4213cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 4214cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 4215cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 42165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 421791bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 421891bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 4219cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 4223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 423472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 42426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 42436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 42446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 42456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 42466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 42476463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 42486463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 42496463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 42506463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 42516463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 42526463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 42536463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 42546463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 42556463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 42566463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 42576463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->setInt32("what", ACodec::kWhatFlushCompleted); 42586463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 42596463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 42606463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 42616463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4267f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 4268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 4277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 4280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4291f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 4292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4295f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 42963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 4297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 430172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4308d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 4309d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 4310d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 4311d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 4312d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 4313d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 4314d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 4315d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 4316d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 4317d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4318d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 4319d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 4320d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 4321d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 4322d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 4323d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 43246507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 43256507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 43266507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 43276507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 43286507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 43296507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 4344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 4345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4356f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 4357349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 4358349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 4359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4361f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 4362ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 4364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4366054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 4367054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 4368054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 4369054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4370054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4371054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4372054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 4373054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 4374054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 4375054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4376054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 43774dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 43784dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 43794dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 4380054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 4381054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4382054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 4383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 4384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 4385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 4387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 4388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 4389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 4392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 4394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 4398349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4399349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4407054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 4408c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 4409054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4410054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 4411054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4412054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 4413054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4414f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 4415349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 44163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 4417349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 4418349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4419349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 4420349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4421349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 4423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Post the first input buffer. 4425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 4426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(0); 4427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4429349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4430349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 4431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4433f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 44343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 4435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 4437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4439f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 4440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4445c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4446c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4447c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 4448c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4449c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 445054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 4451c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 4452c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4453349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4454349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 4457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 4460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 44677a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 4468d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber "(codec owns %d/%d input, %d/%d output).", 4469d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 4470d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 4471d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 4472d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 4473d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 4474d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4475349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4476349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 4479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4494496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 4495496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 4496496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 4497496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 4498496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 4499496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4500496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4501496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 4502496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 4503496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4504496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4505a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 4506a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 4507a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 4508a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 4509a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4510a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 4511a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4512a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 4513a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 4514a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 4515a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 4516a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4517a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4518a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 4519a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 4520a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4521a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 45227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 45237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 45246507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 45257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 45267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 45277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 45287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 45294dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 45304dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 45314dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 45324dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 45334dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 45344dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 45354dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 45364dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 45374dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 45384dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 45394dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 45404dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 45414dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 4542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4550a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 4551a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 4552530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 4553a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 4554a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 4555a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 4556a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 4557a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4558a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 4559a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 4560a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 4561a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 4562a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 4563a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4564a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 4565a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 4566a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 4567a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4568a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 4569a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4570a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 4571a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 457272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 457372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 457472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 457572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 457672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 457772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 457872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 457972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 458072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 458172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 458272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 458372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 458472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 458572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 458672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 458772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4588e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 4589e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 4590e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 4591e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 4592b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 4593b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 4594e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 4595e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 4596e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 4597e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 4598b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 4599b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 4600b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 4601b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 4602b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 4603b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 4604b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 4605b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 4606b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 4607b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 4608b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 4609b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 4610b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 4611b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 4612b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 4613b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 4614e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 4615e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 4616a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 4617a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 4618a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 46196507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 46206507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 46216507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("what", ACodec::kWhatSignaledInputEOS); 46226507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 46236507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 46246507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 46256507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 46266507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 46276507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 46286507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 46296507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 4630f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 4631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 4634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 4636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 463731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 4638054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 4642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4644349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 4645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 464731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 464831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 4649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 46503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 4651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 4652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 4658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4669f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 4670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 4671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4674f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 4675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 4676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 4677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 4678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 4681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 4683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4685f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 4686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4692349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 4693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4694349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 46953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 4696349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4697349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 47123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 4713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 4722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 4723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 4725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 4728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 4729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 4732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4734cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 4735cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 4736cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 473729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 4738cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 4739cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 4740cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 47415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalError(OMX_ErrorUndefined, err); 4742d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4743755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 4744755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 4745755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 4746755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 4747755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 4748755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 4749755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 4750755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4751cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 4752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 4755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 4756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 475731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 475831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 47593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 4760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 4761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4762349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 4763349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 4764349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4765349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 4767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4781f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 47825778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 47835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 4784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4786f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 4787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 4801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4814f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 48153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 481631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 48175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 481831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 4819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4821f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 4822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 4828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48295778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 48305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4836349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 4837349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 4838349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 4839349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 4840349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 4841349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4842349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 48470af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4848f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 48495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 4850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 4852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 4855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 4856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48570167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 48580167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 4859bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 4860bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 4861bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 4862bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 4863bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mCodec->pushBlankBuffersToNativeWindow(); 4864bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4865bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 4867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4870f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 4871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 4873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4877f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 4878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 4880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 4882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4886f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 4887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4890f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 4891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 4897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 4905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 4906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4918f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 49193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 4920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4922f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 4923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 4929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4930c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4942f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 4943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4946f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 49473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 4948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 4950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4952f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 4953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 4965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 4971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4977f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 4978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 49797a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] FlushingState onOMXEvent(%d,%ld)", 4980d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), event, data1); 4981d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 4986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 4988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 4989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 4990e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 4991e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 4992e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 4993e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 4994e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 4995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 4996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 4997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 4998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 4999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5006349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5007349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5008349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec->id()); 5009349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 5010609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 5011349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 5012349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 5013349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 5014349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 50153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 5016349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5017349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5018349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 5019349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5020349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5021349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5022349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5030f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 5031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5036f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 5037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5042f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 5043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 5044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 5045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 50467e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 50477e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 50487e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 50497e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 5050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setInt32("what", ACodec::kWhatFlushCompleted); 5052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 5053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 5055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 5056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5057dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 5058dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 5059f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 5060f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 5061f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 5062f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 5063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 5068