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