ACodec.cpp revision b2d0b487efd40700199852c9a18b369b1651f15b
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 24609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#include <inttypes.h> 256fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar#include <utils/Trace.h> 266fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar 271de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar#include <gui/Surface.h> 281de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 37a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 40afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 431065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 44d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#include <media/stagefright/PersistentSurface.h> 45b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#include <media/stagefright/SurfaceUtils.h> 463a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 473a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 5197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 54496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 55f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// OMX errors are directly mapped into status_t range if 58251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// there is no corresponding MediaError status code. 59251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Use the statusFromOMXError(int32_t omxError) function. 60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 61251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Currently this is a direct map. 62251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// See frameworks/native/include/media/openmax/OMX_Core.h 63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 64251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Vendor OMX errors from 0x90000000 - 0x9000FFFF 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Extension OMX errors from 0x8F000000 - 0x90000000 66251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Standard OMX errors from 0x80001000 - 0x80001024 (0x80001024 current) 67251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 69251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// returns true if err is a recognized OMX error code. 70251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// as OMX error is OMX_S32, this is an int32_t type 71251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline bool isOMXError(int32_t err) { 72251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return (ERROR_CODEC_MIN <= err && err <= ERROR_CODEC_MAX); 73251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 74251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 75251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// converts an OMX error to a status_t 76251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t statusFromOMXError(int32_t omxError) { 77251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (omxError) { 78251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorInvalidComponentName: 79251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorComponentNotFound: 80251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return NAME_NOT_FOUND; // can trigger illegal argument error for provided names. 81251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 82251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return isOMXError(omxError) ? omxError : 0; // no translation required 83251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 84251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 85251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 86251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// checks and converts status_t to a non-side-effect status_t 87251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t makeNoSideEffectStatus(status_t err) { 88251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (err) { 89251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // the following errors have side effects and may come 90251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // from other code modules. Remap for safety reasons. 91251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case INVALID_OPERATION: 92251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case DEAD_OBJECT: 93251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return UNKNOWN_ERROR; 94251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 95251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return err; 96251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 97251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 98251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 99f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 120609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 133609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 139609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 207784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 216ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 217ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 218ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 219ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 220ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 221ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 222ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 223ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 224ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 225ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 226ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 227ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 228ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 229ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 230ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 231ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 232ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 233ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 239c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 243c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 245ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 246ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 253c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 254c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 255c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 256c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 257c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 258c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 259c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 260c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 261c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 264d291c222357303b9611cab89d0c3b047584ef377Chong Zhang void onUsePersistentInputSurface(const sp<AMessage> &msg); 265c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 266c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 268d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t setupInputSurface(); 269d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 270c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 271c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 272c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 273c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 274c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 309054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 316349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 317349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 318349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 327349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 328349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 409f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 410afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 411609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 4138db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu mIsVideo(false), 414c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 415308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 4169806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 41754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 4189806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 4199806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 420e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees(0), 4219806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 422054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 423054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 424054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 425a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 42694ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 4272c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 42837b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps(-1), 4292c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 430609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 431ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mCreateInputBuffersSuspended(false), 432ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled(false) { 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 434c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 447dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 459f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 4611d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 465a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 4661d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatSetParameters, this); 467a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 468a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 469a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 470a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4715778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4775778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4791d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4831dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::setSurface(const sp<Surface> &surface) { 4841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> msg = new AMessage(kWhatSetSurface, this); 4851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar msg->setObject("surface", surface); 4861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> response; 4881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = msg->postAndAwaitResponse(&response); 4891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err == OK) { 4911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar (void)response->findInt32("err", &err); 4921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 4931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 4941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 4951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 4967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4971d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatCreateInputSurface, this))->post(); 4987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 500d291c222357303b9611cab89d0c3b047584ef377Chong Zhangvoid ACodec::initiateUsePersistentInputSurface( 501d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<PersistentSurface> &surface) { 502d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<AMessage> msg = new AMessage(kWhatUsePersistentInputSurface, this); 503d291c222357303b9611cab89d0c3b047584ef377Chong Zhang msg->setObject("input-surface", surface); 504d291c222357303b9611cab89d0c3b047584ef377Chong Zhang msg->post(); 505d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 506d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 5081d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSignalEndOfInputStream, this))->post(); 5097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 5107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5115778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 5121d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatStart, this))->post(); 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 5167a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 5171d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatFlush, this))->post(); 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 520f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 5211d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatResume, this))->post(); 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 524c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 5251d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatShutdown, this); 526c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 527c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 52830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar if (!keepComponentAllocated) { 52930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // ensure shutdown completes in 3 seconds 5301d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatReleaseCodecInstance, this))->post(3000000); 53130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 534496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 5351d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatRequestIDRFrame, this))->post(); 536496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 537496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5384dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 5394dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 5404dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 5414dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 5424dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 5434dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 5444dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 5454dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 5461d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, this))->post(); 5474dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 5484dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 5494dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5501dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::handleSetSurface(const sp<Surface> &surface) { 5511dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // allow keeping unset surface 5521dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (surface == NULL) { 5531dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mNativeWindow != NULL) { 5541dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("cannot unset a surface"); 5551dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5561dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5571dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 5581dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5591dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5601dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // allow keeping unset surface 5611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mNativeWindow == NULL) { 5621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("component was not configured with a surface"); 5631dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5641dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5651dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5661dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ANativeWindow *nativeWindow = surface.get(); 5671dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // if we have not yet started the codec, we can simply set the native window 5681dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mBuffers[kPortIndexInput].size() == 0) { 5691dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNativeWindow = surface; 5701dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 5711dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5721dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5731dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // we do not support changing a tunneled surface after start 5741dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mTunneled) { 5751dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("cannot change tunneled surface"); 5761dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return INVALID_OPERATION; 5771dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5781dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = setupNativeWindowSizeFormatAndUsage(nativeWindow); 5801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 5811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 5821dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5831dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 5841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // get min undequeued count. We cannot switch to a surface that has a higher 5851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // undequeued count than we allocated. 5861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar int minUndequeuedBuffers = 0; 5871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = nativeWindow->query( 5881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 5891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar &minUndequeuedBuffers); 5901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 5911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 5921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 5931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 5941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 5951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (minUndequeuedBuffers > (int)mNumUndequeuedBuffers) { 5961dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("new surface holds onto more buffers (%d) than planned for (%zu)", 5971dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar minUndequeuedBuffers, mNumUndequeuedBuffers); 5981dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return BAD_VALUE; 5991dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6001dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // we cannot change the number of output buffers while OMX is running 6021dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // set up surface to the same count 6031dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar Vector<BufferInfo> &buffers = mBuffers[kPortIndexOutput]; 6041dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("setting up surface for %zu buffers", buffers.size()); 6051dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6061dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = native_window_set_buffer_count(nativeWindow, buffers.size()); 6071dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 6081dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 6091dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar -err); 6101dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6111dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6121dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6131dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // for meta data mode, we move dequeud buffers to the new surface. 6141dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // for non-meta mode, we must move all registered buffers 6151dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar for (size_t i = 0; i < buffers.size(); ++i) { 6161dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar const BufferInfo &info = buffers[i]; 6171dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // skip undequeued buffers for meta data mode 6181dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mStoreMetaDataInOutputBuffers 6191dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar && info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 6201dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("skipping buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6211dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar continue; 6221dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6231dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("attaching buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6241dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6251dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = surface->attachBuffer(info.mGraphicBuffer->getNativeBuffer()); 6261dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 6271dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("failed to attach buffer %p to the new surface: %s (%d)", 6281dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar info.mGraphicBuffer->getNativeBuffer(), 6291dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 6301dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6311dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6321dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6331dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6341dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // cancel undequeued buffers to new surface 6351dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (!mStoreMetaDataInOutputBuffers) { 6361dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar for (size_t i = 0; i < buffers.size(); ++i) { 6371dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar const BufferInfo &info = buffers[i]; 6381dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 6391dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("canceling buffer %p", info.mGraphicBuffer->getNativeBuffer()); 6401dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = nativeWindow->cancelBuffer( 6411dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, info.mGraphicBuffer->getNativeBuffer(), -1); 6421dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 6431dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGE("failed to cancel buffer %p to the new surface: %s (%d)", 6441dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar info.mGraphicBuffer->getNativeBuffer(), 6451dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar strerror(-err), -err); 6461dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 6471dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6481dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6491dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6501dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // disallow further allocation 6511dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar (void)surface->getIGraphicBufferProducer()->allowAllocation(false); 6521dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 6531dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 6541dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNativeWindow = nativeWindow; 6551dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return OK; 6561dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 6571dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 666054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 667054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 668054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 669054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 670054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 680609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 692ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 693ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 695afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 696afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 697afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 698afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 6991065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 700308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 701308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 702ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 703ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 704ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 705ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 706ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 707ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 708ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 709308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 710308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 711308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 712308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 713ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 715ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 717ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 718ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 719ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 720ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 721ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 7251065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 7261065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 734d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatBuffersAllocated); 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 737eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 738eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 739eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 741eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 743eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 746eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7521dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::setupNativeWindowSizeFormatAndUsage(ANativeWindow *nativeWindow /* nonnull */) { 7531dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_PARAM_PORTDEFINITIONTYPE def; 7541dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar InitOMXParams(&def); 7551dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.nPortIndex = kPortIndexOutput; 7561dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7571dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mOMX->getParameter( 7581dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 7591dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7601dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 7611dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 7621dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7631dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7641dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 usage = 0; 7651dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 7661dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != 0) { 7671dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGW("querying usage flags from OMX IL component failed: %d", err); 7681dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar // XXX: Currently this error is logged, but not fatal. 7691dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage = 0; 7701dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7711dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar int omxUsage = usage; 7721dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7731dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 7741dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage |= GRALLOC_USAGE_PROTECTED; 7751dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 7761dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 777b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar usage |= GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP; 778b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 7791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec)", omxUsage, usage); 7801dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return setNativeWindowSizeFormatAndUsage( 7811dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar nativeWindow, 7821dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.nFrameWidth, 7831dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.nFrameHeight, 7841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.format.video.eColorFormat, 7851dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mRotationDegrees, 7861dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar usage); 7871dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar} 7881dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7891dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 7901dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 7911dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_U32 *minUndequeuedBuffers) { 7921dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar OMX_PARAM_PORTDEFINITIONTYPE def; 7931dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar InitOMXParams(&def); 7941dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar def.nPortIndex = kPortIndexOutput; 7951dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7961dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mOMX->getParameter( 7971dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 7981dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 7991dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err == OK) { 8001dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar err = setupNativeWindowSizeFormatAndUsage(mNativeWindow.get()); 8011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 8021dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar if (err != OK) { 8031dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar return err; 8041dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 8051dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 806ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // Exits here for tunneled video playback codecs -- i.e. skips native window 807ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // buffer allocation step as this is managed by the tunneled OMX omponent 808ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // itself and explicitly sets def.nBufferCountActual to 0. 809ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 810ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Tunneled Playback: skipping native window buffer allocation."); 811ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad def.nBufferCountActual = 0; 812ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad err = mOMX->setParameter( 813ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 814ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 815ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *minUndequeuedBuffers = 0; 816ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferCount = 0; 817ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferSize = 0; 818ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return err; 819ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 820ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 821054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 822258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 823258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 824054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 825258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 826258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 82729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 828258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 829258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 830258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 831258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 832e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 833e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 8341faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 8351faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 836e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 837e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 838e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 839e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 840e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 841e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 842e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 8431faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 8441faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 845e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 846e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 847258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 848258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 849258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 850258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 851e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 852e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 853e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 854e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 855e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 856609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 857e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 858e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 859e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 860258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 861258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 862258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 863258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 86829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 873054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 874054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 875054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 876054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 877054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 882054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 883054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 884e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 8863298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia if (!mStoreMetaDataInOutputBuffers) { 8873298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia static_cast<Surface*>(mNativeWindow.get()) 8883298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia ->getIGraphicBufferProducer()->allowAllocation(true); 8893298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia } 8903298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia 891609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 893054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 896054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 8978ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 8981e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 90029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 90574006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 90674006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 907054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 90874006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 90974006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 91074006804065941841883c4b46ee785070164023fJamie Gennis 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 915609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 91674006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 92074006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 92174006804065941841883c4b46ee785070164023fJamie Gennis 922609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 93474006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 936054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 937054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 938054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 9433fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia status_t error = cancelBufferToNativeWindow(info); 9443fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia if (err == 0) { 9453fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia err = error; 9463fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia } 947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9493298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia if (!mStoreMetaDataInOutputBuffers) { 9503298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia static_cast<Surface*>(mNativeWindow.get()) 9513298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia ->getIGraphicBufferProducer()->allowAllocation(false); 9523298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia } 9533298d6fa642c11c5b004bdfc375252ff4c4536e3Wei Jia 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 957054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 958054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 959054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 960054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 961054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 962054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 963e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 964054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 965609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 966054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 968054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 969054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 970054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 971054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 972054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 973054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 974054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 975054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 976054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 977054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 978054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 979054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 980054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 981054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 982054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 983054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 984054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 985054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 987054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 988054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 989609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 990054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 991054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 992054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 993054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 994054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 995054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 996054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 997054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 998054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 999054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 1000054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 1001054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1002054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 1003054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 1004054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 1005054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1006609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 1007054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 1008054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1009054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 1010054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 1011054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 1012054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1013054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 1014054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 1015054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 1016054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1020609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 1021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 10241e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10263fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia ALOGW_IF(err != 0, "[%s] can not return buffer %u to native window", 10273fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia mComponentName.c_str(), info->mBufferID); 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10313fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia return err; 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1034f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 10358ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 1036054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 1037ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 1038ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 1039ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGW("dequeueBufferFromNativeWindow() should not be called in tunnel" 1040ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad " video playback mode mode!"); 1041ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return NULL; 1042ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 1043ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 10441e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 104529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 1046c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 1047c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 1048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1049054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1054054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 1055054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1063054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1064054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 1065054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 1066054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 1067054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 1068054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 1069054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 1070054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1071054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1072054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1073054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 1074054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 1075054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1076054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 1077054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 1078054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 1079054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1080d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 1081d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 1082d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 1083054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1084d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 1085d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 1086d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 1087d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 1088d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1089d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 1090ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (unsigned)(oldest - &mBuffers[kPortIndexOutput][0]), 1091054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 1092d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 1093d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 1094054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1095054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1103f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 1109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1113349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 1114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11182ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 11192ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 11202ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 11212ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 1123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 11373fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia cancelBufferToNativeWindow(info); 1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 1142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1149f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 1151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 1158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 1170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 1171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 1172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 1173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 1177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 1178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 11792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 11802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 11812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 11822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 1183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 1188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 1189729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 1190729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1191bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 1192bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 1193c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1194c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1195c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1196c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 1198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 11992472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, 12002472b1c0d63454e5d90a982bd6c555de6c3127bdRachad "video_decoder.hevc", "video_encoder.hevc" }, 1201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 1202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 1204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 120594705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 120694705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 120794705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 120894705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 1209ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 1210ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 12112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 12122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1213ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1214ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1215774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1216774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 121797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 121897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 12198a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { MEDIA_MIMETYPE_AUDIO_EAC3, 12208a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad "audio_decoder.eac3", "audio_encoder.eac3" }, 1221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 12555ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1272e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 12734e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> outputFormat = mNotify->dup(); // will use this for kWhatOutputFormatChanged 1274e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12778db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 12852f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 12862f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 12872f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1291d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1292d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1293d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1294d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1295d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1296d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1297d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1298308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1299308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1300d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1301308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1302308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1303308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1304d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1305308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 13063a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 13073a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 13083a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 13093a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 13103a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 13113a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 13123a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 13133a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 13143a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13153a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 13163a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 13173a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 13183a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 13193a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13203a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 13213a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 13223a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13233a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13243a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 13253a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 13263a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 13273a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 13283a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 13293a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13303a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 13313a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1332308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1333308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1334308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1335308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 13368db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu mIsVideo = video; 1337308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1338308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1339308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1340308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1341308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1342308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1343308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1344308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1345308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1346308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1347308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1348308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1349308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1350308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1351a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1352a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1353a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1354a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1355a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1356a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 135794ee4b708acfa941581160b267afb79192b1d816Chong Zhang 135894ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 13592c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 13602c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 13612c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 136237b2b389139ed638831e49708c947863eef631efRonghua Wu if (!msg->findFloat("max-fps-to-encoder", &mMaxFps)) { 136337b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps = -1; 136437b2b389139ed638831e49708c947863eef631efRonghua Wu } 136537b2b389139ed638831e49708c947863eef631efRonghua Wu 13662c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 13672c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 136894ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 136972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 137072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 137172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 137272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 137372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 137472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1375308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1376308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 13773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // NOTE: we only use native window for video decoders 1378054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 13790d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool haveNativeWindow = msg->findObject("native-window", &obj) 13803a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar && obj != NULL && video && !encoder; 1381054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1382e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1383e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 13841713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang 13851713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang int32_t usageProtected; 13861713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (msg->findInt32("protected", &usageProtected) && usageProtected) { 13871713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (!haveNativeWindow) { 13881713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang ALOGE("protected output buffers must be sent to an ANativeWindow"); 13891713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang return PERMISSION_DENIED; 13901713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 13911713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagIsGrallocUsageProtected; 13921713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 13931713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 1394e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 13953a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 13961de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar sp<ANativeWindow> nativeWindow = 13971de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar static_cast<ANativeWindow *>(static_cast<Surface *>(obj.get())); 13985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13996597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // START of temporary support for automatic FRC - THIS WILL BE REMOVED 14006597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar int32_t autoFrc; 14016597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (msg->findInt32("auto-frc", &autoFrc)) { 14026597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar bool enabled = autoFrc; 14036597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar OMX_CONFIG_BOOLEANTYPE config; 14046597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar InitOMXParams(&config); 14056597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar config.bEnabled = (OMX_BOOL)enabled; 14066597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar status_t temp = mOMX->setConfig( 14076597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar mNode, (OMX_INDEXTYPE)OMX_IndexConfigAutoFramerateConversion, 14086597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar &config, sizeof(config)); 14096597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (temp == OK) { 14106597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar outputFormat->setInt32("auto-frc", enabled); 14116597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } else if (enabled) { 14126597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar ALOGI("codec does not support requested auto-frc (err %d)", temp); 14136597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 14146597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 14156597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // END of temporary support for automatic FRC 14166597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar 14175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t tunneled; 14185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("feature-tunneled-playback", &tunneled) && 14195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunneled != 0) { 14205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGI("Configuring TUNNELED video playback."); 1421ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = true; 14225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 142397827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync = 0; 142497827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad if (!msg->findInt32("audio-hw-sync", &audioHwSync)) { 14255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW("No Audio HW Sync provided for video tunnel"); 14265a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = configureTunneledVideoPlayback(audioHwSync, nativeWindow); 14285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 142997827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad ALOGE("configureTunneledVideoPlayback(%d,%p) failed!", 14305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad audioHwSync, nativeWindow.get()); 14315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 1432fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1433fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1434d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad int32_t maxWidth = 0, maxHeight = 0; 1435d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (msg->findInt32("max-width", &maxWidth) && 1436d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad msg->findInt32("max-height", &maxHeight)) { 1437d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad 1438d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad err = mOMX->prepareForAdaptivePlayback( 1439d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, maxHeight); 1440d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (err != OK) { 1441d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad ALOGW("[%s] prepareForAdaptivePlayback failed w/ err %d", 1442d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mComponentName.c_str(), err); 14433a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // allow failure 14443a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = OK; 1445d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } else { 1446d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-width", maxWidth); 1447d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-height", maxHeight); 1448d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("adaptive-playback", true); 1449d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 1450d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 14515a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 1452ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Configuring CPU controlled video playback."); 1453ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = false; 1454ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 14553fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // Explicity reset the sideband handle of the window for 14563fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // non-tunneled video in case the window was previously used 14573fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // for a tunneled video playback. 14583fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad err = native_window_set_sideband_stream(nativeWindow.get(), NULL); 14593fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad if (err != OK) { 14603fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad ALOGE("set_sideband_stream(NULL) failed! (err %d).", err); 14613fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad return err; 14623fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad } 14633fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad 14645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // Always try to enable dynamic output buffers on native surface 14655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->storeMetaDataInBuffers( 14665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE); 14675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 14685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1469fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1470e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 14715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // if adaptive playback has been requested, try JB fallback 14725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 14735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // LARGE MEMORY REQUIREMENT 14745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // we will not do adaptive playback on software accessed 14765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // surfaces as they never had to respond to changes in the 14775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // crop window, and we don't trust that they will be able to. 14785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int usageBits = 0; 14795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad bool canDoAdaptivePlayback; 14805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (nativeWindow->query( 14825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad nativeWindow.get(), 14835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad NATIVE_WINDOW_CONSUMER_USAGE_BITS, 14845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad &usageBits) != OK) { 14855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = false; 14865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 14875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = 14885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (usageBits & 14895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (GRALLOC_USAGE_SW_READ_MASK | 14905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 14915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t maxWidth = 0, maxHeight = 0; 14945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (canDoAdaptivePlayback && 14955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-width", &maxWidth) && 14965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-height", &maxHeight)) { 14975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 14985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), maxWidth, maxHeight); 14995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 15005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->prepareForAdaptivePlayback( 15015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, 15025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad maxHeight); 15035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW_IF(err != OK, 15045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "[%s] prepareForAdaptivePlayback failed w/ err %d", 15055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), err); 15065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 15075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err == OK) { 15085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-width", maxWidth); 15095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-height", maxHeight); 15105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 15115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 1512e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 15135a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // allow failure 15145a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OK; 15155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 15165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] storeMetaDataInBuffers succeeded", 15175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str()); 15185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mStoreMetaDataInOutputBuffers = true; 15195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 1520fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 15210167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 15225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t push; 15235a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 15245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad && push != 0) { 15255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 15265a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 15270167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1528e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 1529e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang int32_t rotationDegrees; 1530e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (msg->findInt32("rotation-degrees", &rotationDegrees)) { 1531e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = rotationDegrees; 1532e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } else { 1533e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = 0; 1534e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 1535054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1536054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1537308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 15383a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // determine need for software renderer 15393a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar bool usingSwRenderer = false; 15403a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { 15413a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 15423a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 15433a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15443a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 15480d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setupVideoDecoder(mime, msg, haveNativeWindow); 15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15503a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15513a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err != OK) { 15523a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar return err; 15533a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15543a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15553a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 15561de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar mNativeWindow = static_cast<Surface *>(obj.get()); 15571de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar CHECK(mNativeWindow != NULL); 15583a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15593a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15603a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // initialize native window now to get actual output format 15613a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: this is needed for some encoders even though they don't use native window 15623a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ((status_t)OK, initNativeWindow()); 15633a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15643a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback for devices that do not handle flex-YUV for native buffers 15653a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 15663a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t requestedColorFormat = OMX_COLOR_FormatUnused; 15673a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (msg->findInt32("color-format", &requestedColorFormat) && 15683a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar requestedColorFormat == OMX_COLOR_FormatYUV420Flexible) { 15693a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 15703a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t colorFormat = OMX_COLOR_FormatUnused; 15713a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar OMX_U32 flexibleEquivalent = OMX_COLOR_FormatUnused; 15723a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(outputFormat->findInt32("color-format", &colorFormat)); 15733a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGD("[%s] Requested output format %#x and got %#x.", 15743a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mComponentName.c_str(), requestedColorFormat, colorFormat); 15753a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (!isFlexibleColorFormat( 15763a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mOMX, mNode, colorFormat, haveNativeWindow, &flexibleEquivalent) 15773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar || flexibleEquivalent != (OMX_U32)requestedColorFormat) { 15783a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // device did not handle flex-YUV request for native window, fall back 15793a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // to SW renderer 15803a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGI("[%s] Falling back to software renderer", mComponentName.c_str()); 15813a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.clear(); 15823a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 15833a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 15843a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mStoreMetaDataInOutputBuffers) { 15853a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_FALSE); 15863a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mStoreMetaDataInOutputBuffers = false; 15873a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: implement adaptive-playback support for bytebuffer mode. 15883a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // This is done by SW codecs, but most HW codecs don't support it. 15893a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar inputFormat->setInt32("adaptive-playback", false); 15903a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15913a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err == OK) { 15923a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 15933a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15943a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 15953a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback is not supported for protected playback 15963a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = PERMISSION_DENIED; 15973a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } else if (err == OK) { 15983a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = setupVideoDecoder(mime, msg, false); 15993a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16003a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16013a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16023a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 16033a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 16043a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (usingSwRenderer) { 16053a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar outputFormat->setInt32("using-sw-renderer", 1); 16063a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 160742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 160842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 160942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 161042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 161142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 161242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 161342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 161442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 161542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 161642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 161742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 161842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 161942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 16255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1626aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1627b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi int32_t sbrMode; 16288045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount; 16292965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable; 16308045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drcParams_t drc; 1631ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1632ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1633ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1634aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1635aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1636aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1637b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi if (!msg->findInt32("aac-sbr-mode", &sbrMode)) { 1638b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi sbrMode = -1; 1639b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1640ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16418045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-max-output-channel_count", &maxOutputChannelCount)) { 16428045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi maxOutputChannelCount = -1; 16438045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16442965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang if (!msg->findInt32("aac-pcm-limiter-enable", &pcmLimiterEnable)) { 16452965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang // value is unknown 16462965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable = -1; 16472965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang } 16488045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-encoded-target-level", &drc.encodedTargetLevel)) { 16498045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16508045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.encodedTargetLevel = -1; 16518045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16528045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-cut-level", &drc.drcCut)) { 16538045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16548045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcCut = -1; 16558045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16568045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-boost-level", &drc.drcBoost)) { 16578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16588045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcBoost = -1; 16598045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16608045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-heavy-compression", &drc.heavyCompression)) { 16618045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16628045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.heavyCompression = -1; 16638045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16648045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-target-ref-level", &drc.targetRefLevel)) { 16658045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 16668045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.targetRefLevel = -1; 16678045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 16688045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 1669ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 16704471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 16712965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang isADTS != 0, sbrMode, maxOutputChannelCount, drc, 16722965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable); 16735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1674729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 16755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1676729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 16775778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1678729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1679729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1680729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1681729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1682729de186450f78c099637e1fce743fe531862c52Andreas Huber 1683729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 168717c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen int32_t sampleRate; 168817c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen if (!msg->findInt32("sample-rate", &sampleRate)) { 168917c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen sampleRate = 8000; 169017c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen } 169117c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen err = setupG711Codec(encoder, sampleRate, numChannels); 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 1694ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar int32_t numChannels = 0, sampleRate = 0, compressionLevel = -1; 16952f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 16962f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 16972f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 16982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 16992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 17002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 17012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1702516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1703cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar "complexity", &compressionLevel) && 1704cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar !msg->findInt32( 1705516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 1706cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar compressionLevel = 5; // default FLAC compression level 17072f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1708516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1709516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1710516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 17112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 17122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1713516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1714516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1715516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 17162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 17172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 17182f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1719516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1720516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 17212f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1722ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1723ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1724ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1725ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1726ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1727ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1728ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1729ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1730ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 173197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 173297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 173397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 173497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 173597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 173697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 173797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 173897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 173997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 17408a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_EAC3)) { 17418a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t numChannels; 17428a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t sampleRate; 17438a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (!msg->findInt32("channel-count", &numChannels) 17448a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad || !msg->findInt32("sample-rate", &sampleRate)) { 17458a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = INVALID_OPERATION; 17468a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else { 17478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = setupEAC3Codec(encoder, numChannels, sampleRate); 17488a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1750729de186450f78c099637e1fce743fe531862c52Andreas Huber 17514471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 17524471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 17534471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 17544471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 17558b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 17568b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 17578b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 17589806555d3930be43e11106281dee354820ac1c88Andreas Huber 17598b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 17608b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 17618b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 17628b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 17639806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 17649806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 17659806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 17669806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 17679806555d3930be43e11106281dee354820ac1c88Andreas Huber } 17689806555d3930be43e11106281dee354820ac1c88Andreas Huber 1769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17768b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu int32_t priority; 17778b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (msg->findInt32("priority", &priority)) { 17788b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu err = setPriority(priority); 17798b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 17808b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 1781ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu int32_t rateInt = -1; 1782ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu float rateFloat = -1; 1783ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (!msg->findFloat("operating-rate", &rateFloat)) { 1784ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu msg->findInt32("operating-rate", &rateInt); 1785ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rateFloat = (float)rateInt; // 16MHz (FLINTMAX) is OK for upper bound. 1786ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1787ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > 0) { 1788ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu err = setOperatingRate(rateFloat, video); 1789ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1790ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu 17914e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mBaseOutputFormat = outputFormat; 17924e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar 1793e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1794e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1795e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1796e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1797e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18018b806ea894ca098366629458bfdd1df4866afcdfRonghua Wustatus_t ACodec::setPriority(int32_t priority) { 18028b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (priority < 0) { 18038b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return BAD_VALUE; 18048b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 18058b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu OMX_PARAM_U32TYPE config; 18068b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu InitOMXParams(&config); 18078b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu config.nU32 = (OMX_U32)priority; 18088b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu status_t temp = mOMX->setConfig( 18098b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu mNode, (OMX_INDEXTYPE)OMX_IndexConfigPriority, 18108b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu &config, sizeof(config)); 18118b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (temp != OK) { 18128b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu ALOGI("codec does not support config priority (err %d)", temp); 18138b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 18148b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return OK; 18158b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu} 18168b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 1817ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wustatus_t ACodec::setOperatingRate(float rateFloat, bool isVideo) { 1818ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat < 0) { 1819ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1820ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1821ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu OMX_U32 rate; 1822ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (isVideo) { 1823ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > 65535) { 1824ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1825ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1826ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rate = (OMX_U32)(rateFloat * 65536.0f + 0.5f); 1827ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } else { 1828ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (rateFloat > UINT_MAX) { 1829ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return BAD_VALUE; 1830ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1831ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu rate = (OMX_U32)(rateFloat); 1832ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1833ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu OMX_PARAM_U32TYPE config; 1834ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu InitOMXParams(&config); 1835ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu config.nU32 = rate; 1836ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu status_t err = mOMX->setConfig( 1837ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu mNode, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate, 1838ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu &config, sizeof(config)); 1839ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu if (err != OK) { 1840ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu ALOGI("codec does not support config operating rate (err %d)", err); 1841ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu } 1842ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu return OK; 1843ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu} 1844ed5554fb1c837f6b1008d3910018c979c57da502Ronghua Wu 1845f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 18835778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 18845778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 18855778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 18865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18875778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 18885778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 18895778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 18905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18915778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 18925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 18935778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 18945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 19005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 19015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 19055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 19065778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 19075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19085778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1909aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 19108045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode, 19112965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t maxOutputChannelCount, const drcParams_t& drc, 19122965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable) { 1913ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1914ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1915ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1916ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 19175778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 19185778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 19195778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 19205778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 19215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 19275778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 19285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19335778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 19345778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 19355778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 19365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19375778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19445778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 19455778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 19465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19475778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 19485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 19495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19545778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 19555778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 19565778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 19575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19585778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 19595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 19605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 19625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 19635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19655778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 19665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19675778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 19685778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 19695778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 19705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19715778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 19725778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 19735778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 19745778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 19755778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 19765778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1977aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 19785778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 1979b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi switch (sbrMode) { 1980b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 0: 1981b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // disable sbr 1982b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1983b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1984b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1985b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 1: 1986b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable single-rate sbr 1987b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1988b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1989b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1990b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 2: 1991b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable dual-rate sbr 1992b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1993b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1994b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1995b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case -1: 1996b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable both modes -> the codec will decide which mode should be used 1997b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1998b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1999b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 2000b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi default: 2001b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // unsupported sbr mode 2002b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi return BAD_VALUE; 2003b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 2004b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi 20055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20065778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 20085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 2017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 2018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 2019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20205778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 2021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 2022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 2028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 2029ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2030ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 2031ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 2032ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 2033ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 2034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20358045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi OMX_AUDIO_PARAM_ANDROID_AACPRESENTATIONTYPE presentation; 20368045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nMaxOutputChannels = maxOutputChannelCount; 20378045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcCut = drc.drcCut; 20388045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcBoost = drc.drcBoost; 20398045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nHeavyCompression = drc.heavyCompression; 20408045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nTargetReferenceLevel = drc.targetRefLevel; 20418045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nEncodedTargetLevel = drc.encodedTargetLevel; 20422965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang presentation.nPCMLimiterEnable = pcmLimiterEnable; 20438045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 20448045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi status_t res = mOMX->setParameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 20458045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (res == OK) { 20468045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // optional parameters, will not cause configuration failure 20478045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi mOMX->setParameter(mNode, (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacPresentation, 20488045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi &presentation, sizeof(presentation)); 20498045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } else { 20508045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi ALOGW("did not set AudioAndroidAacPresentation due to error %d when setting AudioAac", res); 20518045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 20528045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi return res; 20535778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 205597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 205697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 205797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 205897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 205997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 206097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 206197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 206297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 206397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 206497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 206597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 206697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 206797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 206897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 206997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 207097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 207197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 207297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 207397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 207497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 207597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 207697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 207797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 207897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 207997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 208097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 208197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 208297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 208397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 208497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 208597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 208697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 208797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 208897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 208997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 209097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 209197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 209297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 20938a4728966dc9c78e21c3c93a927707e93c05e5e0Rachadstatus_t ACodec::setupEAC3Codec( 20948a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad bool encoder, int32_t numChannels, int32_t sampleRate) { 20958a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad status_t err = setupRawAudioFormat( 20968a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 20978a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 20988a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 20998a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 21008a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21018a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21028a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (encoder) { 21038a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ALOGW("EAC3 encoding is not supported."); 21048a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return INVALID_OPERATION; 21058a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21068a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21078a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE def; 21088a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(&def); 21098a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nPortIndex = kPortIndexInput; 21108a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21118a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = mOMX->getParameter( 21128a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 21138a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 21148a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 21158a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 21168a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21178a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 21188a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 21198a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 21208a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21218a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nChannels = numChannels; 21228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nSampleRate = sampleRate; 21238a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21248a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return mOMX->setParameter( 21258a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 21268a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 21278a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 21288a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 21298a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad} 21308a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 21315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 21325778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 21335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 21345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 21355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 21365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 21375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 21385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 21395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 21405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 21415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 21425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 21435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 21445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 21455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 21465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 21475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 21485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 21495778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 21505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21525778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 21535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 21545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 21555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 21565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 21575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 21585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 21595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 21605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 21615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 21625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 21635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 21645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 21655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 21665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 21675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 21685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 21695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 21705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21715778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 21725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 21735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21765778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 2177729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 2178729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 21795778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 2180729de186450f78c099637e1fce743fe531862c52Andreas Huber 2181729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 2182729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2183729de186450f78c099637e1fce743fe531862c52Andreas Huber 2184729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2185729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2186729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2187729de186450f78c099637e1fce743fe531862c52Andreas Huber 2188729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 21895778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 21905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 21915778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 21925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2193729de186450f78c099637e1fce743fe531862c52Andreas Huber 21945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 21955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 21965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2197729de186450f78c099637e1fce743fe531862c52Andreas Huber 21985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 21995778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 22005778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 22015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 2202729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2203729de186450f78c099637e1fce743fe531862c52Andreas Huber 220417c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissenstatus_t ACodec::setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels) { 22055778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 22065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2207729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 220817c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen kPortIndexInput, sampleRate, numChannels); 2209729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2210729de186450f78c099637e1fce743fe531862c52Andreas Huber 22112f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 22122f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 22132f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 22152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 22162f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 22172f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 22182f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22192f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 22202f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 22212f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 22222f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 22232f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 22242f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22252f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 22262f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 22272f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 22282f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 22292f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 22302f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22312f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 22322f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 22332f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 22342f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 22352f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 22362f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 22372f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 22382f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 2239729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 2240729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 2241729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2242729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 2243729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 2244729de186450f78c099637e1fce743fe531862c52Andreas Huber 2245729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 2246729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2247729de186450f78c099637e1fce743fe531862c52Andreas Huber 2248729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2249729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2250729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2251729de186450f78c099637e1fce743fe531862c52Andreas Huber 2252729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 2253729de186450f78c099637e1fce743fe531862c52Andreas Huber 2254729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 2255729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2256729de186450f78c099637e1fce743fe531862c52Andreas Huber 2257729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2258729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2259729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2260729de186450f78c099637e1fce743fe531862c52Andreas Huber 2261729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 2262729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 2263729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 2264729de186450f78c099637e1fce743fe531862c52Andreas Huber 2265729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 2266729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2267729de186450f78c099637e1fce743fe531862c52Andreas Huber 2268729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2269729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2270729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2271729de186450f78c099637e1fce743fe531862c52Andreas Huber 2272729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 2273729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 2274729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 2275729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 2276729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 2277729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 2278729de186450f78c099637e1fce743fe531862c52Andreas Huber 2279c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 2280c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 2281729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2282729de186450f78c099637e1fce743fe531862c52Andreas Huber 2283729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 2284729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2285729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2286729de186450f78c099637e1fce743fe531862c52Andreas Huber 22875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t ACodec::configureTunneledVideoPlayback( 228897827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync, const sp<ANativeWindow> &nativeWindow) { 22895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t* sidebandHandle; 22905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 22915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad status_t err = mOMX->configureVideoTunnelMode( 22925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, audioHwSync, &sidebandHandle); 22935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 22945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureVideoTunnelMode failed! (err %d).", err); 22955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 22965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 22975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 22985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle); 22995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 23005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", 23015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sidebandHandle, err); 23025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 23035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 23045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 23055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return OK; 23065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 23075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 2308f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 2309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 23110d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat, 23120d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool usingNativeBuffers) { 2313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 2314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 2316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 2317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 2318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 2320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 2321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 2322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2330229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // substitute back flexible color format to codec supported format 2331229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_U32 flexibleEquivalent; 23320d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (compressionFormat == OMX_VIDEO_CodingUnused 23330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 23340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, usingNativeBuffers, &flexibleEquivalent) 23350d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && colorFormat == flexibleEquivalent) { 2336229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar ALOGI("[%s] using color format %#x in place of %#x", 2337229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mComponentName.c_str(), format.eColorFormat, colorFormat); 2338229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat = format.eColorFormat; 2339229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 2340229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 2341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 2342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 2343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 2345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 2346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 2347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 2348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 2352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 2353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 2354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 2360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 2361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 2366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 2369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 2370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 2373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23790d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Set optimal output format. OMX component lists output formats in the order 23800d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// of preference, but this got more complicated since the introduction of flexible 23810d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// YUV formats. We support a legacy behavior for applications that do not use 23820d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// surface output, do not specify an output format, but expect a "usable" standard 23830d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// OMX format. SW readable and standard formats must be flex-YUV. 23840d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 23850d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Suggested preference order: 23860d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal format for texture rendering (mediaplayer behavior) 23870d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable & texture renderable format (flex-YUV support) 23880d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable non-renderable format (flex-YUV bytebuffer support) 23890d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - legacy "usable" standard formats 23900d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 23910d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// For legacy support, we prefer a standard format, but will settle for a SW readable 23920d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// flex-YUV format. 23930d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnarstatus_t ACodec::setSupportedOutputFormat(bool getLegacyFlexibleFormat) { 23940d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE format, legacyFormat; 2395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 2397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23980d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&legacyFormat); 23990d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // this field will change when we find a suitable legacy format 24000d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar legacyFormat.eColorFormat = OMX_COLOR_FormatUnused; 2401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24020d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar for (OMX_U32 index = 0; ; ++index) { 24030d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar format.nIndex = index; 24040d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar status_t err = mOMX->getParameter( 24050d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mNode, OMX_IndexParamVideoPortFormat, 24060d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &format, sizeof(format)); 24070d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (err != OK) { 24080d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // no more formats, pick legacy format if found 24090d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat != OMX_COLOR_FormatUnused) { 24100d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&format, &legacyFormat, sizeof(format)); 24110d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24120d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24130d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return err; 24140d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24150d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eCompressionFormat != OMX_VIDEO_CodingUnused) { 24160d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return OMX_ErrorBadParameter; 24170d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24180d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (!getLegacyFlexibleFormat) { 24190d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24200d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24210d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // standard formats that were exposed to users before 24220d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eColorFormat == OMX_COLOR_FormatYUV420Planar 24230d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar 24240d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 24250d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar 24260d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar) { 24270d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 24280d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24290d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // find best legacy non-standard format 24300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_U32 flexibleEquivalent; 24310d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat == OMX_COLOR_FormatUnused 24320d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 24330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, false /* usingNativeBuffers */, 24340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &flexibleEquivalent) 24350d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && flexibleEquivalent == OMX_COLOR_FormatYUV420Flexible) { 24360d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&legacyFormat, &format, sizeof(format)); 24370d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 24380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 2439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 2440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2444e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 2445e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 2446e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 2447e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 2448e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 24492472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, OMX_VIDEO_CodingHEVC }, 2450e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 2451e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 2452e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 245394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 245494705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 2455e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 2456e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 24575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 24585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 2459e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2460e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2461e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2462e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 2463e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 2464e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2465e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2468e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 2469e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2470e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 2471e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2472e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2473e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 2474e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 2475e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2476e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2477e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2478e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 2479e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 2480e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2481e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2482e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2483e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2484e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 2485e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2486e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 24875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 24885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24895778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 24900d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar const char *mime, const sp<AMessage> &msg, bool haveNativeWindow) { 249189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t width, height; 249289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (!msg->findInt32("width", &width) 249389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar || !msg->findInt32("height", &height)) { 249489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar return INVALID_OPERATION; 249589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 249689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar 24975778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 24985778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 24995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25045778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 2505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 2506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 251189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t tmp; 251289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (msg->findInt32("color-format", &tmp)) { 251389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat = 251489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar static_cast<OMX_COLOR_FORMATTYPE>(tmp); 251589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setVideoPortFormatType( 25160d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar kPortIndexOutput, OMX_VIDEO_CodingUnused, colorFormat, haveNativeWindow); 251789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (err != OK) { 251889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar ALOGW("[%s] does not support color format %d", 251989869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar mComponentName.c_str(), colorFormat); 25200d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 252189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 252289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } else { 25230d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 252489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 2525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t frameRateInt; 253178b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRateFloat; 253278b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findFloat("frame-rate", &frameRateFloat)) { 253378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findInt32("frame-rate", &frameRateInt)) { 253478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateInt = -1; 253578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 253678b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateFloat = (float)frameRateInt; 253778b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 253878b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad 2539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 254078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad kPortIndexInput, width, height, compressionFormat, frameRateFloat); 2541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 2548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25565778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 25575778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 25585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 25595778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 25605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25625778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 25635778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 25645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25655778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 25665778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 25675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25695778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 25705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 25715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25755778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 25765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25775778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 25785778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 25795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25805778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 25815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25825778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 25835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25845778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 25855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25915778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 25925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 25935778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 25945778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 25955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 25965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25985778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 25995778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 26005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26015778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 26025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 26035778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 26045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26065778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 26075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26085778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 26095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 26105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 26115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26135778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 26145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26155778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 26165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26175778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 26185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 26195778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 26205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 26215778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26235778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 26242c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 26255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26275778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 26285778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 2629a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // this is redundant as it was already set up in setVideoPortFormatType 2630a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // FIXME for now skip this only for flexible YUV formats 2631a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar if (colorFormat != OMX_COLOR_FormatYUV420Flexible) { 2632a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar video_def->eColorFormat = colorFormat; 2633a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar } 26345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26355778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 26365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26395778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 26405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 26415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26455778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 26465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26475778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 26485778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 26495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26545778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 26555778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 26565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26585778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 26595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 26605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26645778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 26655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26665778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 26675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26735778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 26745778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 26755778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 26765778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 26775778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 26785778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 26795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 26815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 26825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26845778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 26855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 26865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26905778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 26915778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 26925778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 26935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 26945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 26965778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 26975778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 26985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26995778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 27005778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 27015778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 27025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2703c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad case OMX_VIDEO_CodingHEVC: 2704c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = setupHEVCEncoderParameters(msg); 2705c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad break; 2706c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 270789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 270889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 270989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 271089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 271189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 27125778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 27135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 27145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27165778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 27175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27195778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27210dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 27220dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 27230dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 27240dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 27250dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27260dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 27270dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27280dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 27290dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 27300dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 27310dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 27320dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27330dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27340dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 27350dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27360dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27370dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 27380dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 27390dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 27400dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 27410dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27420dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27430dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 27440dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27450dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 27460dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 27470dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 27480dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27490dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 27500dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 27510dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27520dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 27530dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 27540dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 27550dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 27560dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 27570dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 27585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 27595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 27605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 27615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 27625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 27635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27645778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 27655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 27665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 276896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 276996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 277096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 277196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 277296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 277396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 277496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 277596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 277696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 27785778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 27795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 27805778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 27815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 278496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 278596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27865778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 27875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 27885778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 27895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 27905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27925778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 27935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27955778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 27965778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 27975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 27985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27995778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 28005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 28015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 28075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 28085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 28095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28105778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 28115778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 28145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 28155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 28165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 28185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 28195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 28205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 28215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 28225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 28235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 28245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 28265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 28275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 28285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 28295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28325778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 28335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 28395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 28405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28425778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 28435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 28445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 284996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 28505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28515778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28525778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 28565778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 28575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 28595778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 28605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 28615778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 28625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 286596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 286696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 28675778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 28685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 28695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 28705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 28715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28735778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 28745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28765778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 28775778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 28785778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 28795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 28815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 28825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28875778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 28885778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28905778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 28915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 28925778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 28935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28945778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 28955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28965778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 28975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 28985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 28995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 29005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 29015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29035778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 29045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29095778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 29105778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 29115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29135778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 29145778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 29155778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 29165778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 29175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29185778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 29195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 29205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 292596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 29265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 29325778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 29335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2934a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar// static 2935a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnarint /* OMX_VIDEO_AVCLEVELTYPE */ ACodec::getAVCLevelFor( 2936a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int width, int height, int rate, int bitrate, 2937a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar OMX_VIDEO_AVCPROFILETYPE profile) { 2938a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert bitrate to main/baseline profile kbps equivalent 2939a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar switch (profile) { 2940a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh10: 2941a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 3000); break; 2942a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh: 2943a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1250); break; 2944a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar default: 2945a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1000); break; 2946a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2947a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2948a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert size and rate to MBs 2949a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar width = divUp(width, 16); 2950a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar height = divUp(height, 16); 2951a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int mbs = width * height; 2952a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar rate *= mbs; 2953a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int maxDimension = max(width, height); 2954a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2955a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar static const int limits[][5] = { 2956a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar /* MBps MB dim bitrate level */ 2957a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 64, OMX_VIDEO_AVCLevel1 }, 2958a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 128, OMX_VIDEO_AVCLevel1b }, 2959a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 3000, 396, 56, 192, OMX_VIDEO_AVCLevel11 }, 2960a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 6000, 396, 56, 384, OMX_VIDEO_AVCLevel12 }, 2961a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 768, OMX_VIDEO_AVCLevel13 }, 2962a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 2000, OMX_VIDEO_AVCLevel2 }, 2963a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 19800, 792, 79, 4000, OMX_VIDEO_AVCLevel21 }, 2964a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 20250, 1620, 113, 4000, OMX_VIDEO_AVCLevel22 }, 2965a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 40500, 1620, 113, 10000, OMX_VIDEO_AVCLevel3 }, 2966a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 108000, 3600, 169, 14000, OMX_VIDEO_AVCLevel31 }, 2967a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 216000, 5120, 202, 20000, OMX_VIDEO_AVCLevel32 }, 2968a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 20000, OMX_VIDEO_AVCLevel4 }, 2969a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 50000, OMX_VIDEO_AVCLevel41 }, 2970a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 522240, 8704, 263, 50000, OMX_VIDEO_AVCLevel42 }, 2971a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 589824, 22080, 420, 135000, OMX_VIDEO_AVCLevel5 }, 2972a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 983040, 36864, 543, 240000, OMX_VIDEO_AVCLevel51 }, 2973a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 2073600, 36864, 543, 240000, OMX_VIDEO_AVCLevel52 }, 2974a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar }; 2975a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2976a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar for (size_t i = 0; i < ARRAY_SIZE(limits); i++) { 2977a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar const int (&limit)[5] = limits[i]; 2978a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar if (rate <= limit[0] && mbs <= limit[1] && maxDimension <= limit[2] 2979a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar && bitrate <= limit[3]) { 2980a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return limit[4]; 2981a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2982a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2983a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return 0; 2984a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar} 2985a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 29865778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 29875778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 29885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 29895778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 29905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 29915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 299396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 299496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 29955778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 29965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 29975778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 29985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 29995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 30005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30015778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 30025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30040dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 30050dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 30060dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 30070dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 30080dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 30090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 30100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 30110dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 30120dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 30130dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 30140dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 30155778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 30165778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 30175778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 30185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30190dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 30205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 30215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30265778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 30275778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 30285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30295778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 30305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 30315778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 30325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 30335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 30345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30365778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 30375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30425778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 30435778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 30445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30465778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 30477c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 30487c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 30497c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 30505778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 30515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 30545778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 30555778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 30565778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 30575778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 30585778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 30595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 30605778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 30615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30625778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 30635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 30645778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 30655778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 30665778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 30675778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 30685778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 30695778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 30705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 30735778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 30745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30765778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 30775778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 30785778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 30795778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 30805778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 30815778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 30825778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 30835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30845778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 30855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 30865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 30875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 30885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 30895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 30905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 309196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 30925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 30935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3094c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachadstatus_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { 3095c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t bitrate, iFrameInterval; 3096c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("bitrate", &bitrate) 3097c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 3098c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3099c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3100c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3101c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 3102c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3103c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad float frameRate; 3104c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findFloat("frame-rate", &frameRate)) { 3105c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t tmp; 3106c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("frame-rate", &tmp)) { 3107c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3108c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3109c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad frameRate = (float)tmp; 3110c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3111c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3112c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_PARAM_HEVCTYPE hevcType; 3113c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad InitOMXParams(&hevcType); 3114c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.nPortIndex = kPortIndexOutput; 3115c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3116c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad status_t err = OK; 3117c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->getParameter( 3118c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 3119c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3120c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3121c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3122c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3123c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t profile; 3124c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (msg->findInt32("profile", &profile)) { 3125c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t level; 3126c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("level", &level)) { 3127c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 3128c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3129c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3130c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = verifySupportForProfileAndLevel(profile, level); 3131c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3132c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3133c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3134c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3135c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); 3136c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); 3137c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3138c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3139c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad // TODO: Need OMX structure definition for setting iFrameInterval 3140c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3141c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->setParameter( 3142c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 3143c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3144c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3145c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3146c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3147c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return configureBitrate(bitrate, bitrateMode); 3148c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad} 3149c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 315089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 315189b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 31524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 31534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 31544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 31554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 31564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 31574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 31584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 31594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 31604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 31614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 31624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 316389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 316489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 316589b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 31664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 316789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 316889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 316989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 31704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 31714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 31724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 31734154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 31744154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 31754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 31774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 31794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 31804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 31814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 31824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 31844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 31854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 31874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 31884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 31894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 31904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 31914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 31924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 31944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 31954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 31964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 31974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 31984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 31994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 32004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 32014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 32024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 32034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 32044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 32054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 32074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 32084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 32094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 32104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 32114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 32124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 32154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 32164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 32174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 32194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 32204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 32214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 32224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 32234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 32244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 32264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 322789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 322889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 322989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 32305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 32315778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 32325778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 32335778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 32345778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 32355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32365778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 32375778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 32395778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 32405778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 32415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 32425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 32455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32475778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 32485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 32495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 32515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 32525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 32555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 325696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 325796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 32585778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 32595778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 32605778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 32615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32625778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 32645778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 32655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 32685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 327096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 32715778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 32725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 32745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 32755778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 32765778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 32775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 32795778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 32805778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 32815778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 32825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32835778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 32845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 32855778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 32865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 32885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 32895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 32905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32915778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 32925778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 32935778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 32945778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 32955778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 32965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 32975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 32985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 32995778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 33005778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 33015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3302f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 3303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 330478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat, 330578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRate) { 3306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 3307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 3308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 3309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 3311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 3313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 3316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 3319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 3320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 3321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 3322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 3326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 3328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 3329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 3332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 333378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (frameRate >= 0) { 333478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 333578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 3336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 3339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 3342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 3345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 3346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 3347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 3350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 3351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3353d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 3354d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 3355d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3356d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3357d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 3358d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3359d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 3360d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 3361d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3362d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3363d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3364d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 3365d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 3366d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 33677e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 33687e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 33697e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33707e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 33717e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 33727e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33737e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 33747e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 33757e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33767e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33777e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33787e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 33797e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 33807e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 33817e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 33827e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 33837e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 33847e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33857e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3386e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 33877e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 3388c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 3389c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 3390c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 3391c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 33927e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 33937e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 33947e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3395f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 3396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 3397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 3399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 3401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3402609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 3403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 3404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 3405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3412f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 3413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 3414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 3415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3417f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 3418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 3419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3421f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 3422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 3423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 3424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 3426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 3427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 3428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar// static 3432229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { 343303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar MediaImage &image = params.sMediaImage; 343403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar memset(&image, 0, sizeof(image)); 343503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 343603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 343703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 0; 343803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 343903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 344003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mWidth = params.nFrameWidth; 344103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mHeight = params.nFrameHeight; 344203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 344303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // only supporting YUV420 344403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (fmt != OMX_COLOR_FormatYUV420Planar && 344503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedPlanar && 344603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420SemiPlanar && 34475a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar && 34485a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != HAL_PIXEL_FORMAT_YV12) { 344903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("do not know color format 0x%x = %d", fmt, fmt); 3450229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 345103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 345203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3453b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // TEMPORARY FIX for some vendors that advertise sliceHeight as 0 3454b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride != 0 && params.nSliceHeight == 0) { 3455b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("using sliceHeight=%u instead of what codec advertised (=0)", 3456b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nFrameHeight); 3457b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nSliceHeight = params.nFrameHeight; 3458b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3459b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 3460b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // we need stride and slice-height to be non-zero 3461b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride == 0 || params.nSliceHeight == 0) { 3462b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 3463b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar fmt, fmt, params.nStride, params.nSliceHeight); 3464b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar return false; 3465b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3466b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 346703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set-up YUV format 346803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 346903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 3; 347003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mBitDepth = 8; 347103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mOffset = 0; 347203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mColInc = 1; 347303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mRowInc = params.nStride; 347403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mHorizSubsampling = 1; 347503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mVertSubsampling = 1; 347603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 34775a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar switch ((int)fmt) { 34785a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 34795a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (params.bUsingNativeBuffers) { 34805a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t ystride = align(params.nStride, 16); 34815a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t cstride = align(params.nStride / 2, 16); 34825a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.Y].mRowInc = ystride; 34835a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 34845a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mOffset = ystride * params.nSliceHeight; 34855a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mColInc = 1; 34865a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mRowInc = cstride; 34875a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 34885a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 34895a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 34905a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mOffset = image.mPlane[image.V].mOffset 34915a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar + (cstride * params.nSliceHeight / 2); 34925a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mColInc = 1; 34935a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mRowInc = cstride; 34945a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 34955a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 34965a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar break; 34975a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } else { 34985a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar // fall through as YV12 is used for YUV420Planar by some codecs 34995a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 35005a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 35015a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case OMX_COLOR_FormatYUV420Planar: 350203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedPlanar: 350303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 350403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 1; 350503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride / 2; 350603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 350703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 350803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 350903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 351003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar + (params.nStride * params.nSliceHeight / 4); 351103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 1; 351203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride / 2; 351303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 351403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 351503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 351603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 351703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420SemiPlanar: 351803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 351903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedSemiPlanar: 352003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // NV12 352103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 352203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 2; 352303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride; 352403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 352503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 352603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 352703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 352803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 2; 352903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride; 353003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 353103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 353203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 353303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 353403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar default: 353503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar TRESPASS(); 353603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 3537229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3538229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3539229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3540229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3541229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeColorFormat( 3542229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3543229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams &describeParams) 3544229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar{ 3545229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_INDEXTYPE describeColorFormatIndex; 3546229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (omx->getExtensionIndex( 3547229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, "OMX.google.android.index.describeColorFormat", 3548229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeColorFormatIndex) != OK || 3549229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar omx->getParameter( 3550229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, describeColorFormatIndex, 3551229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeParams, sizeof(describeParams)) != OK) { 3552229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeDefaultColorFormat(describeParams); 3553229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3554229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeParams.sMediaImage.mType != 3555229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 3556229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3557229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3558229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3559229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::isFlexibleColorFormat( 3560229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 35610d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) { 3562229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams describeParams; 3563229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar InitOMXParams(&describeParams); 3564229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3565229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // reasonable dummy values 3566229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameWidth = 128; 3567229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameHeight = 128; 3568229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nStride = 128; 3569229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nSliceHeight = 128; 35700d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = (OMX_BOOL)usingNativeBuffers; 3571229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3572229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar CHECK(flexibleEquivalent != NULL); 3573229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3574229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (!describeColorFormat(omx, node, describeParams)) { 3575229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3576229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3577229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3578229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const MediaImage &img = describeParams.sMediaImage; 3579229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) { 3580229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mNumPlanes != 3 || 3581229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mHorizSubsampling != 1 || 3582229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mVertSubsampling != 1) { 3583229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3584229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3585229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3586229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // YUV 420 3587229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mPlane[img.U].mHorizSubsampling == 2 3588229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.U].mVertSubsampling == 2 3589229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mHorizSubsampling == 2 3590229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mVertSubsampling == 2) { 3591229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // possible flexible YUV420 format 3592229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mBitDepth <= 8) { 3593229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3594229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3595229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3596229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3597229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3598229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 359903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar} 360003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3601e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 3602e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 360331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 360431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 3605e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 360631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 360731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 360831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 360931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 361031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3611e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 3612e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 361331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 361431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 361531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 361631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 361731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 3618e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 3619e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 3620e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3621e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 3622e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 3623e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3624e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 3625e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 3626e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 3627e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 36280d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (mNativeWindow == NULL) { 36290d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar DescribeColorFormatParams describeParams; 36300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&describeParams); 36310d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.eColorFormat = videoDef->eColorFormat; 36320d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameWidth = videoDef->nFrameWidth; 36330d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameHeight = videoDef->nFrameHeight; 36340d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nStride = videoDef->nStride; 36350d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nSliceHeight = videoDef->nSliceHeight; 36360d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = OMX_FALSE; 36370d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar 36380d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (describeColorFormat(mOMX, mNode, describeParams)) { 36390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar notify->setBuffer( 36400d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar "image-data", 36410d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar ABuffer::CreateAsCopy( 36420d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &describeParams.sMediaImage, 36430d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar sizeof(describeParams.sMediaImage))); 36445a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 36455a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar MediaImage *img = &describeParams.sMediaImage; 36465a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] MediaImage { F(%zux%zu) @%zu+%zu+%zu @%zu+%zu+%zu @%zu+%zu+%zu }", 36475a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mComponentName.c_str(), img->mWidth, img->mHeight, 36485a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc, 36495a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc, 36505a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc); 36510d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 365203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 365303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 365491a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar if (portIndex != kPortIndexOutput) { 365591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar // TODO: also get input crop 365691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar break; 365791a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar } 365891a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar 3659e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 3660e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 366191a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar rect.nPortIndex = portIndex; 3662e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3663e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 366491a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar mNode, 366591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar (portIndex == kPortIndexOutput ? 366691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonOutputCrop : 366791a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonInputCrop), 3668e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 3669e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 3670e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 3671e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 3672e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 3673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 367431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3675e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 3676e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 3677e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 3678e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 3679e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 3680e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 3681e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3682e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 3683577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 3684577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 3685577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 3686e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 3687e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 3688e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3689e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3690e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 36914730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 36924730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP8: 36934730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP9: 36944730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 36954730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 36964730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia InitOMXParams(&vp8type); 36974730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia vp8type.nPortIndex = kPortIndexOutput; 36984730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia status_t err = mOMX->getParameter( 36994730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia mNode, 37004730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 37014730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia &vp8type, 37024730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia sizeof(vp8type)); 37034730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 37044730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (err == OK) { 37054730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia AString tsSchema = "none"; 37064730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (vp8type.eTemporalPattern 37074730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 37084730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia switch (vp8type.nTemporalLayerCount) { 37094730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 1: 37104730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37114730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.1-layer"; 37124730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37134730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37144730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 2: 37154730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37164730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.2-layer"; 37174730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37184730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37194730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 3: 37204730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37214730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.3-layer"; 37224730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37234730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37244730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia default: 37254730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 37264730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 37274730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37284730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37294730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37304730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia notify->setString("ts-schema", tsSchema); 37314730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37324730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia // Fall through to set up mime. 37334730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 37344730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 3735e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 3736e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3737e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 3738e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3739e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 3740e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 3741e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 3742e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 3743e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 3744e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3745e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3746e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 374731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3748e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 3749e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 37505a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] %s format is %s", mComponentName.c_str(), 37515a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar portIndex == kPortIndexInput ? "input" : "output", 37525a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar notify->debugString().c_str()); 37535a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 375431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 375531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 375631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 375731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 375831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 375931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 376031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 376197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 3762e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 3763e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3764e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 3765e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3766e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3767e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3768e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3769e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 3770e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3771e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3772e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 377314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 3774e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 3775e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 377614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 377714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 377814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 377914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 378014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 378114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 3782e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3783e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 3784e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3785e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 3786e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3787e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 3788e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 37898b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 3790e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 37918b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 37929806555d3930be43e11106281dee354820ac1c88Andreas Huber 3793e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 3794e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3795e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 3796e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3797e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3798e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3799e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3800e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 3801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 3805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 3811e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3812e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 3813e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3814e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 38159806555d3930be43e11106281dee354820ac1c88Andreas Huber 3816e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3817e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 3818e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3819e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3820e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3821e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 3822e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 3823e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3824e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 3825e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3826e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 3827e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 3828e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3829e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 3830e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 3832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 3837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 3839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3840e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 3844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 3848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3853e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 3854e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3855e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 3856e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3857e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3858e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3859e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3860e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 3861e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3862e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3863e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3864e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 3865e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3866e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3867e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3868e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3869e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3870e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 3871e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3872e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 3873e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3874e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3875e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3876e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3877e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 3878e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3879e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3880e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3881e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 3882e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3883e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3884e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3885e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3886e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 388797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 388897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 388997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 389097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 3891e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 389297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 389397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 389497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 389597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 389697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 389797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 389897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 389997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 390097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 390197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 390297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 390397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 3904e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 39058a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad case OMX_AUDIO_CodingAndroidEAC3: 39068a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { 39078a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE params; 39088a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(¶ms); 39098a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad params.nPortIndex = portIndex; 39108a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39118a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad CHECK_EQ((status_t)OK, mOMX->getParameter( 39128a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 39138a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 39148a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ¶ms, 39158a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(params))); 39168a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39178a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setString("mime", MEDIA_MIMETYPE_AUDIO_EAC3); 39188a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("channel-count", params.nChannels); 39198a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("sample-rate", params.nSampleRate); 39208a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad break; 39218a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 39228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 39238c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian case OMX_AUDIO_CodingAndroidOPUS: 39248c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian { 39258c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian OMX_AUDIO_PARAM_ANDROID_OPUSTYPE params; 39268c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian InitOMXParams(¶ms); 39278c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian params.nPortIndex = portIndex; 39288c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 39298c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian CHECK_EQ((status_t)OK, mOMX->getParameter( 39308c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian mNode, 39318c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, 39328c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian ¶ms, 39338c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian sizeof(params))); 39348c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 39358c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); 39368c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("channel-count", params.nChannels); 39378c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("sample-rate", params.nSampleRate); 39388c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian break; 39398c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian } 39408c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 394110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang case OMX_AUDIO_CodingG711: 394210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang { 394310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang OMX_AUDIO_PARAM_PCMMODETYPE params; 394410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang InitOMXParams(¶ms); 394510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang params.nPortIndex = portIndex; 394610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 394710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang CHECK_EQ((status_t)OK, mOMX->getParameter( 394810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mNode, 394910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang (OMX_INDEXTYPE)OMX_IndexParamAudioPcm, 395010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang ¶ms, 395110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang sizeof(params))); 395210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 395310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang const char *mime = NULL; 395410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang if (params.ePCMMode == OMX_AUDIO_PCMModeMULaw) { 395510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_MLAW; 395610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else if (params.ePCMMode == OMX_AUDIO_PCMModeALaw) { 395710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_ALAW; 395810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else { // params.ePCMMode == OMX_AUDIO_PCMModeLinear 395910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_RAW; 396010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 396110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setString("mime", mime); 396210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("channel-count", params.nChannels); 396310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("sample-rate", params.nSamplingRate); 396410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang break; 396510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 396641d3f579d2c166984958263533284209b90c87d5Marco Nelissen 396741d3f579d2c166984958263533284209b90c87d5Marco Nelissen case OMX_AUDIO_CodingGSMFR: 396841d3f579d2c166984958263533284209b90c87d5Marco Nelissen { 396941d3f579d2c166984958263533284209b90c87d5Marco Nelissen OMX_AUDIO_PARAM_MP3TYPE params; 397041d3f579d2c166984958263533284209b90c87d5Marco Nelissen InitOMXParams(¶ms); 397141d3f579d2c166984958263533284209b90c87d5Marco Nelissen params.nPortIndex = portIndex; 397241d3f579d2c166984958263533284209b90c87d5Marco Nelissen 397341d3f579d2c166984958263533284209b90c87d5Marco Nelissen CHECK_EQ(mOMX->getParameter( 397441d3f579d2c166984958263533284209b90c87d5Marco Nelissen mNode, OMX_IndexParamAudioPcm, 397541d3f579d2c166984958263533284209b90c87d5Marco Nelissen ¶ms, sizeof(params)), 397641d3f579d2c166984958263533284209b90c87d5Marco Nelissen (status_t)OK); 397741d3f579d2c166984958263533284209b90c87d5Marco Nelissen 397841d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MSGSM); 397941d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("channel-count", params.nChannels); 398041d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("sample-rate", params.nSampleRate); 398141d3f579d2c166984958263533284209b90c87d5Marco Nelissen break; 398210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 398310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 3984e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 3985e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 3986e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 3987e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 398831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 398931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 399031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 399131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 399231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 399331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 399431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3995e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 3996e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 3997e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3998e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 39994e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> notify = mBaseOutputFormat->dup(); 4000e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 4001e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4002e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 4003e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4004e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 4005e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 4006e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 4007e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 4008e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 4009e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 4010e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 4011e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 4012e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 4013e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 4014e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 4015e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 4016e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 4017e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 4018e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 4019e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 4020e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 4021e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 4022ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGW("Replacing SkipCutBuffer holding %zu bytes", prevbufsize); 4023e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4024e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4025e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 4026e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 4027e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 4028e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 4029e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 403031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 403131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 403231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 403331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 403431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 40355778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 4036cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 4037d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatError); 4038251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGE("signalError(omxError %#x, internalError %d)", error, internalError); 4039251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 4040251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (internalError == UNKNOWN_ERROR) { // find better error code 4041251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const status_t omxStatus = statusFromOMXError(error); 4042251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (omxStatus != 0) { 4043251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung internalError = omxStatus; 4044251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 4045251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", error); 4046251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4047251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 40485778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 4049251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung notify->setInt32("actionCode", ACTION_CODE_FATAL); // could translate from OMX error. 4050cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 4051cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 4052cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 4053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4055eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 4056eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4057eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4058496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 4059496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 4060496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 4061496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4062496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4063496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 4064496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 4065496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4066496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 4067496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 4068496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4069496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 4070496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 4071496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 4072496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 4073496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 4074496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 4075496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4076eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 4077eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 4078eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 4079eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 4080eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4081eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4082eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 4083eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 4084eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4085eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4086eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 4087eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 4088eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4089eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4090eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 4091eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 4092eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4093eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4094eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4095eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4096f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 4097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 4098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 4099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4101ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 4102ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 4104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4106f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 4107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 4109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 4111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 4115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 4117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 4121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 4123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41251dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar case ACodec::kWhatSetSurface: 41261dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar { 41271dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AReplyToken> replyID; 41281dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar CHECK(msg->senderAwaitsResponse(&replyID)); 41291dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41301dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<RefBase> obj; 41311dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar CHECK(msg->findObject("surface", &obj)); 41321dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41331dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar status_t err = mCodec->handleSetSurface(static_cast<Surface *>(obj.get())); 41341dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41351dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar sp<AMessage> response = new AMessage; 41361dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar response->setInt32("err", err); 41371dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar response->postReply(replyID); 41381dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar break; 41391dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar } 41401dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar 41417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 4142d291c222357303b9611cab89d0c3b047584ef377Chong Zhang case ACodec::kWhatUsePersistentInputSurface: 41437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 41447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 4145251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This may result in an app illegal state exception. 41467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 41477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 41487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 41497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4151ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 4152ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 4153251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This will result in kFlagSawMediaServerDie handling in MediaCodec. 4154ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 4155ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 4156ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 4157ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4158ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 415930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 416030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 416130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGI("[%s] forcing the release of codec", 416230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str()); 416330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar status_t err = mCodec->mOMX->freeNode(mCodec->mNode); 416430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGE_IF("[%s] failed to release codec instance: err=%d", 416530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str(), err); 416630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 416730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 416830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->post(); 416930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 417030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 417130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4179f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 4180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 4181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 4182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41835e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 41845e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 4185ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar if (mCodec->mNode == 0) { 41865e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 41875e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 41885e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 41895e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 41905e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 4191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 4192609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 4193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 4194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 4197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 4199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 4201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 4202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42030af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 42040af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 42050af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 42060af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 42070af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 42080af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 42090af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 42100af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 42110af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 42120af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 42130af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 4215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 4216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 4217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 4218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 4221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4223609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 4229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4231609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 4240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 4242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 4244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 4245784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 4246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4254f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 4255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 4257ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] EVENT(%d, 0x%08x, 0x%08x)", 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4263ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("[%s] ERROR(0x%08x)", mCodec->mComponentName.c_str(), data1); 4264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4265251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // verify OMX component sends back an error we expect. 4266251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung OMX_ERRORTYPE omxError = (OMX_ERRORTYPE)data1; 4267251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (!isOMXError(omxError)) { 4268251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", omxError); 4269251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung omxError = OMX_ErrorUndefined; 4270251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4271251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(omxError); 4272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4276f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 4277ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] onOMXEmptyBufferDone %u", 4278349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4279349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 4282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 428696e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // We're in "store-metadata-in-buffers" mode, the underlying 428796e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // OMX component had access to data that's implicitly refcounted 428896e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // by this "MediaBuffer" object. Now that the OMX component has 428996e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // told us that it's done with the input buffer, we can decrement 429096e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // the mediaBuffer's reference count. 429196e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia info->mData->setMediaBufferBase(NULL); 4292d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 4294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 4307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4314f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 4315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4322d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFillThisBuffer); 4323609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 4324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 43262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 4327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43281d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec); 4329609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4338f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 4339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4340609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 43412d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 4342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 43435778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 4344a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 43455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 4347a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 4348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 4349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43507fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 43517fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 43527fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 43537fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 43547fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 43557fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 43567fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 43577fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 43583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43592d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 4360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43625778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 43635778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 43645778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 43655778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 43665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 4369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 4370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 4377dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 4378dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4379dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4380dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 4388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 4392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 4394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 4395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 4396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 43995778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 44005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 44015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 4403ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] Needs to copy input data for buffer %u. (%p != %p)", 4404d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 4405d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 4406d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 4407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 4409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 4410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 4413ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ codec specific data", 4414078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 44155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 4416ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ EOS", 44175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 4418078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 4419d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4420ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGI("[%s] calling emptyBuffer %u w/ time %lld us", 4421ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), bufferID, (long long)timeUs); 4422d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 4423ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u w/ time %lld us", 4424ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), bufferID, (long long)timeUs); 4425d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4426078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 4427349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4428d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4429d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 4430d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 4431d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 4432d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 4433d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4434d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4435054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4436054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 4437054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 4438054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4439054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 4440054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 4441054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 4442054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 4443054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 4444e53350373ac516257b4f8956ff1e3f1ac48f607eLajos Molnar mCodec->submitOutputMetaDataBuffer(); 4445054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4446054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4447054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 4453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 4454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 44605778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 44615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 44625778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 44635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 44645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 44655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 44665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 44675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 4469dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 44703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 4471dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 4472dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 4473dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 44743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 4475dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 4476dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4478ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling emptyBuffer %u signalling EOS", 4479349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4480349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4493dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4497625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 4498625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 4499625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4500625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 4501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4504f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 4505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 4510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 4515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 4516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 4517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 4520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 4522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 4523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 4527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 4531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4533f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 4534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 4535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 4536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 4537784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 4538609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 45395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 4540349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4542d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4543d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4544d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 4545d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 4546d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 4547d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 4548d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4549d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 4550d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 4551d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 4552d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4553d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 4554d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 4555d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 4556d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4557d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4563054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 4564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4574a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (rangeLength == 0 && (!(flags & OMX_BUFFERFLAG_EOS) 4575a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || mCodec->mPortEOS[kPortIndexOutput])) { 4576609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 45775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4578349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 45795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 45805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 45815778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 4582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45835778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 45845778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 45855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 458631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4587577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 45881d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec); 4589577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 45904bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 4591577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 45925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4594308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 4595308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 4596308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 4597308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 4598308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 4599308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 4600308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 4601308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 4602308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 4603496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 460421ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 4605496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 4606496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 4607496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 46085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 460921ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 4610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46118b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 46128b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 46138b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 46145778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 4615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4617d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); 4618609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 46192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 46205778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 4621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4622609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46245778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 4625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46265778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 46275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 46285778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 4629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 46315778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 46325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4634d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatEOS); 4635dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 4636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 4639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4656f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 4657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4658609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 4659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 4663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4664577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 4665577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 4666577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 4667577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 4668577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 4669577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 4670577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 4671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 4672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 46736aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 467479ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 46756fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 4676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 4677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4678fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 4679fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 4680fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 4681fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 4682fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 4683fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 4684fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 4685fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 468647aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 4687fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 4688fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4689fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 4690fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4691fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46925778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4693fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 4694fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 4695fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 4696fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4697fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 4699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 47001e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 4701cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 4702cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 4703251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4704cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4705cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 4706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 47076fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 47086fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 47096fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 47106fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 4720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 4733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4740c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 4741609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 4742c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4743349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4744c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4745c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 4746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4747c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4748c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4766f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 4767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4770c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 4771c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 4772ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4773ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 4774f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen IInterface::asBinder(mCodec->mOMX)->unlinkToDeath(mDeathNotifier); 4775ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4776ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4777ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4778ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 4779ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mNode = 0; 4780ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 4781ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 4782ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 4783308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 4784ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 4785c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4786c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4787f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 4788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 4792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47995778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 48005778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 48015778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 48025778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 48035778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 48045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 4807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4808c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4809c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4810c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 481154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 481254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 4813c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4815d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 4816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4819c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 4823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4825d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4829c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 483230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 483330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 483430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // nothing to do, as we have already signaled shutdown 483530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar handled = true; 483630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 483730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 483830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4846f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 4847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4848c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 4849c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 4850c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 4851c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 48525778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 48535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4854c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 48555778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 48565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4857ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar CHECK(mCodec->mNode == 0); 48585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 486048a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung if (client.connect() != OK) { 486148a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung mCodec->signalError(OMX_ErrorUndefined, NO_INIT); 486248a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung return false; 486348a31bf3f1c1ed5953a4e64f71cdf528f3a38ee5Andy Hung } 4864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 4866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48671d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec); 4868ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4869ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 4870f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen if (IInterface::asBinder(omx)->linkToDeath(mDeathNotifier) != OK) { 4871ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 4872ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 4873ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4874ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4875ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4876e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 48775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 4879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48805778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4881d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 48827791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen int32_t encoder = false; 48835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 4884e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 4885e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 4886e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 4887afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4888e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 4889e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 4890e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 4891afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 48925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 48935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 48945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 48965778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 48975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48995778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 49005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 49015778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 49025778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 49035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 4904e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 49055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 49061065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49071065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 4908ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar IOMX::node_id node = 0; 49091065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49109f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu status_t err = OMX_ErrorComponentNotFound; 49111065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 49121065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 4913e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 4914e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 4915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4916da153975581fb3161a30452348a5b26ee72d9255Elliott Hughes pid_t tid = gettid(); 4917078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 4918078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 49199f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu err = omx->allocateNode(componentName.c_str(), observer, &node); 4920078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 4921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49221065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 49231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 49247a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He } else { 49257a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He ALOGW("Allocating component '%s' failed, try next one.", componentName.c_str()); 49261065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49271065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4928ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar node = 0; 49291065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49301065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4931ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar if (node == 0) { 49325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 49339f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate a %scoder for type '%s' with err %#x.", 49349f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu encoder ? "en" : "de", mime.c_str(), err); 49355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 49369f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate codec '%s' with err %#x.", componentName.c_str(), err); 49375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4938c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 493952e88b2986536e83a7a6da63461556b8734a85f3Ronghua Wu mCodec->signalError((OMX_ERRORTYPE)err, makeNoSideEffectStatus(err)); 4940c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 4941c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49431d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar notify = new AMessage(kWhatOMXMessage, mCodec); 4944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 4945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 4947ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 4948ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4949ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 4950ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 49511713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mCodec->mFlags |= kFlagIsGrallocUsageProtected; 49520167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 4953ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 4954ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4955afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 4956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 4957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 4958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49595778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 49605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4961d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentAllocated); 49625778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 49635778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 49645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4965c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4966c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4967c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4968c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 49695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 49705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4971c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4972c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4973c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 4974c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 4975c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4976c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4977c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 4978c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 4979c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4980f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4981f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4982f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4983f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 4984f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4985054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 4986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4987a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 4988e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 4989e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 49904e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mCodec->mBaseOutputFormat.clear(); 4991054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4992c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 4993c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 4994c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4995c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 4996c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 4997c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4998c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4999c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 500054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 5001f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia 5002f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia mCodec->processDeferredMessages(); 5003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 5006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 5007c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 5008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 5010c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5011c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 501254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 501354b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 5014d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 501554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 501654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 501754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 5018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 5021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 5022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 5024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 5025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5026c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 5027c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5028c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5029c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5030c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 50317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 50327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 50337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 50347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 50357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 50367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 50377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5038d291c222357303b9611cab89d0c3b047584ef377Chong Zhang case ACodec::kWhatUsePersistentInputSurface: 5039d291c222357303b9611cab89d0c3b047584ef377Chong Zhang { 5040d291c222357303b9611cab89d0c3b047584ef377Chong Zhang onUsePersistentInputSurface(msg); 5041d291c222357303b9611cab89d0c3b047584ef377Chong Zhang handled = true; 5042d291c222357303b9611cab89d0c3b047584ef377Chong Zhang break; 5043d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5044d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5045c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 5046c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5047c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 5048c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5049c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5050c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5051c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5052c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 5053c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5054c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5055c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5056c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5057c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 505854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5059c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 5060c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5061c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5062c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5063c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5064c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5065c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 5066c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5067c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5068d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5069c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 5070c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5071c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5072c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5073c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5074c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5075c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 5076c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 5077c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5078c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5079c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 5080c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5081c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5082c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 50835778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 50845778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 50855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5086ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar CHECK(mCodec->mNode != 0); 50875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50885778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 50895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 50905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50915778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 50925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5094c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 5095c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 5096c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 5097251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5098c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 50995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51015778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 51025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5103d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentConfigured); 5104e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 5105e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 51065778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 51075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5108c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5109c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 51105778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 51115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5112d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t ACodec::LoadedState::setupInputSurface() { 5113d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t err = OK; 5114a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5115d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mRepeatFrameDelayUs > 0ll) { 5116a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 5117a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 5118a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 5119a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 5120a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 5121a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 5122a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5123a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 5124a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 5125a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 5126a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 5127a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 5128d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 5129a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5130a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5131a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5132d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mMaxPtsGapUs > 0ll) { 513394ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 513494ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 513594ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 513694ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 513794ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 513894ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 513994ee4b708acfa941581160b267afb79192b1d816Chong Zhang 514094ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 514194ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 514272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 514372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 5144d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 51452c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51462c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51472c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 5148d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mMaxFps > 0) { 514937b2b389139ed638831e49708c947863eef631efRonghua Wu err = mCodec->mOMX->setInternalOption( 515037b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mNode, 515137b2b389139ed638831e49708c947863eef631efRonghua Wu kPortIndexInput, 515237b2b389139ed638831e49708c947863eef631efRonghua Wu IOMX::INTERNAL_OPTION_MAX_FPS, 515337b2b389139ed638831e49708c947863eef631efRonghua Wu &mCodec->mMaxFps, 515437b2b389139ed638831e49708c947863eef631efRonghua Wu sizeof(mCodec->mMaxFps)); 515537b2b389139ed638831e49708c947863eef631efRonghua Wu 515637b2b389139ed638831e49708c947863eef631efRonghua Wu if (err != OK) { 515737b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGE("[%s] Unable to configure max fps (err %d)", 515837b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mComponentName.c_str(), 515937b2b389139ed638831e49708c947863eef631efRonghua Wu err); 5160d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 516137b2b389139ed638831e49708c947863eef631efRonghua Wu } 516237b2b389139ed638831e49708c947863eef631efRonghua Wu } 516337b2b389139ed638831e49708c947863eef631efRonghua Wu 5164d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mTimePerCaptureUs > 0ll 51652c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 51662c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 51672c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 51682c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 51692c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 51702c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 51712c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 51722c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 51732c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 51742c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 51752c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 51762c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 51772c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 51782c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 51792c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 5180d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 51812c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51822c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 518372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5184d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (mCodec->mCreateInputBuffersSuspended) { 518572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 518672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 518772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 518872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 518972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 519072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 519172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 519272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 519372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 519472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 519594ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 519694ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 5197d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 519894ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 519994ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 520094ee4b708acfa941581160b267afb79192b1d816Chong Zhang 5201d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 5202d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 5203d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5204d291c222357303b9611cab89d0c3b047584ef377Chong Zhangvoid ACodec::LoadedState::onCreateInputSurface( 5205d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<AMessage> & /* msg */) { 5206d291c222357303b9611cab89d0c3b047584ef377Chong Zhang ALOGV("onCreateInputSurface"); 5207d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5208d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<AMessage> notify = mCodec->mNotify->dup(); 5209d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated); 5210d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5211d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferProducer> bufferProducer; 5212d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t err = mCodec->mOMX->createInputSurface( 5213d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mNode, kPortIndexInput, &bufferProducer); 5214d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5215d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err == OK) { 5216d291c222357303b9611cab89d0c3b047584ef377Chong Zhang err = setupInputSurface(); 5217d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5218d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 52197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 52207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 52217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 52227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 52237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 52247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 52257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 52267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 52277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 52287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 52297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 52307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 52317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 52327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5233d291c222357303b9611cab89d0c3b047584ef377Chong Zhangvoid ACodec::LoadedState::onUsePersistentInputSurface( 5234d291c222357303b9611cab89d0c3b047584ef377Chong Zhang const sp<AMessage> &msg) { 5235d291c222357303b9611cab89d0c3b047584ef377Chong Zhang ALOGV("onUsePersistentInputSurface"); 5236d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5237d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<AMessage> notify = mCodec->mNotify->dup(); 5238d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("what", CodecBase::kWhatInputSurfaceAccepted); 5239d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5240d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<RefBase> obj; 5241d291c222357303b9611cab89d0c3b047584ef377Chong Zhang CHECK(msg->findObject("input-surface", &obj)); 5242d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<PersistentSurface> surface = static_cast<PersistentSurface *>(obj.get()); 5243d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5244d291c222357303b9611cab89d0c3b047584ef377Chong Zhang status_t err = mCodec->mOMX->usePersistentInputSurface( 5245d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mNode, kPortIndexInput, surface->getBufferConsumer()); 5246d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5247d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err == OK) { 5248d291c222357303b9611cab89d0c3b047584ef377Chong Zhang err = setupInputSurface(); 5249d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5250d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5251d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err != OK) { 5252d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // Can't use mCodec->signalError() here -- MediaCodec won't forward 5253d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // the error through because it's in the "configured" state. We 5254d291c222357303b9611cab89d0c3b047584ef377Chong Zhang // send a kWhatInputSurfaceAccepted with an error value instead. 5255d291c222357303b9611cab89d0c3b047584ef377Chong Zhang ALOGE("[%s] onUsePersistentInputSurface returning error %d", 5256d291c222357303b9611cab89d0c3b047584ef377Chong Zhang mCodec->mComponentName.c_str(), err); 5257d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->setInt32("err", err); 5258d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 5259d291c222357303b9611cab89d0c3b047584ef377Chong Zhang notify->post(); 5260d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 5261d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 5262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 52635778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 52645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 52655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 52665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 5270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5274f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 5275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5278f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 52793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 5280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5281cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5282cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 528329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 5284cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 5285cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5286cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5287251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 528891bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 528991bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 5290cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5293f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 5294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 5295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 5297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 5298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 5301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5303f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 530572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53126507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 53136507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 53146507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 53156507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 53166507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 53176507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 53186463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 53196463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 53206463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 53216463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 53226463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 53236463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 53246463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 53256463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 53266463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 53276463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 5328d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 53296463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 53306463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 53316463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 53326463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 5333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5338f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 5339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 5348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 5351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5362f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 5363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5366f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 53673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 5368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5370f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 537272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5379d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 5380d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5381d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 5382d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5383d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5384d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5385d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 5386d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5387d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 5388d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5389d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5390d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 5391d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5392d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5393d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5394d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 53956507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 53966507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 53976507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 53986507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 53996507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 54006507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5406f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 5407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 5413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 5415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5427f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 5428349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 5429349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 5430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5432f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 5433ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 5434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5437054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 5438054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 5439054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 5440054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 5441054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 5442054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5443054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 5444054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 5445054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 5446054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5447054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 54484dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 54494dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 54504dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 5451054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5452054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5453054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 5454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 5455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 5456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 5458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 5459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 5460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 5462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 5463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 5466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5468ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] calling fillBuffer %u", 5469349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 5470349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 5472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 5475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5478054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 5479c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 5480054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 5481054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 5482054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5483054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5484054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5485f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 5486349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 54873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 5488349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5489349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5490349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 5491349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5492349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 5494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54953cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar // Post all available input buffers 5496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 54973cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); i++) { 54983cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 54993cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_US) { 55003cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar postFillThisBuffer(info); 55013cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 55023cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 5503349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5504349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 5505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5507f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 55083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 5509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 5511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5513f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5519c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5520c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5521c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5522c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5523c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 552454b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5525c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 5526c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5527349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5528349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 5534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 55417a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 5542ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar "(codec owns %zu/%zu input, %zu/%zu output).", 5543d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 5544d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 5545d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 5546d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 5547d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 5548d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5549349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5550349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 5553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 5556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 5561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 5563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5568496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 5569496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 5570496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 5571496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 5572496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 5573496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5574496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5575496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 5576496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 5577496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5578496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5579a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 5580a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 5581a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 5582a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 5583a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5584a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 5585a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5586a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 5587a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 5588a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 5589a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 5590a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5591a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5592a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 5593a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 5594a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5595a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 55967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 55977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 55986507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 55997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 56007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 56017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 56027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 56034dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 56044dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 56054dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 56064dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 56074dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 56084dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 56094dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 56104dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 56114dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56124dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56134dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 56144dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 56154dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5624a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 5625a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 5626530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 5627a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 5628a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 5629a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 5630a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 5631a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5632a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 5633a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 5634a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 5635a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 5636a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 5637a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5638a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 5639a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 5640a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 5641a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5642a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 5643a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5644a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5645a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 564672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 564772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 564872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 564972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 565072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 565172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 565272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 565372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 565472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 565572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 565672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 565772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 565872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 565972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 566072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 566172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5662e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 5663e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 5664e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 5665e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5666b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 5667b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 5668e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 5669e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 5670e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 5671e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 5672b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 5673b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5674b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5675b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 5676b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5677b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5678b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5679b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5680b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 5681b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 5682b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 5683b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5684b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5685b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 5686b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5687b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5688e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 5689e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 56908db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu float rate; 56918db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu if (params->findFloat("operating-rate", &rate) && rate > 0) { 56928db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu status_t err = setOperatingRate(rate, mIsVideo); 56938db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu if (err != OK) { 56948db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu ALOGE("Failed to set parameter 'operating-rate' (err %d)", err); 56958db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu return err; 56968db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu } 56978db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu } 56988db8813d39e3c8b5fbd580dfc3062830744afd63Ronghua Wu 5699a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 5700a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 5701a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 57026507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 57036507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 5704d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatSignaledInputEOS); 57056507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 57066507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 57076507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 57086507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 57096507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 57106507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 57116507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 57126507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5713f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 5714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 5717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 5719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 572031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 5721054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 5722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 5724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 5725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5727349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 5728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 573031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 573131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5733ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08x", 5734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 5735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 5741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5752f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 5753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 5754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5757f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 5758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 5759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 5760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 5761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 5764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5768f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 5769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5775349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 5776e6eea3a6b6e0cf92287ec1ceb8350f201d17e1acPer Persson case kWhatSetParameters: 5777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5778349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 57793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 5780349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5781349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5795f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 57963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 5797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5800f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 5801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 5806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 5809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 5812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 5813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 5816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5818cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5819cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 5820cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 582129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 5822cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 5823cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5824cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5825251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5826d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5827755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 5828755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 5829755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 5830755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 5831755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 5832755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 5833755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 5834755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5835cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 5839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 584131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 584231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 58433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 5844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5846349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 5847349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 5848349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5849349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5865f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 58665778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 58675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 5868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5870f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5898f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 58993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 590031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 59015778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 590231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5905f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 5906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 59145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5920349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5921349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 5922349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5923349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 5924349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5925349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5926349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 59310af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 5932f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 59335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 5934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 5936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 5939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 5940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59410167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 59420167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 5943bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 5944bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 5945bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 5946bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 5947b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar pushBlankBuffersToNativeWindow(mCodec->mNativeWindow.get()); 5948bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 5949bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 5950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 5951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5954f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 5955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5961f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 5962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5970f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 5971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5974f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 5975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 6000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6002f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 60033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 6004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6006f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 6007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 6008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 6009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 6010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 6012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 6013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 6015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 6021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 6025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6026f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 6027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 6028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6030f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 60313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 6032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 6034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6036f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 6037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 6038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 6040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 6041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 6043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 6047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 6049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 6050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 6055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 6056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 6059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6061f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 6062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 6063ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("[%s] FlushingState onOMXEvent(%u,%d)", 6064ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar mCodec->mComponentName.c_str(), event, (OMX_S32)data1); 6065d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 6066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 6067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 6068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 6070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 6072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 6073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 6074e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 6075e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 6076e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 6077e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 6078e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 6079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 6080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 6081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 6082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 6083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6090349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 6091349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 60921d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec); 6093349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 6094609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 6095349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 6096349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 6097349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 6098349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 60993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 6100349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 6101349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6102349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 6103349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6104349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 6105349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 6106349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 6109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6114f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 6115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 6116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6120f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 6121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 6122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6126f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 6127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 6128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 6129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 61307e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 61317e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 61327e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 61337e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 6134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 6135d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 6136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 6137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 6139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 6140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6141dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 6142dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 6143f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 6144f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 6145f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 6146f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 6147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 6148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 6152