ACodec.cpp revision 8f469e18c307cb9dc0d16ed9225972aa8be4516f
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 271de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar#include <gui/Surface.h> 281de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 37a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 40afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 431065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 44d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#include <media/stagefright/PersistentSurface.h> 45b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#include <media/stagefright/SurfaceUtils.h> 463a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 473a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 5197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 54496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 55f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// OMX errors are directly mapped into status_t range if 58251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// there is no corresponding MediaError status code. 59251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Use the statusFromOMXError(int32_t omxError) function. 60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 61251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Currently this is a direct map. 62251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// See frameworks/native/include/media/openmax/OMX_Core.h 63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 64251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Vendor OMX errors from 0x90000000 - 0x9000FFFF 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Extension OMX errors from 0x8F000000 - 0x90000000 66251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Standard OMX errors from 0x80001000 - 0x80001024 (0x80001024 current) 67251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 69251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// returns true if err is a recognized OMX error code. 70251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// as OMX error is OMX_S32, this is an int32_t type 71251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline bool isOMXError(int32_t err) { 72251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return (ERROR_CODEC_MIN <= err && err <= ERROR_CODEC_MAX); 73251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 74251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 75251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// converts an OMX error to a status_t 76251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t statusFromOMXError(int32_t omxError) { 77251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (omxError) { 78251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorInvalidComponentName: 79251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorComponentNotFound: 80251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return NAME_NOT_FOUND; // can trigger illegal argument error for provided names. 81251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 82251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return isOMXError(omxError) ? omxError : 0; // no translation required 83251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 84251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 85251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 86251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// checks and converts status_t to a non-side-effect status_t 87251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t makeNoSideEffectStatus(status_t err) { 88251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (err) { 89251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // the following errors have side effects and may come 90251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // from other code modules. Remap for safety reasons. 91251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case INVALID_OPERATION: 92251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case DEAD_OBJECT: 93251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return UNKNOWN_ERROR; 94251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 95251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return err; 96251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 97251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 98251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 99f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 120609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 133609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 139609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 207784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 216ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 217ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 218ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 219ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 220ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 221ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 222ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 223ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 224ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 225ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 226ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 227ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 228ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 229ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 230ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 231ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 232ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 233ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 239c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 243c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 245ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 246ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 253c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 254c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 255c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 256c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 257c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 258c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 259c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 260c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 261c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 2648f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang void onSetInputSurface(const sp<AMessage> &msg); 265c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 266c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 268d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t setupInputSurface(); 269d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 270c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 271c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 272c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 273c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 274c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 309054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 316349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 317349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 318349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 327349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 328349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 409f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 410afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 411609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 4138db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu mIsVideo(false), 414c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 415308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 4169806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 41754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 4189806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 4199806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 420e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees(0), 4219806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 422054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 423054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 424054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 425a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 42694ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 4272c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 42837b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps(-1), 4292c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 430609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 431ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mCreateInputBuffersSuspended(false), 432ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled(false) { 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 434c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 447dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 459f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 4611d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 465a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 4661d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatSetParameters, this); 467a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 468a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 469a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 470a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4715778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4775778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4791d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4831dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::setSurface(const sp<Surface> &surface) { 4841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> msg = new AMessage(kWhatSetSurface, this); 4851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar msg->setObject("surface", surface); 4861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> response; 4881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = msg->postAndAwaitResponse(&response); 4891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err == OK) { 4911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar (void)response->findInt32("err", &err); 4921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 4931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 4941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 4951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4971d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatCreateInputSurface, this))->post(); 4987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5008f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangvoid ACodec::initiateSetInputSurface( 501d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<PersistentSurface> &surface) { 5028f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang sp<AMessage> msg = new AMessage(kWhatSetInputSurface, this); 503d291c222357303b9611cab89d0c3b047584ef377Chong Zhang msg->setObject("input-surface", surface); 504d291c222357303b9611cab89d0c3b047584ef377Chong Zhang msg->post(); 505d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 506d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 5081d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSignalEndOfInputStream, this))->post(); 5097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 5107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5115778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 5121d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatStart, this))->post(); 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 5167a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 5171d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatFlush, this))->post(); 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 520f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 5211d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatResume, this))->post(); 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 524c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 5251d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatShutdown, this); 526c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 527c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 52830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar if (!keepComponentAllocated) { 52930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // ensure shutdown completes in 3 seconds 5301d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatReleaseCodecInstance, this))->post(3000000); 53130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 534496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 5351d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatRequestIDRFrame, this))->post(); 536496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 537496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5384dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 5394dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 5404dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 5414dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 5424dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 5434dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 5444dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 5454dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 5461d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, this))->post(); 5474dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 5484dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 5494dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5501dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::handleSetSurface(const sp<Surface> &surface) { 5511dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // allow keeping unset surface 5521dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (surface == NULL) { 5531dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mNativeWindow != NULL) { 5541dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("cannot unset a surface"); 5551dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5561dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5571dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 5581dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5591dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5601dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // allow keeping unset surface 5611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mNativeWindow == NULL) { 5621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("component was not configured with a surface"); 5631dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5641dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5651dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5661dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ANativeWindow *nativeWindow = surface.get(); 5671dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // if we have not yet started the codec, we can simply set the native window 5681dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mBuffers[kPortIndexInput].size() == 0) { 5691dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNativeWindow = surface; 5701dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 5711dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5721dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5731dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // we do not support changing a tunneled surface after start 5741dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mTunneled) { 5751dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("cannot change tunneled surface"); 5761dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5771dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5781dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = setupNativeWindowSizeFormatAndUsage(nativeWindow); 5801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 5811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 5821dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5831dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // get min undequeued count. We cannot switch to a surface that has a higher 5851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // undequeued count than we allocated. 5861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar int minUndequeuedBuffers = 0; 5871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = nativeWindow->query( 5881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 5891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar &minUndequeuedBuffers); 5901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 5911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 5921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 5931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 5941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (minUndequeuedBuffers > (int)mNumUndequeuedBuffers) { 5961dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("new surface holds onto more buffers (%d) than planned for (%zu)", 5971dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar minUndequeuedBuffers, mNumUndequeuedBuffers); 5981dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return BAD_VALUE; 5991dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6001dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // we cannot change the number of output buffers while OMX is running 6021dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // set up surface to the same count 6031dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar Vector<BufferInfo> &buffers = mBuffers[kPortIndexOutput]; 6041dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("setting up surface for %zu buffers", buffers.size()); 6051dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6061dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = native_window_set_buffer_count(nativeWindow, buffers.size()); 6071dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 6081dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 6091dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar -err); 6101dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6111dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6121dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6131dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // for meta data mode, we move dequeud buffers to the new surface. 6141dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // for non-meta mode, we must move all registered buffers 6151dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar for (size_t i = 0; i < buffers.size(); ++i) { 6161dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar const BufferInfo &info = buffers[i]; 6171dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // skip undequeued buffers for meta data mode 6181dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mStoreMetaDataInOutputBuffers 6191dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar && info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 6201dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("skipping buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6211dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar continue; 6221dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6231dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("attaching buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6241dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6251dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = surface->attachBuffer(info.mGraphicBuffer->getNativeBuffer()); 6261dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 6271dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("failed to attach buffer %p to the new surface: %s (%d)", 6281dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar info.mGraphicBuffer->getNativeBuffer(), 6291dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 6301dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6311dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6321dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6331dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6341dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // cancel undequeued buffers to new surface 6351dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (!mStoreMetaDataInOutputBuffers) { 6361dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar for (size_t i = 0; i < buffers.size(); ++i) { 6371dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar const BufferInfo &info = buffers[i]; 6381dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 6391dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("canceling buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6401dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = nativeWindow->cancelBuffer( 6411dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, info.mGraphicBuffer->getNativeBuffer(), -1); 6421dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 6431dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("failed to cancel buffer %p to the new surface: %s (%d)", 6441dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar info.mGraphicBuffer->getNativeBuffer(), 6451dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 6461dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6471dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6481dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6491dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6501dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // disallow further allocation 6511dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar (void)surface->getIGraphicBufferProducer()->allowAllocation(false); 6521dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6531dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 654484979b1ab25aa41f503bd846323ab93b46d37e5Lajos Molnar // push blank buffers to previous window if requested 655484979b1ab25aa41f503bd846323ab93b46d37e5Lajos Molnar if (mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) { 656484979b1ab25aa41f503bd846323ab93b46d37e5Lajos Molnar pushBlankBuffersToNativeWindow(mNativeWindow.get()); 657484979b1ab25aa41f503bd846323ab93b46d37e5Lajos Molnar } 658484979b1ab25aa41f503bd846323ab93b46d37e5Lajos Molnar 6591dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNativeWindow = nativeWindow; 6601dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 6611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 6621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 671054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 672054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 673054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 674054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 675054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 685609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 697ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 698ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 700afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 701afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 702afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 703afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 7041065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 705308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 706308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 707ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 708ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 709ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 710ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 711ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 712ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 713ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 714308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 715308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 716308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 717308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 718ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 720ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 722ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 723ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 724ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 725ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 726ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7281065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 7301065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 7311065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 739d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatBuffersAllocated); 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 742eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 743eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 744eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 746eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 748eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 751eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7571dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::setupNativeWindowSizeFormatAndUsage(ANativeWindow *nativeWindow /* nonnull */) { 7581dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_PARAM_PORTDEFINITIONTYPE def; 7591dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar InitOMXParams(&def); 7601dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.nPortIndex = kPortIndexOutput; 7611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mOMX->getParameter( 7631dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 7641dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7651dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 7661dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 7671dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7681dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7691dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 usage = 0; 7701dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 7711dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 7721dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("querying usage flags from OMX IL component failed: %d", err); 7731dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // XXX: Currently this error is logged, but not fatal. 7741dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage = 0; 7751dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7761dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar int omxUsage = usage; 7771dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7781dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 7791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage |= GRALLOC_USAGE_PROTECTED; 7801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 782b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar usage |= GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP; 783b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 7841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec)", omxUsage, usage); 7851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return setNativeWindowSizeFormatAndUsage( 7861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, 7871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.nFrameWidth, 7881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.nFrameHeight, 7891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.eColorFormat, 7901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mRotationDegrees, 7911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage); 7921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 7931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 7951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 7961dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 *minUndequeuedBuffers) { 7971dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_PARAM_PORTDEFINITIONTYPE def; 7981dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar InitOMXParams(&def); 7991dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.nPortIndex = kPortIndexOutput; 8001dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 8011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mOMX->getParameter( 8021dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 8031dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 8041dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err == OK) { 8051dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = setupNativeWindowSizeFormatAndUsage(mNativeWindow.get()); 8061dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 8071dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 8081dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 8091dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 8101dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 811ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // Exits here for tunneled video playback codecs -- i.e. skips native window 812ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // buffer allocation step as this is managed by the tunneled OMX omponent 813ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // itself and explicitly sets def.nBufferCountActual to 0. 814ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 815ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Tunneled Playback: skipping native window buffer allocation."); 816ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad def.nBufferCountActual = 0; 817ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad err = mOMX->setParameter( 818ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 819ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 820ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *minUndequeuedBuffers = 0; 821ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferCount = 0; 822ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferSize = 0; 823ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return err; 824ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 825ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 826054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 827258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 828258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 829054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 830258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 831258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 83229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 833258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 834258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 835258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 836258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 837e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 838e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 8391faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 8401faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 841e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 842e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 843e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 844e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 845e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 846e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 847e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 8481faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 8491faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 850e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 851e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 852258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 853258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 854258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 855258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 856e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 857e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 858e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 859e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 860e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 861609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 862e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 863e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 864e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 865258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 866258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 867258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 868258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 87329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 882054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 883054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 884054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 886054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 887054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 888054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 889e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 890054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 8913298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia if (!mStoreMetaDataInOutputBuffers) { 8923298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia static_cast<Surface*>(mNativeWindow.get()) 8933298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia ->getIGraphicBufferProducer()->allowAllocation(true); 8943298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia } 8953298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia 896609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 898054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 901054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 9028ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 9031e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 90529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 91074006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 91174006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 912054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 91374006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 91474006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 91574006804065941841883c4b46ee785070164023fJamie Gennis 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 920609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 92174006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 92574006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 92674006804065941841883c4b46ee785070164023fJamie Gennis 927609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 93974006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 941054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 942054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 943054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 9483fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia status_t error = cancelBufferToNativeWindow(info); 9493fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia if (err == 0) { 9503fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia err = error; 9513fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia } 952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9543298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia if (!mStoreMetaDataInOutputBuffers) { 9553298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia static_cast<Surface*>(mNativeWindow.get()) 9563298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia ->getIGraphicBufferProducer()->allowAllocation(false); 9573298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia } 9583298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 962054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 963054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 964054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 965054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 966054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 968e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 969054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 970609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 971054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 972054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 973054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 974054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 975054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 976054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 977054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 978054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 979054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 980054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 981054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 982054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 983054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 984054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 985054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 987054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 988054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 989054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 990054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 991054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 992054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 993054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 994609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 995054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 996054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 997054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 998054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 999054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 1000054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 1001054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1002054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 1003054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 1004054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 1005054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 1006054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1007054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 1008054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 1009054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 1010054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1011609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 1012054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 1013054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1014054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 1015054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 1016054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 1017054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1018054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1019054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 1020054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 1021054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 1024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1025609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 10291e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10313fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia ALOGW_IF(err != 0, "[%s] can not return buffer %u to native window", 10323fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia mComponentName.c_str(), info->mBufferID); 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10363fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia return err; 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1039f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 10408ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 1041054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 1042ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 1043ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 1044ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGW("dequeueBufferFromNativeWindow() should not be called in tunnel" 1045ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad " video playback mode mode!"); 1046ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return NULL; 1047ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 1048ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 10491e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 105029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 1051c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 1052c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1054054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1059054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 1060054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1068054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1069054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 1070054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 1071054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 1072054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 1073054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 1074054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 1075054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1076054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1077054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1078054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 1079054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 1080054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1081054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 1082054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 1083054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 1084054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1085d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 1086d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 1087d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 1088054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1089d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 1090d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 1091d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 1092d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 1093d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1094d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 1095ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (unsigned)(oldest - &mBuffers[kPortIndexOutput][0]), 1096054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 1097d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 1098d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 1099054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1100054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1108f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 1109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 1114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1118349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11232ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 11242ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 11252ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 11262ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 11423fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia cancelBufferToNativeWindow(info); 1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1154f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 1158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 1161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 1175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 1176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 1177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 1178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 1179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 1182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 1183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 11842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 11852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 11862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 11872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 1188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 1193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 1194729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 1195729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1196bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 1197bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 1198c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1199c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1200c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1201c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 1203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 12042472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, 12052472b1c0d63454e5d90a982bd6c555de6c3127bdRachad "video_decoder.hevc", "video_encoder.hevc" }, 1206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 1207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 1209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 121094705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 121194705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 121294705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 121394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 1214ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 1215ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 12162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 12172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1218ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1219ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1220774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1221774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 122297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 122397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 12248a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { MEDIA_MIMETYPE_AUDIO_EAC3, 12258a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad "audio_decoder.eac3", "audio_encoder.eac3" }, 1226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 12605ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1277e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 12784e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> outputFormat = mNotify->dup(); // will use this for kWhatOutputFormatChanged 1279e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12828db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 12902f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 12912f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 12922f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1296d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1297d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1298d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1299d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1300d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1301d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1302d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1303308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1304308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1305d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1306308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1307308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1308308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1309d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1310308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 13113a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 13123a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 13133a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 13143a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 13153a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 13163a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 13173a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 13183a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 13193a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13203a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 13213a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 13223a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 13233a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 13243a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13253a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 13263a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 13273a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13283a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13293a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 13303a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 13313a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 13323a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13333a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 13343a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13353a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13363a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1337308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1338308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1339308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1340308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 13418db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu mIsVideo = video; 1342308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1343308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1344308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1345308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1346308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1347308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1348308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1349308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1350308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1351308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1352308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1353308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1354308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1355308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1356a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1357a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1358a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1359a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1360a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1361a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 136294ee4b708acfa941581160b267afb79192b1d816Chong Zhang 136394ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 13642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 13652c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 13662c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 136737b2b389139ed638831e49708c947863eef631efRonghua Wu if (!msg->findFloat("max-fps-to-encoder", &mMaxFps)) { 136837b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps = -1; 136937b2b389139ed638831e49708c947863eef631efRonghua Wu } 137037b2b389139ed638831e49708c947863eef631efRonghua Wu 13712c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 13722c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 137394ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 137472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 137572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 137672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 137772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 137872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 137972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1380308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1381308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 13823a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // NOTE: we only use native window for video decoders 1383054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 13840d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool haveNativeWindow = msg->findObject("native-window", &obj) 13853a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar && obj != NULL && video && !encoder; 1386054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1387e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1388e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 13891713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang 13901713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang int32_t usageProtected; 13911713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (msg->findInt32("protected", &usageProtected) && usageProtected) { 13921713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (!haveNativeWindow) { 13931713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang ALOGE("protected output buffers must be sent to an ANativeWindow"); 13941713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang return PERMISSION_DENIED; 13951713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 13961713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagIsGrallocUsageProtected; 13971713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 13981713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 1399e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 14003a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 14011de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar sp<ANativeWindow> nativeWindow = 14021de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar static_cast<ANativeWindow *>(static_cast<Surface *>(obj.get())); 14035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14046597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // START of temporary support for automatic FRC - THIS WILL BE REMOVED 14056597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar int32_t autoFrc; 14066597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (msg->findInt32("auto-frc", &autoFrc)) { 14076597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar bool enabled = autoFrc; 14086597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar OMX_CONFIG_BOOLEANTYPE config; 14096597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar InitOMXParams(&config); 14106597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar config.bEnabled = (OMX_BOOL)enabled; 14116597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar status_t temp = mOMX->setConfig( 14126597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar mNode, (OMX_INDEXTYPE)OMX_IndexConfigAutoFramerateConversion, 14136597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar &config, sizeof(config)); 14146597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (temp == OK) { 14156597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar outputFormat->setInt32("auto-frc", enabled); 14166597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } else if (enabled) { 14176597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar ALOGI("codec does not support requested auto-frc (err %d)", temp); 14186597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 14196597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 14206597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // END of temporary support for automatic FRC 14216597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar 14225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t tunneled; 14235a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("feature-tunneled-playback", &tunneled) && 14245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunneled != 0) { 14255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGI("Configuring TUNNELED video playback."); 1426ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = true; 14275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 142897827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync = 0; 142997827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad if (!msg->findInt32("audio-hw-sync", &audioHwSync)) { 14305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW("No Audio HW Sync provided for video tunnel"); 14315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14325a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = configureTunneledVideoPlayback(audioHwSync, nativeWindow); 14335a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 143497827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad ALOGE("configureTunneledVideoPlayback(%d,%p) failed!", 14355a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad audioHwSync, nativeWindow.get()); 14365a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 1437fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1438fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1439d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad int32_t maxWidth = 0, maxHeight = 0; 1440d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (msg->findInt32("max-width", &maxWidth) && 1441d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad msg->findInt32("max-height", &maxHeight)) { 1442d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad 1443d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad err = mOMX->prepareForAdaptivePlayback( 1444d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, maxHeight); 1445d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (err != OK) { 1446d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad ALOGW("[%s] prepareForAdaptivePlayback failed w/ err %d", 1447d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mComponentName.c_str(), err); 14483a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // allow failure 14493a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = OK; 1450d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } else { 1451d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-width", maxWidth); 1452d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-height", maxHeight); 1453d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("adaptive-playback", true); 1454d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 1455d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 14565a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 1457ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Configuring CPU controlled video playback."); 1458ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = false; 1459ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 14603fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // Explicity reset the sideband handle of the window for 14613fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // non-tunneled video in case the window was previously used 14623fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // for a tunneled video playback. 14633fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad err = native_window_set_sideband_stream(nativeWindow.get(), NULL); 14643fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad if (err != OK) { 14653fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad ALOGE("set_sideband_stream(NULL) failed! (err %d).", err); 14663fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad return err; 14673fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad } 14683fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad 14695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // Always try to enable dynamic output buffers on native surface 14705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->storeMetaDataInBuffers( 14715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE); 14725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 14735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1474fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1475e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 14765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // if adaptive playback has been requested, try JB fallback 14775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 14785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // LARGE MEMORY REQUIREMENT 14795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // we will not do adaptive playback on software accessed 14815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // surfaces as they never had to respond to changes in the 14825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // crop window, and we don't trust that they will be able to. 14835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int usageBits = 0; 14845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad bool canDoAdaptivePlayback; 14855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (nativeWindow->query( 14875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad nativeWindow.get(), 14885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad NATIVE_WINDOW_CONSUMER_USAGE_BITS, 14895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad &usageBits) != OK) { 14905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = false; 14915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 14925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = 14935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (usageBits & 14945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (GRALLOC_USAGE_SW_READ_MASK | 14955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 14965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t maxWidth = 0, maxHeight = 0; 14995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (canDoAdaptivePlayback && 15005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-width", &maxWidth) && 15015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-height", &maxHeight)) { 15025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 15035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), maxWidth, maxHeight); 15045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 15055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->prepareForAdaptivePlayback( 15065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, 15075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad maxHeight); 15085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW_IF(err != OK, 15095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "[%s] prepareForAdaptivePlayback failed w/ err %d", 15105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), err); 15115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 15125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err == OK) { 15135a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-width", maxWidth); 15145a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-height", maxHeight); 15155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 15165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 1517e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 15185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // allow failure 15195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OK; 15205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 15215a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] storeMetaDataInBuffers succeeded", 15225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str()); 15235a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mStoreMetaDataInOutputBuffers = true; 15245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 1525fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 15260167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 15275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t push; 15285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 15295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad && push != 0) { 15305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 15315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 15320167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1533e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 1534e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang int32_t rotationDegrees; 1535e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (msg->findInt32("rotation-degrees", &rotationDegrees)) { 1536e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = rotationDegrees; 1537e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } else { 1538e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = 0; 1539e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 1540054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1541054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1542308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 15433a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // determine need for software renderer 15443a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar bool usingSwRenderer = false; 15453a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { 15463a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 15473a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 15483a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15493a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 15530d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setupVideoDecoder(mime, msg, haveNativeWindow); 15545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15553a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15563a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err != OK) { 15573a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar return err; 15583a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15593a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15603a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 15611de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar mNativeWindow = static_cast<Surface *>(obj.get()); 15621de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar CHECK(mNativeWindow != NULL); 15633a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15643a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15653a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // initialize native window now to get actual output format 15663a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: this is needed for some encoders even though they don't use native window 15673a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ((status_t)OK, initNativeWindow()); 15683a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15693a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback for devices that do not handle flex-YUV for native buffers 15703a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 15713a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t requestedColorFormat = OMX_COLOR_FormatUnused; 15723a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (msg->findInt32("color-format", &requestedColorFormat) && 15733a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar requestedColorFormat == OMX_COLOR_FormatYUV420Flexible) { 15743a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 15753a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t colorFormat = OMX_COLOR_FormatUnused; 15763a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar OMX_U32 flexibleEquivalent = OMX_COLOR_FormatUnused; 15773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(outputFormat->findInt32("color-format", &colorFormat)); 15783a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGD("[%s] Requested output format %#x and got %#x.", 15793a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mComponentName.c_str(), requestedColorFormat, colorFormat); 15803a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (!isFlexibleColorFormat( 15813a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mOMX, mNode, colorFormat, haveNativeWindow, &flexibleEquivalent) 15823a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar || flexibleEquivalent != (OMX_U32)requestedColorFormat) { 15833a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // device did not handle flex-YUV request for native window, fall back 15843a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // to SW renderer 15853a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGI("[%s] Falling back to software renderer", mComponentName.c_str()); 15863a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.clear(); 15873a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 15883a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 15893a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mStoreMetaDataInOutputBuffers) { 15903a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_FALSE); 15913a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mStoreMetaDataInOutputBuffers = false; 15923a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: implement adaptive-playback support for bytebuffer mode. 15933a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // This is done by SW codecs, but most HW codecs don't support it. 15943a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar inputFormat->setInt32("adaptive-playback", false); 15953a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15963a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err == OK) { 15973a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 15983a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15993a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 16003a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback is not supported for protected playback 16013a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = PERMISSION_DENIED; 16023a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } else if (err == OK) { 16033a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = setupVideoDecoder(mime, msg, false); 16043a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16053a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16063a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16073a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16083a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 16093a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (usingSwRenderer) { 16103a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar outputFormat->setInt32("using-sw-renderer", 1); 16113a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 161242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 161342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 161442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 161542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 161642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 161742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 161842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 161942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 162042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 162142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 162242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 162342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 162442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 16275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 16295778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 16305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1631aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1632b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi int32_t sbrMode; 16338045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount; 16342965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable; 16358045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drcParams_t drc; 1636ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1637ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1638ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1639aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1640aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1641aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1642b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi if (!msg->findInt32("aac-sbr-mode", &sbrMode)) { 1643b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi sbrMode = -1; 1644b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1645ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16468045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-max-output-channel_count", &maxOutputChannelCount)) { 16478045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi maxOutputChannelCount = -1; 16488045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16492965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang if (!msg->findInt32("aac-pcm-limiter-enable", &pcmLimiterEnable)) { 16502965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang // value is unknown 16512965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable = -1; 16522965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang } 16538045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-encoded-target-level", &drc.encodedTargetLevel)) { 16548045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16558045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.encodedTargetLevel = -1; 16568045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-cut-level", &drc.drcCut)) { 16588045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16598045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcCut = -1; 16608045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16618045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-boost-level", &drc.drcBoost)) { 16628045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16638045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcBoost = -1; 16648045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16658045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-heavy-compression", &drc.heavyCompression)) { 16668045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16678045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.heavyCompression = -1; 16688045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16698045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-target-ref-level", &drc.targetRefLevel)) { 16708045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16718045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.targetRefLevel = -1; 16728045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16738045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 1674ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 16754471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 16762965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang isADTS != 0, sbrMode, maxOutputChannelCount, drc, 16772965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable); 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1679729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 16805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1681729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1683729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1684729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1685729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1686729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1687729de186450f78c099637e1fce743fe531862c52Andreas Huber 1688729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 16905778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 169217c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen int32_t sampleRate; 169317c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen if (!msg->findInt32("sample-rate", &sampleRate)) { 169417c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen sampleRate = 8000; 169517c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen } 169617c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen err = setupG711Codec(encoder, sampleRate, numChannels); 16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 1699ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar int32_t numChannels = 0, sampleRate = 0, compressionLevel = -1; 17002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 17012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 17022f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 17032f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 17042f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 17052f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 17062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1707516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1708cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar "complexity", &compressionLevel) && 1709cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar !msg->findInt32( 1710516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 1711cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar compressionLevel = 5; // default FLAC compression level 17122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1713516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1714516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1715516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 17162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 17172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1718516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1719516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1720516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 17212f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 17222f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 17232f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1724516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1725516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 17262f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1727ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1728ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1729ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1730ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1731ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1732ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1733ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1734ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1735ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 173697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 173797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 173897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 173997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 174097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 174197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 174297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 174397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 174497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 17458a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_EAC3)) { 17468a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t numChannels; 17478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t sampleRate; 17488a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (!msg->findInt32("channel-count", &numChannels) 17498a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad || !msg->findInt32("sample-rate", &sampleRate)) { 17508a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = INVALID_OPERATION; 17518a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else { 17528a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = setupEAC3Codec(encoder, numChannels, sampleRate); 17538a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1755729de186450f78c099637e1fce743fe531862c52Andreas Huber 17564471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 17574471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 17584471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 17594471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 17608b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 17618b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 17628b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 17639806555d3930be43e11106281dee354820ac1c88Andreas Huber 17648b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 17658b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 17668b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 17678b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 17689806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 17699806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 17709806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 17719806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 17729806555d3930be43e11106281dee354820ac1c88Andreas Huber } 17739806555d3930be43e11106281dee354820ac1c88Andreas Huber 1774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 17785778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 17805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17818b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu int32_t priority; 17828b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (msg->findInt32("priority", &priority)) { 17838b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu err = setPriority(priority); 17848b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 17858b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 1786ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu int32_t rateInt = -1; 1787ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu float rateFloat = -1; 1788ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (!msg->findFloat("operating-rate", &rateFloat)) { 1789ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu msg->findInt32("operating-rate", &rateInt); 1790ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rateFloat = (float)rateInt; // 16MHz (FLINTMAX) is OK for upper bound. 1791ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1792ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > 0) { 1793ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu err = setOperatingRate(rateFloat, video); 1794ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1795ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu 17964e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mBaseOutputFormat = outputFormat; 17974e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar 1798e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1799e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1800e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1801e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1802e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18068b806ea894ca098366629458bfdd1df4866afcdfRonghua Wustatus_t ACodec::setPriority(int32_t priority) { 18078b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (priority < 0) { 18088b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return BAD_VALUE; 18098b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 18108b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu OMX_PARAM_U32TYPE config; 18118b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu InitOMXParams(&config); 18128b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu config.nU32 = (OMX_U32)priority; 18138b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu status_t temp = mOMX->setConfig( 18148b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu mNode, (OMX_INDEXTYPE)OMX_IndexConfigPriority, 18158b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu &config, sizeof(config)); 18168b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (temp != OK) { 18178b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu ALOGI("codec does not support config priority (err %d)", temp); 18188b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 18198b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return OK; 18208b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu} 18218b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 1822ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wustatus_t ACodec::setOperatingRate(float rateFloat, bool isVideo) { 1823ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat < 0) { 1824ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1825ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1826ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu OMX_U32 rate; 1827ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (isVideo) { 1828ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > 65535) { 1829ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1830ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1831ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rate = (OMX_U32)(rateFloat * 65536.0f + 0.5f); 1832ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } else { 1833ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > UINT_MAX) { 1834ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1835ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1836ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rate = (OMX_U32)(rateFloat); 1837ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1838ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu OMX_PARAM_U32TYPE config; 1839ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu InitOMXParams(&config); 1840ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu config.nU32 = rate; 1841ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu status_t err = mOMX->setConfig( 1842ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu mNode, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate, 1843ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu &config, sizeof(config)); 1844ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (err != OK) { 1845ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu ALOGI("codec does not support config operating rate (err %d)", err); 1846ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1847ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return OK; 1848ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu} 1849ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu 1850f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18875778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 18885778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 18895778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 18905778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 18915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18925778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 18935778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 18945778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 18955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18965778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 18975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 18985778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 18995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 19055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 19065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 19105778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 19115778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 19125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1914aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 19158045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode, 19162965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t maxOutputChannelCount, const drcParams_t& drc, 19172965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable) { 1918ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1919ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1920ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1921ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 19225778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 19235778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 19245778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 19255778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 19265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 19325778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 19335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19385778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 19395778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 19405778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 19415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19425778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19495778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 19505778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 19515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19525778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 19535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19595778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 19605778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 19615778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 19625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19635778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 19655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19705778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 19715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19725778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 19735778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 19745778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 19755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19765778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 19775778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 19785778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 19795778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 19805778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 19815778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1982aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 19835778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 1984b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi switch (sbrMode) { 1985b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 0: 1986b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // disable sbr 1987b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1988b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1989b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1990b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 1: 1991b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable single-rate sbr 1992b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1993b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1994b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1995b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 2: 1996b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable dual-rate sbr 1997b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1998b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1999b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 2000b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case -1: 2001b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable both modes -> the codec will decide which mode should be used 2002b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 2003b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 2004b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 2005b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi default: 2006b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // unsupported sbr mode 2007b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi return BAD_VALUE; 2008b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 2009b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 2022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 2023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 2024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20255778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 2026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 2027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 2033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 2034ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2035ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 2036ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 2037ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 2038ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 2039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20408045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi OMX_AUDIO_PARAM_ANDROID_AACPRESENTATIONTYPE presentation; 20418045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nMaxOutputChannels = maxOutputChannelCount; 20428045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcCut = drc.drcCut; 20438045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcBoost = drc.drcBoost; 20448045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nHeavyCompression = drc.heavyCompression; 20458045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nTargetReferenceLevel = drc.targetRefLevel; 20468045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nEncodedTargetLevel = drc.encodedTargetLevel; 20472965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang presentation.nPCMLimiterEnable = pcmLimiterEnable; 20488045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 20498045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi status_t res = mOMX->setParameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 20508045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (res == OK) { 20518045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // optional parameters, will not cause configuration failure 20528045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi mOMX->setParameter(mNode, (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacPresentation, 20538045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi &presentation, sizeof(presentation)); 20548045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } else { 20558045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi ALOGW("did not set AudioAndroidAacPresentation due to error %d when setting AudioAac", res); 20568045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 20578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi return res; 20585778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 206097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 206197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 206297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 206397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 206497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 206597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 206697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 206797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 206897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 206997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 207097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 207197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 207297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 207397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 207497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 207597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 207697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 207797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 207897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 207997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 208097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 208197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 208297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 208397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 208497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 208597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 208697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 208797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 208897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 208997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 209097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 209197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 209297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 209397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 209497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 209597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 209697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 209797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 20988a4728966dc9c78e21c3c93a927707e93c05e5e0Rachadstatus_t ACodec::setupEAC3Codec( 20998a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad bool encoder, int32_t numChannels, int32_t sampleRate) { 21008a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad status_t err = setupRawAudioFormat( 21018a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 21028a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21038a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 21048a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 21058a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21068a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21078a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (encoder) { 21088a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ALOGW("EAC3 encoding is not supported."); 21098a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return INVALID_OPERATION; 21108a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21118a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21128a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE def; 21138a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(&def); 21148a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nPortIndex = kPortIndexInput; 21158a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21168a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = mOMX->getParameter( 21178a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 21188a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 21198a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 21208a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 21218a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 21238a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 21248a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21258a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21268a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nChannels = numChannels; 21278a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nSampleRate = sampleRate; 21288a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21298a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return mOMX->setParameter( 21308a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 21318a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 21328a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 21338a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 21348a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad} 21358a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 21375778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 21385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 21395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 21405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 21415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 21425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 21435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 21445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 21455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 21465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 21475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 21485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 21495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 21505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 21515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 21525778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 21535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 21545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 21555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21575778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 21585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 21595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 21605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 21615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 21625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 21635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 21645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 21655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 21665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 21675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 21685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 21695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 21705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 21715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 21725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 21735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 21745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21765778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 21775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 21785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 2182729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 2183729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 21845778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 2185729de186450f78c099637e1fce743fe531862c52Andreas Huber 2186729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 2187729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2188729de186450f78c099637e1fce743fe531862c52Andreas Huber 2189729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2190729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2191729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2192729de186450f78c099637e1fce743fe531862c52Andreas Huber 2193729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 21945778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 21955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21965778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 21975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2198729de186450f78c099637e1fce743fe531862c52Andreas Huber 21995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 22005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 22015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2202729de186450f78c099637e1fce743fe531862c52Andreas Huber 22035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 22045778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 22055778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 22065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 2207729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2208729de186450f78c099637e1fce743fe531862c52Andreas Huber 220917c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissenstatus_t ACodec::setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels) { 22105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 22115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2212729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 221317c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen kPortIndexInput, sampleRate, numChannels); 2214729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2215729de186450f78c099637e1fce743fe531862c52Andreas Huber 22162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 22172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 22182f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22192f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 22202f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 22212f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 22222f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 22232f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22242f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 22252f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 22262f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 22272f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 22282f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 22292f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22302f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 22312f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 22322f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 22332f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 22342f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 22352f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22362f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22372f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22382f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 22392f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 22402f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 22412f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 22422f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 22432f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 2244729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 2245729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 2246729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2247729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 2248729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 2249729de186450f78c099637e1fce743fe531862c52Andreas Huber 2250729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 2251729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2252729de186450f78c099637e1fce743fe531862c52Andreas Huber 2253729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2254729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2255729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2256729de186450f78c099637e1fce743fe531862c52Andreas Huber 2257729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 2258729de186450f78c099637e1fce743fe531862c52Andreas Huber 2259729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 2260729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2261729de186450f78c099637e1fce743fe531862c52Andreas Huber 2262729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2263729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2264729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2265729de186450f78c099637e1fce743fe531862c52Andreas Huber 2266729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 2267729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 2268729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 2269729de186450f78c099637e1fce743fe531862c52Andreas Huber 2270729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 2271729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2272729de186450f78c099637e1fce743fe531862c52Andreas Huber 2273729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2274729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2275729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2276729de186450f78c099637e1fce743fe531862c52Andreas Huber 2277729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 2278729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 2279729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 2280729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 2281729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 2282729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 2283729de186450f78c099637e1fce743fe531862c52Andreas Huber 2284c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 2285c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 2286729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2287729de186450f78c099637e1fce743fe531862c52Andreas Huber 2288729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 2289729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2290729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2291729de186450f78c099637e1fce743fe531862c52Andreas Huber 22925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t ACodec::configureTunneledVideoPlayback( 229397827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync, const sp<ANativeWindow> &nativeWindow) { 22945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t* sidebandHandle; 22955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 22965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad status_t err = mOMX->configureVideoTunnelMode( 22975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, audioHwSync, &sidebandHandle); 22985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 22995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureVideoTunnelMode failed! (err %d).", err); 23005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 23015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 23025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 23035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle); 23045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 23055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", 23065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sidebandHandle, err); 23075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 23085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 23095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 23105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return OK; 23115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 23125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 2313f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 2314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 23160d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat, 23170d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool usingNativeBuffers) { 2318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 2319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 2321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 2322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 2323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 2325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 2326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 2327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2335229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // substitute back flexible color format to codec supported format 2336229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_U32 flexibleEquivalent; 23370d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (compressionFormat == OMX_VIDEO_CodingUnused 23380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 23390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, usingNativeBuffers, &flexibleEquivalent) 23400d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && colorFormat == flexibleEquivalent) { 2341229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar ALOGI("[%s] using color format %#x in place of %#x", 2342229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mComponentName.c_str(), format.eColorFormat, colorFormat); 2343229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat = format.eColorFormat; 2344229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 2345229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 2346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 2347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 2348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 2350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 2351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 2352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 2353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 2357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 2358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 2359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 2365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 2366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 2371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 2374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 2375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 2378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23840d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Set optimal output format. OMX component lists output formats in the order 23850d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// of preference, but this got more complicated since the introduction of flexible 23860d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// YUV formats. We support a legacy behavior for applications that do not use 23870d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// surface output, do not specify an output format, but expect a "usable" standard 23880d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// OMX format. SW readable and standard formats must be flex-YUV. 23890d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 23900d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Suggested preference order: 23910d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal format for texture rendering (mediaplayer behavior) 23920d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable & texture renderable format (flex-YUV support) 23930d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable non-renderable format (flex-YUV bytebuffer support) 23940d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - legacy "usable" standard formats 23950d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 23960d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// For legacy support, we prefer a standard format, but will settle for a SW readable 23970d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// flex-YUV format. 23980d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnarstatus_t ACodec::setSupportedOutputFormat(bool getLegacyFlexibleFormat) { 23990d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE format, legacyFormat; 2400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 2402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24030d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&legacyFormat); 24040d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // this field will change when we find a suitable legacy format 24050d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar legacyFormat.eColorFormat = OMX_COLOR_FormatUnused; 2406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24070d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar for (OMX_U32 index = 0; ; ++index) { 24080d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar format.nIndex = index; 24090d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar status_t err = mOMX->getParameter( 24100d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mNode, OMX_IndexParamVideoPortFormat, 24110d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &format, sizeof(format)); 24120d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (err != OK) { 24130d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // no more formats, pick legacy format if found 24140d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat != OMX_COLOR_FormatUnused) { 24150d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&format, &legacyFormat, sizeof(format)); 24160d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24170d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24180d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return err; 24190d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24200d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eCompressionFormat != OMX_VIDEO_CodingUnused) { 24210d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return OMX_ErrorBadParameter; 24220d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24230d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (!getLegacyFlexibleFormat) { 24240d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24250d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24260d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // standard formats that were exposed to users before 24270d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eColorFormat == OMX_COLOR_FormatYUV420Planar 24280d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar 24290d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 24300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar 24310d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar) { 24320d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // find best legacy non-standard format 24350d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_U32 flexibleEquivalent; 24360d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat == OMX_COLOR_FormatUnused 24370d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 24380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, false /* usingNativeBuffers */, 24390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &flexibleEquivalent) 24400d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && flexibleEquivalent == OMX_COLOR_FormatYUV420Flexible) { 24410d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&legacyFormat, &format, sizeof(format)); 24420d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24430d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 2444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 2445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2449e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 2450e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 2451e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 2452e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 2453e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 24542472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, OMX_VIDEO_CodingHEVC }, 2455e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 2456e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 2457e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 245894705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 245994705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 2460e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 2461e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 24625778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 24635778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 2464e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2465e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2466e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2467e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 2468e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 2469e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2470e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2473e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 2474e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2475e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 2476e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2477e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2478e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 2479e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 2480e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2481e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2482e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2483e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 2484e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 2485e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2486e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2487e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2488e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2489e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 2490e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2491e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 24925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 24950d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar const char *mime, const sp<AMessage> &msg, bool haveNativeWindow) { 249689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t width, height; 249789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (!msg->findInt32("width", &width) 249889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar || !msg->findInt32("height", &height)) { 249989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar return INVALID_OPERATION; 250089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 250189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar 25025778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 25035778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 25045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25095778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 2510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 2511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 251689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t tmp; 251789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (msg->findInt32("color-format", &tmp)) { 251889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat = 251989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar static_cast<OMX_COLOR_FORMATTYPE>(tmp); 252089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setVideoPortFormatType( 25210d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar kPortIndexOutput, OMX_VIDEO_CodingUnused, colorFormat, haveNativeWindow); 252289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (err != OK) { 252389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar ALOGW("[%s] does not support color format %d", 252489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar mComponentName.c_str(), colorFormat); 25250d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 252689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 252789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } else { 25280d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 252989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 2530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t frameRateInt; 253678b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRateFloat; 253778b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findFloat("frame-rate", &frameRateFloat)) { 253878b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findInt32("frame-rate", &frameRateInt)) { 253978b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateInt = -1; 254078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 254178b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateFloat = (float)frameRateInt; 254278b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 254378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad 2544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 254578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad kPortIndexInput, width, height, compressionFormat, frameRateFloat); 2546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 2553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25615778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 25625778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 25635778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 25645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 25655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25675778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 25685778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 25695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25705778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 25715778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 25725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25745778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 25755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 25765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25805778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 25815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25825778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 25835778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 25845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25855778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 25865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25875778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 25885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25895778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 25905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25965778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 25975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 25985778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 25995778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 26005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26035778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 26045778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 26055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26065778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 26075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 26085778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 26095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26115778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 26125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 26145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 26155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 26165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26185778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 26195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26205778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 26215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26225778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 26235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 26245778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 26255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 26265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26285778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 26292c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 26305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26325778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 26335778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 2634a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // this is redundant as it was already set up in setVideoPortFormatType 2635a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // FIXME for now skip this only for flexible YUV formats 2636a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar if (colorFormat != OMX_COLOR_FormatYUV420Flexible) { 2637a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar video_def->eColorFormat = colorFormat; 2638a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar } 26395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26405778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 26415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26445778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 26455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 26465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26505778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 26515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26525778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 26535778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 26545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26595778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 26605778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 26615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26635778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 26645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 26655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26695778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 26705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26715778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 26725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26785778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 26795778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 26805778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 26815778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 26825778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 26835778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 26845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26855778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 26865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26895778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 26905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 26915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26955778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 26965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 26975778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 26985778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 26995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27005778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 27015778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 27025778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 27035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27045778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 27055778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 27065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 27075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2708c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad case OMX_VIDEO_CodingHEVC: 2709c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = setupHEVCEncoderParameters(msg); 2710c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad break; 2711c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 271289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 271389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 271489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 271589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 271689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 27175778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 27185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 27195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27215778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 27225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27245778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27260dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 27270dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 27280dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 27290dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 27300dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27310dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 27320dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27330dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 27340dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 27350dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 27360dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 27370dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27380dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27390dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 27400dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27410dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27420dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 27430dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 27440dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 27450dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 27460dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27470dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27480dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 27490dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27500dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 27510dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 27520dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27530dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27540dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 27550dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27560dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27570dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 27580dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 27590dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 27600dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 27610dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 27620dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27635778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 27645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 27655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 27665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 27675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 27685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27695778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 27705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 27715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 277396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 277496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 277596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 277696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 277796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 277896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 277996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 278096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 278196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 27835778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 27845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 27855778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 27865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 278996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 279096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27915778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 27925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 27935778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 27945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 27955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27975778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 27985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28005778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 28015778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 28025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 28035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28045778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 28055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 28065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 28125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 28135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 28145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 28165778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 28195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 28205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 28215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 28235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 28245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 28255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 28265778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 28275778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 28285778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 28295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28305778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 28315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 28325778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 28335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 28345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28375778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 28385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 28445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 28455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28475778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 28485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 28495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 285496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 28555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 28615778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 28625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28635778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 28645778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 28655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 28665778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 28675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 287096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 287196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 28725778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 28735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 28745778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 28755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 28765778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28785778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 28795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28815778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 28825778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 28835778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 28845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28855778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 28865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 28875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28925778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 28935778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28955778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 28965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 28975778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 28985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28995778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 29005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29015778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 29025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 29035778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 29045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 29055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 29065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29085778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 29095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29145778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 29155778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 29165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29185778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 29195778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 29205778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 29215778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 29225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29235778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 29245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 29255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 293096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 29315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 29375778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 29385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2939a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar// static 2940a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnarint /* OMX_VIDEO_AVCLEVELTYPE */ ACodec::getAVCLevelFor( 2941a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int width, int height, int rate, int bitrate, 2942a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar OMX_VIDEO_AVCPROFILETYPE profile) { 2943a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert bitrate to main/baseline profile kbps equivalent 2944a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar switch (profile) { 2945a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh10: 2946a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 3000); break; 2947a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh: 2948a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1250); break; 2949a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar default: 2950a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1000); break; 2951a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2952a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2953a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert size and rate to MBs 2954a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar width = divUp(width, 16); 2955a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar height = divUp(height, 16); 2956a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int mbs = width * height; 2957a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar rate *= mbs; 2958a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int maxDimension = max(width, height); 2959a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2960a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar static const int limits[][5] = { 2961a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar /* MBps MB dim bitrate level */ 2962a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 64, OMX_VIDEO_AVCLevel1 }, 2963a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 128, OMX_VIDEO_AVCLevel1b }, 2964a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 3000, 396, 56, 192, OMX_VIDEO_AVCLevel11 }, 2965a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 6000, 396, 56, 384, OMX_VIDEO_AVCLevel12 }, 2966a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 768, OMX_VIDEO_AVCLevel13 }, 2967a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 2000, OMX_VIDEO_AVCLevel2 }, 2968a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 19800, 792, 79, 4000, OMX_VIDEO_AVCLevel21 }, 2969a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 20250, 1620, 113, 4000, OMX_VIDEO_AVCLevel22 }, 2970a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 40500, 1620, 113, 10000, OMX_VIDEO_AVCLevel3 }, 2971a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 108000, 3600, 169, 14000, OMX_VIDEO_AVCLevel31 }, 2972a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 216000, 5120, 202, 20000, OMX_VIDEO_AVCLevel32 }, 2973a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 20000, OMX_VIDEO_AVCLevel4 }, 2974a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 50000, OMX_VIDEO_AVCLevel41 }, 2975a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 522240, 8704, 263, 50000, OMX_VIDEO_AVCLevel42 }, 2976a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 589824, 22080, 420, 135000, OMX_VIDEO_AVCLevel5 }, 2977a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 983040, 36864, 543, 240000, OMX_VIDEO_AVCLevel51 }, 2978a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 2073600, 36864, 543, 240000, OMX_VIDEO_AVCLevel52 }, 2979a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar }; 2980a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2981a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar for (size_t i = 0; i < ARRAY_SIZE(limits); i++) { 2982a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar const int (&limit)[5] = limits[i]; 2983a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar if (rate <= limit[0] && mbs <= limit[1] && maxDimension <= limit[2] 2984a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar && bitrate <= limit[3]) { 2985a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return limit[4]; 2986a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2987a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2988a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return 0; 2989a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar} 2990a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 29915778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 29925778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 29935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 29945778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 29955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 29965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 299896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 299996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 30005778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 30015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 30025778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 30035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 30045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 30055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30065778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 30075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 30100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 30110dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 30120dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 30130dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 30140dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 30150dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 30160dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 30170dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 30180dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 30190dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 30205778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 30215778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 30225778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 30235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30240dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 30255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 30265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30315778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 30325778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 30335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 30355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 30365778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 30375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 30385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 30395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30415778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 30425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30475778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 30485778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 30495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30515778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 30527c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 30537c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 30547c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 30555778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 30565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 30595778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 30605778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 30615778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 30625778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 30635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 30645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 30655778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 30665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30675778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 30685778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 30695778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 30705778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 30715778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 30725778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 30735778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 30745778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 30755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 30785778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 30795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30815778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 30825778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 30835778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 30845778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 30855778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 30865778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 30875778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 30885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30895778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 30905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 30915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 309696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 30975778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 30985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3099c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachadstatus_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { 3100c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t bitrate, iFrameInterval; 3101c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("bitrate", &bitrate) 3102c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 3103c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3104c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3105c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3106c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 3107c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3108c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad float frameRate; 3109c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findFloat("frame-rate", &frameRate)) { 3110c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t tmp; 3111c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("frame-rate", &tmp)) { 3112c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3113c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3114c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad frameRate = (float)tmp; 3115c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3116c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3117c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_PARAM_HEVCTYPE hevcType; 3118c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad InitOMXParams(&hevcType); 3119c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.nPortIndex = kPortIndexOutput; 3120c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3121c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad status_t err = OK; 3122c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->getParameter( 3123c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 3124c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3125c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3126c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3127c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3128c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t profile; 3129c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (msg->findInt32("profile", &profile)) { 3130c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t level; 3131c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("level", &level)) { 3132c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3133c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3134c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3135c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = verifySupportForProfileAndLevel(profile, level); 3136c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3137c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3138c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3139c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3140c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); 3141c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); 3142c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3143c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3144c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad // TODO: Need OMX structure definition for setting iFrameInterval 3145c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3146c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->setParameter( 3147c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 3148c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3149c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3150c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3151c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3152c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return configureBitrate(bitrate, bitrateMode); 3153c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad} 3154c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 315589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 315689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 31574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 31584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 31594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 31604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 31614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 31624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 31634154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 31644154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 31654154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 31664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 31674154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 316889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 316989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 317089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 31714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 317289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 317389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 317489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 31754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 31764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 31774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 31784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 31794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 31804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 31824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 31844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 31854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 31864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 31874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 31894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 31904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 31924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 31934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 31954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 31964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 31974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 32004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 32014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 32024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 32034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 32044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 32054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 32064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 32074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 32084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 32094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 32104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 32124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 32134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 32144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 32154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 32164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 32174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 32204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 32214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 32224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 32244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 32254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 32264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 32274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 32284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 32294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 323289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 323389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 323489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 32355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 32365778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 32375778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 32385778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 32395778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 32405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32415778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 32425778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 32445778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 32455778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 32465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 32475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32495778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 32505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 32535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 32545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 32565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 32575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 32605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 326196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 326296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 32635778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 32645778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 32655778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 32665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32675778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 32695778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 32705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 32735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 327596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 32765778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 32775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 32795778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 32805778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 32815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 32825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 32845778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 32855778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 32865778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 32875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 32905778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 32915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 32945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32965778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 32975778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 32985778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 32995778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 33005778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 33015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 33025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 33035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 33045778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 33055778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 33065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3307f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 3308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 330978b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat, 331078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRate) { 3311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 3312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 3313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 3314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 3316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 3318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 3321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 3324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 3325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 3326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 3327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 3331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 3333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 3334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 3337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 333878b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (frameRate >= 0) { 333978b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 334078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 3341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 3344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 3347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3349f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 3350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 3351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 3352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 3355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 3356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3358d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 3359d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 3360d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3361d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3362d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 3363d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3364d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 3365d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 3366d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3367d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3368d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3369d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 3370d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 3371d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 33727e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 33737e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 33747e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33757e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 33767e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 33777e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33787e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 33797e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 33807e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33817e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33827e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33837e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 33847e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 33857e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33867e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 33877e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 33887e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 33897e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33907e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3391e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 33927e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 3393c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 3394c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 3395c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 3396c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 33977e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33987e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 33997e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3400f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 3401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 3402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 3404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 3406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3407609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 3408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 3409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 3410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3417f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 3418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 3419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 3420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3422f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 3423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 3424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3426f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 3427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 3428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 3429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 3431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 3432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 3433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar// static 3437229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { 343803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar MediaImage &image = params.sMediaImage; 343903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar memset(&image, 0, sizeof(image)); 344003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 344103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 344203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 0; 344303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 344403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 344503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mWidth = params.nFrameWidth; 344603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mHeight = params.nFrameHeight; 344703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 344803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // only supporting YUV420 344903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (fmt != OMX_COLOR_FormatYUV420Planar && 345003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedPlanar && 345103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420SemiPlanar && 34525a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar && 34535a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != HAL_PIXEL_FORMAT_YV12) { 345403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("do not know color format 0x%x = %d", fmt, fmt); 3455229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 345603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 345703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3458b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // TEMPORARY FIX for some vendors that advertise sliceHeight as 0 3459b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride != 0 && params.nSliceHeight == 0) { 3460b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("using sliceHeight=%u instead of what codec advertised (=0)", 3461b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nFrameHeight); 3462b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nSliceHeight = params.nFrameHeight; 3463b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3464b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 3465b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // we need stride and slice-height to be non-zero 3466b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride == 0 || params.nSliceHeight == 0) { 3467b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 3468b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar fmt, fmt, params.nStride, params.nSliceHeight); 3469b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar return false; 3470b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3471b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 347203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set-up YUV format 347303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 347403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 3; 347503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mBitDepth = 8; 347603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mOffset = 0; 347703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mColInc = 1; 347803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mRowInc = params.nStride; 347903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mHorizSubsampling = 1; 348003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mVertSubsampling = 1; 348103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 34825a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar switch ((int)fmt) { 34835a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 34845a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (params.bUsingNativeBuffers) { 34855a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t ystride = align(params.nStride, 16); 34865a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t cstride = align(params.nStride / 2, 16); 34875a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.Y].mRowInc = ystride; 34885a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 34895a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mOffset = ystride * params.nSliceHeight; 34905a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mColInc = 1; 34915a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mRowInc = cstride; 34925a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 34935a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 34945a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 34955a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mOffset = image.mPlane[image.V].mOffset 34965a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar + (cstride * params.nSliceHeight / 2); 34975a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mColInc = 1; 34985a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mRowInc = cstride; 34995a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 35005a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 35015a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar break; 35025a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } else { 35035a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar // fall through as YV12 is used for YUV420Planar by some codecs 35045a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 35055a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 35065a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case OMX_COLOR_FormatYUV420Planar: 350703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedPlanar: 350803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 350903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 1; 351003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride / 2; 351103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 351203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 351303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 351403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 351503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar + (params.nStride * params.nSliceHeight / 4); 351603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 1; 351703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride / 2; 351803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 351903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 352003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 352103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 352203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420SemiPlanar: 352303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 352403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedSemiPlanar: 352503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // NV12 352603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 352703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 2; 352803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride; 352903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 353003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 353103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 353203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 353303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 2; 353403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride; 353503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 353603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 353703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 353803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 353903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar default: 354003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar TRESPASS(); 354103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 3542229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3543229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3544229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3545229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3546229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeColorFormat( 3547229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3548229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams &describeParams) 3549229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar{ 3550229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_INDEXTYPE describeColorFormatIndex; 3551229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (omx->getExtensionIndex( 3552229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, "OMX.google.android.index.describeColorFormat", 3553229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeColorFormatIndex) != OK || 3554229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar omx->getParameter( 3555229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, describeColorFormatIndex, 3556229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeParams, sizeof(describeParams)) != OK) { 3557229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeDefaultColorFormat(describeParams); 3558229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3559229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeParams.sMediaImage.mType != 3560229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 3561229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3562229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3563229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3564229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::isFlexibleColorFormat( 3565229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 35660d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) { 3567229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams describeParams; 3568229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar InitOMXParams(&describeParams); 3569229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3570229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // reasonable dummy values 3571229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameWidth = 128; 3572229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameHeight = 128; 3573229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nStride = 128; 3574229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nSliceHeight = 128; 35750d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = (OMX_BOOL)usingNativeBuffers; 3576229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3577229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar CHECK(flexibleEquivalent != NULL); 3578229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3579229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (!describeColorFormat(omx, node, describeParams)) { 3580229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3581229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3582229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3583229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const MediaImage &img = describeParams.sMediaImage; 3584229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) { 3585229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mNumPlanes != 3 || 3586229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mHorizSubsampling != 1 || 3587229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mVertSubsampling != 1) { 3588229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3589229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3590229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3591229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // YUV 420 3592229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mPlane[img.U].mHorizSubsampling == 2 3593229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.U].mVertSubsampling == 2 3594229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mHorizSubsampling == 2 3595229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mVertSubsampling == 2) { 3596229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // possible flexible YUV420 format 3597229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mBitDepth <= 8) { 3598229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3599229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3600229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3601229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3602229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3603229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 360403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar} 360503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3606e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 3607e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 360831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 360931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 3610e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 361131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 361231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 361331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 361431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 361531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3616e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 3617e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 361831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 361931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 362031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 362131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 362231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 3623e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 3624e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 3625e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3626e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 3627e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 3628e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3629e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 3630e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 3631e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 3632e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 36330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (mNativeWindow == NULL) { 36340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar DescribeColorFormatParams describeParams; 36350d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&describeParams); 36360d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.eColorFormat = videoDef->eColorFormat; 36370d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameWidth = videoDef->nFrameWidth; 36380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameHeight = videoDef->nFrameHeight; 36390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nStride = videoDef->nStride; 36400d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nSliceHeight = videoDef->nSliceHeight; 36410d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = OMX_FALSE; 36420d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar 36430d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (describeColorFormat(mOMX, mNode, describeParams)) { 36440d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar notify->setBuffer( 36450d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar "image-data", 36460d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar ABuffer::CreateAsCopy( 36470d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &describeParams.sMediaImage, 36480d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar sizeof(describeParams.sMediaImage))); 36495a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 36505a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar MediaImage *img = &describeParams.sMediaImage; 36515a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] MediaImage { F(%zux%zu) @%zu+%zu+%zu @%zu+%zu+%zu @%zu+%zu+%zu }", 36525a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mComponentName.c_str(), img->mWidth, img->mHeight, 36535a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc, 36545a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc, 36555a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc); 36560d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 365703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 365803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 365991a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar if (portIndex != kPortIndexOutput) { 366091a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar // TODO: also get input crop 366191a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar break; 366291a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar } 366391a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar 3664e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 3665e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 366691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar rect.nPortIndex = portIndex; 3667e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3668e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 366991a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar mNode, 367091a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar (portIndex == kPortIndexOutput ? 367191a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonOutputCrop : 367291a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonInputCrop), 3673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 3674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 3675e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 3676e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 3677e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 3678e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 367931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3680e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 3681e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 3682e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 3683e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 3684e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 3685e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 3686e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3687e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 3688577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 3689577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 3690577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 3691e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 3692e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 3693e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3694e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3695e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 36964730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 36974730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP8: 36984730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP9: 36994730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37004730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 37014730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia InitOMXParams(&vp8type); 37024730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia vp8type.nPortIndex = kPortIndexOutput; 37034730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia status_t err = mOMX->getParameter( 37044730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia mNode, 37054730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 37064730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia &vp8type, 37074730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia sizeof(vp8type)); 37084730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 37094730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (err == OK) { 37104730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia AString tsSchema = "none"; 37114730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (vp8type.eTemporalPattern 37124730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 37134730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia switch (vp8type.nTemporalLayerCount) { 37144730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 1: 37154730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37164730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.1-layer"; 37174730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37184730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37194730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 2: 37204730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37214730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.2-layer"; 37224730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37234730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37244730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 3: 37254730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37264730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.3-layer"; 37274730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37284730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37294730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia default: 37304730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37314730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37324730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37334730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37344730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37354730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia notify->setString("ts-schema", tsSchema); 37364730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37374730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia // Fall through to set up mime. 37384730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37394730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 3740e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 3741e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3742e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 3743e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3744e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 3745e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 3746e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 3747e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 3748e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 3749e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3750e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3751e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 375231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3753e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 3754e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 37555a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] %s format is %s", mComponentName.c_str(), 37565a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar portIndex == kPortIndexInput ? "input" : "output", 37575a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar notify->debugString().c_str()); 37585a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 375931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 376031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 376131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 376231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 376331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 376431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 376531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 376697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 3767e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 3768e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3769e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 3770e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3771e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3772e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3773e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3774e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 3775e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3776e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3777e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 377814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 3779e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 3780e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 378114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 378214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 378314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 378414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 378514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 378614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 3787e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3788e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 3789e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3790e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 3791e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3792e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 3793e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 37948b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 3795e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 37968b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 37979806555d3930be43e11106281dee354820ac1c88Andreas Huber 3798e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 3799e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3800e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 3801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3802e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 3806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 3810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3811e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3812e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3813e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3814e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3815e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 3816e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3817e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 3818e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3819e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 38209806555d3930be43e11106281dee354820ac1c88Andreas Huber 3821e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3822e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 3823e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3824e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3825e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3826e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 3827e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 3828e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3829e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 3830e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 3832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 3833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 3835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 3837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 3842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 3844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3845e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 3849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 3853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3854e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3857e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3858e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 3859e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3860e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 3861e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3862e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3863e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3864e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3865e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 3866e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3867e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3868e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3869e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 3870e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3871e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3872e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3873e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3874e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3875e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 3876e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3877e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 3878e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3879e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3880e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3881e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3882e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 3883e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3884e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3885e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3886e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 3887e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3888e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3889e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3890e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3891e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 389297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 389397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 389497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 389597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 3896e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 389797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 389897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 389997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 390097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 390197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 390297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 390397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 390497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 390597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 390697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 390797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 390897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 3909e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 39108a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad case OMX_AUDIO_CodingAndroidEAC3: 39118a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { 39128a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE params; 39138a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(¶ms); 39148a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad params.nPortIndex = portIndex; 39158a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39168a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad CHECK_EQ((status_t)OK, mOMX->getParameter( 39178a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 39188a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 39198a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ¶ms, 39208a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(params))); 39218a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setString("mime", MEDIA_MIMETYPE_AUDIO_EAC3); 39238a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("channel-count", params.nChannels); 39248a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("sample-rate", params.nSampleRate); 39258a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad break; 39268a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 39278a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39288c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian case OMX_AUDIO_CodingAndroidOPUS: 39298c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian { 39308c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian OMX_AUDIO_PARAM_ANDROID_OPUSTYPE params; 39318c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian InitOMXParams(¶ms); 39328c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian params.nPortIndex = portIndex; 39338c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 39348c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian CHECK_EQ((status_t)OK, mOMX->getParameter( 39358c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian mNode, 39368c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, 39378c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian ¶ms, 39388c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian sizeof(params))); 39398c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 39408c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); 39418c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("channel-count", params.nChannels); 39428c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("sample-rate", params.nSampleRate); 39438c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian break; 39448c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian } 39458c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 394610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang case OMX_AUDIO_CodingG711: 394710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang { 394810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang OMX_AUDIO_PARAM_PCMMODETYPE params; 394910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang InitOMXParams(¶ms); 395010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang params.nPortIndex = portIndex; 395110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 395210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang CHECK_EQ((status_t)OK, mOMX->getParameter( 395310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mNode, 395410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang (OMX_INDEXTYPE)OMX_IndexParamAudioPcm, 395510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang ¶ms, 395610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang sizeof(params))); 395710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 395810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang const char *mime = NULL; 395910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang if (params.ePCMMode == OMX_AUDIO_PCMModeMULaw) { 396010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_MLAW; 396110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else if (params.ePCMMode == OMX_AUDIO_PCMModeALaw) { 396210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_ALAW; 396310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else { // params.ePCMMode == OMX_AUDIO_PCMModeLinear 396410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_RAW; 396510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 396610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setString("mime", mime); 396710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("channel-count", params.nChannels); 396810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("sample-rate", params.nSamplingRate); 396910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang break; 397010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 397141d3f579d2c166984958263533284209b90c87d5Marco Nelissen 397241d3f579d2c166984958263533284209b90c87d5Marco Nelissen case OMX_AUDIO_CodingGSMFR: 397341d3f579d2c166984958263533284209b90c87d5Marco Nelissen { 397441d3f579d2c166984958263533284209b90c87d5Marco Nelissen OMX_AUDIO_PARAM_MP3TYPE params; 397541d3f579d2c166984958263533284209b90c87d5Marco Nelissen InitOMXParams(¶ms); 397641d3f579d2c166984958263533284209b90c87d5Marco Nelissen params.nPortIndex = portIndex; 397741d3f579d2c166984958263533284209b90c87d5Marco Nelissen 397841d3f579d2c166984958263533284209b90c87d5Marco Nelissen CHECK_EQ(mOMX->getParameter( 397941d3f579d2c166984958263533284209b90c87d5Marco Nelissen mNode, OMX_IndexParamAudioPcm, 398041d3f579d2c166984958263533284209b90c87d5Marco Nelissen ¶ms, sizeof(params)), 398141d3f579d2c166984958263533284209b90c87d5Marco Nelissen (status_t)OK); 398241d3f579d2c166984958263533284209b90c87d5Marco Nelissen 398341d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MSGSM); 398441d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("channel-count", params.nChannels); 398541d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("sample-rate", params.nSampleRate); 398641d3f579d2c166984958263533284209b90c87d5Marco Nelissen break; 398710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 398810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 3989e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 3990e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 3991e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 3992e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 399331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 399431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 399531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 399631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 399731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 399831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 399931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4000e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 4001e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 4002e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4003e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 40044e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> notify = mBaseOutputFormat->dup(); 4005e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 4006e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4007e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 4008e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4009e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 4010e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 4011e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4012e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 4013e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 4014e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 4015e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 4016e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 4017e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 4018e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 4019e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 4020e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 4021e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 4022e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 4023e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 4024e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 4025e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 4026e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 4027ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGW("Replacing SkipCutBuffer holding %zu bytes", prevbufsize); 4028e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4029e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4030e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 4031e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 4032e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 4033e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4034e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 403531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 403631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 403731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 403831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 403931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 40405778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 4041cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 4042d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatError); 4043251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGE("signalError(omxError %#x, internalError %d)", error, internalError); 4044251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 4045251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (internalError == UNKNOWN_ERROR) { // find better error code 4046251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const status_t omxStatus = statusFromOMXError(error); 4047251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (omxStatus != 0) { 4048251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung internalError = omxStatus; 4049251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 4050251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", error); 4051251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4052251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 40535778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 4054251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung notify->setInt32("actionCode", ACTION_CODE_FATAL); // could translate from OMX error. 4055cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 4056cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 4057cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 4058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4060eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 4061eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4062eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4063496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 4064496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 4065496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 4066496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4067496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4068496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 4069496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 4070496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4071496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 4072496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 4073496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4074496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 4075496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 4076496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 4077496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 4078496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 4079496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 4080496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4081eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 4082eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 4083eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 4084eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 4085eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4086eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4087eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 4088eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 4089eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4090eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4091eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 4092eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 4093eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4094eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4095eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 4096eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 4097eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4098eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4099eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4100eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4101f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 4102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 4103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 4104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4106ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 4107ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 4109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4111f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 4112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 4114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 4116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 4120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 4122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 4126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 4128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41301dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar case ACodec::kWhatSetSurface: 41311dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar { 41321dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AReplyToken> replyID; 41331dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar CHECK(msg->senderAwaitsResponse(&replyID)); 41341dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41351dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<RefBase> obj; 41361dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar CHECK(msg->findObject("surface", &obj)); 41371dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41381dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mCodec->handleSetSurface(static_cast<Surface *>(obj.get())); 41391dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41401dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> response = new AMessage; 41411dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar response->setInt32("err", err); 41421dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar response->postReply(replyID); 41431dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar break; 41441dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 41451dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 41478f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang case ACodec::kWhatSetInputSurface: 41487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 41497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 4150251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This may result in an app illegal state exception. 41517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 41527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 41537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 41547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4156ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 4157ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 4158251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This will result in kFlagSawMediaServerDie handling in MediaCodec. 4159ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 4160ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 4161ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 4162ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4163ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 416430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 416530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 416630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGI("[%s] forcing the release of codec", 416730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str()); 416830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar status_t err = mCodec->mOMX->freeNode(mCodec->mNode); 416930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGE_IF("[%s] failed to release codec instance: err=%d", 417030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str(), err); 417130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 417230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 417330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->post(); 417430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 417530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 417630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4184f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 4185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 4186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 4187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41885e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 41895e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 4190ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar if (mCodec->mNode == 0) { 41915e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 41925e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 41935e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 41945e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 41955e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 4197609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 4199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 4201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 4202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 4204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 4205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 4206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 4207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42080af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 42090af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 42100af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 42110af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 42120af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 42130af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 42140af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 42150af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 42160af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 42170af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 42180af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 4221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 4223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4228609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 4231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4236609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 4242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 4243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 4244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 4245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 4247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 4249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 4250784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 4251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 4262ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] EVENT(%d, 0x%08x, 0x%08x)", 4263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4268ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("[%s] ERROR(0x%08x)", mCodec->mComponentName.c_str(), data1); 4269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4270251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // verify OMX component sends back an error we expect. 4271251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung OMX_ERRORTYPE omxError = (OMX_ERRORTYPE)data1; 4272251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (!isOMXError(omxError)) { 4273251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", omxError); 4274251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung omxError = OMX_ErrorUndefined; 4275251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4276251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(omxError); 4277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4281f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 4282ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] onOMXEmptyBufferDone %u", 4283349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4284349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 4287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // We're in "store-metadata-in-buffers" mode, the underlying 429296e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // OMX component had access to data that's implicitly refcounted 429396e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // by this "MediaBuffer" object. Now that the OMX component has 429496e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // told us that it's done with the input buffer, we can decrement 429596e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // the mediaBuffer's reference count. 429696e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia info->mData->setMediaBufferBase(NULL); 4297d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 4312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4319f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 4320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4327d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFillThisBuffer); 4328609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 4329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 43312d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43331d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec); 4334609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 4341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4343f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 4344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4345609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 43462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 4347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 43485778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 4349a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 43505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43512d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 4352a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 4353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 4354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43557fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 43567fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 43577fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 43587fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 43597fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 43607fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 43617fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 43627fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 43633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 4365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 43685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 43695778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 43705778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 43715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 4374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 4375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 4382dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 4383dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4384dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4385dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 4393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 4397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 4399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 4400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 4401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 44045778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 44055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 44065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 4408ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] Needs to copy input data for buffer %u. (%p != %p)", 4409d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 4410d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 4411d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 4412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 4414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 4415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4417078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 4418ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ codec specific data", 4419078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 44205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 4421ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ EOS", 44225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 4423078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 4424d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4425ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGI("[%s] calling emptyBuffer %u w/ time %lld us", 4426ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), bufferID, (long long)timeUs); 4427d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 4428ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ time %lld us", 4429ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), bufferID, (long long)timeUs); 4430d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4431078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 4432349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4433d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4434d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 4435d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 4436d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 4437d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 4438d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4439d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4440054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4441054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 4442054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 4443054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4444054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 4445054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 4446054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 4447054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 4448054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 4449e53350373ac516257b4f8956ff1e3f1ac48f607eLajos Molnar mCodec->submitOutputMetaDataBuffer(); 4450054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4451054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4452054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 4458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 4459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 4460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 44655778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 44665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 44675778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 44685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 44695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 44705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 44715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 44725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 4474dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 44753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 4476dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 4477dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 4478dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 44793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 4480dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 4481dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4483ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u signalling EOS", 4484349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4485349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 4492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 4493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4498dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4502625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 4503625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 4504625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4505625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 4506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4509f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 4510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 4515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 4520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 4521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 4522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 4525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 4527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 4528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 4532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 4536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4538f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 4539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 4540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 4541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 4542784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 4543609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 45445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 4545349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4547d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4548d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4549d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 4550d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 4551d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 4552d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 4553d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4554d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 4555d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 4556d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 4557d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4558d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 4559d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 4560d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 4561d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4562d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4568054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 4569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4579a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (rangeLength == 0 && (!(flags & OMX_BUFFERFLAG_EOS) 4580a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || mCodec->mPortEOS[kPortIndexOutput])) { 4581609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 45825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4583349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 45845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 45855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 45865778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 4587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45885778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 45895778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 45905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 459131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4592577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 45931d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec); 4594577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 45954bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 4596577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 45975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4599308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 4600308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 4601308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 4602308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 4603308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 4604308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 4605308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 4606308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 4607308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 4608496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 460921ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 4610496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 4611496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 4612496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 46135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 461421ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 4615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46168b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 46178b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 46188b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 46195778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 4620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46215778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4622d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); 4623609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 46242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 46255778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 4626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4627609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46295778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 4630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46315778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 46325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 46335778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 4634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 46365778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 46375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4639d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatEOS); 4640dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 4641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 4644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4661f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 4662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4663609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 4664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 4668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4669577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 4670577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 4671577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 4672577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 4673577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 4674577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 4675577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 4676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 4677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 46786aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 467979ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 46806fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 4681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 4682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4683fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 4684fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 4685fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 4686fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 4687fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 4688fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 4689fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 4690fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 469147aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 4692fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 4693fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4694fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 4695fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4696fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46975778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4698fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 4699fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 4700fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 4701fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4702fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 47035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 4704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 47051e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 4706cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 4707cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 4708251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4709cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4710cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 47126fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 47136fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 47146fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 47156fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 4725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 4738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4745c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 4746609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 4747c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4748349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4749c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4750c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 4751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4752c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4753c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4771f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 4772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4775c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 4776c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 4777ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4778ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 4779f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen IInterface::asBinder(mCodec->mOMX)->unlinkToDeath(mDeathNotifier); 4780ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4781ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4782ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4783ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 4784ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mNode = 0; 4785ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 4786ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 4787ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 4788308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 4789ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 4790c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4791c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4792f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 4797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 4799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48045778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 48055778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 48065778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 48075778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 48085778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 48095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 4812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4813c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4814c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4815c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 481654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 481754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 4818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4820d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 4821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4824c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 4828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4830d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4834c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 483730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 483830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 483930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // nothing to do, as we have already signaled shutdown 484030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar handled = true; 484130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 484230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 484330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4851f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 4852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4853c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 4854c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 4855c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 4856c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 48575778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 48585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4859c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 48605778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 48615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4862ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar CHECK(mCodec->mNode == 0); 48635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 486548a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung if (client.connect() != OK) { 486648a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung mCodec->signalError(OMX_ErrorUndefined, NO_INIT); 486748a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung return false; 486848a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung } 4869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 4871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48721d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec); 4873ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4874ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 4875f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen if (IInterface::asBinder(omx)->linkToDeath(mDeathNotifier) != OK) { 4876ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 4877ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 4878ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4879ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4880ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4881e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 48825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 4884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48855778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4886d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 48877791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen int32_t encoder = false; 48885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 4889e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 4890e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 4891e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 4892afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4893e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 4894e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 4895e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 4896afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 48975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 48985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 48995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 49005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 49015778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 49025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 49035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 49045778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 49055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 49065778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 49075778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 49085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 4909e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 49105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 49111065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49121065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 4913ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar IOMX::node_id node = 0; 49141065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49159f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu status_t err = OMX_ErrorComponentNotFound; 49161065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 49171065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 4918e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 4919e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 4920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4921da153975581fb3161a30452348a5b26ee72d9255Elliott Hughes pid_t tid = gettid(); 4922078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 4923078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 49249f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu err = omx->allocateNode(componentName.c_str(), observer, &node); 4925078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 4926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49271065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 49281065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 49297a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He } else { 49307a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He ALOGW("Allocating component '%s' failed, try next one.", componentName.c_str()); 49311065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49321065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4933ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar node = 0; 49341065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49351065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4936ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar if (node == 0) { 49375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 49389f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate a %scoder for type '%s' with err %#x.", 49399f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu encoder ? "en" : "de", mime.c_str(), err); 49405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 49419f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate codec '%s' with err %#x.", componentName.c_str(), err); 49425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4943c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 494452e88b2986536e83a7a6da63461556b8734a85f3Ronghua Wu mCodec->signalError((OMX_ERRORTYPE)err, makeNoSideEffectStatus(err)); 4945c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 4946c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49481d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar notify = new AMessage(kWhatOMXMessage, mCodec); 4949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 4950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 4952ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 4953ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4954ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 4955ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 49561713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mCodec->mFlags |= kFlagIsGrallocUsageProtected; 49570167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 4958ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 4959ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4960afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 4961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 4962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 4963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 49655778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4966d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentAllocated); 49675778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 49685778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 49695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4970c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4971c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4972c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4973c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 49745778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 49755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4976c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4977c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4978c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 4979c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 4980c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4981c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4982c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 4983c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 4984c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4985f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4986f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4987f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4988f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 4989f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4990054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 4991054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4992a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 4993e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 4994e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 49954e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mCodec->mBaseOutputFormat.clear(); 4996054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4997c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 4998c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 4999c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5000c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 5001c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 5002c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 5004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 500554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 5006f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia 5007f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia mCodec->processDeferredMessages(); 5008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5010c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 5011c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 5012c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 5013c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 5015c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5016c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 501754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 501854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 5019d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 502054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 502154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 502254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 5023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 5026c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 5027c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5028c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 5029c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 5030c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5031c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 5032c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5033c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5034c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5035c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 50367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 50377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 50387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 50397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 50407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 50417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 50427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 50438f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang case ACodec::kWhatSetInputSurface: 5044d291c222357303b9611cab89d0c3b047584ef377Chong Zhang { 50458f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang onSetInputSurface(msg); 5046d291c222357303b9611cab89d0c3b047584ef377Chong Zhang handled = true; 5047d291c222357303b9611cab89d0c3b047584ef377Chong Zhang break; 5048d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5049d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5050c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 5051c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5052c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 5053c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5054c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5055c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5056c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5057c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 5058c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5059c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5060c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5061c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5062c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 506354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5064c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 5065c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5066c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5067c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5068c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5069c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5070c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 5071c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5072c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5073d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5074c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 5075c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5076c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5077c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5078c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5079c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5080c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 5081c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 5082c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5083c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5084c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 5085c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5086c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5087c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 50885778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 50895778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 50905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5091ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar CHECK(mCodec->mNode != 0); 50925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50935778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 50945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 50955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50965778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 50975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5099c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 5100c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 5101c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 5102251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5103c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 51045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51065778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 51075778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5108d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentConfigured); 5109e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 5110e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 51115778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 51125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5113c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 51155778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 51165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5117d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t ACodec::LoadedState::setupInputSurface() { 5118d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t err = OK; 5119a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5120d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mRepeatFrameDelayUs > 0ll) { 5121a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 5122a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 5123a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 5124a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 5125a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 5126a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 5127a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5128a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 5129a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 5130a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 5131a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 5132a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 5133d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 5134a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5135a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5136a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5137d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mMaxPtsGapUs > 0ll) { 513894ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 513994ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 514094ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 514194ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 514294ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 514394ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 514494ee4b708acfa941581160b267afb79192b1d816Chong Zhang 514594ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 514694ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 514772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 514872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 5149d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 51502c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51512c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51522c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 5153d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mMaxFps > 0) { 515437b2b389139ed638831e49708c947863eef631efRonghua Wu err = mCodec->mOMX->setInternalOption( 515537b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mNode, 515637b2b389139ed638831e49708c947863eef631efRonghua Wu kPortIndexInput, 515737b2b389139ed638831e49708c947863eef631efRonghua Wu IOMX::INTERNAL_OPTION_MAX_FPS, 515837b2b389139ed638831e49708c947863eef631efRonghua Wu &mCodec->mMaxFps, 515937b2b389139ed638831e49708c947863eef631efRonghua Wu sizeof(mCodec->mMaxFps)); 516037b2b389139ed638831e49708c947863eef631efRonghua Wu 516137b2b389139ed638831e49708c947863eef631efRonghua Wu if (err != OK) { 516237b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGE("[%s] Unable to configure max fps (err %d)", 516337b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mComponentName.c_str(), 516437b2b389139ed638831e49708c947863eef631efRonghua Wu err); 5165d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 516637b2b389139ed638831e49708c947863eef631efRonghua Wu } 516737b2b389139ed638831e49708c947863eef631efRonghua Wu } 516837b2b389139ed638831e49708c947863eef631efRonghua Wu 5169d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mTimePerCaptureUs > 0ll 51702c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 51712c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 51722c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 51732c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 51742c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 51752c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 51762c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 51772c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 51782c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 51792c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 51802c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 51812c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 51822c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 51832c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 51842c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 5185d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 51862c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51872c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 518872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5189d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mCreateInputBuffersSuspended) { 519072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 519172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 519272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 519372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 519472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 519572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 519672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 519772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 519872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 519972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 520094ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 520194ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 5202d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 520394ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 520494ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 520594ee4b708acfa941581160b267afb79192b1d816Chong Zhang 5206d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 5207d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 5208d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5209d291c222357303b9611cab89d0c3b047584ef377Chong Zhangvoid ACodec::LoadedState::onCreateInputSurface( 5210d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<AMessage> & /* msg */) { 5211d291c222357303b9611cab89d0c3b047584ef377Chong Zhang ALOGV("onCreateInputSurface"); 5212d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5213d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<AMessage> notify = mCodec->mNotify->dup(); 5214d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated); 5215d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5216d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferProducer> bufferProducer; 5217d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t err = mCodec->mOMX->createInputSurface( 5218d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mNode, kPortIndexInput, &bufferProducer); 5219d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5220d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err == OK) { 5221d291c222357303b9611cab89d0c3b047584ef377Chong Zhang err = setupInputSurface(); 5222d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5223d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 52247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 52257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 52267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 52277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 52287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 52297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 52307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 52317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 52327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 52337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 52347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 52357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 52367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 52377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 52388f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangvoid ACodec::LoadedState::onSetInputSurface( 5239d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<AMessage> &msg) { 52408f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang ALOGV("onSetInputSurface"); 5241d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5242d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<AMessage> notify = mCodec->mNotify->dup(); 5243d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("what", CodecBase::kWhatInputSurfaceAccepted); 5244d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5245d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<RefBase> obj; 5246d291c222357303b9611cab89d0c3b047584ef377Chong Zhang CHECK(msg->findObject("input-surface", &obj)); 5247d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<PersistentSurface> surface = static_cast<PersistentSurface *>(obj.get()); 5248d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 52498f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang status_t err = mCodec->mOMX->setInputSurface( 5250d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mNode, kPortIndexInput, surface->getBufferConsumer()); 5251d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5252d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err == OK) { 5253d291c222357303b9611cab89d0c3b047584ef377Chong Zhang err = setupInputSurface(); 5254d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5255d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5256d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err != OK) { 5257d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // Can't use mCodec->signalError() here -- MediaCodec won't forward 5258d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // the error through because it's in the "configured" state. We 5259d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // send a kWhatInputSurfaceAccepted with an error value instead. 52608f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang ALOGE("[%s] onSetInputSurface returning error %d", 5261d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mComponentName.c_str(), err); 5262d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("err", err); 5263d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5264d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->post(); 5265d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 5266d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 52685778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 52695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 52705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 52715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 5275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5279f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 5280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5283f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 52843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 5285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5286cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5287cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 528829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 5289cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 5290cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5291cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5292251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 529391bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 529491bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 5295cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5298f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 5299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 5300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 5302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 5303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 5306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5308f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 531072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53176507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 53186507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 53196507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 53206507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 53216507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 53226507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 53236463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 53246463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 53256463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 53266463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 53276463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 53286463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 53296463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 53306463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 53316463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 53326463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 5333d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 53346463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 53356463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 53366463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 53376463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 5338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5343f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 5344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 5353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 5356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5367f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 5368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5371f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 53723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 5373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5375f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 537772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5384d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 5385d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5386d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 5387d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5388d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5389d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5390d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 5391d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5392d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 5393d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5394d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5395d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 5396d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5397d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5398d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5399d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 54006507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 54016507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 54026507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 54036507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 54046507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 54056507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5411f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 5412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 5418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 5420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5432f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 5433349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 5434349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 5435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5437f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 5438ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 5439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5442054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 5443054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 5444054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 5445054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 5446054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 5447054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5448054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 5449054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 5450054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 5451054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5452054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 54534dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 54544dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 54554dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 5456054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5457054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5458054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 5459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 5460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 5461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 5463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 5464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 5465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 5467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 5468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 5471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5473ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling fillBuffer %u", 5474349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 5475349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 5477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 5480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5483054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 5484c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 5485054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 5486054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 5487054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5488054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5489054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5490f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 5491349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 54923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 5493349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5494349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5495349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 5496349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5497349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 5499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55003cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar // Post all available input buffers 5501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 55023cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); i++) { 55033cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 55043cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_US) { 55053cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar postFillThisBuffer(info); 55063cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 55073cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 5508349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5509349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 5510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5512f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 55133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 5514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 5516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5518f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5524c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5525c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5526c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5527c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5528c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 552954b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5530c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 5531c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5532349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5533349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 5539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 55467a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 5547ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar "(codec owns %zu/%zu input, %zu/%zu output).", 5548d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 5549d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 5550d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 5551d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 5552d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 5553d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5554349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5555349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 5558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 5561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 5566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 5568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5573496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 5574496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 5575496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 5576496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 5577496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 5578496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5579496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5580496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 5581496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 5582496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5583496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5584a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 5585a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 5586a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 5587a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 5588a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5589a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 5590a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5591a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 5592a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 5593a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 5594a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 5595a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5596a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5597a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 5598a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 5599a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5600a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 56017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 56027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 56036507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 56047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 56057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 56067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 56077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 56084dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 56094dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 56104dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 56114dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 56124dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 56134dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 56144dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 56154dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 56164dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56174dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56184dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 56194dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56204dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5629a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 5630a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 5631530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 5632a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 5633a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 5634a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 5635a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 5636a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5637a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 5638a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 5639a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 5640a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 5641a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 5642a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5643a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 5644a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 5645a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 5646a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5647a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 5648a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5649a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5650a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 565172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 565272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 565372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 565472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 565572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 565672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 565772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 565872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 565972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 566072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 566172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 566272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 566372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 566472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 566572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 566672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5667e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 5668e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 5669e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 5670e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5671b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 5672b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 5673e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 5674e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 5675e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 5676e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 5677b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 5678b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5679b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5680b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 5681b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5682b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5683b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5684b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5685b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 5686b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 5687b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 5688b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5689b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5690b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 5691b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5692b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5693e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 5694e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 56958db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu float rate; 56968db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu if (params->findFloat("operating-rate", &rate) && rate > 0) { 56978db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu status_t err = setOperatingRate(rate, mIsVideo); 56988db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu if (err != OK) { 56998db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu ALOGE("Failed to set parameter 'operating-rate' (err %d)", err); 57008db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu return err; 57018db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu } 57028db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu } 57038db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu 5704a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 5705a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 5706a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 57076507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 57086507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 5709d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatSignaledInputEOS); 57106507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 57116507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 57126507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 57136507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 57146507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 57156507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 57166507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 57176507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5718f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 5719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 5722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 5724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 572531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 5726054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 5727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 5729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 5730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5732349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 5733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 573531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 573631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5738ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08x", 5739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 5740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 5746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5757f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 5758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 5759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5762f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 5763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 5764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 5765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 5766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 5769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5773f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 5774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5780349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 5781e6eea3a6b6e0cf92287ec1ceb8350f201d17e1acPer Persson case kWhatSetParameters: 5782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5783349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 57843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 5785349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5786349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5800f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 58013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 5802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5805f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 5806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 5811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 5814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 5817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 5818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 5821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5823cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5824cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 5825cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 582629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 5827cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 5828cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5829cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5830251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5831d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5832755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 5833755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 5834755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 5835755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 5836755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 5837755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 5838755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 5839755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5840cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 5844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 584631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 584731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 58483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 5849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5851349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 5852349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 5853349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5854349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5870f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 58715778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 58725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 5873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5875f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5903f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 59043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 590531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 59065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 590731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5910f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 5911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 59195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5925349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5926349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 5927349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5928349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 5929349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5930349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5931349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 59360af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 5937f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 59385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 5939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 5941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 5944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 5945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59460167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 59470167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 5948bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 5949bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 5950bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 5951bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 5952b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar pushBlankBuffersToNativeWindow(mCodec->mNativeWindow.get()); 5953bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 5954bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 5955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 5956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5959f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 5960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5966f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 5967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5975f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 5976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5979f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 5980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 6001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 6005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6007f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 60083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 6009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6011f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 6012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 6013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 6014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 6015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 6017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 6018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 6020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 6026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 6030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6031f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 6032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 6033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6035f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 60363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 6037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 6039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6041f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 6042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 6043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 6045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 6046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 6048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 6052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 6054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 6055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 6060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 6064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6066f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 6067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 6068ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] FlushingState onOMXEvent(%u,%d)", 6069ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), event, (OMX_S32)data1); 6070d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 6071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 6072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 6073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 6075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 6077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 6078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 6079e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 6080e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 6081e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 6082e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 6083e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 6084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 6085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 6086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 6087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 6088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6095349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 6096349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 60971d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec); 6098349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 6099609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 6100349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 6101349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 6102349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 6103349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 61043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 6105349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 6106349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6107349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 6108349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6109349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 6110349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 6111349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 6114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6119f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 6120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 6121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6125f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 6126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 6127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6131f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 6132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 6133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 6134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 61357e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 61367e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 61377e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 61387e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 6139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 6140d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 6141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 6142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 6144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 6145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6146dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 6147dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 6148f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 6149f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 6150f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 6151f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 6152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 6153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 6157