/*
* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


#ifndef OMX_VIDEO_DECODER_BASE_H_
#define OMX_VIDEO_DECODER_BASE_H_


#include "OMXComponentCodecBase.h"
#include "VideoDecoderInterface.h"
#include "VideoDecoderHost.h"

#ifdef USE_GEN_HW
#include "graphics.h"
#endif

static constexpr const char* VA_VED_RAW_MIME_TYPE = "video/x-raw-vaved";
static const uint32_t VA_VED_COLOR_FORMAT = 0x20;


class OMXVideoDecoderBase : public OMXComponentCodecBase {
public:
    OMXVideoDecoderBase();
    virtual ~OMXVideoDecoderBase();

protected:
    virtual OMX_ERRORTYPE InitInputPort(void);
    virtual OMX_ERRORTYPE InitOutputPort(void);
    virtual OMX_ERRORTYPE InitInputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *input) = 0;
    virtual OMX_ERRORTYPE InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *output);

    virtual OMX_ERRORTYPE ProcessorInit(void);
    virtual OMX_ERRORTYPE ProcessorDeinit(void);
    virtual OMX_ERRORTYPE ProcessorStart(void);
    virtual OMX_ERRORTYPE ProcessorStop(void);
    virtual OMX_ERRORTYPE ProcessorPause(void);
    virtual OMX_ERRORTYPE ProcessorResume(void);
    virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex);
    virtual OMX_ERRORTYPE ProcessorProcess(
            OMX_BUFFERHEADERTYPE ***pBuffers,
            buffer_retain_t *retains,
            OMX_U32 numberBuffers);
    virtual OMX_ERRORTYPE ProcessorReset(void);
    virtual bool IsAllBufferAvailable(void);
    virtual OMX_ERRORTYPE SetMaxOutputBufferCount(OMX_PARAM_PORTDEFINITIONTYPE *p);
    virtual OMX_ERRORTYPE ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer);
    virtual OMX_ERRORTYPE ProcessorPreFreeBuffer(OMX_U32 nPortIndex,OMX_BUFFERHEADERTYPE * pBuffer);
    virtual OMX_ERRORTYPE PrepareConfigBuffer(VideoConfigBuffer *p);
    virtual OMX_ERRORTYPE PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
    virtual OMX_ERRORTYPE PrepareDecodeNativeHandleBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
    virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer,  buffer_retain_t *retain,
                              OMX_U32 inportBufferFlags,  OMX_BOOL *isResolutionChange);
    virtual OMX_ERRORTYPE HandleFormatChange(void);
    virtual OMX_ERRORTYPE TranslateDecodeStatus(Decode_Status status);
    virtual OMX_COLOR_FORMATTYPE GetOutputColorFormat(int width);
    virtual OMX_ERRORTYPE BuildHandlerList(void);
    virtual OMX_ERRORTYPE SetDecoderOutputCropSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE GetDecoderOutputCropSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE GetNativeBufferUsageSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE SetNativeBufferUsageSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE SetNativeBufferModeSpecific(OMX_PTR pStructure);
    virtual OMX_ERRORTYPE GetNativeBufferModeSpecific(OMX_PTR pStructure);

    DECLARE_HANDLER(OMXVideoDecoderBase, ParamVideoPortFormat);
    DECLARE_HANDLER(OMXVideoDecoderBase, CapabilityFlags);
    DECLARE_HANDLER(OMXVideoDecoderBase, NativeBufferUsage);
    DECLARE_HANDLER(OMXVideoDecoderBase, NativeBuffer);
    DECLARE_HANDLER(OMXVideoDecoderBase, NativeBufferMode);
    DECLARE_HANDLER(OMXVideoDecoderBase, DecoderRotation);
    DECLARE_HANDLER(OMXVideoDecoderBase, DecoderOutputCrop);
#ifdef TARGET_HAS_ISV
    DECLARE_HANDLER(OMXVideoDecoderBase, DecoderVppBufferNum);
#endif
    DECLARE_HANDLER(OMXVideoDecoderBase, StoreMetaDataMode);
    DECLARE_HANDLER(OMXVideoDecoderBase, ErrorReportMode);
    DECLARE_HANDLER(OMXVideoDecoderBase, CodecPriority);
    DECLARE_HANDLER(OMXVideoDecoderBase, DecoderOperatingRate);

private:
    enum {
        // OMX_PARAM_PORTDEFINITIONTYPE
        INPORT_MIN_BUFFER_COUNT = 1,
        INPORT_ACTUAL_BUFFER_COUNT = 256,
        INPORT_BUFFER_SIZE = 1382400,

        // OMX_PARAM_PORTDEFINITIONTYPE
        OUTPORT_MIN_BUFFER_COUNT = 1,
        OUTPORT_ACTUAL_BUFFER_COUNT = 4,
        OUTPORT_BUFFER_SIZE = 1382400,

        OUTPORT_NATIVE_BUFFER_COUNT = 10,
    };

    struct GraphicBufferParam {
        uint32_t graphicBufferHStride;
        uint32_t graphicBufferVStride;
        uint32_t graphicBufferWidth;
        uint32_t graphicBufferHeight;
        uint32_t graphicBufferColorFormat;
    };
    uint32_t mRotationDegrees;
#ifdef TARGET_HAS_ISV
    uint32_t mVppBufferNum;
#endif

    // Codec priority. Higher value means lower priority
    // Currently, only two levels are supported:
    // 0: realtime priority - This will only be used by
    //    media playback, capture, and possibly by realtime
    //    communication scenarios if best effort performance is not suitable.
    // 1: non-realtime priority (best effort). This is the default value.
    uint32_t mCodecPriority;

    uint32_t mOperatingRate;

protected:
    IVideoDecoder *mVideoDecoder;
    int  mNativeBufferCount;
    enum WorkingMode {
        GRAPHICBUFFER_MODE,
        RAWDATA_MODE,
    };
    WorkingMode mWorkingMode;
    bool mErrorReportEnabled;
    GraphicBufferParam mGraphicBufferParam;
    uint32_t mOMXBufferHeaderTypePtrNum;
    OMX_BUFFERHEADERTYPE *mOMXBufferHeaderTypePtrArray[MAX_GRAPHIC_BUFFER_NUM];

    enum AdaptivePlaybackMode {
        METADATA_MODE,
        LEGACY_MODE,
    };
    AdaptivePlaybackMode mAPMode;
    uint32_t mMetaDataBuffersNum;
    OMX_TICKS mFlushMode;
    bool mFormatChanged;
    uint32_t getStride(uint32_t width);
};

#endif /* OMX_VIDEO_DECODER_BASE_H_ */
