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