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 79a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // This function sets both minimum buffer count and actual buffer count of 80a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // input port to be |numInputBuffers|. It will also set both minimum buffer 81a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // count and actual buffer count of output port to be |numOutputBuffers|. 827f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar void initPorts(OMX_U32 numInputBuffers, 837f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 inputBufferSize, 847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 numOutputBuffers, 85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const char *mimeType, 86a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_U32 minCompressionRatio = 1u); 877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 88a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // This function sets input port's minimum buffer count to |numMinInputBuffers|, 89a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // sets input port's actual buffer count to |numInputBuffers|, sets output port's 90a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // minimum buffer count to |numMinOutputBuffers| and sets output port's actual buffer 91a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang // count to be |numOutputBuffers|. 92a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang void initPorts(OMX_U32 numMinInputBuffers, 93a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang OMX_U32 numInputBuffers, 94a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang OMX_U32 inputBufferSize, 95a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang OMX_U32 numMinOutputBuffers, 96a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang OMX_U32 numOutputBuffers, 97a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang const char *mimeType, 98a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang OMX_U32 minCompressionRatio = 1u); 99a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang 100a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false); 101bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 1021aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferWidth(); 1031aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferHeight(); 1041aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 105d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu enum CropSettingsMode { 106d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropUnSet = 0, 107d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropSet, 108d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropChanged, 109d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu }; 110c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 111c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This function will handle several port change events which include 112c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // size changed, crop changed, stride changed and coloraspects changed. 113c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // It will trigger OMX_EventPortSettingsChanged event if necessary. 114bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void handlePortSettingsChange( 115a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu bool *portWillReset, uint32_t width, uint32_t height, 116d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false); 117bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 118bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void copyYV12FrameToOutputBuffer( 119bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV, 120bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu size_t srcYStride, size_t srcUStride, size_t srcVStride); 1217f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1227f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 1237f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kInputPortIndex = 0, 1247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kOutputPortIndex = 1, 1257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kMaxPortIndex = 1, 1267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar }; 1277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 128031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu bool mIsAdaptive; 129031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight; 1307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mWidth, mHeight; 1317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight; 1327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 1347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar NONE, 1357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_DISABLED, 1367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_ENABLED 1377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } mOutputPortSettingsChange; 1387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 139c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool mUpdateColorAspects; 140c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 141c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang Mutex mColorAspectsLock; 142c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // color aspects passed from the framework. 143c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mDefaultColorAspects; 144c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // color aspects parsed from the bitstream. 145c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mBitstreamColorAspects; 146c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // final color aspects after combining the above two aspects. 147c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects mFinalColorAspects; 148c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 149c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b); 150c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 151c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This functions takes two color aspects and updates the mFinalColorAspects 152c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // based on |preferredAspects|. 153c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang void updateFinalColorAspects( 154c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang const ColorAspects &otherAspects, const ColorAspects &preferredAspects); 155c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 156c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // This function will update the mFinalColorAspects based on codec preference. 157c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status_t handleColorAspectsChange(); 158c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 159c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Helper function to dump the ColorAspects. 160c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang void dumpColorAspects(const ColorAspects &colorAspects); 161c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 1627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate: 163a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinInputBufferSize; 164a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinCompressionRatio; 165a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 1667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *mComponentRole; 1677f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE mCodingType; 1687f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *mProfileLevels; 1697f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t mNumProfileLevels; 1707f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1717f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent); 1727f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}; 1737f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1747f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} // namespace android 1757f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1767f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_ 177