12edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar/*
22edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * Copyright 2014 The Android Open Source Project
32edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar *
42edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
52edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * you may not use this file except in compliance with the License.
62edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * You may obtain a copy of the License at
72edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar *
82edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
92edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar *
102edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * Unless required by applicable law or agreed to in writing, software
112edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
122edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * See the License for the specific language governing permissions and
142edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar * limitations under the License.
152edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar */
162edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
172edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#ifndef SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_
182edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
192edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#define SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_
202edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
21a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar#include <media/IOMX.h>
22a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
232edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "SimpleSoftOMXComponent.h"
242edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
252edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarstruct hw_module_t;
262edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
272edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarnamespace android {
282edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
292edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarstruct SoftVideoEncoderOMXComponent : public SimpleSoftOMXComponent {
302edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    SoftVideoEncoderOMXComponent(
312edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            const char *name,
32a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const char *componentRole,
33a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            OMX_VIDEO_CODINGTYPE codingType,
34a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const CodecProfileLevel *profileLevels,
35a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            size_t numProfileLevels,
36a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            int32_t width,
37a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            int32_t height,
382edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            const OMX_CALLBACKTYPE *callbacks,
392edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            OMX_PTR appData,
402edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            OMX_COMPONENTTYPE **component);
412edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
42a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    virtual OMX_ERRORTYPE internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR param);
43a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    virtual OMX_ERRORTYPE internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params);
44a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
452edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarprotected:
46a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    void initPorts(
47a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            OMX_U32 numInputBuffers, OMX_U32 numOutputBuffers, OMX_U32 outputBufferSize,
48a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar            const char *mime, OMX_U32 minCompressionRatio = 1);
49a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
50a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    static void setRawVideoSize(OMX_PARAM_PORTDEFINITIONTYPE *def);
51a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
522edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    static void ConvertFlexYUVToPlanar(
532edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            uint8_t *dst, size_t dstStride, size_t dstVStride,
542edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            struct android_ycbcr *ycbcr, int32_t width, int32_t height);
552edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
562edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    static void ConvertYUV420SemiPlanarToYUV420Planar(
572edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            const uint8_t *inYVU, uint8_t* outYUV, int32_t width, int32_t height);
582edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
592edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    static void ConvertRGB32ToPlanar(
602edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar        uint8_t *dstY, size_t dstStride, size_t dstVStride,
612edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar        const uint8_t *src, size_t width, size_t height, size_t srcStride,
622edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar        bool bgr);
632edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
642edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    const uint8_t *extractGraphicBuffer(
652edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            uint8_t *dst, size_t dstSize, const uint8_t *src, size_t srcSize,
662edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar            size_t width, size_t height) const;
672edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
682edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    virtual OMX_ERRORTYPE getExtensionIndex(const char *name, OMX_INDEXTYPE *index);
692edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
70fed57366c58aa69ad8f1df5191d6bf48e58d86a8Dongwon Kang    OMX_ERRORTYPE validateInputBuffer(const OMX_BUFFERHEADERTYPE *inputBufferHeader);
71fed57366c58aa69ad8f1df5191d6bf48e58d86a8Dongwon Kang
722edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    enum {
732edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar        kInputPortIndex = 0,
742edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar        kOutputPortIndex = 1,
752edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    };
762edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
77a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    bool mInputDataIsMeta;
78a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    int32_t mWidth;      // width of the input frames
79a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    int32_t mHeight;     // height of the input frames
80a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mBitrate;   // target bitrate set for the encoder, in bits per second
81a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mFramerate; // target framerate set for the encoder, in Q16 format
82a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    OMX_COLOR_FORMATTYPE mColorFormat;  // Color format for the input port
83a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
842edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarprivate:
85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    void updatePortParams();
86a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    OMX_ERRORTYPE internalSetPortParams(const OMX_PARAM_PORTDEFINITIONTYPE* port);
87a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
88a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    static const uint32_t kInputBufferAlignment = 1;
89a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    static const uint32_t kOutputBufferAlignment = 2;
90a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
912edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    mutable const hw_module_t *mGrallocModule;
922edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
93a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinOutputBufferSize;
94a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    uint32_t mMinCompressionRatio;
95a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
96a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    const char *mComponentRole;
97a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    OMX_VIDEO_CODINGTYPE mCodingType;
98a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    const CodecProfileLevel *mProfileLevels;
99a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar    size_t mNumProfileLevels;
100a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar
1012edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar    DISALLOW_EVIL_CONSTRUCTORS(SoftVideoEncoderOMXComponent);
1022edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar};
1032edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
1042edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar}  // namespace android
1052edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar
1062edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#endif  // SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_
107