SoftVideoDecoderOMXComponent.h revision a694dd0ce2caaf921f7bc894df87a5d52594b4eb
14b6829f0d28990dd645e16386eb226d0f10c8731shiqian/*
24b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Copyright (C) 2013 The Android Open Source Project
34b6829f0d28990dd645e16386eb226d0f10c8731shiqian *
44b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Licensed under the Apache License, Version 2.0 (the "License");
54b6829f0d28990dd645e16386eb226d0f10c8731shiqian * you may not use this file except in compliance with the License.
64b6829f0d28990dd645e16386eb226d0f10c8731shiqian * You may obtain a copy of the License at
74b6829f0d28990dd645e16386eb226d0f10c8731shiqian *
84b6829f0d28990dd645e16386eb226d0f10c8731shiqian *      http://www.apache.org/licenses/LICENSE-2.0
94b6829f0d28990dd645e16386eb226d0f10c8731shiqian *
104b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Unless required by applicable law or agreed to in writing, software
114b6829f0d28990dd645e16386eb226d0f10c8731shiqian * distributed under the License is distributed on an "AS IS" BASIS,
124b6829f0d28990dd645e16386eb226d0f10c8731shiqian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b6829f0d28990dd645e16386eb226d0f10c8731shiqian * See the License for the specific language governing permissions and
144b6829f0d28990dd645e16386eb226d0f10c8731shiqian * limitations under the License.
154b6829f0d28990dd645e16386eb226d0f10c8731shiqian */
164b6829f0d28990dd645e16386eb226d0f10c8731shiqian
174b6829f0d28990dd645e16386eb226d0f10c8731shiqian#ifndef SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
194b6829f0d28990dd645e16386eb226d0f10c8731shiqian#define SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
214b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "SimpleSoftOMXComponent.h"
224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
234b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <media/stagefright/foundation/AHandlerReflector.h>
244b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <media/IOMX.h>
254b6829f0d28990dd645e16386eb226d0f10c8731shiqian
264b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <utils/RefBase.h>
274b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <utils/threads.h>
284b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <utils/Vector.h>
294b6829f0d28990dd645e16386eb226d0f10c8731shiqian
304b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace android {
314b6829f0d28990dd645e16386eb226d0f10c8731shiqian
322733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanstruct SoftVideoDecoderOMXComponent : public SimpleSoftOMXComponent {
332620c79810d4741922e9fa89050c0af564994f24zhanyong.wan    SoftVideoDecoderOMXComponent(
342620c79810d4741922e9fa89050c0af564994f24zhanyong.wan            const char *name,
354b6829f0d28990dd645e16386eb226d0f10c8731shiqian            const char *componentRole,
36c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian            OMX_VIDEO_CODINGTYPE codingType,
37c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian            const CodecProfileLevel *profileLevels,
38fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan            size_t numProfileLevels,
39733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan            int32_t width,
404cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan            int32_t height,
41733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan            const OMX_CALLBACKTYPE *callbacks,
42733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan            OMX_PTR appData,
43a92a6f792395e1ad462472d474ab0c76949813favladlosev            OMX_COMPONENTTYPE **component);
44a92a6f792395e1ad462472d474ab0c76949813favladlosev
45733a54a398766289b74cf3daebe083d7115cf388zhanyong.wanprotected:
46dd4a17bc20377d250ed116b1083d851adbe45f25shiqian    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
47733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan    virtual void onReset();
48733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
49fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan    virtual OMX_ERRORTYPE internalGetParameter(
50941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian            OMX_INDEXTYPE index, OMX_PTR params);
514cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan
52733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan    virtual OMX_ERRORTYPE internalSetParameter(
53941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian            OMX_INDEXTYPE index, const OMX_PTR params);
54733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
55941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    virtual OMX_ERRORTYPE getConfig(
56733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan            OMX_INDEXTYPE index, OMX_PTR params);
57941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian
58733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan    virtual OMX_ERRORTYPE getExtensionIndex(
59941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian            const char *name, OMX_INDEXTYPE *index);
604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
612620c79810d4741922e9fa89050c0af564994f24zhanyong.wan    void initPorts(OMX_U32 numInputBuffers,
624b6829f0d28990dd645e16386eb226d0f10c8731shiqian            OMX_U32 inputBufferSize,
634b6829f0d28990dd645e16386eb226d0f10c8731shiqian            OMX_U32 numOutputBuffers,
644b6829f0d28990dd645e16386eb226d0f10c8731shiqian            const char *mimeType);
654b6829f0d28990dd645e16386eb226d0f10c8731shiqian
664cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan    virtual void updatePortDefinitions(bool updateCrop = true);
678236131e25705a809d496672a3819e1741166c4bzhanyong.wan
688236131e25705a809d496672a3819e1741166c4bzhanyong.wan    void handlePortSettingsChange(
698236131e25705a809d496672a3819e1741166c4bzhanyong.wan            bool *portWillReset, uint32_t width, uint32_t height,
708236131e25705a809d496672a3819e1741166c4bzhanyong.wan            bool cropChanged = false, bool fakeStride = false);
714b6829f0d28990dd645e16386eb226d0f10c8731shiqian
728236131e25705a809d496672a3819e1741166c4bzhanyong.wan    void copyYV12FrameToOutputBuffer(
738236131e25705a809d496672a3819e1741166c4bzhanyong.wan            uint8_t *dst, const uint8_t *srcY, const uint8_t *srcU, const uint8_t *srcV,
74733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan            size_t srcYStride, size_t srcUStride, size_t srcVStride);
75dd4a17bc20377d250ed116b1083d851adbe45f25shiqian
76dd4a17bc20377d250ed116b1083d851adbe45f25shiqian    enum {
77dd4a17bc20377d250ed116b1083d851adbe45f25shiqian        kInputPortIndex  = 0,
78dd4a17bc20377d250ed116b1083d851adbe45f25shiqian        kOutputPortIndex = 1,
79dd4a17bc20377d250ed116b1083d851adbe45f25shiqian        kMaxPortIndex = 1,
80dd4a17bc20377d250ed116b1083d851adbe45f25shiqian    };
81733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
824b6829f0d28990dd645e16386eb226d0f10c8731shiqian    bool mIsAdaptive;
83733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan    uint32_t mAdaptiveMaxWidth, mAdaptiveMaxHeight;
844b6829f0d28990dd645e16386eb226d0f10c8731shiqian    uint32_t mWidth, mHeight;
854b6829f0d28990dd645e16386eb226d0f10c8731shiqian    uint32_t mCropLeft, mCropTop, mCropWidth, mCropHeight;
864b6829f0d28990dd645e16386eb226d0f10c8731shiqian
874b6829f0d28990dd645e16386eb226d0f10c8731shiqian    enum {
884b6829f0d28990dd645e16386eb226d0f10c8731shiqian        NONE,
898236131e25705a809d496672a3819e1741166c4bzhanyong.wan        AWAITING_DISABLED,
908236131e25705a809d496672a3819e1741166c4bzhanyong.wan        AWAITING_ENABLED
918236131e25705a809d496672a3819e1741166c4bzhanyong.wan    } mOutputPortSettingsChange;
928236131e25705a809d496672a3819e1741166c4bzhanyong.wan
938236131e25705a809d496672a3819e1741166c4bzhanyong.wanprivate:
948236131e25705a809d496672a3819e1741166c4bzhanyong.wan    const char *mComponentRole;
958236131e25705a809d496672a3819e1741166c4bzhanyong.wan    OMX_VIDEO_CODINGTYPE mCodingType;
968236131e25705a809d496672a3819e1741166c4bzhanyong.wan    const CodecProfileLevel *mProfileLevels;
978236131e25705a809d496672a3819e1741166c4bzhanyong.wan    size_t mNumProfileLevels;
98c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian
99c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoDecoderOMXComponent);
100f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com};
101fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan
102fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan}  // namespace android
103c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian
1044cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif  // SOFT_VIDEO_DECODER_OMX_COMPONENT_H_
10598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan