SoftVideoDecoderOMXComponent.h revision c2e98f5f60460890195b33abe40e376f800b242e
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 177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#ifndef SOFT_VIDEO_DECODER_OMX_COMPONENT_H_ 187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#define SOFT_VIDEO_DECODER_OMX_COMPONENT_H_ 207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include "SimpleSoftOMXComponent.h" 227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/stagefright/foundation/AHandlerReflector.h> 24c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang#include <media/stagefright/foundation/ColorUtils.h> 257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/IOMX.h> 267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/RefBase.h> 287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/threads.h> 297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/Vector.h> 307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android { 327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstruct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent { 347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar SoftVideoDecoderOMXComponent( 357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *name, 367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *componentRole, 377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE codingType, 387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *profileLevels, 397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t numProfileLevels, 407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t width, 417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t height, 427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const OMX_CALLBACKTYPE *callbacks, 437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_PTR appData, 447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_COMPONENTTYPE **component); 457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprotected: 47c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang enum { 48c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kDescribeColorAspectsIndex = kPrepareForAdaptivePlaybackIndex + 1, 49c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang }; 50c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 51c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang enum { 52c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kNotSupported, 53c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kPreferBitstream, 54c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kPreferContainer, 55c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang }; 56c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); 587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual void onReset(); 597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE internalGetParameter( 617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params); 627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE internalSetParameter( 647f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, const OMX_PTR params); 657f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE getConfig( 677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params); 687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 69c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang virtual OMX_ERRORTYPE setConfig( 70c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang OMX_INDEXTYPE index, const OMX_PTR params); 71c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 72031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu virtual OMX_ERRORTYPE getExtensionIndex( 73031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu const char *name, OMX_INDEXTYPE *index); 74031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 75c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang virtual bool supportsDescribeColorAspects(); 76c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 77c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang virtual int getColorAspectPreference(); 78c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 797f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar void initPorts(OMX_U32 numInputBuffers, 807f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 inputBufferSize, 817f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 numOutputBuffers, 82a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const char *mimeType, 83a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_U32 minCompressionRatio = 1u); 847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false); 86bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 871aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferWidth(); 881aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferHeight(); 891aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 90d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu enum CropSettingsMode { 91d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropUnSet = 0, 92d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropSet, 93d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropChanged, 94d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu }; 95c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 96c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This function will handle several port change events which include 97c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // size changed, crop changed, stride changed and coloraspects changed. 98c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // It will trigger OMX_EventPortSettingsChanged event if necessary. 99bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void handlePortSettingsChange( 100a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu bool *portWillReset, uint32_t width, uint32_t height, 101d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false); 102bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 103bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void copyYV12FrameToOutputBuffer( 104bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV, 105bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu size_t srcYStride, size_t srcUStride, size_t srcVStride); 1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kInputPortIndex = 0, 1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kOutputPortIndex = 1, 1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kMaxPortIndex = 1, 1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar }; 1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 113031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu bool mIsAdaptive; 114031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight; 1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mWidth, mHeight; 1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight; 1177f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1187f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 1197f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar NONE, 1207f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_DISABLED, 1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_ENABLED 1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } mOutputPortSettingsChange; 1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 124c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool mUpdateColorAspects; 125c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 126c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang Mutex mColorAspectsLock; 127c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // color aspects passed from the framework. 128c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mDefaultColorAspects; 129c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // color aspects parsed from the bitstream. 130c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mBitstreamColorAspects; 131c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // final color aspects after combining the above two aspects. 132c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mFinalColorAspects; 133c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 134c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b); 135c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 136c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This functions takes two color aspects and updates the mFinalColorAspects 137c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // based on |preferredAspects|. 138c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang void updateFinalColorAspects( 139c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang const ColorAspects &otherAspects, const ColorAspects &preferredAspects); 140c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 141c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This function will update the mFinalColorAspects based on codec preference. 142c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status_t handleColorAspectsChange(); 143c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 144c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Helper function to dump the ColorAspects. 145c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang void dumpColorAspects(const ColorAspects &colorAspects); 146c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 1477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate: 148a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinInputBufferSize; 149a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinCompressionRatio; 150a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 1517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *mComponentRole; 1527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE mCodingType; 1537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *mProfileLevels; 1547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t mNumProfileLevels; 1557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent); 1577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}; 1587f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1597f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} // namespace android 1607f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_ 162