SoftVideoDecoderOMXComponent.cpp revision 1aa26f787afc525e0deae31d856dce74a4b28a0f
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>
297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/MediaDefs.h>
307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android {
327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnartemplate<class T>
347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstatic void InitOMXParams(T *params) {
357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    params->nSize = sizeof(T);
367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    params->nVersion.s.nVersionMajor = 1;
377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    params->nVersion.s.nVersionMinor = 0;
387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    params->nVersion.s.nRevision = 0;
397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    params->nVersion.s.nStep = 0;
407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarSoftVideoDecoderOMXComponent::SoftVideoDecoderOMXComponent(
437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        const char *name,
447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        const char *componentRole,
457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_VIDEO_CODINGTYPE codingType,
467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        const CodecProfileLevel *profileLevels,
477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        size_t numProfileLevels,
487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        int32_t width,
497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        int32_t height,
507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        const OMX_CALLBACKTYPE *callbacks,
517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_PTR appData,
527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_COMPONENTTYPE **component)
537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        : SimpleSoftOMXComponent(name, callbacks, appData, component),
54031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        mIsAdaptive(false),
55031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        mAdaptiveMaxWidth(0),
56031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        mAdaptiveMaxHeight(0),
577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mWidth(width),
587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mHeight(height),
597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mCropLeft(0),
607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mCropTop(0),
617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mCropWidth(width),
627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mCropHeight(height),
637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mOutputPortSettingsChange(NONE),
647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mComponentRole(componentRole),
657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mCodingType(codingType),
667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mProfileLevels(profileLevels),
677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        mNumProfileLevels(numProfileLevels) {
687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::initPorts(
717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_U32 numInputBuffers,
727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_U32 inputBufferSize,
737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_U32 numOutputBuffers,
747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        const char *mimeType) {
757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_PARAM_PORTDEFINITIONTYPE def;
767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    InitOMXParams(&def);
777f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
787f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nPortIndex = kInputPortIndex;
797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.eDir = OMX_DirInput;
807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferCountMin = numInputBuffers;
817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferCountActual = def.nBufferCountMin;
827f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferSize = inputBufferSize;
837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bEnabled = OMX_TRUE;
847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bPopulated = OMX_FALSE;
857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.eDomain = OMX_PortDomainVideo;
867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bBuffersContiguous = OMX_FALSE;
877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferAlignment = 1;
887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.cMIMEType = const_cast<char *>(mimeType);
907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.pNativeRender = NULL;
917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    /* size is initialized in updatePortDefinitions() */
927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.nBitrate = 0;
937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.xFramerate = 0;
947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.bFlagErrorConcealment = OMX_FALSE;
957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.eCompressionFormat = mCodingType;
967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.eColorFormat = OMX_COLOR_FormatUnused;
977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.pNativeWindow = NULL;
987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    addPort(def);
1007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nPortIndex = kOutputPortIndex;
1027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.eDir = OMX_DirOutput;
1037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferCountMin = numOutputBuffers;
1047f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferCountActual = def.nBufferCountMin;
1057f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bEnabled = OMX_TRUE;
1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bPopulated = OMX_FALSE;
1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.eDomain = OMX_PortDomainVideo;
1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.bBuffersContiguous = OMX_FALSE;
1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.nBufferAlignment = 2;
1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.cMIMEType = const_cast<char *>("video/raw");
1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.pNativeRender = NULL;
1137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    /* size is initialized in updatePortDefinitions() */
1147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.nBitrate = 0;
1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.xFramerate = 0;
1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.bFlagErrorConcealment = OMX_FALSE;
1177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
1197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def.format.video.pNativeWindow = NULL;
1207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    addPort(def);
1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    updatePortDefinitions();
1247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
1257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
126bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wuvoid SoftVideoDecoderOMXComponent::updatePortDefinitions(bool updateCrop) {
1277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    OMX_PARAM_PORTDEFINITIONTYPE *def = &editPortInfo(kInputPortIndex)->mDef;
1287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nFrameWidth = mWidth;
1297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nFrameHeight = mHeight;
1307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nStride = def->format.video.nFrameWidth;
1317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nSliceHeight = def->format.video.nFrameHeight;
1327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
133bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    def->nBufferSize = def->format.video.nFrameWidth * def->format.video.nFrameHeight * 3 / 2;
134bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
1357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def = &editPortInfo(kOutputPortIndex)->mDef;
1361aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    def->format.video.nFrameWidth = outputBufferWidth();
1371aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    def->format.video.nFrameHeight = outputBufferHeight();
1387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nStride = def->format.video.nFrameWidth;
1397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->format.video.nSliceHeight = def->format.video.nFrameHeight;
1407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
1417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    def->nBufferSize =
1427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            (def->format.video.nFrameWidth *
1437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar             def->format.video.nFrameHeight * 3) / 2;
1447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
145bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    if (updateCrop) {
146bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mCropLeft = 0;
147bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mCropTop = 0;
148bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mCropWidth = mWidth;
149bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mCropHeight = mHeight;
150bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    }
151bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu}
152bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
1531aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
1541aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wuuint32_t SoftVideoDecoderOMXComponent::outputBufferWidth() {
1551aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    return mIsAdaptive ? mAdaptiveMaxWidth : mWidth;
1561aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu}
1571aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
1581aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wuuint32_t SoftVideoDecoderOMXComponent::outputBufferHeight() {
1591aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    return mIsAdaptive ? mAdaptiveMaxHeight : mHeight;
1601aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu}
1611aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu
162bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wuvoid SoftVideoDecoderOMXComponent::handlePortSettingsChange(
163a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu        bool *portWillReset, uint32_t width, uint32_t height, bool cropChanged, bool fakeStride) {
164bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    *portWillReset = false;
165bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    bool sizeChanged = (width != mWidth || height != mHeight);
166bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
167bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    if (sizeChanged || cropChanged) {
168bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mWidth = width;
169bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        mHeight = height;
170bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
171bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        bool updateCrop = !cropChanged;
172bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        if ((sizeChanged && !mIsAdaptive)
173bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            || width > mAdaptiveMaxWidth
174bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            || height > mAdaptiveMaxHeight) {
175bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            if (mIsAdaptive) {
176bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                if (width > mAdaptiveMaxWidth) {
177bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                    mAdaptiveMaxWidth = width;
178bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                }
179bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                if (height > mAdaptiveMaxHeight) {
180bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                    mAdaptiveMaxHeight = height;
181bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                }
182bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            }
183bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            updatePortDefinitions(updateCrop);
184bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 0, NULL);
185bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            mOutputPortSettingsChange = AWAITING_DISABLED;
186bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            *portWillReset = true;
187bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        } else {
188bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            updatePortDefinitions(updateCrop);
189a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu
190a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu            if (fakeStride) {
191a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // MAJOR HACK that is not pretty, it's just to fool the renderer to read the correct
192a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // data.
193a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // Some software decoders (e.g. SoftMPEG4) fill decoded frame directly to output
194a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // buffer without considering the output buffer stride and slice height. So this is
195a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // used to signal how the buffer is arranged.  The alternative is to re-arrange the
196a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                // output buffer in SoftMPEG4, but that results in memcopies.
197a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                OMX_PARAM_PORTDEFINITIONTYPE *def = &editPortInfo(kOutputPortIndex)->mDef;
198a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                def->format.video.nStride = mWidth;
199a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu                def->format.video.nSliceHeight = mHeight;
200a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu            }
201a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu
202bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu            notify(OMX_EventPortSettingsChanged, kOutputPortIndex,
203bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu                   OMX_IndexConfigCommonOutputCrop, NULL);
204bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        }
205bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    }
206bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu}
207bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
208bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wuvoid SoftVideoDecoderOMXComponent::copyYV12FrameToOutputBuffer(
209bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
210bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu        size_t srcYStride, size_t srcUStride, size_t srcVStride) {
2111aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    size_t dstYStride = outputBufferWidth();
212bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    size_t dstUVStride = dstYStride / 2;
2131aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu    size_t dstHeight = outputBufferHeight();
21458c4cf4540e3f23847196bd4b45d82613e238821hkuang    uint8_t *dstStart = dst;
215bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
21658c4cf4540e3f23847196bd4b45d82613e238821hkuang    for (size_t i = 0; i < mHeight; ++i) {
21758c4cf4540e3f23847196bd4b45d82613e238821hkuang         memcpy(dst, srcY, mWidth);
21858c4cf4540e3f23847196bd4b45d82613e238821hkuang         srcY += srcYStride;
21958c4cf4540e3f23847196bd4b45d82613e238821hkuang         dst += dstYStride;
220bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    }
221bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
22258c4cf4540e3f23847196bd4b45d82613e238821hkuang    dst = dstStart + dstYStride * dstHeight;
22358c4cf4540e3f23847196bd4b45d82613e238821hkuang    for (size_t i = 0; i < mHeight / 2; ++i) {
22458c4cf4540e3f23847196bd4b45d82613e238821hkuang         memcpy(dst, srcU, mWidth / 2);
22558c4cf4540e3f23847196bd4b45d82613e238821hkuang         srcU += srcUStride;
22658c4cf4540e3f23847196bd4b45d82613e238821hkuang         dst += dstUVStride;
227bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    }
228bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu
22958c4cf4540e3f23847196bd4b45d82613e238821hkuang    dst = dstStart + (5 * dstYStride * dstHeight) / 4;
23058c4cf4540e3f23847196bd4b45d82613e238821hkuang    for (size_t i = 0; i < mHeight / 2; ++i) {
23158c4cf4540e3f23847196bd4b45d82613e238821hkuang         memcpy(dst, srcV, mWidth / 2);
23258c4cf4540e3f23847196bd4b45d82613e238821hkuang         srcV += srcVStride;
23358c4cf4540e3f23847196bd4b45d82613e238821hkuang         dst += dstUVStride;
234bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu    }
2357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
2367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalGetParameter(
2387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_INDEXTYPE index, OMX_PTR params) {
2397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    switch (index) {
2407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case OMX_IndexParamVideoPortFormat:
2417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
2427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams =
2437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                (OMX_VIDEO_PARAM_PORTFORMATTYPE *)params;
2447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (formatParams->nPortIndex > kMaxPortIndex) {
2467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorUndefined;
2477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
2487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (formatParams->nIndex != 0) {
2507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorNoMore;
2517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
2527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (formatParams->nPortIndex == kInputPortIndex) {
2547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->eCompressionFormat = mCodingType;
2557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->eColorFormat = OMX_COLOR_FormatUnused;
2567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->xFramerate = 0;
2577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            } else {
2587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                CHECK_EQ(formatParams->nPortIndex, 1u);
2597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->eCompressionFormat = OMX_VIDEO_CodingUnused;
2617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->eColorFormat = OMX_COLOR_FormatYUV420Planar;
2627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                formatParams->xFramerate = 0;
2637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
2647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorNone;
2667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
2677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case OMX_IndexParamVideoProfileLevelQuerySupported:
2697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
2707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevel =
2717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                  (OMX_VIDEO_PARAM_PROFILELEVELTYPE *) params;
2727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (profileLevel->nPortIndex != kInputPortIndex) {
274db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn                ALOGE("Invalid port index: %" PRIu32, profileLevel->nPortIndex);
2757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorUnsupportedIndex;
2767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
2777f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2783b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar            if (profileLevel->nProfileIndex >= mNumProfileLevels) {
2797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorNoMore;
2807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
2817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2823b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar            profileLevel->eProfile = mProfileLevels[profileLevel->nProfileIndex].mProfile;
2833b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar            profileLevel->eLevel   = mProfileLevels[profileLevel->nProfileIndex].mLevel;
2847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorNone;
2857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
2867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        default:
2887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return SimpleSoftOMXComponent::internalGetParameter(index, params);
2897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    }
2907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
2917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
2927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::internalSetParameter(
2937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_INDEXTYPE index, const OMX_PTR params) {
294031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    // Include extension index OMX_INDEXEXTTYPE.
295031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    const int32_t indexFull = index;
296031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
297031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    switch (indexFull) {
2987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case OMX_IndexParamStandardComponentRole:
2997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
3007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            const OMX_PARAM_COMPONENTROLETYPE *roleParams =
3017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                (const OMX_PARAM_COMPONENTROLETYPE *)params;
3027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (strncmp((const char *)roleParams->cRole,
3047f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                        mComponentRole,
3057f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                        OMX_MAX_STRINGNAME_SIZE - 1)) {
3067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorUndefined;
3077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
3087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorNone;
3107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
3117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case OMX_IndexParamVideoPortFormat:
3137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
3147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_VIDEO_PARAM_PORTFORMATTYPE *formatParams =
3157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                (OMX_VIDEO_PARAM_PORTFORMATTYPE *)params;
3167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (formatParams->nPortIndex > kMaxPortIndex) {
3187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorUndefined;
3197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
3207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (formatParams->nIndex != 0) {
3227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorNoMore;
3237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
3247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorNone;
3267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
3277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
328031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        case kPrepareForAdaptivePlaybackIndex:
329031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        {
330031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            const PrepareForAdaptivePlaybackParams* adaptivePlaybackParams =
331031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                    (const PrepareForAdaptivePlaybackParams *)params;
332031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            mIsAdaptive = adaptivePlaybackParams->bEnable;
333031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            if (mIsAdaptive) {
334031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mAdaptiveMaxWidth = adaptivePlaybackParams->nMaxFrameWidth;
335031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mAdaptiveMaxHeight = adaptivePlaybackParams->nMaxFrameHeight;
336031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mWidth = mAdaptiveMaxWidth;
337031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mHeight = mAdaptiveMaxHeight;
338031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            } else {
339031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mAdaptiveMaxWidth = 0;
340031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu                mAdaptiveMaxHeight = 0;
341031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            }
342031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            updatePortDefinitions();
343031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu            return OMX_ErrorNone;
344031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        }
345031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
3467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        default:
3477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return SimpleSoftOMXComponent::internalSetParameter(index, params);
3487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    }
3497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
3507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos MolnarOMX_ERRORTYPE SoftVideoDecoderOMXComponent::getConfig(
3527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        OMX_INDEXTYPE index, OMX_PTR params) {
3537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    switch (index) {
3547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case OMX_IndexConfigCommonOutputCrop:
3557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
3567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            OMX_CONFIG_RECTTYPE *rectParams = (OMX_CONFIG_RECTTYPE *)params;
3577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            if (rectParams->nPortIndex != kOutputPortIndex) {
3597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar                return OMX_ErrorUndefined;
3607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            }
3617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            rectParams->nLeft = mCropLeft;
3637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            rectParams->nTop = mCropTop;
3647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            rectParams->nWidth = mCropWidth;
3657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            rectParams->nHeight = mCropHeight;
3667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorNone;
3687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
3697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        default:
3717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            return OMX_ErrorUnsupportedIndex;
3727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    }
3737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
3747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
375031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua WuOMX_ERRORTYPE SoftVideoDecoderOMXComponent::getExtensionIndex(
376031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        const char *name, OMX_INDEXTYPE *index) {
377031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    if (!strcmp(name, "OMX.google.android.index.prepareForAdaptivePlayback")) {
378031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        *(int32_t*)index = kPrepareForAdaptivePlaybackIndex;
379031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        return OMX_ErrorNone;
380031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    }
381031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
382031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    return SimpleSoftOMXComponent::getExtensionIndex(name, index);
383031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu}
384031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
3857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::onReset() {
3867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    mOutputPortSettingsChange = NONE;
3877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
3887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarvoid SoftVideoDecoderOMXComponent::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) {
3907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    if (portIndex != kOutputPortIndex) {
3917f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        return;
3927f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    }
3937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    switch (mOutputPortSettingsChange) {
3957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case NONE:
3967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            break;
3977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
3987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        case AWAITING_DISABLED:
3997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
4007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            CHECK(!enabled);
4017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            mOutputPortSettingsChange = AWAITING_ENABLED;
4027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            break;
4037f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
4047f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
4057f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        default:
4067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        {
4077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            CHECK_EQ((int)mOutputPortSettingsChange, (int)AWAITING_ENABLED);
4087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            CHECK(enabled);
4097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            mOutputPortSettingsChange = NONE;
4107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar            break;
4117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar        }
4127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar    }
4137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}
4147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar
4157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}  // namespace android
416