ACodec.cpp revision cd39746f8d83bb3f12e8f613e77c3c3b5f77c077
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 20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 24609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#include <inttypes.h> 256fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar#include <utils/Trace.h> 266fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 37afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 391173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 411065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 443a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 4897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 51496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 52f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// OMX errors are directly mapped into status_t range if 55251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// there is no corresponding MediaError status code. 56251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Use the statusFromOMXError(int32_t omxError) function. 57251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 58251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Currently this is a direct map. 59251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// See frameworks/native/include/media/openmax/OMX_Core.h 60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 61251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Vendor OMX errors from 0x90000000 - 0x9000FFFF 62251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Extension OMX errors from 0x8F000000 - 0x90000000 63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Standard OMX errors from 0x80001000 - 0x80001024 (0x80001024 current) 64251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 66251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// returns true if err is a recognized OMX error code. 67251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// as OMX error is OMX_S32, this is an int32_t type 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline bool isOMXError(int32_t err) { 69251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return (ERROR_CODEC_MIN <= err && err <= ERROR_CODEC_MAX); 70251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 71251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 72251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// converts an OMX error to a status_t 73251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t statusFromOMXError(int32_t omxError) { 74251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (omxError) { 75251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorInvalidComponentName: 76251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorComponentNotFound: 77251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return NAME_NOT_FOUND; // can trigger illegal argument error for provided names. 78251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 79251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return isOMXError(omxError) ? omxError : 0; // no translation required 80251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 81251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 82251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 83251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// checks and converts status_t to a non-side-effect status_t 84251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t makeNoSideEffectStatus(status_t err) { 85251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (err) { 86251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // the following errors have side effects and may come 87251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // from other code modules. Remap for safety reasons. 88251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case INVALID_OPERATION: 89251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case DEAD_OBJECT: 90251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return UNKNOWN_ERROR; 91251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 92251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return err; 93251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 94251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 95251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 96f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 117609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 130609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 136609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 204784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 213ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 214ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 215ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 216ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 217ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 218ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 219ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 220ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 221ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 222ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 223ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 224ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 225ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 226ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 227ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 228ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 229ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 230ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 236c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 240c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 243ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 250c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 251c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 252c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 253c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 254c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 255c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 256c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 257c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 258c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 259c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 261c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 263c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 264c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 265c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 266c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 268c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 302054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 303054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 310349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 311349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 312349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 321349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 322349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 403f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 404afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 405609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 407c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 408308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 4099806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 41054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 4119806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 4129806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 413e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees(0), 4149806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 415054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 416054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 417054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 418a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 41994ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 4202c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 4212c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 422609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 42372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended(false) { 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 425c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 438dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 450f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setTarget(id()); 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 456a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 457a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 458a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 459a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 460a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 461a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4625778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4685778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatCreateInputSurface, id()))->post(); 4767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 4797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatSignalEndOfInputStream, id()))->post(); 4807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4825778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage(kWhatStart, id()))->post(); 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 486f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 4877a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatFlush, id()))->post(); 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 491f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatResume, id()))->post(); 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 495c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 496c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatShutdown, id()); 497c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 498c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 501496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 502496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 503496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 504496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5054dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 5064dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 5074dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 5084dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 5094dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 5104dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 5114dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 5124dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 5134dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, id()))->post(); 5144dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 5154dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 5164dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 525054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 526054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 527054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 528054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 529054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 539609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 551ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 552ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 554afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 555afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 556afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 557afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 5581065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 559308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 560308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 561ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 562ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 563ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 564ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 565ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 566ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 567ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 568308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 569308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 570308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 571308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 572ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 574ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 576ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 577ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 578ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 579ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 580ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5821065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 5841065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5851065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 593d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatBuffersAllocated); 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 596eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 597eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 598eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 600eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 602eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 605eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 611054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 612054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 613054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *minUndequeuedBuffers) { 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 63229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffers_geometry failed: %s (%d)", 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 637e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (mRotationDegrees != 0) { 638e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang uint32_t transform = 0; 639e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang switch (mRotationDegrees) { 640e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 0: transform = 0; break; 641e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 90: transform = HAL_TRANSFORM_ROT_90; break; 642e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 180: transform = HAL_TRANSFORM_ROT_180; break; 643e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 270: transform = HAL_TRANSFORM_ROT_270; break; 644e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang default: transform = 0; break; 645e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 646e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 647e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (transform > 0) { 648e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang err = native_window_set_buffers_transform( 649e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mNativeWindow.get(), transform); 650e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (err != 0) { 651e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang ALOGE("native_window_set_buffers_transform failed: %s (%d)", 652e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang strerror(-err), -err); 653e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang return err; 654e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 655e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 656e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 657e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 6593c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis OMX_U32 usage = 0; 6603c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 6613c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis if (err != 0) { 6625ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("querying usage flags from OMX IL component failed: %d", err); 6633c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis // XXX: Currently this error is logged, but not fatal. 6643c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage = 0; 6653c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis } 6663c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis 667bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (mFlags & kFlagIsSecure) { 668bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber usage |= GRALLOC_USAGE_PROTECTED; 669bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 670bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 671bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Make sure to check whether either Stagefright or the video decoder 672bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // requested protected buffers. 673bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (usage & GRALLOC_USAGE_PROTECTED) { 674bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Verify that the ANativeWindow sends images directly to 675bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // SurfaceFlinger. 676bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int queuesToNativeWindow = 0; 677bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query( 678bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 679bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber &queuesToNativeWindow); 680bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != 0) { 681bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error authenticating native window: %d", err); 682bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 683bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 684bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (queuesToNativeWindow != 1) { 685bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("native window could not be authenticated"); 686bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return PERMISSION_DENIED; 687bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 688bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 689bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 6923c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 69529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 699054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 700258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 701258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 702054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 703258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 704258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 70529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 706258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 707258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 708258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 709258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 710e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 711e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 7121faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 7131faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 714e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 715e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 716e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 717e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 718e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 719e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 720e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 7211faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 7221faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 723e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 724e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 725258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 726258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 727258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 728258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 729e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 730e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 731e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 732e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 733e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 734609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 735e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 736e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 737e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 738258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 739258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 740258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 741258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 74629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 751054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 752054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 753054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 754054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 755054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 756054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 757054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 758054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 759054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 760054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 761054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 762e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 763054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 764609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 766054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 769054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 7708ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 7711e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 77329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 77874006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 77974006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 780054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 78174006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 78274006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 78374006804065941841883c4b46ee785070164023fJamie Gennis 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 788609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 78974006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79374006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 79474006804065941841883c4b46ee785070164023fJamie Gennis 795609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 80774006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 809054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 810054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 811054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelBufferToNativeWindow(info); 817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 822054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 823054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 824054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 825054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 826054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 827054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 828e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 829054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 830609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 831054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 832054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 833054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 834054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 835054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 836054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 837054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 838054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 839054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 840054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 841054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 842054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 843054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 844054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 845054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 846054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 847054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 848054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 849054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 850054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 851054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 852054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 853054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 854609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 855054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 856054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 857054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 858054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 859054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 860054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 861054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 862054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 863054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 864054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 865054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 866054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 867054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 868054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 869054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 870054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 871609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 872054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 873054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 874054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 875054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 876054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 877054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 885609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 8891e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, 0); 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 898f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 8998ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 9001e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 901054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 9021e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 90329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 904c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 905c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 907054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 912054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 913054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 921054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 922054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 923054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 924054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 925054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 926054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 927054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 928054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 929054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 930054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 931054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 932054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 933054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 934054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 935054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 936054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 937054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 938d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 939d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 940d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 941054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 942d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 943d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 944d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 945d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 946d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 947d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 948054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest - &mBuffers[kPortIndexOutput][0], 949054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 950d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 951d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 952054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 953054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 971349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9762ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 9772ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 9782ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 9792ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 987f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info)); 996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1007f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 1016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 10372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 10382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 10392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 10402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 1041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 1047729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 1048729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1049bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 1050bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 1051c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1052c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1053c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1054c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 10572472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, 10582472b1c0d63454e5d90a982bd6c555de6c3127bdRachad "video_decoder.hevc", "video_encoder.hevc" }, 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 106394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 106494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 106594705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 106694705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 1067ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 1068ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 10692f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 10702f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1071ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1072ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1073774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1074774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 107597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 107697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 1077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 11115ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1128e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 1129e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> outputFormat = new AMessage(); 1130e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 11402f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 11412f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 11422f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1146d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1148d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1149d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1150d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1151d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1152d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1153308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1154308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1155d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1156308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1157308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1158308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1159d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1160308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 11613a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 11623a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 11633a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 11643a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 11653a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 11663a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 11673a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 11683a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 11693a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11703a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 11713a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 11723a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 11733a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 11743a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11753a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 11763a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 11773a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11783a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11793a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 11803a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 11813a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 11823a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 11833a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 11843a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11853a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 11863a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1187308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1188308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1189308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1190308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 1191308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1192308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1193308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1194308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1195308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1196308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1197308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1198308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1199308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1200308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1201308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1202308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1203308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1204308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1205a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1206a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1207a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1208a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1209a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1210a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 121194ee4b708acfa941581160b267afb79192b1d816Chong Zhang 121294ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 12132c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 12142c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 12152c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 12162c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 12172c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 121894ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 121972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 122072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 122172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 122272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 122372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 122472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1225308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1226308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1227054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 1228054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar int32_t haveNativeWindow = msg->findObject("native-window", &obj) && 12295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad obj != NULL; 1230054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1231e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1232e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 1233e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 1234054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (!encoder && video && haveNativeWindow) { 12355a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<NativeWindowWrapper> windowWrapper( 12365a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad static_cast<NativeWindowWrapper *>(obj.get())); 12375a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<ANativeWindow> nativeWindow = windowWrapper->getNativeWindow(); 12385a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12395a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t tunneled; 12405a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("feature-tunneled-playback", &tunneled) && 12415a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunneled != 0) { 12425a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGI("Configuring TUNNELED video playback."); 12435a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12445a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int64_t audioHwSync = 0; 12455a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (!msg->findInt64("audio-hw-sync", &audioHwSync)) { 12465a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW("No Audio HW Sync provided for video tunnel"); 12475a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 12485a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = configureTunneledVideoPlayback(audioHwSync, nativeWindow); 12495a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 12505a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureTunneledVideoPlayback(%" PRId64 ",%p) failed!", 12515a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad audioHwSync, nativeWindow.get()); 12525a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 1253fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1254fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 12555a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 12565a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 12575a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // Always try to enable dynamic output buffers on native surface 12585a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->storeMetaDataInBuffers( 12595a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE); 12605a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 12615a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1262fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1263e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 12645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // if adaptive playback has been requested, try JB fallback 12655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 12665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // LARGE MEMORY REQUIREMENT 12675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // we will not do adaptive playback on software accessed 12695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // surfaces as they never had to respond to changes in the 12705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // crop window, and we don't trust that they will be able to. 12715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int usageBits = 0; 12725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad bool canDoAdaptivePlayback; 12735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (nativeWindow->query( 12755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad nativeWindow.get(), 12765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad NATIVE_WINDOW_CONSUMER_USAGE_BITS, 12775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad &usageBits) != OK) { 12785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = false; 12795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 12805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = 12815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (usageBits & 12825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (GRALLOC_USAGE_SW_READ_MASK | 12835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 12845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 12855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t maxWidth = 0, maxHeight = 0; 12875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (canDoAdaptivePlayback && 12885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-width", &maxWidth) && 12895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-height", &maxHeight)) { 12905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 12915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), maxWidth, maxHeight); 12925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->prepareForAdaptivePlayback( 12945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, 12955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad maxHeight); 12965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW_IF(err != OK, 12975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "[%s] prepareForAdaptivePlayback failed w/ err %d", 12985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), err); 12995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err == OK) { 13015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-width", maxWidth); 13025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-height", maxHeight); 13035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 13045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 1305e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 13065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // allow failure 13075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OK; 13085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 13095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] storeMetaDataInBuffers succeeded", 13105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str()); 13115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mStoreMetaDataInOutputBuffers = true; 13125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 1313fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 13140167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 13155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t push; 13165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 13175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad && push != 0) { 13185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 13195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 13200167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1321e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 1322e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang int32_t rotationDegrees; 1323e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (msg->findInt32("rotation-degrees", &rotationDegrees)) { 1324e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = rotationDegrees; 1325e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } else { 1326e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = 0; 1327e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 1328054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1329054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1330308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 133489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setupVideoDecoder(mime, msg); 13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 133642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 133742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 133842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 133942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 134042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 134142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 134242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 134342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 134442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 134542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 134642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 134742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 134842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1355aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1356b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi int32_t sbrMode; 13578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount; 13588045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drcParams_t drc; 1359ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1360ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1361ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1362aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1363aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1364aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1365b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi if (!msg->findInt32("aac-sbr-mode", &sbrMode)) { 1366b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi sbrMode = -1; 1367b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1368ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 13698045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-max-output-channel_count", &maxOutputChannelCount)) { 13708045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi maxOutputChannelCount = -1; 13718045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13728045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-encoded-target-level", &drc.encodedTargetLevel)) { 13738045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 13748045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.encodedTargetLevel = -1; 13758045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13768045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-cut-level", &drc.drcCut)) { 13778045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 13788045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcCut = -1; 13798045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13808045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-boost-level", &drc.drcBoost)) { 13818045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 13828045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcBoost = -1; 13838045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13848045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-heavy-compression", &drc.heavyCompression)) { 13858045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 13868045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.heavyCompression = -1; 13878045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13888045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-target-ref-level", &drc.targetRefLevel)) { 13898045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 13908045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.targetRefLevel = -1; 13918045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 13928045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 1393ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 13944471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 13958045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi isADTS != 0, sbrMode, maxOutputChannelCount, drc); 13965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1397729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 13985778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1399729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1401729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1402729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1403729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1404729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1405729de186450f78c099637e1fce743fe531862c52Andreas Huber 1406729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 14085778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupG711Codec(encoder, numChannels); 14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 14132f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi int32_t numChannels, sampleRate, compressionLevel = -1; 14142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 14152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 14162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 14172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 14182f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 14192f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 14202f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1421516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1422cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar "complexity", &compressionLevel) && 1423cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar !msg->findInt32( 1424516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 1425cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar compressionLevel = 5; // default FLAC compression level 14262f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1427516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1428516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1429516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 14302f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 14312f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1432516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1433516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1434516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 14352f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 14362f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 14372f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1438516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1439516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 14402f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1441ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1442ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1443ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1444ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1445ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1446ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1447ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1448ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1449ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 145097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 145197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 145297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 145397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 145497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 145597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 145697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 145797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 145897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1460729de186450f78c099637e1fce743fe531862c52Andreas Huber 14614471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 14624471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 14634471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 14644471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 14658b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 14668b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 14678b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 14689806555d3930be43e11106281dee354820ac1c88Andreas Huber 14698b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 14708b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 14718b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 14728b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 14739806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 14749806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 14759806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 14769806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 14779806555d3930be43e11106281dee354820ac1c88Andreas Huber } 14789806555d3930be43e11106281dee354820ac1c88Andreas Huber 1479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1486e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1487e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1488e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1489e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1490e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 14915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1494f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 15545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 15555778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1558aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 15598045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode, 15608045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount, const drcParams_t& drc) { 1561ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1562ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1563ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1564ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16025778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 16035778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 16045778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 16055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 16085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 16105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16135778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 16145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16155778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 16165778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 16175778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 16185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16195778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 16205778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1625aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 16265778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 1627b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi switch (sbrMode) { 1628b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 0: 1629b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // disable sbr 1630b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1631b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1632b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1633b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 1: 1634b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable single-rate sbr 1635b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1636b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1637b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1638b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 2: 1639b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable dual-rate sbr 1640b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1641b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1642b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1643b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case -1: 1644b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable both modes -> the codec will decide which mode should be used 1645b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1646b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1647b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1648b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi default: 1649b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // unsupported sbr mode 1650b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi return BAD_VALUE; 1651b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1652b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 16625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 1665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 1666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 1667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16685778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 1669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 1676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 1677ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1678ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 1679ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 1680ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 1681ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 1682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16838045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi OMX_AUDIO_PARAM_ANDROID_AACPRESENTATIONTYPE presentation; 16848045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nMaxOutputChannels = maxOutputChannelCount; 16858045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcCut = drc.drcCut; 16868045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcBoost = drc.drcBoost; 16878045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nHeavyCompression = drc.heavyCompression; 16888045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nTargetReferenceLevel = drc.targetRefLevel; 16898045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nEncodedTargetLevel = drc.encodedTargetLevel; 16908045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 16918045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi status_t res = mOMX->setParameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 16928045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (res == OK) { 16938045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // optional parameters, will not cause configuration failure 16948045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi mOMX->setParameter(mNode, (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacPresentation, 16958045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi &presentation, sizeof(presentation)); 16968045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } else { 16978045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi ALOGW("did not set AudioAndroidAacPresentation due to error %d when setting AudioAac", res); 16988045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16998045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi return res; 17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 170397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 170497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 170597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 170697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 170797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 170897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 170997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 171097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 171197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 171297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 171397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 171497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 171597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 171697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 171797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 171897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 171997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 172097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 172197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 172297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 172397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 172497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 172597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 172697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 172797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 172897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 172997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 173097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 173197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 173297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 173397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 173497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 173597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 173697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 173797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 173897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 173997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 17705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 17745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 17775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 17785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17805778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 17815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 17825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17855778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 1786729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 1787729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 17885778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 1789729de186450f78c099637e1fce743fe531862c52Andreas Huber 1790729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 1791729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1792729de186450f78c099637e1fce743fe531862c52Andreas Huber 1793729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1794729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1795729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1796729de186450f78c099637e1fce743fe531862c52Andreas Huber 1797729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 1802729de186450f78c099637e1fce743fe531862c52Andreas Huber 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1806729de186450f78c099637e1fce743fe531862c52Andreas Huber 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 1811729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1812729de186450f78c099637e1fce743fe531862c52Andreas Huber 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1816729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 1817729de186450f78c099637e1fce743fe531862c52Andreas Huber kPortIndexInput, 8000 /* sampleRate */, numChannels); 1818729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1819729de186450f78c099637e1fce743fe531862c52Andreas Huber 18202f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 18212f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 18222f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 18232f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 18242f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 18252f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 18262f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 18272f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 18282f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 18292f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 18302f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 18312f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 18322f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 18332f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 18342f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 18352f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 18362f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 18372f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 18382f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 18392f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 18402f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 18412f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 18422f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 18432f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 18442f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 18452f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 18462f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 18472f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 1848729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 1849729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 1850729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1851729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 1852729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 1853729de186450f78c099637e1fce743fe531862c52Andreas Huber 1854729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 1855729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1856729de186450f78c099637e1fce743fe531862c52Andreas Huber 1857729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1858729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1859729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1860729de186450f78c099637e1fce743fe531862c52Andreas Huber 1861729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 1862729de186450f78c099637e1fce743fe531862c52Andreas Huber 1863729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 1864729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1865729de186450f78c099637e1fce743fe531862c52Andreas Huber 1866729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1867729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1868729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1869729de186450f78c099637e1fce743fe531862c52Andreas Huber 1870729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 1871729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 1872729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 1873729de186450f78c099637e1fce743fe531862c52Andreas Huber 1874729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 1875729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1876729de186450f78c099637e1fce743fe531862c52Andreas Huber 1877729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 1878729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 1879729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1880729de186450f78c099637e1fce743fe531862c52Andreas Huber 1881729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 1882729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 1883729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 1884729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 1885729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 1886729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 1887729de186450f78c099637e1fce743fe531862c52Andreas Huber 1888c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 1889c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 1890729de186450f78c099637e1fce743fe531862c52Andreas Huber } 1891729de186450f78c099637e1fce743fe531862c52Andreas Huber 1892729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 1893729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 1894729de186450f78c099637e1fce743fe531862c52Andreas Huber} 1895729de186450f78c099637e1fce743fe531862c52Andreas Huber 18965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t ACodec::configureTunneledVideoPlayback( 18975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int64_t audioHwSync, const sp<ANativeWindow> &nativeWindow) { 18985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t* sidebandHandle; 18995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 19005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad status_t err = mOMX->configureVideoTunnelMode( 19015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, audioHwSync, &sidebandHandle); 19025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 19035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureVideoTunnelMode failed! (err %d).", err); 19045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 19055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 19065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 19075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle); 19085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 19095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", 19105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sidebandHandle, err); 19115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 19125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 19135a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 19145a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return OK; 19155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 19165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 1917f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 1918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 1919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 1920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_COLOR_FORMATTYPE colorFormat) { 1921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 1924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 1926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 1928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 1929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 1930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1938229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // substitute back flexible color format to codec supported format 1939229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_U32 flexibleEquivalent; 1940229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (compressionFormat == OMX_VIDEO_CodingUnused && 1941229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar isFlexibleColorFormat( 1942229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mOMX, mNode, format.eColorFormat, &flexibleEquivalent) && 1943229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat == flexibleEquivalent) { 1944229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar ALOGI("[%s] using color format %#x in place of %#x", 1945229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mComponentName.c_str(), format.eColorFormat, colorFormat); 1946229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat = format.eColorFormat; 1947229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 1948229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 1949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 1950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 1951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 1953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 1954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 1955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 1956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 1960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 1961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 1962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 1968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 1969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 1970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 1974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 1977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 1978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1987f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setSupportedOutputFormat() { 1988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 1989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 1990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 1991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 1992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 1995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 1996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 1997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)format.eCompressionFormat, (int)OMX_VIDEO_CodingUnused); 1998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 2000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2004e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 2005e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 2006e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 2007e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 2008e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 20092472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, OMX_VIDEO_CodingHEVC }, 2010e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 2011e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 2012e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 201394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 201494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 2015e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 2016e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 20175778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 20185778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 2019e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2020e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2021e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2022e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 2023e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 2024e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2025e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2028e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 2029e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2030e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 2031e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2032e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2033e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 2034e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 2035e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2036e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2037e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2038e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 2039e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 2040e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2041e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2042e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2043e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2044e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 2045e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2046e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 20475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 20485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 205089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar const char *mime, const sp<AMessage> &msg) { 205189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t width, height; 205289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (!msg->findInt32("width", &width) 205389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar || !msg->findInt32("height", &height)) { 205489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar return INVALID_OPERATION; 205589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 205689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar 20575778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 20585778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 20595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20645778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 2065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 2066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 207189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t tmp; 207289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (msg->findInt32("color-format", &tmp)) { 207389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat = 207489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar static_cast<OMX_COLOR_FORMATTYPE>(tmp); 207589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setVideoPortFormatType( 207689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar kPortIndexOutput, OMX_VIDEO_CodingUnused, colorFormat); 207789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (err != OK) { 207889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar ALOGW("[%s] does not support color format %d", 207989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar mComponentName.c_str(), colorFormat); 208089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setSupportedOutputFormat(); 208189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 208289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } else { 208389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setSupportedOutputFormat(); 208489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 2085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, width, height, compressionFormat); 2092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 2099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21075778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 21085778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 21095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 21105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21135778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 21145778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 21155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21165778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 21175778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 21185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21205778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 21215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 21225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21265778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 21275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21285778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 21295778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 21305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21315778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 21325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21335778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 21345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21355778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 21365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 21375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21425778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 21435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 21445778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 21455778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 21465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21495778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 21505778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 21515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 21535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 21545778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 21555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21575778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 21585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21595778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 21605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 21615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 21625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21645778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 21655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21665778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 21675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21685778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 21695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 21705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 21715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 21725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 21735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21745778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 21752c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 21765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21785778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 21795778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 21805778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = colorFormat; 21815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 21835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 21845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21865778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 21875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 21885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21925778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 21935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21945778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 21955778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 21965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22015778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 22025778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 22035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22055778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 22065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 22075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22115778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 22125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22135778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 22145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 22155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22175778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22205778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 22215778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 22225778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 22235778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 22245778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 22255778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 22265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22275778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 22285778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 22295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22315778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 22325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 22335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22375778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 22385778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 22395778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 22405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 22415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22425778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 22435778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 22445778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 22455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22465778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 22475778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 22485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 22495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2250c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad case OMX_VIDEO_CodingHEVC: 2251c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = setupHEVCEncoderParameters(msg); 2252c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad break; 2253c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 225489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 225589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 225689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 225789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 225889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 22595778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 22605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 22615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 22625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22635778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 22645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 22675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 22680dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 22690dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 22700dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 22710dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 22720dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22730dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 22740dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22750dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 22760dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 22770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 22780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 22790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 22800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 22820dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22830dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22840dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 22850dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 22860dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 22870dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 22880dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 22890dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22900dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 22910dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22920dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 22930dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 22940dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 22950dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22960dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 22970dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 22980dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 22990dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 23000dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 23010dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 23020dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 23030dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 23040dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 23055778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 23065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 23075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 23085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 23095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 23105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23115778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 23125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(ret > 1); 23135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 23145778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 23155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 231696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 231796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 231896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 231996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 232096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 232196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 232296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 232396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 232496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 23255778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 23265778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 23275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 23285778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 23295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 23305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 233296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 233396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 23345778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 23355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 23365778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 23375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 23385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 23395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23405778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 23415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23435778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 23445778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 23455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 23465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23475778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 23485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 23495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 23555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 23565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 23575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 23595778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 23605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 23625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 23635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 23645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 23665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 23675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 23685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 23695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 23705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 23715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 23725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23735778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 23745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 23755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 23765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 23775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 23785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 23815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 23875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 23885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23905778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 23915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 23925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23945778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 239796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 23985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 24045778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24065778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 24075778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 24085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 24095778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 24105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 241396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 241496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 24155778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 24165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 24175778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 24185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 24195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24215778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 24225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24245778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 24255778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 24265778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 24275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24285778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 24295778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 24305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24325778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24355778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 24365778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 24375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24385778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 24395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 24405778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 24415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24425778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 24435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24445778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 24455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 24465778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 24475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 24485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24515778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 24525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24575778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 24585778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 24595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24615778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 24625778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 24635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 24645778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 24655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24665778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 24675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 24685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 247396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 24745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24765778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 24805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 24835778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 24845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 24855778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 24865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 248996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 249096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 24915778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 24925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 24935778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 24945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 24955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24975778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 24985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25000dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 25010dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 25020dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 25030dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 25040dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 25050dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 25060dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 25070dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 25080dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25115778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 25125778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 25135778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 25145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25150dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 25165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 25175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25225778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 25235778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 25245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 25265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 25275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 25285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 25295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 25305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25325778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 25335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25385778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 25395778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 25405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25425778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 25437c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 25447c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 25457c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 25465778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 25475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 25505778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 25515778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 25525778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 25535778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 25545778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 25555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 25565778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 25575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25585778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 25595778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 25605778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 25615778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 25625778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 25635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 25645778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 25655778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 25665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 25695778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 25705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25725778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 25735778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 25745778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 25755778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 25765778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 25775778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 25785778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 25795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 25815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 25825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 258796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 25885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 25895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2590c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachadstatus_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { 2591c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t bitrate, iFrameInterval; 2592c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("bitrate", &bitrate) 2593c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 2594c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2595c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2596c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2597c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 2598c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2599c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad float frameRate; 2600c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findFloat("frame-rate", &frameRate)) { 2601c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t tmp; 2602c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("frame-rate", &tmp)) { 2603c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2604c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2605c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad frameRate = (float)tmp; 2606c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2607c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2608c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_PARAM_HEVCTYPE hevcType; 2609c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad InitOMXParams(&hevcType); 2610c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.nPortIndex = kPortIndexOutput; 2611c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2612c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad status_t err = OK; 2613c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->getParameter( 2614c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 2615c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2616c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2617c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2618c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2619c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t profile; 2620c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (msg->findInt32("profile", &profile)) { 2621c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t level; 2622c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("level", &level)) { 2623c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2624c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2625c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2626c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = verifySupportForProfileAndLevel(profile, level); 2627c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2628c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2629c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2630c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2631c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); 2632c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); 2633c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2634c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2635c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad // TODO: Need OMX structure definition for setting iFrameInterval 2636c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2637c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->setParameter( 2638c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 2639c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2640c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2641c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2642c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2643c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return configureBitrate(bitrate, bitrateMode); 2644c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad} 2645c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 264689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 264789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 26484154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 26494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 26504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 26514154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 26524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 26534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 26544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 26554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 26564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 26574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 26584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 265989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 266089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 266189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 26624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 266389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 266489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 266589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 26664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 26674154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 26684154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 26694154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 26704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 26714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 26724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 26734154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 26744154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 26754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 26764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 26774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 26784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 26794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 26804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 26814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 26824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 26834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 26844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 26854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 26864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 26874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 26884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 26894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 26904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 26914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 26924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 26934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 26944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 26954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 26964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 26974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 26984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 26994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 27004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 27014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 27034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 27044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 27054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 27064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 27074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 27084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 27114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 27124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 27134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 27154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 27164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 27174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 27184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 27194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 27204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 27224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 272389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 272489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 272589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 27265778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 27275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 27285778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 27295778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 27305778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 27315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27325778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 27335778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 27345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 27355778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 27365778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 27375778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 27385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27435778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 27445778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 27455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 27475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 27485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27505778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 275296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 275396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 27545778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 27555778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 27565778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 27575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27585778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 27595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 27605778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 27615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 276696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 27675778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 27685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 27705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 27715778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 27725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27745778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 27755778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 27765778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 27775778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 27785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27795778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 27805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 27815778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 27825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 27855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27875778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 27885778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 27895778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 27905778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 27915778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 27925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 27945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 27955778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 27965778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2798f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 2799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat) { 2801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 2803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 2804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 2806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 2811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 2814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 2815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 2816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 2817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 2821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 2823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 2824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 2826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 2827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 2828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 2831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2836f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 2837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 2838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 2839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 2842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2845d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 2846d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 2847d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2848d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2849d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 2850d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2851d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 2852d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 2853d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2854d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 2855d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 2856d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 2857d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 2858d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 28597e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 28607e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 28617e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 28627e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 28637e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 28647e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 28657e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 28667e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 28677e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 28687e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 28697e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 28707e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 28717e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 28727e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 28737e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 28747e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 28757e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 28767e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 28777e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 2878e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 28797e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 2880c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 2881c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 2882c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 2883c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 28847e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 28857e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 28867e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 2887f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 2888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 2889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 2890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 2891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 2893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 2894609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 2895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 2896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 2897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 2898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 2902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2904f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 2905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 2906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 2907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2909f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 2910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool wasEmptyBefore = mDeferredQueue.empty(); 2911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 2912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2914f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 2915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 2916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 2917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 2919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 2920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 2921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 292403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar// static 2925229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { 292603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar MediaImage &image = params.sMediaImage; 292703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar memset(&image, 0, sizeof(image)); 292803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 292903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 293003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 0; 293103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 293203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 293303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // we need stride and slice-height to be non-zero 293403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (params.nStride == 0 || params.nSliceHeight == 0) { 293503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 293603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt, fmt, params.nStride, params.nSliceHeight); 2937229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 293803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 293903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 294003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mWidth = params.nFrameWidth; 294103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mHeight = params.nFrameHeight; 294203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 294303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // only supporting YUV420 294403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (fmt != OMX_COLOR_FormatYUV420Planar && 294503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedPlanar && 294603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420SemiPlanar && 294703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar) { 294803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("do not know color format 0x%x = %d", fmt, fmt); 2949229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 295003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 295103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 295203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set-up YUV format 295303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 295403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 3; 295503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mBitDepth = 8; 295603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mOffset = 0; 295703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mColInc = 1; 295803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mRowInc = params.nStride; 295903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mHorizSubsampling = 1; 296003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mVertSubsampling = 1; 296103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 296203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar switch (fmt) { 296303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420Planar: // used for YV12 296403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedPlanar: 296503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 296603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 1; 296703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride / 2; 296803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 296903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 297003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 297103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 297203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar + (params.nStride * params.nSliceHeight / 4); 297303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 1; 297403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride / 2; 297503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 297603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 297703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 297803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 297903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420SemiPlanar: 298003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 298103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedSemiPlanar: 298203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // NV12 298303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 298403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 2; 298503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride; 298603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 298703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 298803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 298903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 299003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 2; 299103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride; 299203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 299303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 299403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 299503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 299603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar default: 299703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar TRESPASS(); 299803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 2999229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3000229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3001229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3002229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3003229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeColorFormat( 3004229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3005229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams &describeParams) 3006229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar{ 3007229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_INDEXTYPE describeColorFormatIndex; 3008229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (omx->getExtensionIndex( 3009229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, "OMX.google.android.index.describeColorFormat", 3010229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeColorFormatIndex) != OK || 3011229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar omx->getParameter( 3012229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, describeColorFormatIndex, 3013229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeParams, sizeof(describeParams)) != OK) { 3014229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeDefaultColorFormat(describeParams); 3015229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3016229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeParams.sMediaImage.mType != 3017229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 3018229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3019229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3020229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3021229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::isFlexibleColorFormat( 3022229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3023229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar uint32_t colorFormat, OMX_U32 *flexibleEquivalent) { 3024229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams describeParams; 3025229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar InitOMXParams(&describeParams); 3026229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3027229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // reasonable dummy values 3028229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameWidth = 128; 3029229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameHeight = 128; 3030229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nStride = 128; 3031229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nSliceHeight = 128; 3032229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3033229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar CHECK(flexibleEquivalent != NULL); 3034229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3035229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (!describeColorFormat(omx, node, describeParams)) { 3036229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3037229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3038229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3039229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const MediaImage &img = describeParams.sMediaImage; 3040229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) { 3041229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mNumPlanes != 3 || 3042229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mHorizSubsampling != 1 || 3043229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mVertSubsampling != 1) { 3044229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3045229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3046229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3047229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // YUV 420 3048229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mPlane[img.U].mHorizSubsampling == 2 3049229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.U].mVertSubsampling == 2 3050229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mHorizSubsampling == 2 3051229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mVertSubsampling == 2) { 3052229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // possible flexible YUV420 format 3053229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mBitDepth <= 8) { 3054229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3055229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3056229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3057229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3058229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3059229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 306003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar} 306103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3062e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 3063e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 306431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 306531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 3066e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 306731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 306831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 306931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 307031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 307131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3072e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 3073e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 307431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 307531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 307631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 307731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 307831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 3079e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 3080e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 3081e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3082e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 3083e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 3084e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3085e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 3086e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 3087e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 3088e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 308903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar DescribeColorFormatParams describeParams; 309003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar InitOMXParams(&describeParams); 309103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar describeParams.eColorFormat = videoDef->eColorFormat; 309203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar describeParams.nFrameWidth = videoDef->nFrameWidth; 309303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar describeParams.nFrameHeight = videoDef->nFrameHeight; 309403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar describeParams.nStride = videoDef->nStride; 309503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar describeParams.nSliceHeight = videoDef->nSliceHeight; 309603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3097229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (describeColorFormat(mOMX, mNode, describeParams)) { 309803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar notify->setBuffer( 309903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar "image-data", 310003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ABuffer::CreateAsCopy( 310103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar &describeParams.sMediaImage, 310203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar sizeof(describeParams.sMediaImage))); 310303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 310403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3105e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 3106e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 3107e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nPortIndex = kPortIndexOutput; 3108e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3109e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 3110e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexConfigCommonOutputCrop, 3111e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 3112e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 3113e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 3114e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 3115e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 3116e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 311731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3118e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 3119e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 3120e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 3121e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 3122e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 3123e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 3124e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3125e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 3126577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 3127577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 3128577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 3129e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 3130e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 3131e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3132e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3133e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 31344730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 31354730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP8: 31364730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP9: 31374730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 31384730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 31394730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia InitOMXParams(&vp8type); 31404730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia vp8type.nPortIndex = kPortIndexOutput; 31414730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia status_t err = mOMX->getParameter( 31424730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia mNode, 31434730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 31444730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia &vp8type, 31454730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia sizeof(vp8type)); 31464730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 31474730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (err == OK) { 31484730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia AString tsSchema = "none"; 31494730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (vp8type.eTemporalPattern 31504730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 31514730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia switch (vp8type.nTemporalLayerCount) { 31524730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 1: 31534730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 31544730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.1-layer"; 31554730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 31564730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31574730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 2: 31584730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 31594730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.2-layer"; 31604730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 31614730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31624730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 3: 31634730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 31644730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.3-layer"; 31654730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 31664730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31674730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia default: 31684730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 31694730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 31704730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31714730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31724730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31734730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia notify->setString("ts-schema", tsSchema); 31744730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31754730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia // Fall through to set up mime. 31764730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 31774730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 3178e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 3179e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3180e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 3181e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3182e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 3183e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 3184e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 3185e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 3186e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 3187e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3188e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3189e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 319031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3191e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3192e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 3193e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 319431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 319531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 319631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 319731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 319831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 319931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 320031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 320197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 3202e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 3203e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3204e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 3205e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3206e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3207e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3208e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3209e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 3210e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3211e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3212e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 321314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 3214e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 3215e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 321614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 321714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 321814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 321914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 322014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 322114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 3222e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3223e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 3224e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3225e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 3226e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3227e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 3228e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 32298b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 3230e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 32318b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 32329806555d3930be43e11106281dee354820ac1c88Andreas Huber 3233e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 3234e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3235e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 3236e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3237e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3238e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3239e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3240e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 3241e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3242e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3243e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3244e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 3245e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3246e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3247e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3248e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3249e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3250e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 3251e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3252e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 3253e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3254e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 32559806555d3930be43e11106281dee354820ac1c88Andreas Huber 3256e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3257e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 3258e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3259e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3260e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3261e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 3262e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 3263e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3264e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 3265e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3266e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 3267e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 3268e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3269e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 3270e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3271e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 3272e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3273e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3274e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3275e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3276e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 3277e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3278e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 3279e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3280e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3281e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3282e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3283e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 3284e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3285e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3286e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3287e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 3288e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3289e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3290e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3291e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3292e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3293e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 3294e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3295e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 3296e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3297e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3298e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3299e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3300e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 3301e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3302e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3303e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3304e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 3305e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3306e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3307e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3308e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3309e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3310e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 3311e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3312e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 3313e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3314e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3315e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3316e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3317e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 3318e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3319e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3320e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3321e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 3322e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3323e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3324e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3325e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3326e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 332797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 332897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 332997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 333097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 3331e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 333297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 333397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 333497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 333597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 333697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 333797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 333897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 333997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 334097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 334197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 334297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 334397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 3344e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 33458c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian case OMX_AUDIO_CodingAndroidOPUS: 33468c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian { 33478c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian OMX_AUDIO_PARAM_ANDROID_OPUSTYPE params; 33488c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian InitOMXParams(¶ms); 33498c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian params.nPortIndex = portIndex; 33508c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 33518c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian CHECK_EQ((status_t)OK, mOMX->getParameter( 33528c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian mNode, 33538c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, 33548c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian ¶ms, 33558c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian sizeof(params))); 33568c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 33578c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); 33588c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("channel-count", params.nChannels); 33598c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("sample-rate", params.nSampleRate); 33608c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian break; 33618c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian } 33628c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 3363e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 3364e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 3365e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 3366e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 336731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 336831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 336931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 337031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 337131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 337231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 337331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 3375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 3376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3377e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 3378e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> notify = mNotify->dup(); 3379e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 3380e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3381e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 3382e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3383e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3384e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 3385e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3386e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 3387e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 3388e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 3389e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 3390e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 3391e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 3392e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 3393e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 3394e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 3395e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 3396e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 3397e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 3398e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 3399e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 3400e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 3401e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGW("Replacing SkipCutBuffer holding %d " 3402e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar "bytes", 3403e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar prevbufsize); 3404e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3405e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3406e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 3407e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 3408e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 3409e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3410e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 341131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 341231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 341331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 341431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 341531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 34165778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 3417cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 3418d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatError); 3419251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGE("signalError(omxError %#x, internalError %d)", error, internalError); 3420251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3421251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (internalError == UNKNOWN_ERROR) { // find better error code 3422251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const status_t omxStatus = statusFromOMXError(error); 3423251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (omxStatus != 0) { 3424251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung internalError = omxStatus; 3425251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 3426251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", error); 3427251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 3428251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 34295778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 3430251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung notify->setInt32("actionCode", ACTION_CODE_FATAL); // could translate from OMX error. 3431cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 3432cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 3433cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 3434bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huberstatus_t ACodec::pushBlankBuffersToNativeWindow() { 3435bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber status_t err = NO_ERROR; 3436bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ANativeWindowBuffer* anb = NULL; 3437bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int numBufs = 0; 3438bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int minUndequeuedBufs = 0; 3439bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3440bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We need to reconnect to the ANativeWindow as a CPU client to ensure that 3441bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // no frames get dropped by SurfaceFlinger assuming that these are video 3442bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // frames. 3443bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 3444bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3445bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3446bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 3447bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3448bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3449bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3450bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3451bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 3452bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3453bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3454bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 3455bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3456bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3457bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3458bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3459bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1, 3460bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber HAL_PIXEL_FORMAT_RGBX_8888); 3461bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3462bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)", 3463bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3464bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3465bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3466bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 346787eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin err = native_window_set_scaling_mode(mNativeWindow.get(), 346887eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 346987eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin if (err != NO_ERROR) { 347087eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin ALOGE("error pushing blank_frames: set_scaling_mode failed: %s (%d)", 347187eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin strerror(-err), -err); 347287eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin goto error; 3473bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3474bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3475bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_usage(mNativeWindow.get(), 3476bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber GRALLOC_USAGE_SW_WRITE_OFTEN); 3477bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3478bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_usage failed: %s (%d)", 3479bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3480bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3481bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3482bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3483bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query(mNativeWindow.get(), 3484bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 3485bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3486bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 3487bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber "failed: %s (%d)", strerror(-err), -err); 3488bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3489bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3490bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3491bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber numBufs = minUndequeuedBufs + 1; 3492bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffer_count(mNativeWindow.get(), numBufs); 3493bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3494bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", 3495bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3496bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3497bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3498bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3499bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push numBufs + 1 buffers to ensure that we've drawn into the same 3500bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // buffer twice. This should guarantee that the buffer has been displayed 3501bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // on the screen and then been replaced, so an previous video frames are 3502bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // guaranteed NOT to be currently displayed. 3503bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber for (int i = 0; i < numBufs + 1; i++) { 35041e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 35051e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb); 3506bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3507bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 3508bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3509bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3510bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3511bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3512bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 3513bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3514bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Fill the buffer with the a 1x1 checkerboard pattern ;) 3515bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber uint32_t* img = NULL; 3516bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 3517bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3518bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: lock failed: %s (%d)", 3519bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3520bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3521bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3522bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3523bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber *img = 0; 3524bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3525bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->unlock(); 3526bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3527bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: unlock failed: %s (%d)", 3528bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3529bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3530bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3531bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3532bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->queueBuffer(mNativeWindow.get(), 35331e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis buf->getNativeBuffer(), -1); 3534bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3535bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", 3536bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3537bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3538bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3539bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3540bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber anb = NULL; 3541bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3542bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3543bc098410be55f9d96f394b3981a0c482b83859b6Andreas Hubererror: 3544bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3545bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3546bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after an error. 3547bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (anb != NULL) { 35481e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow->cancelBuffer(mNativeWindow.get(), anb, -1); 3549bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3550bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3551bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_disconnect(mNativeWindow.get(), 3552bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3553bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_connect(mNativeWindow.get(), 3554bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3555bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3556bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3557bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } else { 3558bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after success. 3559bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 3560bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3561bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3562bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 3563bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3564bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3565bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3566bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3567bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 3568bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3569bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3570bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 3571bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3572bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3573bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3574bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3575bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return NO_ERROR; 3576bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3577bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber} 3578bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 3580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3581eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 3582eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3583eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3584496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 3585496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 3586496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 3587496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 3588496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3589496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 3590496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 3591496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3592496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 3593496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 3594496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3595496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 3596496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 3597496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 3598496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 3599496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 3600496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 3601496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 3602eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 3603eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 3604eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 3605eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 3606eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3607eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3608eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 3609eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 3610eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3611eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3612eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 3613eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 3614eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3615eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3616eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 3617eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 3618eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 3619eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3620eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 3621eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 3622f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 3623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 3624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 3625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3627ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 3628ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 3629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 3630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3632f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 3633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 3634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 3635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 3637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 3641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 3643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 3647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 3649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 36527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 36537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 3654251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This may result in an app illegal state exception. 36557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 36567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 36577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 36587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 36597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3660ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 3661ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 3662251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This will result in kFlagSawMediaServerDie handling in MediaCodec. 3663ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 3664ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 3665ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 3666ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 3667ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 3668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3675f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 3676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 3677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 3678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36795e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 36805e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 36815e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar if (mCodec->mNode == NULL) { 36825e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 36835e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 36845e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 36855e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 36865e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 3687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 3688609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 3689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 3690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 3692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 3693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 3695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 3696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 3697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 3698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36990af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 37000af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 37010af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 37020af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 37030af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 37040af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 37050af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 37060af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 37070af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 37080af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 37090af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 3710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 3711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 3712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 3713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 3714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 3717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3719609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 3720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 3722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 3725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3727609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 3728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 3730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 3731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 3733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 3734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 3735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 3736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 3738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 3740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 3741784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 3742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 3746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3750f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 3751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 3752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 37533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 3754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 3755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1); 3760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3761251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // verify OMX component sends back an error we expect. 3762251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung OMX_ERRORTYPE omxError = (OMX_ERRORTYPE)data1; 3763251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (!isOMXError(omxError)) { 3764251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", omxError); 3765251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung omxError = OMX_ErrorUndefined; 3766251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 3767251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(omxError); 3768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3772f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 37733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] onOMXEmptyBufferDone %p", 3774349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 3775349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 3777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 3778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 3780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3782d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber const sp<AMessage> &bufferMeta = info->mData->meta(); 3783d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber void *mediaBuffer; 3784d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (bufferMeta->findPointer("mediaBuffer", &mediaBuffer) 3785d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && mediaBuffer != NULL) { 3786d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // We're in "store-metadata-in-buffers" mode, the underlying 3787d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // OMX component had access to data that's implicitly refcounted 3788d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // by this "mediaBuffer" object. Now that the OMX component has 3789d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // told us that it's done with the input buffer, we can decrement 3790d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber // the mediaBuffer's reference count. 379196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 379296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("releasing mbuf %p", mediaBuffer); 379396fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 3794d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ((MediaBuffer *)mediaBuffer)->release(); 3795d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mediaBuffer = NULL; 3796d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3797d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferMeta->setPointer("mediaBuffer", NULL); 3798d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 3799d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 3801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 3808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 3811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 3813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 3814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3821f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 3822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 3823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 3824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 3827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 3829d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFillThisBuffer); 3830609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 3831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 38332d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 3834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id()); 3836609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 3837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 3839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 3841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 3843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3845f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 3846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 3847609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 38482d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 3849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 38505778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 3851a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 38525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 38532d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 3854a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 3855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 3856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38577fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 38587fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 38597fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 38607fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 38617fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 38627fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 38637fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 38647fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 38653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 38662d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 3867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 38705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 38715778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 38725778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 38735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 38745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 3876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 3877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 3879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 3881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 3882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 38835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 3884dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 3885dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 3886dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 3887dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 3890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 3893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 38945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 3895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 3896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 3897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 3899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 3901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 3902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 3903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 39065778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 39075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 39085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 3910d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGV("[%s] Needs to copy input data for buffer %p. (%p != %p)", 3911d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 3912d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 3913d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 3914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 3916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 3917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3919078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 39203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ codec specific data", 3921078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 39225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 39235778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling emptyBuffer %p w/ EOS", 39245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 3925078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 3926d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3927d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("[%s] calling emptyBuffer %p w/ time %lld us", 3928d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3929d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 39303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ time %lld us", 3931078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 3932d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3933078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 3934349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3935d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 3936d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 3937d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 3938d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 3939d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 3940d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 3941d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 3942054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 3943054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 3944054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 3945054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3946054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 3947054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 3948054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 3949054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 3950054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 3951e53350373ac516257b4f8956ff1e3f1ac48f607eLajos Molnar mCodec->submitOutputMetaDataBuffer(); 3952054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3953054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 3954054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 3955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 3960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 3961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 3962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 39675778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 39685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 39695778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 39705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 39715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 39725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 39735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 39745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 3976dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 39773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 3978dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 3979dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 3980dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 39813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 3982dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 3983dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 3984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p signalling EOS", 3986349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 3987349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 3988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 3989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 3990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 3991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 3993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 3994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 3995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 3996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 3998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4000dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4004625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 4005625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 4006625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4007625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 4008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4011f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 4012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 4017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 4022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 4023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 4024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 4027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 4029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 4030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 4034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 4038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4040f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 4041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 4042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 4043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 4044784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 4045609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 40465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 4047349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4049d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4050d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4051d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 4052d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 4053d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 4054d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 4055d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4056d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 4057d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 4058d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 4059d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4060d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 4061d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 4062d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 4063d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4064d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4070054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 4071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 40815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (rangeLength == 0 && !(flags & OMX_BUFFERFLAG_EOS)) { 4082609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 40835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4084349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 40855778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 40865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 40875778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 4088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40895778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 40905778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 40915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 409231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4093577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 4094577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec->id()); 4095577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 40964bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 4097577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 40985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4100308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 4101308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 4102308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 4103308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 4104308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 4105308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 4106308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 4107308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 4108308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 4109496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 411021ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 4111496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 4112496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 4113496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 41145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 411521ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 4116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41178b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 41188b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 41198b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 41205778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 4121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41225778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4123d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); 4124609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 41252d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 41265778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 4127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4128609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41305778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 4131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41325778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 41335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 41345778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 4135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 41375778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 41385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4140d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatEOS); 4141dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 4142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 4145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4162f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 4163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4164609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 4165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 4169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4170577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 4171577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 4172577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 4173577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 4174577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 4175577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 4176577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 4177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 41796aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 418079ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 41816fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 4182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 4183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4184fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 4185fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 4186fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 4187fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 4188fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 4189fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 4190fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 4191fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 419247aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 4193fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 4194fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4195fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 4196fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4197fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 41985778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4199fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 4200fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 4201fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 4202fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4203fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 42045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 4205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 42061e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 4207cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 4208cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 4209251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4210cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4211cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 4212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 42136fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 42146fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 42156fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 42166fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 4217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4246c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 4247609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 4248c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4249349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4250c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4251c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4253c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4254c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4272f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4276c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 4277c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 4278ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4279ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 4280ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); 4281ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4282ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4283ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4284ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 4285ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNode = NULL; 4286ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 4287ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 4288ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 4289308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 4290ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 4291c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4292c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4293f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 4294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43055778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 43065778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 43075778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 43085778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 43095778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 43105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 4313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4314c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4315c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4316c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 431754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 431854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 4319c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4321d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 4322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4325c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 4329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4331d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4335c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4345f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 4346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4347c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 4348c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 4349c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 4350c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 43515778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 43525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4353c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 43545778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 43555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4356c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(mCodec->mNode == NULL); 43575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 4359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 4360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 4362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4363ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id()); 4364ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4365ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 4366ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { 4367ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 4368ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 4369ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4370ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4371ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4372e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 43735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 4375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43765778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4377d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 43787791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen int32_t encoder = false; 43795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 4380e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 4381e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 4382e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 4383afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4384e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 4385e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 4386e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 4387afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 43885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 43895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 43905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 43925778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 43935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43955778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 43965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 43975778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 43985778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 43995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 4400e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 44015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 44021065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 44031065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 44041065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber IOMX::node_id node = NULL; 44051065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 44061065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 44071065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 4408e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 4409e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 4410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4411078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber pid_t tid = androidGetTid(); 4412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 4413078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 44141065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber status_t err = omx->allocateNode(componentName.c_str(), observer, &node); 4415078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 4416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44171065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 44181065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 44197a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He } else { 44207a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He ALOGW("Allocating component '%s' failed, try next one.", componentName.c_str()); 44211065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 44221065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 44231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber node = NULL; 44241065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 44251065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4426c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (node == NULL) { 44275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 44287791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen ALOGE("Unable to instantiate a %scoder for type '%s'.", 44297791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen encoder ? "en" : "de", mime.c_str()); 44305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 44317791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen ALOGE("Unable to instantiate codec '%s'.", componentName.c_str()); 44325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4433c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 4434cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError(OMX_ErrorComponentNotFound); 4435c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 4436c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4438ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber notify = new AMessage(kWhatOMXMessage, mCodec->id()); 4439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 4440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 4442ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 4443ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4444ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 4445ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 44460167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 4447ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 4448ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4449afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 4450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 4451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 4452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44535778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 44545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4455d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentAllocated); 44565778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 44575778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 44585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4459c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4460c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4461c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4462c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 44635778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 44645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4465c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4466c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4467c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 4468c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 4469c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4470c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4471c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 4472c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 4473c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4474f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4475f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4476f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4477f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 4478f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4479054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 4480054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4481a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 4482e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 4483e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 4484054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4485c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 4486c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 4487c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4488c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 4489c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 4490c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4491c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4492c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 449354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 4494c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4495c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4496c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 4497c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 4498c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 4499c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4500c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 4501c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4502c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 450354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 450454b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 4505d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 450654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 450754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 450854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 4509c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4510c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4511c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 4512c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 4513c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4514c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 4515c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 4516c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4517c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 4518c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4519c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4520c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4521c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 45227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 45237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 45247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 45257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 45267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 45277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 45287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4529c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 4530c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4531c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 4532c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4533c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4534c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4535c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4536c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 4537c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4538c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4539c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4540c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 4541c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 454254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 4543c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4544c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4545c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4546c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4547c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4548c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4549c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 4550c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4551c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4552d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4553c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 4554c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4555c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4556c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4557c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4558c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4559c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 4560c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 4561c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4562c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4563c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 4564c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4565c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4566c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 45675778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 45685778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 45695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 45705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mCodec->mNode != NULL); 45715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 45725778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 45735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 45745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 45755778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 45765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 45775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 4578c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 4579c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 4580c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 4581251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4582c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 45835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 4586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (msg->findObject("native-window", &obj) 45875778822d86b0337407514b9372562b86edfa91cdAndreas Huber && strncmp("OMX.google.", mCodec->mComponentName.c_str(), 11)) { 45881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<NativeWindowWrapper> nativeWindow( 45891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten static_cast<NativeWindowWrapper *>(obj.get())); 45901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(nativeWindow != NULL); 45911173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mCodec->mNativeWindow = nativeWindow->getNativeWindow(); 45921ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber 45931ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber native_window_set_scaling_mode( 45941ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber mCodec->mNativeWindow.get(), 45951ec498e67f78fb0c3ab2a1cd9a071e6356618dadAndreas Huber NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 4596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, mCodec->initNativeWindow()); 4598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45995778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 46005778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4601d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentConfigured); 4602e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 4603e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 46045778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 46055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4606c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4607c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 46085778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 46095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 46107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::LoadedState::onCreateInputSurface( 4611ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber const sp<AMessage> & /* msg */) { 46127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGV("onCreateInputSurface"); 46137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 46147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> notify = mCodec->mNotify->dup(); 4615d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated); 46167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 46177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> bufferProducer; 46187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 46197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 46207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden err = mCodec->mOMX->createInputSurface(mCodec->mNode, kPortIndexInput, 46217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden &bufferProducer); 4622a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 4623a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err == OK && mCodec->mRepeatFrameDelayUs > 0ll) { 4624a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 4625a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 4626a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 4627a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 4628a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 4629a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 4630a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 4631a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 4632a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 4633a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 4634a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 4635a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 4636a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 4637a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 4638a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 46392c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mMaxPtsGapUs > 0ll) { 464094ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 464194ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 464294ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 464394ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 464494ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 464594ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 464694ee4b708acfa941581160b267afb79192b1d816Chong Zhang 464794ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 464894ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 464972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 465072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 46512c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 46522c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 46532c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 46542c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mTimePerCaptureUs > 0ll 46552c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 46562c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 46572c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 46582c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 46592c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 46602c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 46612c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 46622c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 46632c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 46642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 46652c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 46662c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 46672c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 46682c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 46692c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 46702c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 46712c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 467272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 467372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err == OK && mCodec->mCreateInputBuffersSuspended) { 467472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 467572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 467672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 467772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 467872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 467972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 468072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 468172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 468272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 468372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 468494ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 468594ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 468694ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 468794ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 468894ee4b708acfa941581160b267afb79192b1d816Chong Zhang 46897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 46907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 46917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 46927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 46937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 46947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 46957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 46967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 46977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 46987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 46997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 47007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 47017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 47027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4703c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 47045778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 47055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 47065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 47075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 4708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4715f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 47203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4722cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 4723cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 472429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 4725cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 4726cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 4727cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 4728251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 472991bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 473091bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 4731cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 4732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4734f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 4735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 4736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 4738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 4739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 4742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4744f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 4745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 474672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 4747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47536507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 47546507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 47556507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 47566507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 47576507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 47586507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 47596463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 47606463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 47616463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 47626463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 47636463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 47646463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 47656463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 47666463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 47676463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 47686463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 4769d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 47706463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 47716463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 47726463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 47736463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 4774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4779f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 4780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 4786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 4789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 4792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4803f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 4804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4807f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 48083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 4809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4811f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 4812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 481372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 4814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 4817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4820d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 4821d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 4822d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 4823d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 4824d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 4825d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 4826d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 4827d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 4828d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 4829d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4830d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4831d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 4832d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 4833d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 4834d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 4835d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 48366507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 48376507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 48386507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 48396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 48406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 48416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 4842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4847f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 4848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 4850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 4851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 4853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 4854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 4856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 4857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 4863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4868f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 4869349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 4870349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 4871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4873f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 4874ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 4876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 4879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 4880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 4881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4882054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4883054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4884054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 4885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 4886054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 4887054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4888054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 48894dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 48904dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 48914dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 4892054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 4893054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4894054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 4895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 4896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 4897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 4899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 4900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 4901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 4904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 4906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 4910349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4911349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4919054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 4920c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 4921054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4922054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 4923054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4924054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 4925054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4926f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 4927349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 49283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 4929349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 4930349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4931349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 4932349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 4933349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 4935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49363cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar // Post all available input buffers 4937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 49383cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); i++) { 49393cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 49403cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_US) { 49413cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar postFillThisBuffer(info); 49423cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 49433cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 4944349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4945349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 4946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4948f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 49493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 4950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 4952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4954f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 4955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 4959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4960c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4961c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4962c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 4963c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4964c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 496554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 4966c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 4967c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4968349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4969349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 4972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 4975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 4981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 49827a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 4983d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber "(codec owns %d/%d input, %d/%d output).", 4984d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 4985d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 4986d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 4987d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 4988d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 4989d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 4990349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 4991349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 4993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 4994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 4997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 5002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 5004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5009496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 5010496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 5011496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 5012496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 5013496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 5014496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5015496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5016496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 5017496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 5018496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5019496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5020a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 5021a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 5022a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 5023a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 5024a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5025a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 5026a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5027a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 5028a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 5029a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 5030a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 5031a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5032a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5033a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 5034a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 5035a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5036a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 50377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 50387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 50396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 50407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 50417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 50427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 50437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 50444dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 50454dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 50464dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 50474dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 50484dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 50494dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 50504dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 50514dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 50524dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 50534dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 50544dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 50554dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 50564dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5065a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 5066a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 5067530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 5068a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 5069a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 5070a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 5071a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 5072a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5073a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 5074a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 5075a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 5076a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 5077a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 5078a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5079a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 5080a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 5081a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 5082a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5083a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 5084a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5085a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5086a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 508772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 508872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 508972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 509072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 509172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 509272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 509372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 509472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 509572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 509672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 509772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 509872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 509972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 510072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 510172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 510272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5103e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 5104e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 5105e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 5106e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5107b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 5108b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 5109e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 5110e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 5111e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 5112e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 5113b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 5114b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5115b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5116b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 5117b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5118b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5119b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5120b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5121b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 5122b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 5123b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 5124b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5125b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5126b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 5127b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5128b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5129e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 5130e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5131a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 5132a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 5133a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 51346507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 51356507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 5136d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatSignaledInputEOS); 51376507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 51386507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 51396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 51406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 51416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 51426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 51436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 51446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5145f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 5146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 5149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 5151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 515231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 5153054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 5154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 5156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 5157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5159349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 5160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 516231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 516331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 51653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 5166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 5167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 5173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5184f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 5185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 5186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5189f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 5190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 5191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 5192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 5193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 5196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5200f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 5201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5207349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 5208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5209349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 52103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 5211349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5212349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5226f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 52273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 5228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5231f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 5232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 5237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 5240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 5243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 5244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 5247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5249cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5250cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 5251cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 525229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 5253cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 5254cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5255cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5256251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5257d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5258755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 5259755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 5260755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 5261755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 5262755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 5263755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 5264755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 5265755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5266cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 5270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 527231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 527331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 52743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 5275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5277349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 5278349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 5279349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5280349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5296f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 52975778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 52985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 5299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5301f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5329f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 53303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 533131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 53325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 533331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5336f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 5337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 53455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5351349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5352349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 5353349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5354349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 5355349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5356349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5357349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 53620af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 5363f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 53645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 5365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 5367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 5370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 5371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53720167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 53730167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 5374bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 5375bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 5376bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 5377bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 5378bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mCodec->pushBlankBuffersToNativeWindow(); 5379bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 5380bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 5381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 5382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5385f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 5386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5392f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 5393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5401f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 5402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5405f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 5406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5433f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 54343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 5435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5437f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 5438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 5444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5445c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5457f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 5458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5461f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 54623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 5463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 5465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5467f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 5468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 5480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5492f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 5493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 54947a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] FlushingState onOMXEvent(%d,%ld)", 5495d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), event, data1); 5496d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 5501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 5503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 5504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 5505e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 5506e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 5507e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 5508e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 5509e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 5510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 5512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 5513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 5514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5521349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5522349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5523349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec->id()); 5524349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 5525609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 5526349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 5527349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 5528349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 5529349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 55303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 5531349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5532349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5533349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 5534349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5535349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5536349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5537349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5545f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 5546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5551f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 5552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5557f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 5558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 5559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 5560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 55617e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 55627e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 55637e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 55647e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 5565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5566d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 5568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 5570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 5571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5572dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 5573dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 5574f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 5575f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 5576f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 5577f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 5578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 5583