17f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar/* 27f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Copyright (C) 2013 The Android Open Source Project 37f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * 47f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 57f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * you may not use this file except in compliance with the License. 67f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * You may obtain a copy of the License at 77f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * 87f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 97f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * 107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * Unless required by applicable law or agreed to in writing, software 117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * See the License for the specific language governing permissions and 147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar * limitations under the License. 157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar */ 167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 17db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn#include <inttypes.h> 18db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn 197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar//#define LOG_NDEBUG 0 207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#define LOG_TAG "SoftVideoDecoderOMXComponent" 217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/Log.h> 227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include "include/SoftVideoDecoderOMXComponent.h" 247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 25031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu#include <media/hardware/HardwareAPI.h> 267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/foundation/ADebug.h> 277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/foundation/ALooper.h> 287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/foundation/AMessage.h> 29a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/MediaDefs.h> 317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android { 337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnartemplate<class T> 357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstatic void InitOMXParams(T *params) { 367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar params->nSize = sizeof(T); 377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar params->nVersion.s.nVersionMajor = 1; 387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar params->nVersion.s.nVersionMinor = 0; 397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar params->nVersion.s.nRevision = 0; 407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar params->nVersion.s.nStep = 0; 417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarSoftVideoDecoderOMXComponent::SoftVideoDecoderOMXComponent( 447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *name, 457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *componentRole, 467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE codingType, 477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *profileLevels, 487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t numProfileLevels, 497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t width, 507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t height, 517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const OMX_CALLBACKTYPE *callbacks, 527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_PTR appData, 537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_COMPONENTTYPE **component) 547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar : SimpleSoftOMXComponent(name, callbacks, appData, component), 55031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mIsAdaptive(false), 56031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxWidth(0), 57031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxHeight(0), 587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mWidth(width), 597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mHeight(height), 607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mCropLeft(0), 617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mCropTop(0), 627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mCropWidth(width), 637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mCropHeight(height), 647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mOutputPortSettingsChange(NONE), 65a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar mMinInputBufferSize(384), // arbitrary, using one uncompressed macroblock 66a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar mMinCompressionRatio(1), // max input size is normally the output size 677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mComponentRole(componentRole), 687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mCodingType(codingType), 697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mProfileLevels(profileLevels), 707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mNumProfileLevels(numProfileLevels) { 717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::initPorts( 747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 numInputBuffers, 757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 inputBufferSize, 767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 numOutputBuffers, 77a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const char *mimeType, 78a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_U32 minCompressionRatio) { 79a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar mMinInputBufferSize = inputBufferSize; 80a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar mMinCompressionRatio = minCompressionRatio; 81a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 827f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_PARAM_PORTDEFINITIONTYPE def; 837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar InitOMXParams(&def); 847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nPortIndex = kInputPortIndex; 867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.eDir = OMX_DirInput; 877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferCountMin = numInputBuffers; 887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferCountActual = def.nBufferCountMin; 897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferSize = inputBufferSize; 907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bEnabled = OMX_TRUE; 917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bPopulated = OMX_FALSE; 927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.eDomain = OMX_PortDomainVideo; 937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bBuffersContiguous = OMX_FALSE; 947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferAlignment = 1; 957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.cMIMEType = const_cast<char *>(mimeType); 977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.pNativeRender = NULL; 987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar /* size is initialized in updatePortDefinitions() */ 997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.nBitrate = 0; 1007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.xFramerate = 0; 1017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.bFlagErrorConcealment = OMX_FALSE; 1027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.eCompressionFormat = mCodingType; 1037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.eColorFormat = OMX_COLOR_FormatUnused; 1047f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.pNativeWindow = NULL; 1057f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar addPort(def); 1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nPortIndex = kOutputPortIndex; 1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.eDir = OMX_DirOutput; 1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferCountMin = numOutputBuffers; 1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferCountActual = def.nBufferCountMin; 1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bEnabled = OMX_TRUE; 1137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bPopulated = OMX_FALSE; 1147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.eDomain = OMX_PortDomainVideo; 1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.bBuffersContiguous = OMX_FALSE; 1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.nBufferAlignment = 2; 1177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.cMIMEType = const_cast<char *>("video/raw"); 1197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.pNativeRender = NULL; 1207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar /* size is initialized in updatePortDefinitions() */ 1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.nBitrate = 0; 1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.xFramerate = 0; 1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.bFlagErrorConcealment = OMX_FALSE; 1247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 1257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar; 1267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar def.format.video.pNativeWindow = NULL; 1277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar addPort(def); 1297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 130a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar updatePortDefinitions(true /* updateCrop */, true /* updateInputSize */); 1317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 1327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 133a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnarvoid SoftVideoDecoderOMXComponent::updatePortDefinitions(bool updateCrop, bool updateInputSize) { 134a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_PARAM_PORTDEFINITIONTYPE *outDef = &editPortInfo(kOutputPortIndex)->mDef; 135a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar outDef->format.video.nFrameWidth = outputBufferWidth(); 136a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar outDef->format.video.nFrameHeight = outputBufferHeight(); 137a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar outDef->format.video.nStride = outDef->format.video.nFrameWidth; 138a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar outDef->format.video.nSliceHeight = outDef->format.video.nFrameHeight; 139a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 140a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar outDef->nBufferSize = 141a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar (outDef->format.video.nStride * outDef->format.video.nSliceHeight * 3) / 2; 142a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 143a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_PARAM_PORTDEFINITIONTYPE *inDef = &editPortInfo(kInputPortIndex)->mDef; 144a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar inDef->format.video.nFrameWidth = mWidth; 145a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar inDef->format.video.nFrameHeight = mHeight; 146a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // input port is compressed, hence it has no stride 147a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar inDef->format.video.nStride = 0; 148a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar inDef->format.video.nSliceHeight = 0; 149a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 150a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // when output format changes, input buffer size does not actually change 151a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (updateInputSize) { 15238a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar inDef->nBufferSize = max( 15338a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar outDef->nBufferSize / mMinCompressionRatio, 15438a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar max(mMinInputBufferSize, inDef->nBufferSize)); 155a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 1567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 157bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu if (updateCrop) { 158bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mCropLeft = 0; 159bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mCropTop = 0; 160bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mCropWidth = mWidth; 161bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mCropHeight = mHeight; 162bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 163bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu} 164bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 1651aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 1661aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wuuint32_t SoftVideoDecoderOMXComponent::outputBufferWidth() { 1671aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu return mIsAdaptive ? mAdaptiveMaxWidth : mWidth; 1681aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu} 1691aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 1701aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wuuint32_t SoftVideoDecoderOMXComponent::outputBufferHeight() { 1711aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu return mIsAdaptive ? mAdaptiveMaxHeight : mHeight; 1721aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu} 1731aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 174bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wuvoid SoftVideoDecoderOMXComponent::handlePortSettingsChange( 175d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu bool *portWillReset, uint32_t width, uint32_t height, 176d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu CropSettingsMode cropSettingsMode, bool fakeStride) { 177bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu *portWillReset = false; 178bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu bool sizeChanged = (width != mWidth || height != mHeight); 179d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu bool updateCrop = (cropSettingsMode == kCropUnSet); 180d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu bool cropChanged = (cropSettingsMode == kCropChanged); 1810f694a12f92a01f95807242320bd65e88c699708Ronghua Wu bool strideChanged = false; 1820f694a12f92a01f95807242320bd65e88c699708Ronghua Wu if (fakeStride) { 1830f694a12f92a01f95807242320bd65e88c699708Ronghua Wu OMX_PARAM_PORTDEFINITIONTYPE *def = &editPortInfo(kOutputPortIndex)->mDef; 184a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (def->format.video.nStride != (OMX_S32)width 185a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || def->format.video.nSliceHeight != (OMX_U32)height) { 1860f694a12f92a01f95807242320bd65e88c699708Ronghua Wu strideChanged = true; 1870f694a12f92a01f95807242320bd65e88c699708Ronghua Wu } 1880f694a12f92a01f95807242320bd65e88c699708Ronghua Wu } 189bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 1900f694a12f92a01f95807242320bd65e88c699708Ronghua Wu if (sizeChanged || cropChanged || strideChanged) { 191bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mWidth = width; 192bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mHeight = height; 193bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 194bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu if ((sizeChanged && !mIsAdaptive) 195bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu || width > mAdaptiveMaxWidth 196bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu || height > mAdaptiveMaxHeight) { 197bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu if (mIsAdaptive) { 198bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu if (width > mAdaptiveMaxWidth) { 199bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mAdaptiveMaxWidth = width; 200bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 201bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu if (height > mAdaptiveMaxHeight) { 202bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mAdaptiveMaxHeight = height; 203bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 204bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 205bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu updatePortDefinitions(updateCrop); 206bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 0, NULL); 207bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu mOutputPortSettingsChange = AWAITING_DISABLED; 208bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu *portWillReset = true; 209bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } else { 210bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu updatePortDefinitions(updateCrop); 211a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu 212a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu if (fakeStride) { 213a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // MAJOR HACK that is not pretty, it's just to fool the renderer to read the correct 214a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // data. 215a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // Some software decoders (e.g. SoftMPEG4) fill decoded frame directly to output 216a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // buffer without considering the output buffer stride and slice height. So this is 217a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // used to signal how the buffer is arranged. The alternative is to re-arrange the 218a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu // output buffer in SoftMPEG4, but that results in memcopies. 219a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu OMX_PARAM_PORTDEFINITIONTYPE *def = &editPortInfo(kOutputPortIndex)->mDef; 220a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu def->format.video.nStride = mWidth; 221a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu def->format.video.nSliceHeight = mHeight; 222a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu } 223a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu 224bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 225bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu OMX_IndexConfigCommonOutputCrop, NULL); 226bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 227bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 228bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu} 229bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 230bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wuvoid SoftVideoDecoderOMXComponent::copyYV12FrameToOutputBuffer( 231bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV, 232bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu size_t srcYStride, size_t srcUStride, size_t srcVStride) { 2331aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu size_t dstYStride = outputBufferWidth(); 234bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu size_t dstUVStride = dstYStride / 2; 2351aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu size_t dstHeight = outputBufferHeight(); 23658c4cf4540e3f23847196bd4b45d82613e238821hkuang uint8_t *dstStart = dst; 237bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 23858c4cf4540e3f23847196bd4b45d82613e238821hkuang for (size_t i = 0; i < mHeight; ++i) { 23958c4cf4540e3f23847196bd4b45d82613e238821hkuang memcpy(dst, srcY, mWidth); 24058c4cf4540e3f23847196bd4b45d82613e238821hkuang srcY += srcYStride; 24158c4cf4540e3f23847196bd4b45d82613e238821hkuang dst += dstYStride; 242bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 243bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 24458c4cf4540e3f23847196bd4b45d82613e238821hkuang dst = dstStart + dstYStride * dstHeight; 24558c4cf4540e3f23847196bd4b45d82613e238821hkuang for (size_t i = 0; i < mHeight / 2; ++i) { 24658c4cf4540e3f23847196bd4b45d82613e238821hkuang memcpy(dst, srcU, mWidth / 2); 24758c4cf4540e3f23847196bd4b45d82613e238821hkuang srcU += srcUStride; 24858c4cf4540e3f23847196bd4b45d82613e238821hkuang dst += dstUVStride; 249bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 250bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 25158c4cf4540e3f23847196bd4b45d82613e238821hkuang dst = dstStart + (5 * dstYStride * dstHeight) / 4; 25258c4cf4540e3f23847196bd4b45d82613e238821hkuang for (size_t i = 0; i < mHeight / 2; ++i) { 25358c4cf4540e3f23847196bd4b45d82613e238821hkuang memcpy(dst, srcV, mWidth / 2); 25458c4cf4540e3f23847196bd4b45d82613e238821hkuang srcV += srcVStride; 25558c4cf4540e3f23847196bd4b45d82613e238821hkuang dst += dstUVStride; 256bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu } 2577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 2587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalGetParameter( 2607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params) { 2617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar switch (index) { 2627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case OMX_IndexParamVideoPortFormat: 2637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 2647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams = 2657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar (OMX_VIDEO_PARAM_PORTFORMATTYPE *)params; 2667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (formatParams->nPortIndex > kMaxPortIndex) { 268a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return OMX_ErrorBadPortIndex; 2697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 2707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (formatParams->nIndex != 0) { 2727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNoMore; 2737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 2747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (formatParams->nPortIndex == kInputPortIndex) { 2767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->eCompressionFormat = mCodingType; 2777f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->eColorFormat = OMX_COLOR_FormatUnused; 2787f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->xFramerate = 0; 2797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } else { 2807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar CHECK_EQ(formatParams->nPortIndex, 1u); 2817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2827f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->eCompressionFormat = OMX_VIDEO_CodingUnused; 2837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->eColorFormat = OMX_COLOR_FormatYUV420Planar; 2847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar formatParams->xFramerate = 0; 2857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 2867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNone; 2887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 2897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case OMX_IndexParamVideoProfileLevelQuerySupported: 2917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 2927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevel = 2937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar (OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params; 2947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 2957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (profileLevel->nPortIndex != kInputPortIndex) { 296db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn ALOGE("Invalid port index: %" PRIu32, profileLevel->nPortIndex); 2977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorUnsupportedIndex; 2987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 2997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3003b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar if (profileLevel->nProfileIndex >= mNumProfileLevels) { 3017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNoMore; 3027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3043b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar profileLevel->eProfile = mProfileLevels[profileLevel->nProfileIndex].mProfile; 3053b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar profileLevel->eLevel = mProfileLevels[profileLevel->nProfileIndex].mLevel; 3067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNone; 3077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar default: 3107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return SimpleSoftOMXComponent::internalGetParameter(index, params); 3117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 3137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalSetParameter( 3157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, const OMX_PTR params) { 316031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu // Include extension index OMX_INDEXEXTTYPE. 317031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu const int32_t indexFull = index; 318031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 319031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu switch (indexFull) { 3207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case OMX_IndexParamStandardComponentRole: 3217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 3227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const OMX_PARAM_COMPONENTROLETYPE *roleParams = 3237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar (const OMX_PARAM_COMPONENTROLETYPE *)params; 3247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (strncmp((const char *)roleParams->cRole, 3267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mComponentRole, 3277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_MAX_STRINGNAME_SIZE - 1)) { 3287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorUndefined; 3297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNone; 3327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case OMX_IndexParamVideoPortFormat: 3357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 3367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams = 3377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar (OMX_VIDEO_PARAM_PORTFORMATTYPE *)params; 3387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (formatParams->nPortIndex > kMaxPortIndex) { 340a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return OMX_ErrorBadPortIndex; 3417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 3437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (formatParams->nIndex != 0) { 3447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNoMore; 3457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 347a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (formatParams->nPortIndex == kInputPortIndex) { 348a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (formatParams->eCompressionFormat != mCodingType 349a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || formatParams->eColorFormat != OMX_COLOR_FormatUnused) { 350a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return OMX_ErrorUnsupportedSetting; 351a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 352a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } else { 353a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (formatParams->eCompressionFormat != OMX_VIDEO_CodingUnused 354a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || formatParams->eColorFormat != OMX_COLOR_FormatYUV420Planar) { 355a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return OMX_ErrorUnsupportedSetting; 356a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 357a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 358a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 3597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNone; 3607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 3617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 362031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu case kPrepareForAdaptivePlaybackIndex: 363031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu { 364031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu const PrepareForAdaptivePlaybackParams* adaptivePlaybackParams = 365031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu (const PrepareForAdaptivePlaybackParams *)params; 366031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mIsAdaptive = adaptivePlaybackParams->bEnable; 367031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu if (mIsAdaptive) { 368031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxWidth = adaptivePlaybackParams->nMaxFrameWidth; 369031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxHeight = adaptivePlaybackParams->nMaxFrameHeight; 370031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mWidth = mAdaptiveMaxWidth; 371031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mHeight = mAdaptiveMaxHeight; 372031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu } else { 373031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxWidth = 0; 374031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu mAdaptiveMaxHeight = 0; 375031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu } 376a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar updatePortDefinitions(true /* updateCrop */, true /* updateInputSize */); 377031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu return OMX_ErrorNone; 378031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu } 379031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 38042a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu case OMX_IndexParamPortDefinition: 38142a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu { 38242a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu OMX_PARAM_PORTDEFINITIONTYPE *newParams = 38342a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu (OMX_PARAM_PORTDEFINITIONTYPE *)params; 38442a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &newParams->format.video; 38542a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu OMX_PARAM_PORTDEFINITIONTYPE *def = &editPortInfo(newParams->nPortIndex)->mDef; 38642a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu 38742a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu uint32_t oldWidth = def->format.video.nFrameWidth; 38842a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu uint32_t oldHeight = def->format.video.nFrameHeight; 38942a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu uint32_t newWidth = video_def->nFrameWidth; 39042a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu uint32_t newHeight = video_def->nFrameHeight; 39142a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu if (newWidth != oldWidth || newHeight != oldHeight) { 39242a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu bool outputPort = (newParams->nPortIndex == kOutputPortIndex); 39342a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu if (outputPort) { 39438a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar // only update (essentially crop) if size changes 39542a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu mWidth = newWidth; 39642a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu mHeight = newHeight; 39738a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar 39838a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar updatePortDefinitions(true /* updateCrop */, true /* updateInputSize */); 39938a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar // reset buffer size based on frame size 40038a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar newParams->nBufferSize = def->nBufferSize; 40138a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar } else { 40238a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar // For input port, we only set nFrameWidth and nFrameHeight. Buffer size 40338a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar // is updated when configuring the output port using the max-frame-size, 40438a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar // though client can still request a larger size. 40538a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar def->format.video.nFrameWidth = newWidth; 40638a97bd7891cb0e16f8127510aa81b1b05df3f17Lajos Molnar def->format.video.nFrameHeight = newHeight; 40742a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu } 40842a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu } 40942a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu return SimpleSoftOMXComponent::internalSetParameter(index, params); 41042a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu } 41142a9fd4f382253a2fb7fe6761273841c999606afRonghua Wu 4127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar default: 4137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return SimpleSoftOMXComponent::internalSetParameter(index, params); 4147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 4167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig( 4187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params) { 4197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar switch (index) { 4207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case OMX_IndexConfigCommonOutputCrop: 4217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 4227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)params; 4237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (rectParams->nPortIndex != kOutputPortIndex) { 4257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorUndefined; 4267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar rectParams->nLeft = mCropLeft; 4297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar rectParams->nTop = mCropTop; 4307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar rectParams->nWidth = mCropWidth; 4317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar rectParams->nHeight = mCropHeight; 4327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorNone; 4347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar default: 4377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return OMX_ErrorUnsupportedIndex; 4387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 4407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 441031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua WuOMX_ERRORTYPE SoftVideoDecoderOMXComponent::getExtensionIndex( 442031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu const char *name, OMX_INDEXTYPE *index) { 443031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu if (!strcmp(name, "OMX.google.android.index.prepareForAdaptivePlayback")) { 444031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu *(int32_t*)index = kPrepareForAdaptivePlaybackIndex; 445031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu return OMX_ErrorNone; 446031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu } 447031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 448031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu return SimpleSoftOMXComponent::getExtensionIndex(name, index); 449031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu} 450031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 4517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::onReset() { 4527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mOutputPortSettingsChange = NONE; 4537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 4547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { 4567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar if (portIndex != kOutputPortIndex) { 4577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar return; 4587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar switch (mOutputPortSettingsChange) { 4617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case NONE: 4627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar break; 4637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar case AWAITING_DISABLED: 4657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 4667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar CHECK(!enabled); 4677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mOutputPortSettingsChange = AWAITING_ENABLED; 4687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar break; 4697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar default: 4727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar { 4737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar CHECK_EQ((int)mOutputPortSettingsChange, (int)AWAITING_ENABLED); 4747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar CHECK(enabled); 4757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar mOutputPortSettingsChange = NONE; 4767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar break; 4777f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4787f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } 4797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} 4807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 4817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} // namespace android 482