ACodec.cpp revision 5a52a060fcbe4804bcf4f61b8a457fe0e18a9014
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 24609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#include <inttypes.h> 256fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar#include <utils/Trace.h> 266fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 35a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 38afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 421065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 453a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 4997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 52496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// OMX errors are directly mapped into status_t range if 56251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// there is no corresponding MediaError status code. 57251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Use the statusFromOMXError(int32_t omxError) function. 58251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 59251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Currently this is a direct map. 60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// See frameworks/native/include/media/openmax/OMX_Core.h 61251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 62251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Vendor OMX errors from 0x90000000 - 0x9000FFFF 63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Extension OMX errors from 0x8F000000 - 0x90000000 64251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Standard OMX errors from 0x80001000 - 0x80001024 (0x80001024 current) 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 66251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 67251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// returns true if err is a recognized OMX error code. 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// as OMX error is OMX_S32, this is an int32_t type 69251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline bool isOMXError(int32_t err) { 70251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return (ERROR_CODEC_MIN <= err && err <= ERROR_CODEC_MAX); 71251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 72251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 73251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// converts an OMX error to a status_t 74251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t statusFromOMXError(int32_t omxError) { 75251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (omxError) { 76251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorInvalidComponentName: 77251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorComponentNotFound: 78251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return NAME_NOT_FOUND; // can trigger illegal argument error for provided names. 79251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 80251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return isOMXError(omxError) ? omxError : 0; // no translation required 81251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 82251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 83251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 84251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// checks and converts status_t to a non-side-effect status_t 85251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t makeNoSideEffectStatus(status_t err) { 86251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (err) { 87251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // the following errors have side effects and may come 88251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // from other code modules. Remap for safety reasons. 89251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case INVALID_OPERATION: 90251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case DEAD_OBJECT: 91251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return UNKNOWN_ERROR; 92251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 93251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return err; 94251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 95251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 96251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 97f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 118609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 131609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 137609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 205784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 214ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 215ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 216ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 217ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 218ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 219ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 220ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 221ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 222ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 223ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 224ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 225ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 226ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 227ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 228ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 229ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 230ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 231ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 237c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 241c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 243ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 244ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 251c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 252c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 253c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 254c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 255c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 256c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 257c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 258c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 259c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 260c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 263c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 264c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 265c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 266c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 268c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 269c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 304054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 312349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 313349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 322349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 323349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 405afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 406609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 408c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 409308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 4109806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 41154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 4129806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 4139806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 414e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees(0), 4159806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 416054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 417054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 418054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 419a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 42094ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 4212c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 4222c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 423609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 424ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mCreateInputBuffersSuspended(false), 425ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled(false) { 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 427c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 440dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 445f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 448f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setTarget(id()); 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 458a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 459a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 460a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 461a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 462a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 463a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4645778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4705778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setTarget(id()); 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatCreateInputSurface, id()))->post(); 4787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 4817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden (new AMessage(kWhatSignalEndOfInputStream, id()))->post(); 4827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4845778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage(kWhatStart, id()))->post(); 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 488f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 4897a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatFlush, id()))->post(); 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 493f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatResume, id()))->post(); 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 497c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 498c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatShutdown, id()); 499c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 500c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 50130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar if (!keepComponentAllocated) { 50230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // ensure shutdown completes in 3 seconds 50330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar (new AMessage(kWhatReleaseCodecInstance, id()))->post(3000000); 50430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 507496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 508496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 509496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 510496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5114dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 5124dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 5134dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 5144dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 5154dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 5164dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 5174dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 5184dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 5194dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, id()))->post(); 5204dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 5214dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 5224dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 531054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 532054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 533054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 534054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 535054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 545609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 557ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 558ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 560afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 561afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 562afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 563afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 5641065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 565308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 566308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 567ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 568ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 569ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 570ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 571ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 572ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 573ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 574308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 575308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 576308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 577308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 578ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 580ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 582ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 583ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 584ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 585ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 586ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5881065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 5901065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5911065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 599d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatBuffersAllocated); 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 602eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 603eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 604eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 606eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 608eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 611eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 617054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 618054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 619054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *minUndequeuedBuffers) { 620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 63829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffers_geometry failed: %s (%d)", 639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 643e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (mRotationDegrees != 0) { 644e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang uint32_t transform = 0; 645e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang switch (mRotationDegrees) { 646e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 0: transform = 0; break; 647e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 90: transform = HAL_TRANSFORM_ROT_90; break; 648e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 180: transform = HAL_TRANSFORM_ROT_180; break; 649e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 270: transform = HAL_TRANSFORM_ROT_270; break; 650e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang default: transform = 0; break; 651e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 652e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 653e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (transform > 0) { 654e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang err = native_window_set_buffers_transform( 655e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mNativeWindow.get(), transform); 656e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (err != 0) { 657e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang ALOGE("native_window_set_buffers_transform failed: %s (%d)", 658e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang strerror(-err), -err); 659e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang return err; 660e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 661e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 662e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 663e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 6653c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis OMX_U32 usage = 0; 6663c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 6673c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis if (err != 0) { 6685ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("querying usage flags from OMX IL component failed: %d", err); 6693c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis // XXX: Currently this error is logged, but not fatal. 6703c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage = 0; 6713c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis } 6725a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar int omxUsage = usage; 6733c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis 6741713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (mFlags & kFlagIsGrallocUsageProtected) { 675bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber usage |= GRALLOC_USAGE_PROTECTED; 676bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 677bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 678bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Make sure to check whether either Stagefright or the video decoder 679bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // requested protected buffers. 680bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (usage & GRALLOC_USAGE_PROTECTED) { 681bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Verify that the ANativeWindow sends images directly to 682bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // SurfaceFlinger. 683bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int queuesToNativeWindow = 0; 684bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query( 685bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 686bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber &queuesToNativeWindow); 687bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != 0) { 688bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error authenticating native window: %d", err); 689bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 690bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 691bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (queuesToNativeWindow != 1) { 692bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("native window could not be authenticated"); 693bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return PERMISSION_DENIED; 694bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 695bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 696bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 6975a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar int consumerUsage = 0; 6985a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar err = mNativeWindow->query( 6995a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mNativeWindow.get(), NATIVE_WINDOW_CONSUMER_USAGE_BITS, 7005a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar &consumerUsage); 7015a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (err != 0) { 7025a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGW("failed to get consumer usage bits. ignoring"); 7035a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar err = 0; 7045a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 7055a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 7065a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec) + %#x(Consumer) = %#x", 7075a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar omxUsage, usage, consumerUsage, usage | consumerUsage); 7085a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar usage |= consumerUsage; 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 7113c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 71429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 718ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // Exits here for tunneled video playback codecs -- i.e. skips native window 719ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // buffer allocation step as this is managed by the tunneled OMX omponent 720ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // itself and explicitly sets def.nBufferCountActual to 0. 721ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 722ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Tunneled Playback: skipping native window buffer allocation."); 723ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad def.nBufferCountActual = 0; 724ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad err = mOMX->setParameter( 725ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 726ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 727ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *minUndequeuedBuffers = 0; 728ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferCount = 0; 729ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferSize = 0; 730ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return err; 731ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 732ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 733054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 734258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 735258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 736054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 737258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 738258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 73929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 740258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 741258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 742258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 743258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 744e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 745e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 7461faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 7471faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 748e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 749e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 750e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 751e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 752e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 753e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 754e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 7551faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 7561faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 757e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 758e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 759258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 760258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 761258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 762258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 763e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 764e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 765e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 766e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 767e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 768609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 769e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 770e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 771e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 772258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 773258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 774258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 775258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 78029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 785054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 786054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 787054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 788054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 789054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 790054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 791054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 792054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 793054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 794054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 795054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 796e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 797054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 798609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 800054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 803054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 8048ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 8051e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 80729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 81274006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 81374006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 814054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 81574006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 81674006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 81774006804065941841883c4b46ee785070164023fJamie Gennis 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 822609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 82374006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 82774006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 82874006804065941841883c4b46ee785070164023fJamie Gennis 829609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 84174006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 843054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 844054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 845054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 8503fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia status_t error = cancelBufferToNativeWindow(info); 8513fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia if (err == 0) { 8523fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia err = error; 8533fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia } 854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 859054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 860054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 861054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 862054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 863054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 864054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 865e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 866054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 867609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 868054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 869054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 870054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 871054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 872054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 873054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 874054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 875054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 876054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 877054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 882054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 883054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 884054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 886054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 887054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 888054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 889054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 890054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 891609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 892054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 893054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 894054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 895054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 896054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 897054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 898054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 899054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 900054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 901054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 902054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 903054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 904054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 905054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 906054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 907054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 908609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 909054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 910054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 911054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 912054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 913054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 914054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 915054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 916054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 917054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 918054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 922609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 9261e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9283fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia ALOGW_IF(err != 0, "[%s] can not return buffer %u to native window", 9293fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia mComponentName.c_str(), info->mBufferID); 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9333fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia return err; 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 936f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 9378ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 9381e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 939054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 940ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 941ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 942ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGW("dequeueBufferFromNativeWindow() should not be called in tunnel" 943ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad " video playback mode mode!"); 944ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return NULL; 945ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 946ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 9471e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 94829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 949c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 950c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 952054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 957054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 958054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 966054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 968054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 969054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 970054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 971054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 972054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 973054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 974054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 975054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 976054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 977054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 978054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 979054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 980054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 981054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 982054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 983d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 984d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 985d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 987d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 988d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 989d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 990d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 991d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 992d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 993054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest - &mBuffers[kPortIndexOutput][0], 994054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 995d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 996d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 997054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 998054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1016349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10212ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 10222ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 10232ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 10242ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 10403fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia cancelBufferToNativeWindow(info); 1041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 1048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1052f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 1073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 1074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 1075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 1076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 1077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 1080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 1081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 10822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 10832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 10842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 10852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 1091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 1092729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 1093729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1094bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 1095bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 1096c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1097c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1098c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1099c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 11022472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, 11032472b1c0d63454e5d90a982bd6c555de6c3127bdRachad "video_decoder.hevc", "video_encoder.hevc" }, 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 110894705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 110994705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 111094705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 111194705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 1112ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 1113ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 11142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 11152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1116ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1117ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1118774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1119774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 112097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 112197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 11228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { MEDIA_MIMETYPE_AUDIO_EAC3, 11238a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad "audio_decoder.eac3", "audio_encoder.eac3" }, 1124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 11585ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1175e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 11764e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> outputFormat = mNotify->dup(); // will use this for kWhatOutputFormatChanged 1177e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 11872f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 11882f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 11892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1195d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1197d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1200308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1201308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1202d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1203308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1204308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1205308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1207308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 12083a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 12093a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 12103a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 12113a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 12123a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 12133a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 12143a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 12153a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 12163a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12173a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 12183a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 12193a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 12203a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 12213a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12223a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 12233a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 12243a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12253a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12263a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 12273a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 12283a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 12293a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12303a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 12313a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12323a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12333a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1234308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1235308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1236308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1237308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 1238308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1239308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1240308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1241308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1242308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1243308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1244308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1245308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1246308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1247308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1248308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1249308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1250308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1251308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1252a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1253a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1254a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1255a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1256a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1257a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 125894ee4b708acfa941581160b267afb79192b1d816Chong Zhang 125994ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 12602c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 12612c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 12622c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 12632c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 12642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 126594ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 126672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 126772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 126872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 126972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 127072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 127172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1272308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1273308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 12743a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // NOTE: we only use native window for video decoders 1275054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 12760d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool haveNativeWindow = msg->findObject("native-window", &obj) 12773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar && obj != NULL && video && !encoder; 1278054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1279e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1280e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 12811713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang 12821713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang int32_t usageProtected; 12831713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (msg->findInt32("protected", &usageProtected) && usageProtected) { 12841713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (!haveNativeWindow) { 12851713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang ALOGE("protected output buffers must be sent to an ANativeWindow"); 12861713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang return PERMISSION_DENIED; 12871713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 12881713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagIsGrallocUsageProtected; 12891713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 12901713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 1291e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 12923a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 12935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<NativeWindowWrapper> windowWrapper( 12945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad static_cast<NativeWindowWrapper *>(obj.get())); 12955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<ANativeWindow> nativeWindow = windowWrapper->getNativeWindow(); 12965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 12976597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // START of temporary support for automatic FRC - THIS WILL BE REMOVED 12986597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar int32_t autoFrc; 12996597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (msg->findInt32("auto-frc", &autoFrc)) { 13006597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar bool enabled = autoFrc; 13016597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar OMX_CONFIG_BOOLEANTYPE config; 13026597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar InitOMXParams(&config); 13036597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar config.bEnabled = (OMX_BOOL)enabled; 13046597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar status_t temp = mOMX->setConfig( 13056597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar mNode, (OMX_INDEXTYPE)OMX_IndexConfigAutoFramerateConversion, 13066597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar &config, sizeof(config)); 13076597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (temp == OK) { 13086597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar outputFormat->setInt32("auto-frc", enabled); 13096597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } else if (enabled) { 13106597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar ALOGI("codec does not support requested auto-frc (err %d)", temp); 13116597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 13126597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 13136597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // END of temporary support for automatic FRC 13146597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar 13155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t tunneled; 13165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("feature-tunneled-playback", &tunneled) && 13175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunneled != 0) { 13185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGI("Configuring TUNNELED video playback."); 1319ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = true; 13205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 132197827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync = 0; 132297827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad if (!msg->findInt32("audio-hw-sync", &audioHwSync)) { 13235a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW("No Audio HW Sync provided for video tunnel"); 13245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 13255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = configureTunneledVideoPlayback(audioHwSync, nativeWindow); 13265a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 132797827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad ALOGE("configureTunneledVideoPlayback(%d,%p) failed!", 13285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad audioHwSync, nativeWindow.get()); 13295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 1330fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1331fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1332d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad int32_t maxWidth = 0, maxHeight = 0; 1333d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (msg->findInt32("max-width", &maxWidth) && 1334d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad msg->findInt32("max-height", &maxHeight)) { 1335d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad 1336d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad err = mOMX->prepareForAdaptivePlayback( 1337d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, maxHeight); 1338d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (err != OK) { 1339d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad ALOGW("[%s] prepareForAdaptivePlayback failed w/ err %d", 1340d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mComponentName.c_str(), err); 13413a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // allow failure 13423a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = OK; 1343d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } else { 1344d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-width", maxWidth); 1345d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-height", maxHeight); 1346d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("adaptive-playback", true); 1347d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 1348d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 13495a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 1350ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Configuring CPU controlled video playback."); 1351ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = false; 1352ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 13533fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // Explicity reset the sideband handle of the window for 13543fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // non-tunneled video in case the window was previously used 13553fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // for a tunneled video playback. 13563fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad err = native_window_set_sideband_stream(nativeWindow.get(), NULL); 13573fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad if (err != OK) { 13583fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad ALOGE("set_sideband_stream(NULL) failed! (err %d).", err); 13593fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad return err; 13603fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad } 13613fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad 13625a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // Always try to enable dynamic output buffers on native surface 13635a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->storeMetaDataInBuffers( 13645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE); 13655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 13665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1367fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 13695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // if adaptive playback has been requested, try JB fallback 13705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 13715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // LARGE MEMORY REQUIREMENT 13725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // we will not do adaptive playback on software accessed 13745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // surfaces as they never had to respond to changes in the 13755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // crop window, and we don't trust that they will be able to. 13765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int usageBits = 0; 13775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad bool canDoAdaptivePlayback; 13785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (nativeWindow->query( 13805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad nativeWindow.get(), 13815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad NATIVE_WINDOW_CONSUMER_USAGE_BITS, 13825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad &usageBits) != OK) { 13835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = false; 13845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 13855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = 13865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (usageBits & 13875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (GRALLOC_USAGE_SW_READ_MASK | 13885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 13895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 13905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t maxWidth = 0, maxHeight = 0; 13925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (canDoAdaptivePlayback && 13935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-width", &maxWidth) && 13945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-height", &maxHeight)) { 13955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 13965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), maxWidth, maxHeight); 13975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->prepareForAdaptivePlayback( 13995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, 14005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad maxHeight); 14015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW_IF(err != OK, 14025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "[%s] prepareForAdaptivePlayback failed w/ err %d", 14035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), err); 14045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err == OK) { 14065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-width", maxWidth); 14075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-height", maxHeight); 14085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 14095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 1410e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 14115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // allow failure 14125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OK; 14135a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 14145a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] storeMetaDataInBuffers succeeded", 14155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str()); 14165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mStoreMetaDataInOutputBuffers = true; 14175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 1418fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 14190167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 14205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t push; 14215a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 14225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad && push != 0) { 14235a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 14245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14250167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1426e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 1427e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang int32_t rotationDegrees; 1428e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (msg->findInt32("rotation-degrees", &rotationDegrees)) { 1429e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = rotationDegrees; 1430e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } else { 1431e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = 0; 1432e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 1433054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1434054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1435308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 14363a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // determine need for software renderer 14373a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar bool usingSwRenderer = false; 14383a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { 14393a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 14403a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 14413a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14423a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 14460d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setupVideoDecoder(mime, msg, haveNativeWindow); 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14483a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14493a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err != OK) { 14503a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar return err; 14513a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14523a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14533a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 14543a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar sp<NativeWindowWrapper> nativeWindow( 14553a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar static_cast<NativeWindowWrapper *>(obj.get())); 14563a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(nativeWindow != NULL); 14573a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow = nativeWindow->getNativeWindow(); 14583a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14593a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar native_window_set_scaling_mode( 14603a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.get(), NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 14613a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14623a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14633a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // initialize native window now to get actual output format 14643a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: this is needed for some encoders even though they don't use native window 14653a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ((status_t)OK, initNativeWindow()); 14663a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14673a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback for devices that do not handle flex-YUV for native buffers 14683a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 14693a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t requestedColorFormat = OMX_COLOR_FormatUnused; 14703a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (msg->findInt32("color-format", &requestedColorFormat) && 14713a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar requestedColorFormat == OMX_COLOR_FormatYUV420Flexible) { 14723a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 14733a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t colorFormat = OMX_COLOR_FormatUnused; 14743a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar OMX_U32 flexibleEquivalent = OMX_COLOR_FormatUnused; 14753a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(outputFormat->findInt32("color-format", &colorFormat)); 14763a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGD("[%s] Requested output format %#x and got %#x.", 14773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mComponentName.c_str(), requestedColorFormat, colorFormat); 14783a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (!isFlexibleColorFormat( 14793a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mOMX, mNode, colorFormat, haveNativeWindow, &flexibleEquivalent) 14803a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar || flexibleEquivalent != (OMX_U32)requestedColorFormat) { 14813a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // device did not handle flex-YUV request for native window, fall back 14823a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // to SW renderer 14833a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGI("[%s] Falling back to software renderer", mComponentName.c_str()); 14843a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.clear(); 14853a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 14863a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 14873a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mStoreMetaDataInOutputBuffers) { 14883a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_FALSE); 14893a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mStoreMetaDataInOutputBuffers = false; 14903a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: implement adaptive-playback support for bytebuffer mode. 14913a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // This is done by SW codecs, but most HW codecs don't support it. 14923a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar inputFormat->setInt32("adaptive-playback", false); 14933a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14943a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err == OK) { 14953a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 14963a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14973a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 14983a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback is not supported for protected playback 14993a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = PERMISSION_DENIED; 15003a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } else if (err == OK) { 15013a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = setupVideoDecoder(mime, msg, false); 15023a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15033a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15043a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15053a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15063a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15073a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (usingSwRenderer) { 15083a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar outputFormat->setInt32("using-sw-renderer", 1); 15093a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 151042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 151142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 151242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 151342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 151442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 151542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 151642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 151742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 151842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 151942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 152042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 152142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 152242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1529aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1530b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi int32_t sbrMode; 15318045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount; 15322965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable; 15338045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drcParams_t drc; 1534ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1535ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1536ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1537aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1538aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1539aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1540b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi if (!msg->findInt32("aac-sbr-mode", &sbrMode)) { 1541b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi sbrMode = -1; 1542b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1543ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 15448045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-max-output-channel_count", &maxOutputChannelCount)) { 15458045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi maxOutputChannelCount = -1; 15468045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15472965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang if (!msg->findInt32("aac-pcm-limiter-enable", &pcmLimiterEnable)) { 15482965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang // value is unknown 15492965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable = -1; 15502965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang } 15518045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-encoded-target-level", &drc.encodedTargetLevel)) { 15528045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15538045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.encodedTargetLevel = -1; 15548045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15558045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-cut-level", &drc.drcCut)) { 15568045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcCut = -1; 15588045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15598045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-boost-level", &drc.drcBoost)) { 15608045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15618045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcBoost = -1; 15628045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15638045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-heavy-compression", &drc.heavyCompression)) { 15648045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15658045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.heavyCompression = -1; 15668045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15678045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-target-ref-level", &drc.targetRefLevel)) { 15688045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15698045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.targetRefLevel = -1; 15708045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15718045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 1572ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 15734471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 15742965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang isADTS != 0, sbrMode, maxOutputChannelCount, drc, 15752965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable); 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1577729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1579729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1581729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1582729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1583729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1584729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1585729de186450f78c099637e1fce743fe531862c52Andreas Huber 1586729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupG711Codec(encoder, numChannels); 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15922f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 15932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi int32_t numChannels, sampleRate, compressionLevel = -1; 15942f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 15952f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 15962f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 15972f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 15982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 15992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 16002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1601516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1602cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar "complexity", &compressionLevel) && 1603cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar !msg->findInt32( 1604516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 1605cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar compressionLevel = 5; // default FLAC compression level 16062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1607516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1608516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1609516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 16102f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 16112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1613516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1614516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 16152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 16162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 16172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1618516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1619516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 16202f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1621ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1622ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1623ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1624ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1625ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1626ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1627ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1628ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1629ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 163097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 163197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 163297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 163397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 163497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 163597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 163697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 163797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 163897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 16398a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_EAC3)) { 16408a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t numChannels; 16418a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t sampleRate; 16428a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (!msg->findInt32("channel-count", &numChannels) 16438a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad || !msg->findInt32("sample-rate", &sampleRate)) { 16448a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = INVALID_OPERATION; 16458a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else { 16468a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = setupEAC3Codec(encoder, numChannels, sampleRate); 16478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1649729de186450f78c099637e1fce743fe531862c52Andreas Huber 16504471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 16514471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 16524471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 16534471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 16548b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 16558b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 16568b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 16579806555d3930be43e11106281dee354820ac1c88Andreas Huber 16588b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 16598b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 16608b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 16618b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 16629806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 16639806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 16649806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 16659806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 16669806555d3930be43e11106281dee354820ac1c88Andreas Huber } 16679806555d3930be43e11106281dee354820ac1c88Andreas Huber 1668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 16705778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 16725778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 16745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16754e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mBaseOutputFormat = outputFormat; 16764e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar 1677e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1678e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1679e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1680e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1681e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1685f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17225778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 17235778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 17245778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 17255778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 17265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17275778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 17285778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 17295778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 17305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17315778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 17325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 17335778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 17345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1749aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 17508045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode, 17512965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t maxOutputChannelCount, const drcParams_t& drc, 17522965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable) { 1753ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1754ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1755ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1756ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 17745778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17775778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 17785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 17795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17845778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 17855778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 17865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 17885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 17895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17945778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 17955778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 17965778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 18065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18115778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 18125778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 18165778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1817aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 18185778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 1819b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi switch (sbrMode) { 1820b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 0: 1821b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // disable sbr 1822b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1823b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1824b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1825b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 1: 1826b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable single-rate sbr 1827b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1828b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1829b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1830b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 2: 1831b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable dual-rate sbr 1832b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1833b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1834b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1835b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case -1: 1836b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable both modes -> the codec will decide which mode should be used 1837b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1838b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1839b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1840b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi default: 1841b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // unsupported sbr mode 1842b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi return BAD_VALUE; 1843b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1844b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi 18455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18465778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 18475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 18485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 1857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 1858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18605778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 1869ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1870ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 1871ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 1872ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 1873ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18758045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi OMX_AUDIO_PARAM_ANDROID_AACPRESENTATIONTYPE presentation; 18768045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nMaxOutputChannels = maxOutputChannelCount; 18778045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcCut = drc.drcCut; 18788045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcBoost = drc.drcBoost; 18798045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nHeavyCompression = drc.heavyCompression; 18808045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nTargetReferenceLevel = drc.targetRefLevel; 18818045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nEncodedTargetLevel = drc.encodedTargetLevel; 18822965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang presentation.nPCMLimiterEnable = pcmLimiterEnable; 18838045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 18848045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi status_t res = mOMX->setParameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 18858045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (res == OK) { 18868045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // optional parameters, will not cause configuration failure 18878045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi mOMX->setParameter(mNode, (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacPresentation, 18888045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi &presentation, sizeof(presentation)); 18898045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } else { 18908045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi ALOGW("did not set AudioAndroidAacPresentation due to error %d when setting AudioAac", res); 18918045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 18928045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi return res; 18935778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 189697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 189797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 189897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 189997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 190097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 190197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 190297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 190397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 190497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 190597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 190697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 190797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 190897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 190997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 191097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 191197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 191297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 191397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 191497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 191597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 191697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 191797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 191897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 191997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 192097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 192197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 192297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 192397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 192497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 192597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 192697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 192797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 192897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 192997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 193097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 193197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 193297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 19338a4728966dc9c78e21c3c93a927707e93c05e5e0Rachadstatus_t ACodec::setupEAC3Codec( 19348a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad bool encoder, int32_t numChannels, int32_t sampleRate) { 19358a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad status_t err = setupRawAudioFormat( 19368a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 19378a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19388a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 19398a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 19408a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19418a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19428a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (encoder) { 19438a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ALOGW("EAC3 encoding is not supported."); 19448a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return INVALID_OPERATION; 19458a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19468a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE def; 19488a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(&def); 19498a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nPortIndex = kPortIndexInput; 19508a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19518a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = mOMX->getParameter( 19528a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 19538a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 19548a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 19558a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 19568a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19578a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 19588a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 19598a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19608a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19618a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nChannels = numChannels; 19628a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nSampleRate = sampleRate; 19638a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19648a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return mOMX->setParameter( 19658a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 19668a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 19678a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 19688a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 19698a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad} 19708a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 19725778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 19735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 19745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 19755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 19765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 19775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 19785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 19795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 19805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 19815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 19825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 19835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 19845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 19855778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 19865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 19875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 19885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 19895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 19905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19925778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 19935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 19945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 19955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 19965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 19975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 19985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 19995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 20005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 20015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 20025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 20035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 20045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 20055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 20065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 20075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 20085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 20095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20165778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 2017729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 2018729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 20195778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 2020729de186450f78c099637e1fce743fe531862c52Andreas Huber 2021729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 2022729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2023729de186450f78c099637e1fce743fe531862c52Andreas Huber 2024729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2025729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2026729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2027729de186450f78c099637e1fce743fe531862c52Andreas Huber 2028729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 20295778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 20305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20315778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2033729de186450f78c099637e1fce743fe531862c52Andreas Huber 20345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2037729de186450f78c099637e1fce743fe531862c52Andreas Huber 20385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 20395778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 20405778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 20415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 2042729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2043729de186450f78c099637e1fce743fe531862c52Andreas Huber 20445778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { 20455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 20465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2047729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 2048729de186450f78c099637e1fce743fe531862c52Andreas Huber kPortIndexInput, 8000 /* sampleRate */, numChannels); 2049729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2050729de186450f78c099637e1fce743fe531862c52Andreas Huber 20512f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 20522f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 20532f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 20542f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 20552f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 20562f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 20572f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 20582f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 20592f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 20602f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 20612f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 20622f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 20632f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 20642f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 20652f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 20662f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 20672f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 20682f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 20692f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 20702f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 20712f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 20722f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 20732f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 20742f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 20752f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 20762f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 20772f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 20782f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 2079729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 2080729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 2081729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2082729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 2083729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 2084729de186450f78c099637e1fce743fe531862c52Andreas Huber 2085729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 2086729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2087729de186450f78c099637e1fce743fe531862c52Andreas Huber 2088729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2089729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2090729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2091729de186450f78c099637e1fce743fe531862c52Andreas Huber 2092729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 2093729de186450f78c099637e1fce743fe531862c52Andreas Huber 2094729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 2095729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2096729de186450f78c099637e1fce743fe531862c52Andreas Huber 2097729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2098729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2099729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2100729de186450f78c099637e1fce743fe531862c52Andreas Huber 2101729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 2102729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 2103729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 2104729de186450f78c099637e1fce743fe531862c52Andreas Huber 2105729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 2106729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2107729de186450f78c099637e1fce743fe531862c52Andreas Huber 2108729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2109729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2110729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2111729de186450f78c099637e1fce743fe531862c52Andreas Huber 2112729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 2113729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 2114729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 2115729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 2116729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 2117729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 2118729de186450f78c099637e1fce743fe531862c52Andreas Huber 2119c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 2120c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 2121729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2122729de186450f78c099637e1fce743fe531862c52Andreas Huber 2123729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 2124729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2125729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2126729de186450f78c099637e1fce743fe531862c52Andreas Huber 21275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t ACodec::configureTunneledVideoPlayback( 212897827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync, const sp<ANativeWindow> &nativeWindow) { 21295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t* sidebandHandle; 21305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad status_t err = mOMX->configureVideoTunnelMode( 21325a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, audioHwSync, &sidebandHandle); 21335a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 21345a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureVideoTunnelMode failed! (err %d).", err); 21355a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 21365a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 21375a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21385a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle); 21395a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 21405a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", 21415a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sidebandHandle, err); 21425a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 21435a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 21445a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21455a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return OK; 21465a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 21475a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 2148f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 2149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 21510d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat, 21520d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool usingNativeBuffers) { 2153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 2154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 2156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 2157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 2158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 2160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 2161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 2162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2170229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // substitute back flexible color format to codec supported format 2171229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_U32 flexibleEquivalent; 21720d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (compressionFormat == OMX_VIDEO_CodingUnused 21730d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 21740d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, usingNativeBuffers, &flexibleEquivalent) 21750d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && colorFormat == flexibleEquivalent) { 2176229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar ALOGI("[%s] using color format %#x in place of %#x", 2177229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mComponentName.c_str(), format.eColorFormat, colorFormat); 2178229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat = format.eColorFormat; 2179229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 2180229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 2181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 2182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 2183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 2185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 2186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 2187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 2188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 2192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 2193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 2194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 2200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 2201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 2206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 2209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 2210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 2213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22190d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Set optimal output format. OMX component lists output formats in the order 22200d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// of preference, but this got more complicated since the introduction of flexible 22210d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// YUV formats. We support a legacy behavior for applications that do not use 22220d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// surface output, do not specify an output format, but expect a "usable" standard 22230d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// OMX format. SW readable and standard formats must be flex-YUV. 22240d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 22250d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Suggested preference order: 22260d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal format for texture rendering (mediaplayer behavior) 22270d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable & texture renderable format (flex-YUV support) 22280d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable non-renderable format (flex-YUV bytebuffer support) 22290d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - legacy "usable" standard formats 22300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 22310d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// For legacy support, we prefer a standard format, but will settle for a SW readable 22320d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// flex-YUV format. 22330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnarstatus_t ACodec::setSupportedOutputFormat(bool getLegacyFlexibleFormat) { 22340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE format, legacyFormat; 2235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 2237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&legacyFormat); 22390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // this field will change when we find a suitable legacy format 22400d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar legacyFormat.eColorFormat = OMX_COLOR_FormatUnused; 2241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22420d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar for (OMX_U32 index = 0; ; ++index) { 22430d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar format.nIndex = index; 22440d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar status_t err = mOMX->getParameter( 22450d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mNode, OMX_IndexParamVideoPortFormat, 22460d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &format, sizeof(format)); 22470d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (err != OK) { 22480d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // no more formats, pick legacy format if found 22490d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat != OMX_COLOR_FormatUnused) { 22500d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&format, &legacyFormat, sizeof(format)); 22510d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22520d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22530d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return err; 22540d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22550d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eCompressionFormat != OMX_VIDEO_CodingUnused) { 22560d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return OMX_ErrorBadParameter; 22570d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22580d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (!getLegacyFlexibleFormat) { 22590d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22600d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22610d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // standard formats that were exposed to users before 22620d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eColorFormat == OMX_COLOR_FormatYUV420Planar 22630d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar 22640d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 22650d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar 22660d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar) { 22670d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22680d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22690d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // find best legacy non-standard format 22700d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_U32 flexibleEquivalent; 22710d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat == OMX_COLOR_FormatUnused 22720d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 22730d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, false /* usingNativeBuffers */, 22740d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &flexibleEquivalent) 22750d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && flexibleEquivalent == OMX_COLOR_FormatYUV420Flexible) { 22760d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&legacyFormat, &format, sizeof(format)); 22770d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22780d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 2279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 2280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2284e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 2285e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 2286e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 2287e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 2288e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 22892472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, OMX_VIDEO_CodingHEVC }, 2290e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 2291e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 2292e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 229394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 229494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 2295e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 2296e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 22975778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 22985778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 2299e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2300e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2301e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2302e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 2303e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 2304e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2305e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2308e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 2309e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2310e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 2311e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2312e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2313e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 2314e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 2315e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2316e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2317e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2318e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 2319e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 2320e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2321e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2322e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2323e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2324e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 2325e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2326e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 23275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 23285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 23300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar const char *mime, const sp<AMessage> &msg, bool haveNativeWindow) { 233189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t width, height; 233289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (!msg->findInt32("width", &width) 233389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar || !msg->findInt32("height", &height)) { 233489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar return INVALID_OPERATION; 233589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 233689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar 23375778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 23385778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 23395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23445778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 2345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 2346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 235189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t tmp; 235289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (msg->findInt32("color-format", &tmp)) { 235389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat = 235489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar static_cast<OMX_COLOR_FORMATTYPE>(tmp); 235589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setVideoPortFormatType( 23560d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar kPortIndexOutput, OMX_VIDEO_CodingUnused, colorFormat, haveNativeWindow); 235789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (err != OK) { 235889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar ALOGW("[%s] does not support color format %d", 235989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar mComponentName.c_str(), colorFormat); 23600d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 236189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 236289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } else { 23630d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 236489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 2365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t frameRateInt; 237178b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRateFloat; 237278b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findFloat("frame-rate", &frameRateFloat)) { 237378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findInt32("frame-rate", &frameRateInt)) { 237478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateInt = -1; 237578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 237678b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateFloat = (float)frameRateInt; 237778b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 237878b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad 2379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 238078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad kPortIndexInput, width, height, compressionFormat, frameRateFloat); 2381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 2388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23965778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 23975778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 23985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 23995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24025778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 24035778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 24045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24055778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 24065778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 24075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 24105778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 24115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24155778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 24165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24175778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 24185778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 24195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24205778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 24215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24225778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 24235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24245778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 24255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 24265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24315778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 24325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 24335778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 24345778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 24355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24385778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 24395778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 24405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24415778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 24425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 24435778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 24445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24465778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 24475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 24495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 24505778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 24515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24535778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 24545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24555778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 24565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24575778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 24585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 24595778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 24605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 24615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24635778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 24642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 24655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24675778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 24685778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 2469a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // this is redundant as it was already set up in setVideoPortFormatType 2470a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // FIXME for now skip this only for flexible YUV formats 2471a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar if (colorFormat != OMX_COLOR_FormatYUV420Flexible) { 2472a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar video_def->eColorFormat = colorFormat; 2473a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar } 24745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 24765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 24775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24795778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 24805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 24815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24825778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24855778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 24865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24875778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 24885778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 24895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24945778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 24955778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 24965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24985778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 24995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 25005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25045778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 25055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25065778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 25075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25135778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 25145778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 25155778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 25165778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 25175778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 25185778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 25195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25205778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 25215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25245778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 25255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 25265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25305778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 25315778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 25325778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 25335778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25355778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 25365778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 25375778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25395778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 25405778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 25415778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2543c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad case OMX_VIDEO_CodingHEVC: 2544c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = setupHEVCEncoderParameters(msg); 2545c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad break; 2546c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 254789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 254889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 254989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 255089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 255189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 25525778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 25535778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25565778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 25575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 25605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25610dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 25620dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 25630dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 25640dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 25650dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25660dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 25670dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25680dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 25690dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 25700dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 25710dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 25720dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 25730dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25740dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 25750dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25760dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 25780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 25790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 25800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 25810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 25820dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25830dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 25840dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25850dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 25860dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 25870dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 25880dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25890dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 25900dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 25910dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25920dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 25930dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 25940dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 25950dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 25960dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 25970dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25985778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 25995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 26005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 26015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 26025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 26035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26045778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 26055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 26065778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 26075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 260896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 260996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 261096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 261196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 261296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 261396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 261496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 261596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 261696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 26175778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 26185778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 26195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 26205778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 26215778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 262496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 262596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 26265778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 26275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 26285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 26295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 26305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26325778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 26335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26355778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 26365778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 26375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 26385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26395778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 26405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 26415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 26475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 26485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 26495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 26515778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 26525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 26545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 26555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 26565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26575778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 26585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 26595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 26605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 26615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 26625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 26635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 26645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26655778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 26665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 26675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 26685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 26695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26725778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 26735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 26795778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 26805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 26835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 26845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 268996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 26905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 26965778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 26975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26985778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 26995778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 27005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 27015778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 27025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 270596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 270696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27075778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 27085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 27095778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 27105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 27115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27135778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 27145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27165778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 27175778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 27185778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 27195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27205778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 27215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 27225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27275778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 27285778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 27295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27305778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 27315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 27325778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 27335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27345778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 27355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27365778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 27375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 27385778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 27395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 27405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27435778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 27445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27495778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 27505778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 27515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27535778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 27545778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 27555778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 27565778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 27575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27585778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 27595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 27605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 276596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 27665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 27725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2774a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar// static 2775a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnarint /* OMX_VIDEO_AVCLEVELTYPE */ ACodec::getAVCLevelFor( 2776a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int width, int height, int rate, int bitrate, 2777a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar OMX_VIDEO_AVCPROFILETYPE profile) { 2778a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert bitrate to main/baseline profile kbps equivalent 2779a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar switch (profile) { 2780a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh10: 2781a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 3000); break; 2782a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh: 2783a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1250); break; 2784a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar default: 2785a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1000); break; 2786a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2787a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2788a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert size and rate to MBs 2789a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar width = divUp(width, 16); 2790a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar height = divUp(height, 16); 2791a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int mbs = width * height; 2792a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar rate *= mbs; 2793a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int maxDimension = max(width, height); 2794a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2795a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar static const int limits[][5] = { 2796a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar /* MBps MB dim bitrate level */ 2797a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 64, OMX_VIDEO_AVCLevel1 }, 2798a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 128, OMX_VIDEO_AVCLevel1b }, 2799a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 3000, 396, 56, 192, OMX_VIDEO_AVCLevel11 }, 2800a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 6000, 396, 56, 384, OMX_VIDEO_AVCLevel12 }, 2801a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 768, OMX_VIDEO_AVCLevel13 }, 2802a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 2000, OMX_VIDEO_AVCLevel2 }, 2803a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 19800, 792, 79, 4000, OMX_VIDEO_AVCLevel21 }, 2804a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 20250, 1620, 113, 4000, OMX_VIDEO_AVCLevel22 }, 2805a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 40500, 1620, 113, 10000, OMX_VIDEO_AVCLevel3 }, 2806a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 108000, 3600, 169, 14000, OMX_VIDEO_AVCLevel31 }, 2807a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 216000, 5120, 202, 20000, OMX_VIDEO_AVCLevel32 }, 2808a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 20000, OMX_VIDEO_AVCLevel4 }, 2809a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 50000, OMX_VIDEO_AVCLevel41 }, 2810a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 522240, 8704, 263, 50000, OMX_VIDEO_AVCLevel42 }, 2811a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 589824, 22080, 420, 135000, OMX_VIDEO_AVCLevel5 }, 2812a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 983040, 36864, 543, 240000, OMX_VIDEO_AVCLevel51 }, 2813a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 2073600, 36864, 543, 240000, OMX_VIDEO_AVCLevel52 }, 2814a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar }; 2815a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2816a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar for (size_t i = 0; i < ARRAY_SIZE(limits); i++) { 2817a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar const int (&limit)[5] = limits[i]; 2818a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar if (rate <= limit[0] && mbs <= limit[1] && maxDimension <= limit[2] 2819a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar && bitrate <= limit[3]) { 2820a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return limit[4]; 2821a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2822a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2823a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return 0; 2824a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar} 2825a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 28265778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 28275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 28285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 28295778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 28305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 283396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 283496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 28355778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 28365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 28375778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 28385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 28395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28415778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 28425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28440dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 28450dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 28460dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 28470dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 28480dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 28490dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 28500dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 28510dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 28520dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 28530dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 28540dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 28555778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 28565778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 28575778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 28585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28590dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 28605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 28615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28665778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 28675778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 28705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 28715778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 28725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 28735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28765778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 28775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28825778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 28835778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 28845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28865778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 28877c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 28887c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 28897c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 28905778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 28915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 28945778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 28955778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 28965778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 28975778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 28985778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 28995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 29005778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 29015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29025778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 29035778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 29045778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 29055778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 29065778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 29075778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 29085778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 29095778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 29105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 29135778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 29145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29165778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 29175778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 29185778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 29195778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 29205778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 29215778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 29225778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 29235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29245778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 29255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 29265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 293196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 29325778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 29335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2934c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachadstatus_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { 2935c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t bitrate, iFrameInterval; 2936c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("bitrate", &bitrate) 2937c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 2938c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2939c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2940c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2941c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 2942c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2943c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad float frameRate; 2944c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findFloat("frame-rate", &frameRate)) { 2945c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t tmp; 2946c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("frame-rate", &tmp)) { 2947c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2948c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2949c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad frameRate = (float)tmp; 2950c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2951c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2952c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_PARAM_HEVCTYPE hevcType; 2953c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad InitOMXParams(&hevcType); 2954c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.nPortIndex = kPortIndexOutput; 2955c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2956c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad status_t err = OK; 2957c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->getParameter( 2958c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 2959c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2960c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2961c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2962c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2963c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t profile; 2964c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (msg->findInt32("profile", &profile)) { 2965c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t level; 2966c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("level", &level)) { 2967c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2968c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2969c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2970c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = verifySupportForProfileAndLevel(profile, level); 2971c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2972c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2973c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2974c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2975c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); 2976c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); 2977c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2978c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2979c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad // TODO: Need OMX structure definition for setting iFrameInterval 2980c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2981c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->setParameter( 2982c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 2983c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2984c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2985c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2986c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2987c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return configureBitrate(bitrate, bitrateMode); 2988c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad} 2989c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 299089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 299189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 29924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 29934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 29944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 29954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 29964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 29974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 29984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 29994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 30004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 30014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 30024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 300389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 300489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 300589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 30064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 300789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 300889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 300989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 30104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 30114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 30124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 30134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 30144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 30154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 30174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 30204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 30214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 30224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 30244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 30254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 30274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 30284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 30304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 30314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 30324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 30364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 30374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 30384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 30394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 30404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 30414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 30434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 30444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 30454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 30474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 30484154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 30494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 30504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 30514154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 30524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 30554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 30564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 30574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 30604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 30614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 30624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 30634154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 30644154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30654154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 306789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 306889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 306989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 30705778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 30715778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 30725778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 30735778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 30745778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 30755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30765778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 30775778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 30785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 30795778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 30805778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 30815778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 30825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30875778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 30885778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 30895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 30915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 30925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30945778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 30955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 309696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 309796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 30985778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 30995778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 31005778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 31015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31025778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 31035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 31045778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 31055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 31075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 31085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 311096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 31115778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 31125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 31145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 31155778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 31165778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 31175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31185778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 31195778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 31205778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 31215778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 31225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31235778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 31245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 31255778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 31265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 31285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 31295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31315778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 31325778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 31335778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 31345778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 31355778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 31365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 31385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 31395778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 31405778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 31415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3142f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 3143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 314478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat, 314578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRate) { 3146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 3147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 3148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 3149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 3151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 3153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 3156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 3159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 3160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 3161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 3162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 3166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 3168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 3169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 3172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 317378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (frameRate >= 0) { 317478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 317578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 3176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 3179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 3182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3184f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 3185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 3186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 3187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 3190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 3191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3193d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 3194d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 3195d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3196d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3197d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 3198d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3199d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 3200d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 3201d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3202d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3203d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3204d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 3205d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 3206d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 32077e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 32087e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 32097e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32107e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 32117e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 32127e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32137e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 32147e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 32157e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32167e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32177e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32187e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 32197e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 32207e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32217e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 32227e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 32237e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 32247e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32257e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3226e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 32277e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 3228c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 3229c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 3230c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 3231c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 32327e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32337e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 32347e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3235f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 3236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 3237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 3239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 3241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3242609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 3243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 3244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 3245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3252f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 3253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 3254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 3255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3257f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 3258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool wasEmptyBefore = mDeferredQueue.empty(); 3259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 3260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3262f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 3263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 3264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 3265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 3267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 3268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 3269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar// static 3273229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { 327403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar MediaImage &image = params.sMediaImage; 327503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar memset(&image, 0, sizeof(image)); 327603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 327703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 327803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 0; 327903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 328003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 328103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mWidth = params.nFrameWidth; 328203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mHeight = params.nFrameHeight; 328303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 328403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // only supporting YUV420 328503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (fmt != OMX_COLOR_FormatYUV420Planar && 328603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedPlanar && 328703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420SemiPlanar && 32885a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar && 32895a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != HAL_PIXEL_FORMAT_YV12) { 329003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("do not know color format 0x%x = %d", fmt, fmt); 3291229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 329203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 329303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3294b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // TEMPORARY FIX for some vendors that advertise sliceHeight as 0 3295b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride != 0 && params.nSliceHeight == 0) { 3296b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("using sliceHeight=%u instead of what codec advertised (=0)", 3297b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nFrameHeight); 3298b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nSliceHeight = params.nFrameHeight; 3299b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3300b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 3301b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // we need stride and slice-height to be non-zero 3302b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride == 0 || params.nSliceHeight == 0) { 3303b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 3304b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar fmt, fmt, params.nStride, params.nSliceHeight); 3305b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar return false; 3306b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3307b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 330803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set-up YUV format 330903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 331003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 3; 331103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mBitDepth = 8; 331203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mOffset = 0; 331303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mColInc = 1; 331403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mRowInc = params.nStride; 331503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mHorizSubsampling = 1; 331603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mVertSubsampling = 1; 331703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 33185a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar switch ((int)fmt) { 33195a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 33205a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (params.bUsingNativeBuffers) { 33215a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t ystride = align(params.nStride, 16); 33225a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t cstride = align(params.nStride / 2, 16); 33235a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.Y].mRowInc = ystride; 33245a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33255a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mOffset = ystride * params.nSliceHeight; 33265a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mColInc = 1; 33275a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mRowInc = cstride; 33285a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 33295a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 33305a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33315a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mOffset = image.mPlane[image.V].mOffset 33325a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar + (cstride * params.nSliceHeight / 2); 33335a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mColInc = 1; 33345a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mRowInc = cstride; 33355a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 33365a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 33375a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar break; 33385a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } else { 33395a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar // fall through as YV12 is used for YUV420Planar by some codecs 33405a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 33415a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33425a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case OMX_COLOR_FormatYUV420Planar: 334303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedPlanar: 334403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 334503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 1; 334603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride / 2; 334703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 334803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 334903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 335003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 335103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar + (params.nStride * params.nSliceHeight / 4); 335203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 1; 335303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride / 2; 335403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 335503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 335603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 335703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 335803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420SemiPlanar: 335903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 336003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedSemiPlanar: 336103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // NV12 336203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 336303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 2; 336403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride; 336503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 336603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 336703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 336803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 336903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 2; 337003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride; 337103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 337203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 337303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 337403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 337503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar default: 337603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar TRESPASS(); 337703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 3378229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3379229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3380229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3381229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3382229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeColorFormat( 3383229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3384229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams &describeParams) 3385229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar{ 3386229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_INDEXTYPE describeColorFormatIndex; 3387229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (omx->getExtensionIndex( 3388229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, "OMX.google.android.index.describeColorFormat", 3389229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeColorFormatIndex) != OK || 3390229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar omx->getParameter( 3391229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, describeColorFormatIndex, 3392229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeParams, sizeof(describeParams)) != OK) { 3393229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeDefaultColorFormat(describeParams); 3394229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3395229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeParams.sMediaImage.mType != 3396229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 3397229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3398229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3399229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3400229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::isFlexibleColorFormat( 3401229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 34020d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) { 3403229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams describeParams; 3404229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar InitOMXParams(&describeParams); 3405229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3406229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // reasonable dummy values 3407229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameWidth = 128; 3408229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameHeight = 128; 3409229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nStride = 128; 3410229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nSliceHeight = 128; 34110d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = (OMX_BOOL)usingNativeBuffers; 3412229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3413229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar CHECK(flexibleEquivalent != NULL); 3414229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3415229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (!describeColorFormat(omx, node, describeParams)) { 3416229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3417229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3418229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3419229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const MediaImage &img = describeParams.sMediaImage; 3420229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) { 3421229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mNumPlanes != 3 || 3422229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mHorizSubsampling != 1 || 3423229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mVertSubsampling != 1) { 3424229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3425229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3426229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3427229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // YUV 420 3428229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mPlane[img.U].mHorizSubsampling == 2 3429229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.U].mVertSubsampling == 2 3430229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mHorizSubsampling == 2 3431229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mVertSubsampling == 2) { 3432229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // possible flexible YUV420 format 3433229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mBitDepth <= 8) { 3434229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3435229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3436229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3437229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3438229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3439229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 344003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar} 344103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3442e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 3443e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 344431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 344531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 3446e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 344731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 344831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 344931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 345031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 345131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3452e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 3453e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 345431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 345531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 345631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 345731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 345831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 3459e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 3460e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 3461e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3462e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 3463e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 3464e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3465e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 3466e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 3467e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 3468e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 34690d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (mNativeWindow == NULL) { 34700d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar DescribeColorFormatParams describeParams; 34710d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&describeParams); 34720d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.eColorFormat = videoDef->eColorFormat; 34730d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameWidth = videoDef->nFrameWidth; 34740d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameHeight = videoDef->nFrameHeight; 34750d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nStride = videoDef->nStride; 34760d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nSliceHeight = videoDef->nSliceHeight; 34770d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = OMX_FALSE; 34780d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar 34790d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (describeColorFormat(mOMX, mNode, describeParams)) { 34800d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar notify->setBuffer( 34810d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar "image-data", 34820d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar ABuffer::CreateAsCopy( 34830d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &describeParams.sMediaImage, 34840d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar sizeof(describeParams.sMediaImage))); 34855a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 34865a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar MediaImage *img = &describeParams.sMediaImage; 34875a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] MediaImage { F(%zux%zu) @%zu+%zu+%zu @%zu+%zu+%zu @%zu+%zu+%zu }", 34885a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mComponentName.c_str(), img->mWidth, img->mHeight, 34895a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc, 34905a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc, 34915a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc); 34920d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 349303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 349403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 349591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar if (portIndex != kPortIndexOutput) { 349691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar // TODO: also get input crop 349791a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar break; 349891a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar } 349991a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar 3500e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 3501e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 350291a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar rect.nPortIndex = portIndex; 3503e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3504e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 350591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar mNode, 350691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar (portIndex == kPortIndexOutput ? 350791a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonOutputCrop : 350891a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonInputCrop), 3509e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 3510e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 3511e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 3512e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 3513e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 3514e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 351531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3516e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 3517e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 3518e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 3519e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 3520e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 3521e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 3522e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3523e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 3524577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 3525577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 3526577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 3527e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 3528e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 3529e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3530e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3531e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 35324730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 35334730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP8: 35344730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP9: 35354730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35364730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 35374730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia InitOMXParams(&vp8type); 35384730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia vp8type.nPortIndex = kPortIndexOutput; 35394730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia status_t err = mOMX->getParameter( 35404730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia mNode, 35414730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 35424730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia &vp8type, 35434730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia sizeof(vp8type)); 35444730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 35454730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (err == OK) { 35464730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia AString tsSchema = "none"; 35474730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (vp8type.eTemporalPattern 35484730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 35494730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia switch (vp8type.nTemporalLayerCount) { 35504730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 1: 35514730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35524730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.1-layer"; 35534730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35544730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35554730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 2: 35564730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35574730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.2-layer"; 35584730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35594730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35604730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 3: 35614730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35624730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.3-layer"; 35634730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35644730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35654730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia default: 35664730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35674730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35684730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35694730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35704730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35714730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia notify->setString("ts-schema", tsSchema); 35724730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35734730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia // Fall through to set up mime. 35744730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35754730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 3576e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 3577e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3578e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 3579e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3580e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 3581e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 3582e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 3583e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 3584e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 3585e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3586e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3587e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 358831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3589e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 3590e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 35915a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] %s format is %s", mComponentName.c_str(), 35925a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar portIndex == kPortIndexInput ? "input" : "output", 35935a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar notify->debugString().c_str()); 35945a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 359531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 359631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 359731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 359831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 359931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 360031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 360131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 360297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 3603e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 3604e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3605e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 3606e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3607e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3608e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3609e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3610e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 3611e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3612e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3613e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 361414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 3615e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 3616e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 361714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 361814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 361914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 362014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 362114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 362214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 3623e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3624e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 3625e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3626e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 3627e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3628e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 3629e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 36308b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 3631e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 36328b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 36339806555d3930be43e11106281dee354820ac1c88Andreas Huber 3634e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 3635e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3636e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 3637e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3638e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3639e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3640e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3641e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 3642e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3643e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3644e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3645e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 3646e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3647e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3648e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3649e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3650e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3651e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 3652e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3653e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 3654e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3655e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 36569806555d3930be43e11106281dee354820ac1c88Andreas Huber 3657e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3658e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 3659e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3660e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3661e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3662e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 3663e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 3664e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3665e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 3666e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3667e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 3668e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 3669e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3670e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 3671e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3672e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 3673e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3674e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3675e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3676e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3677e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 3678e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3679e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 3680e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3681e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3682e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3683e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3684e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 3685e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3686e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3687e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3688e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 3689e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3690e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3691e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3692e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3693e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3694e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 3695e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3696e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 3697e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3698e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3699e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3700e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3701e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 3702e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3703e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3704e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3705e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 3706e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3707e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3708e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3709e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3710e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3711e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 3712e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3713e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 3714e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3715e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3716e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3717e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3718e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 3719e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3720e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3721e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3722e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 3723e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3724e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3725e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3726e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3727e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 372897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 372997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 373097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 373197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 3732e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 373397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 373497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 373597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 373697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 373797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 373897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 373997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 374097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 374197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 374297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 374397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 374497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 3745e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 37468a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad case OMX_AUDIO_CodingAndroidEAC3: 37478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { 37488a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE params; 37498a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(¶ms); 37508a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad params.nPortIndex = portIndex; 37518a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37528a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad CHECK_EQ((status_t)OK, mOMX->getParameter( 37538a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 37548a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 37558a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ¶ms, 37568a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(params))); 37578a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37588a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setString("mime", MEDIA_MIMETYPE_AUDIO_EAC3); 37598a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("channel-count", params.nChannels); 37608a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("sample-rate", params.nSampleRate); 37618a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad break; 37628a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 37638a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37648c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian case OMX_AUDIO_CodingAndroidOPUS: 37658c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian { 37668c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian OMX_AUDIO_PARAM_ANDROID_OPUSTYPE params; 37678c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian InitOMXParams(¶ms); 37688c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian params.nPortIndex = portIndex; 37698c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 37708c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian CHECK_EQ((status_t)OK, mOMX->getParameter( 37718c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian mNode, 37728c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, 37738c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian ¶ms, 37748c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian sizeof(params))); 37758c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 37768c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); 37778c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("channel-count", params.nChannels); 37788c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("sample-rate", params.nSampleRate); 37798c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian break; 37808c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian } 37818c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 378210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang case OMX_AUDIO_CodingG711: 378310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang { 378410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang OMX_AUDIO_PARAM_PCMMODETYPE params; 378510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang InitOMXParams(¶ms); 378610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang params.nPortIndex = portIndex; 378710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 378810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang CHECK_EQ((status_t)OK, mOMX->getParameter( 378910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mNode, 379010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang (OMX_INDEXTYPE)OMX_IndexParamAudioPcm, 379110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang ¶ms, 379210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang sizeof(params))); 379310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 379410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang const char *mime = NULL; 379510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang if (params.ePCMMode == OMX_AUDIO_PCMModeMULaw) { 379610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_MLAW; 379710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else if (params.ePCMMode == OMX_AUDIO_PCMModeALaw) { 379810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_ALAW; 379910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else { // params.ePCMMode == OMX_AUDIO_PCMModeLinear 380010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_RAW; 380110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 380210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setString("mime", mime); 380310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("channel-count", params.nChannels); 380410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("sample-rate", params.nSamplingRate); 380510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang break; 380610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 380710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 3808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 3809e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 3810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 3811e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 381231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 381331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 381431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 381531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 381631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 381731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 381831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3819e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 3820e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 3821e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3822e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 38234e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> notify = mBaseOutputFormat->dup(); 3824e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 3825e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3826e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 3827e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3828e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3829e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 3830e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3831e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 3832e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 3833e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 3834e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 3835e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 3836e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 3837e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 3838e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 3839e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 3840e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 3841e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 3842e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 3843e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 3844e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 3845e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 3846e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGW("Replacing SkipCutBuffer holding %d " 3847e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar "bytes", 3848e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar prevbufsize); 3849e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3850e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3851e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 3852e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 3853e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 3854e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3855e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 385631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 385731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 385831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 385931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 386031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 38615778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 3862cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 3863d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatError); 3864251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGE("signalError(omxError %#x, internalError %d)", error, internalError); 3865251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3866251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (internalError == UNKNOWN_ERROR) { // find better error code 3867251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const status_t omxStatus = statusFromOMXError(error); 3868251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (omxStatus != 0) { 3869251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung internalError = omxStatus; 3870251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 3871251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", error); 3872251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 3873251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 38745778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 3875251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung notify->setInt32("actionCode", ACTION_CODE_FATAL); // could translate from OMX error. 3876cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 3877cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 3878cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 3879bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huberstatus_t ACodec::pushBlankBuffersToNativeWindow() { 3880bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber status_t err = NO_ERROR; 3881bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ANativeWindowBuffer* anb = NULL; 3882bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int numBufs = 0; 3883bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int minUndequeuedBufs = 0; 3884bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3885bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We need to reconnect to the ANativeWindow as a CPU client to ensure that 3886bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // no frames get dropped by SurfaceFlinger assuming that these are video 3887bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // frames. 3888bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 3889bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3890bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3891bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 3892bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3893bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3894bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3895bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3896bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 3897bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3898bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3899bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 3900bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3901bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3902bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3903bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3904bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1, 3905bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber HAL_PIXEL_FORMAT_RGBX_8888); 3906bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3907bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)", 3908bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3909bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3910bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3911bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 391287eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin err = native_window_set_scaling_mode(mNativeWindow.get(), 391387eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 391487eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin if (err != NO_ERROR) { 391587eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin ALOGE("error pushing blank_frames: set_scaling_mode failed: %s (%d)", 391687eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin strerror(-err), -err); 391787eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin goto error; 3918bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3919bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3920bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_usage(mNativeWindow.get(), 3921bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber GRALLOC_USAGE_SW_WRITE_OFTEN); 3922bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3923bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_usage failed: %s (%d)", 3924bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3925bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3926bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3927bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3928bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query(mNativeWindow.get(), 3929bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 3930bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3931bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 3932bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber "failed: %s (%d)", strerror(-err), -err); 3933bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3934bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3935bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3936bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber numBufs = minUndequeuedBufs + 1; 3937bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffer_count(mNativeWindow.get(), numBufs); 3938bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3939bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", 3940bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3941bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3942bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3943bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3944bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push numBufs + 1 buffers to ensure that we've drawn into the same 3945bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // buffer twice. This should guarantee that the buffer has been displayed 3946bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // on the screen and then been replaced, so an previous video frames are 3947bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // guaranteed NOT to be currently displayed. 3948bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber for (int i = 0; i < numBufs + 1; i++) { 39491e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis int fenceFd = -1; 39501e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb); 3951bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3952bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 3953bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3954bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3955bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3956bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3957bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 3958bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3959bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Fill the buffer with the a 1x1 checkerboard pattern ;) 3960bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber uint32_t* img = NULL; 3961bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 3962bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3963bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: lock failed: %s (%d)", 3964bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3965bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3966bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3967bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3968bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber *img = 0; 3969bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3970bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->unlock(); 3971bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3972bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: unlock failed: %s (%d)", 3973bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3974bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3975bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3976bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3977bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->queueBuffer(mNativeWindow.get(), 39781e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis buf->getNativeBuffer(), -1); 3979bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3980bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", 3981bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3982bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3983bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3984bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3985bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber anb = NULL; 3986bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3987bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3988bc098410be55f9d96f394b3981a0c482b83859b6Andreas Hubererror: 3989bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3990bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3991bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after an error. 3992bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (anb != NULL) { 39931e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow->cancelBuffer(mNativeWindow.get(), anb, -1); 3994bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3995bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3996bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_disconnect(mNativeWindow.get(), 3997bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3998bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_connect(mNativeWindow.get(), 3999bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 4000bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4001bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4002bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } else { 4003bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after success. 4004bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 4005bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 4006bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4007bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 4008bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4009bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4010bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4011bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4012bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 4013bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 4014bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4015bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 4016bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4017bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4018bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4019bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4020bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return NO_ERROR; 4021bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4022bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber} 4023bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4026eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 4027eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4028eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4029496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 4030496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 4031496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 4032496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4033496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4034496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 4035496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 4036496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4037496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 4038496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 4039496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4040496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 4041496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 4042496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 4043496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 4044496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 4045496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 4046496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4047eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 4048eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 4049eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 4050eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 4051eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4052eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4053eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 4054eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 4055eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4056eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4057eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 4058eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 4059eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4060eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4061eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 4062eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 4063eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4064eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4065eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4066eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4067f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 4068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 4069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 4070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4072ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 4073ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 4075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4077f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 4078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 4080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 4082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 4086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 4088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 4092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 4094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 40977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 40987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 4099251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This may result in an app illegal state exception. 41007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 41017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 41027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 41037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4105ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 4106ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 4107251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This will result in kFlagSawMediaServerDie handling in MediaCodec. 4108ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 4109ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 4110ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 4111ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4112ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 411330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 411430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 411530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGI("[%s] forcing the release of codec", 411630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str()); 411730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar status_t err = mCodec->mOMX->freeNode(mCodec->mNode); 411830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGE_IF("[%s] failed to release codec instance: err=%d", 411930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str(), err); 412030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 412130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 412230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->post(); 412330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 412430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 412530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4133f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 4134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 4135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 4136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41375e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 41385e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 41395e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar if (mCodec->mNode == NULL) { 41405e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 41415e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 41425e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 41435e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 41445e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 4145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 4146609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 4147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 4148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 4150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 4151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 4153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 4154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 4155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 4156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41570af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 41580af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 41590af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 41600af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 41610af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 41620af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 41630af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 41640af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 41650af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 41660af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 41670af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 4169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 4170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 4171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 4172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 4175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4177609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 4180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 4183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4185609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 4188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 4191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 4192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 4193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 4194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 4199784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4208f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 4209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 42113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 4212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 4213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 421729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1); 4218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4219251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // verify OMX component sends back an error we expect. 4220251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung OMX_ERRORTYPE omxError = (OMX_ERRORTYPE)data1; 4221251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (!isOMXError(omxError)) { 4222251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", omxError); 4223251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung omxError = OMX_ErrorUndefined; 4224251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4225251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(omxError); 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 42313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] onOMXEmptyBufferDone %p", 4232349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4233349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 4236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 424096e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // We're in "store-metadata-in-buffers" mode, the underlying 424196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // OMX component had access to data that's implicitly refcounted 424296e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // by this "MediaBuffer" object. Now that the OMX component has 424396e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // told us that it's done with the input buffer, we can decrement 424496e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // the mediaBuffer's reference count. 424596e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia info->mData->setMediaBufferBase(NULL); 4246d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 4248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 4261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4268f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 4269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4276d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFillThisBuffer); 4277609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 4278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 42802d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 4281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id()); 4283609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 4286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 4290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4292f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 4293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4294609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 42952d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 4296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 42975778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 4298a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 42995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43002d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 4301a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43047fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 43057fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 43067fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 43077fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 43087fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 43097fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 43107fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 43117fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 43123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 4314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43165778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 43175778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 43185778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 43195778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 43205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 4323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 4324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 4331dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 4332dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4333dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4334dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 4346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 4348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 4349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 4350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 43535778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 43545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 4357d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGV("[%s] Needs to copy input data for buffer %p. (%p != %p)", 4358d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 4359d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 4360d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 4361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 4363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 4364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4366078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 43673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ codec specific data", 4368078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 43695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 43705778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling emptyBuffer %p w/ EOS", 43715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 4372078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 4373d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4374d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("[%s] calling emptyBuffer %p w/ time %lld us", 4375d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 4376d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 43773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ time %lld us", 4378078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 4379d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4380078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 4381349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4382d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4383d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 4384d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 4385d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 4386d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 4387d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4388d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4389054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4390054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 4391054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 4392054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4393054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 4394054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 4395054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 4396054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 4397054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 4398e53350373ac516257b4f8956ff1e3f1ac48f607eLajos Molnar mCodec->submitOutputMetaDataBuffer(); 4399054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4400054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4401054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 4407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 4408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 4409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 44145778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 44155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 44165778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 44175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 44185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 44195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 44205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 44215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 4423dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 44243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 4425dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 4426dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 4427dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 44283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 4429dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 4430dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p signalling EOS", 4433349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4434349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 4441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 4442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4447dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4451625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 4452625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 4453625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4454625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4458f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 4459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 4464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 4469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 4470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 4471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 4474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 4476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 4477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 4481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 4485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 4490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 4491784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 4492609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 44935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 4494349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4496d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4497d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4498d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 4499d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 4500d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 4501d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 4502d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4503d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 4504d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 4505d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 4506d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4507d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 4508d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 4509d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 4510d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4511d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4517054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 4518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4528a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (rangeLength == 0 && (!(flags & OMX_BUFFERFLAG_EOS) 4529a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || mCodec->mPortEOS[kPortIndexOutput])) { 4530609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 45315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4532349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 45335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 45345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 45355778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 4536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45375778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 45385778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 45395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 454031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4541577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 4542577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec->id()); 4543577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 45444bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 4545577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 45465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4548308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 4549308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 4550308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 4551308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 4552308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 4553308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 4554308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 4555308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 4556308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 4557496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 455821ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 4559496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 4560496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 4561496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 45625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 456321ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 4564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45658b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 45668b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 45678b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 45685778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 4569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4571d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); 4572609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 45732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 45745778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 4575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4576609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45785778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 4579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45805778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 45815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 45825778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 4583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 45855778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 45865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4588d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatEOS); 4589dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 4590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 4593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4610f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 4611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4612609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 4613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 4617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4618577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 4619577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 4620577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 4621577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 4622577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 4623577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 4624577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 4625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 4626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 46276aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 462879ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 46296fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 4630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 4631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4632fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 4633fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 4634fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 4635fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 4636fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 4637fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 4638fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 4639fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 464047aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 4641fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 4642fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4643fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 4644fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4645fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46465778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4647fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 4648fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 4649fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 4650fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4651fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 4653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 46541e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 4655cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 4656cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 4657251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4658cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4659cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 4660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 46616fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 46626fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 46636fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 46646fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 4665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 4674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 4687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4694c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 4695609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 4696c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4697349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4698c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4699c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 4700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4701c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4702c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4720f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4724c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 4725c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 4726ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4727ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 4728ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); 4729ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4730ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4731ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4732ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 4733ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNode = NULL; 4734ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 4735ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 4736ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 4737308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 4738ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 4739c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4740c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4741f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 4742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 4746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 4748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47535778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 47545778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 47555778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 47565778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 47575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 47585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 47595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 4761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4762c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4763c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4764c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 476554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 476654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 4767c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4769d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 4770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4773c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 4777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4779d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4783c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 478630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 478730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 478830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // nothing to do, as we have already signaled shutdown 478930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar handled = true; 479030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 479130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 479230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4800f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 4801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4802c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 4803c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 4804c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 4805c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 48065778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 48075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4808c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 48095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 48105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4811c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(mCodec->mNode == NULL); 48125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 4814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 4815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 4817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4818ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id()); 4819ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4820ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 4821ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { 4822ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 4823ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 4824ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4825ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4826ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4827e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 48285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 4830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48315778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4832d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 48337791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen int32_t encoder = false; 48345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 4835e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 4836e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 4837e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 4838afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4839e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 4840e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 4841e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 4842afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 48435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 48445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 48455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 48475778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 48485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48505778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 48515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 48525778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 48535778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 48545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 4855e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 48565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48571065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 48581065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 48591065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber IOMX::node_id node = NULL; 48601065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 48611065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 48621065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 4863e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 4864e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 4865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4866078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber pid_t tid = androidGetTid(); 4867078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 4868078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 48691065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber status_t err = omx->allocateNode(componentName.c_str(), observer, &node); 4870078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 4871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48721065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 48731065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 48747a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He } else { 48757a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He ALOGW("Allocating component '%s' failed, try next one.", componentName.c_str()); 48761065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 48771065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 48781065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber node = NULL; 48791065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 48801065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4881c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (node == NULL) { 48825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 48837791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen ALOGE("Unable to instantiate a %scoder for type '%s'.", 48847791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen encoder ? "en" : "de", mime.c_str()); 48855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 48867791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen ALOGE("Unable to instantiate codec '%s'.", componentName.c_str()); 48875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4888c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 4889cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber mCodec->signalError(OMX_ErrorComponentNotFound); 4890c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 4891c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4893ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber notify = new AMessage(kWhatOMXMessage, mCodec->id()); 4894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 4895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 4897ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 4898ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4899ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 4900ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 49011713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mCodec->mFlags |= kFlagIsGrallocUsageProtected; 49020167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 4903ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 4904ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4905afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 4906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 4907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 4908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49095778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 49105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4911d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentAllocated); 49125778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 49135778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 49145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4915c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4916c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4917c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4918c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 49195778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 49205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 4924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 4925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4926c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4927c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 4928c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 4929c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4930f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4931f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4932f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4933f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 4934f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4935054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 4936054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4937a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 4938e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 4939e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 49404e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mCodec->mBaseOutputFormat.clear(); 4941054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4942c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 4943c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 4944c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4945c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 4946c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 4947c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4948c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4949c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 495054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 4951f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia 4952f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia mCodec->processDeferredMessages(); 4953c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4954c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4955c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 4956c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 4957c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 4958c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4959c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 4960c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4961c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 496254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 496354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 4964d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 496554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 496654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 496754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 4968c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4969c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4970c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 4971c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 4972c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4973c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 4974c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 4975c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4976c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 4977c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4978c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4979c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4980c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 49817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 49827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 49837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 49847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 49857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 49867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 49877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4988c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 4989c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4990c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 4991c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 4992c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 4993c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 4994c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4995c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 4996c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 4997c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4998c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4999c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5000c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 500154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5002c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 5003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5007c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 5009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5010c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5011d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5012c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 5013c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5015c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5016c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5017c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 5019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 5020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 5023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 50265778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 50275778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 50285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mCodec->mNode != NULL); 50305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50315778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 50325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 50335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50345778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 50355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5037c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 5038c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 5039c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 5040251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5041c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 50425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50445778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 50455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5046d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentConfigured); 5047e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 5048e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 50495778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 50505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5051c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5052c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 50535778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 50545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::LoadedState::onCreateInputSurface( 5056ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber const sp<AMessage> & /* msg */) { 50577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGV("onCreateInputSurface"); 50587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 50597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> notify = mCodec->mNotify->dup(); 5060d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated); 50617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 50627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> bufferProducer; 50637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 50647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 50657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden err = mCodec->mOMX->createInputSurface(mCodec->mNode, kPortIndexInput, 50667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden &bufferProducer); 5067a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5068a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err == OK && mCodec->mRepeatFrameDelayUs > 0ll) { 5069a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 5070a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 5071a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 5072a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 5073a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 5074a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 5075a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5076a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 5077a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 5078a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 5079a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 5080a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 5081a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5082a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5083a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 50842c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mMaxPtsGapUs > 0ll) { 508594ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 508694ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 508794ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 508894ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 508994ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 509094ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 509194ee4b708acfa941581160b267afb79192b1d816Chong Zhang 509294ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 509394ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 509472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 509572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 50962c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 50972c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 50982c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 50992c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mTimePerCaptureUs > 0ll 51002c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 51012c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 51022c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 51032c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 51042c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 51052c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 51062c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 51072c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 51082c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 51092c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 51102c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 51112c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 51122c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 51132c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 51142c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 51152c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51162c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 511772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 511872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err == OK && mCodec->mCreateInputBuffersSuspended) { 511972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 512072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 512172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 512272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 512372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 512472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 512572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 512672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 512772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 512872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 512994ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 513094ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 513194ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 513294ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 513394ee4b708acfa941581160b267afb79192b1d816Chong Zhang 51347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 51357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 51367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 51377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 51387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 51397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 51407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 51417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 51427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 51437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 51447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 51457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 51467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 51477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5148c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 51495778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 51505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 51515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 51525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 5156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5160f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 5161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5164f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 51653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 5166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5167cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5168cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 516929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 5170cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 5171cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5172cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5173251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 517491bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 517591bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 5176cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5179f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 5180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 5181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 5183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 5184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 5187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5189f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 519172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51986507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 51996507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 52006507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 52016507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 52026507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 52036507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 52046463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 52056463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 52066463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 52076463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 52086463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 52096463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 52106463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 52116463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 52126463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 52136463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 5214d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 52156463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 52166463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 52176463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 52186463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 5219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5224f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 5225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 5234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 5237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5248f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 5249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5252f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 52533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 5254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5256f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 525872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5265d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 5266d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5267d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 5268d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5269d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5270d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5271d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 5272d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5273d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 5274d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5275d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5276d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 5277d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5278d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5279d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5280d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 52816507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 52826507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 52836507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 52846507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 52856507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 52866507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5292f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 5293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 5299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 5301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5313f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 5314349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 5315349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 5316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5318f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 5319ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 5320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5323054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 5324054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 5325054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 5326054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 5327054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 5328054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5329054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 5330054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 5331054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 5332054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5333054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 53344dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 53354dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 53364dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 5337054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5338054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5339054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 5340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 5341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 5342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 5344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 5345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 5346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 5348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 5349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 5352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 5355349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 5356349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 5358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 5361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5364054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 5365c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 5366054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 5367054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 5368054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5369054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5370054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5371f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 5372349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 53733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 5374349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5375349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5376349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 5377349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5378349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 5380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53813cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar // Post all available input buffers 5382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 53833cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); i++) { 53843cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 53853cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_US) { 53863cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar postFillThisBuffer(info); 53873cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 53883cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 5389349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5390349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 5391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5393f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 53943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 5395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 5397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5399f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5405c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5406c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5407c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5408c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5409c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 541054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5411c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 5412c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5413349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5414349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 5420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 54277a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 5428d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber "(codec owns %d/%d input, %d/%d output).", 5429d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 5430d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 5431d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 5432d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 5433d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 5434d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5435349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5436349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 5439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 5442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 5447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 5449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5454496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 5455496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 5456496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 5457496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 5458496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 5459496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5460496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5461496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 5462496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 5463496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5464496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5465a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 5466a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 5467a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 5468a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 5469a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5470a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 5471a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5472a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 5473a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 5474a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 5475a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 5476a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5477a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5478a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 5479a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 5480a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5481a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 54827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 54837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 54846507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 54857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 54867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 54877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 54887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 54894dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 54904dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 54914dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 54924dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 54934dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 54944dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 54954dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 54964dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 54974dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 54984dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 54994dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 55004dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 55014dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5510a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 5511a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 5512530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 5513a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 5514a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 5515a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 5516a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 5517a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5518a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 5519a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 5520a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 5521a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 5522a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 5523a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5524a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 5525a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 5526a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 5527a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5528a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 5529a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5530a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5531a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 553272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 553372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 553472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 553572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 553672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 553772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 553872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 553972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 554072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 554172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 554272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 554372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 554472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 554572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 554672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 554772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5548e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 5549e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 5550e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 5551e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5552b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 5553b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 5554e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 5555e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 5556e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 5557e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 5558b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 5559b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5560b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5561b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 5562b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5563b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5564b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5565b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5566b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 5567b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 5568b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 5569b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5570b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5571b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 5572b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5573b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5574e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 5575e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5576a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 5577a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 5578a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 55796507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 55806507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 5581d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatSignaledInputEOS); 55826507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 55836507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 55846507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 55856507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 55866507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 55876507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 55886507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 55896507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5590f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 5591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 5594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 5596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 559731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 5598054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 5599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 5601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 5602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5604349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 5605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 560731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 560831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 56103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 5611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 5612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 5618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5629f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 5630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 5631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5634f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 5635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 5636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 5637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 5638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 5641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5645f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 5646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5652349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 5653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5654349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 56553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 5656349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5657349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5671f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 56723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 5673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5676f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 5677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 5682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 5685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 5688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 5689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 5692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5694cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5695cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 5696cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 569729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 5698cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 5699cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5700cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5701251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5702d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5703755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 5704755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 5705755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 5706755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 5707755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 5708755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 5709755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 5710755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5711cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 5715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 571731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 571831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 57193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 5720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5722349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 5723349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 5724349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5725349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5741f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 57425778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 57435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 5744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5746f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5774f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 57753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 577631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 57775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 577831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5781f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 5782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 57905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5796349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5797349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 5798349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5799349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 5800349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5801349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5802349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 58070af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 5808f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 58095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 5810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 5812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 5815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 5816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58170167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 58180167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 5819bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 5820bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 5821bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 5822bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 5823bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mCodec->pushBlankBuffersToNativeWindow(); 5824bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 5825bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 5826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 5827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5830f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 5831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5837f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 5838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5846f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 5847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5850f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 5851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5878f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 58793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 5880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5882f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 5883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 5889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5890c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5902f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 5903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5906f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 59073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 5908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 5910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5912f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 5913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 5925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5937f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 5938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 59397a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] FlushingState onOMXEvent(%d,%ld)", 5940d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), event, data1); 5941d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 5946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 5948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 5949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 5950e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 5951e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 5952e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 5953e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 5954e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 5955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 5957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 5958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 5959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5966349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5967349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5968349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec->id()); 5969349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 5970609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 5971349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 5972349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 5973349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 5974349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 59753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 5976349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5977349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5978349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 5979349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5980349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5981349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5982349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5990f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 5991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5996f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 5997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6002f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 6003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 6004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 6005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 60067e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 60077e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 60087e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 60097e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 6010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 6011d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 6012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 6013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 6015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 6016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6017dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 6018dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 6019f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 6020f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 6021f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 6022f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 6023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 6024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 6028