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> 247f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <media/IOMX.h> 257f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 267f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/RefBase.h> 277f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/threads.h> 287f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#include <utils/Vector.h> 297f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 307f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarnamespace android { 317f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 327f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarstruct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent { 337f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar SoftVideoDecoderOMXComponent( 347f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *name, 357f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *componentRole, 367f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE codingType, 377f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *profileLevels, 387f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t numProfileLevels, 397f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t width, 407f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar int32_t height, 417f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const OMX_CALLBACKTYPE *callbacks, 427f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_PTR appData, 437f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_COMPONENTTYPE **component); 447f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 457f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprotected: 467f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); 477f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual void onReset(); 487f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 497f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE internalGetParameter( 507f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params); 517f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 527f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE internalSetParameter( 537f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, const OMX_PTR params); 547f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 557f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar virtual OMX_ERRORTYPE getConfig( 567f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_INDEXTYPE index, OMX_PTR params); 577f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 58031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu virtual OMX_ERRORTYPE getExtensionIndex( 59031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu const char *name, OMX_INDEXTYPE *index); 60031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu 617f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar void initPorts(OMX_U32 numInputBuffers, 627f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 inputBufferSize, 637f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_U32 numOutputBuffers, 64a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const char *mimeType, 65a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar OMX_U32 minCompressionRatio = 1u); 667f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 67a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar virtual void updatePortDefinitions(bool updateCrop = true, bool updateInputSize = false); 68bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 691aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferWidth(); 701aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu uint32_t outputBufferHeight(); 711aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 72d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu enum CropSettingsMode { 73d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropUnSet = 0, 74d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropSet, 75d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu kCropChanged, 76d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu }; 77bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void handlePortSettingsChange( 78a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu bool *portWillReset, uint32_t width, uint32_t height, 79d5a2f55034022f2d0425fa0701894d0c4787b726Ronghua Wu CropSettingsMode cropSettingsMode = kCropUnSet, bool fakeStride = false); 80bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu 81bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu void copyYV12FrameToOutputBuffer( 82bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV, 83bf220f3e6e799f28d1599c3c5106e9e15631a91dRonghua Wu size_t srcYStride, size_t srcUStride, size_t srcVStride); 847f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 857f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 867f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kInputPortIndex = 0, 877f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kOutputPortIndex = 1, 887f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar kMaxPortIndex = 1, 897f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar }; 907f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 91031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu bool mIsAdaptive; 92031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight; 937f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mWidth, mHeight; 947f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight; 957f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 967f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar enum { 977f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar NONE, 987f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_DISABLED, 997f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar AWAITING_ENABLED 1007f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar } mOutputPortSettingsChange; 1017f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1027f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnarprivate: 103a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinInputBufferSize; 104a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint32_t mMinCompressionRatio; 105a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 1067f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const char *mComponentRole; 1077f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar OMX_VIDEO_CODINGTYPE mCodingType; 1087f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar const CodecProfileLevel *mProfileLevels; 1097f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar size_t mNumProfileLevels; 1107f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1117f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent); 1127f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar}; 1137f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1147f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar} // namespace android 1157f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar 1167f616d3cc5366a4b8af20d3d0c768e3de1df0666Lajos Molnar#endif // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_ 117