/*
 INTEL CONFIDENTIAL
 Copyright 2011 Intel Corporation All Rights Reserved.
 The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.

 No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
 */

#ifndef __VIDEO_ENCODER_BASE_H__
#define __VIDEO_ENCODER_BASE_H__

#include <va/va.h>
#include <va/va_tpi.h>
#include "VideoEncoderDef.h"
#include "VideoEncoderInterface.h"
class VideoEncoderBase : IVideoEncoder {

public:
    VideoEncoderBase();
    virtual ~VideoEncoderBase();

    virtual Encode_Status start(void);
    virtual void flush(void);
    virtual Encode_Status stop(void);
    virtual Encode_Status encode(VideoEncRawBuffer *inBuffer);

    /*
    * getOutput can be called several time for a frame (such as first time  codec data, and second time others)
    * encoder will provide encoded data according to the format (whole frame, codec_data, sigle NAL etc)
    * If the buffer passed to encoded is not big enough, this API call will return ENCODE_BUFFER_TOO_SMALL
    * and caller should provide a big enough buffer and call again
    */
    virtual Encode_Status getOutput(VideoEncOutputBuffer *outBuffer);

    virtual Encode_Status getParameters(VideoParamConfigSet *videoEncParams);
    virtual Encode_Status setParameters(VideoParamConfigSet *videoEncParams);
    virtual Encode_Status setConfig(VideoParamConfigSet *videoEncConfig);
    virtual Encode_Status getConfig(VideoParamConfigSet *videoEncConfig);

    virtual Encode_Status getMaxOutSize(uint32_t *maxSize);

protected:
    virtual Encode_Status sendEncodeCommand(void) = 0;
    virtual Encode_Status derivedSetParams(VideoParamConfigSet *videoEncParams) = 0;
    virtual Encode_Status derivedGetParams(VideoParamConfigSet *videoEncParams) = 0;
    virtual Encode_Status derivedGetConfig(VideoParamConfigSet *videoEncConfig) = 0;
    virtual Encode_Status derivedSetConfig(VideoParamConfigSet *videoEncConfig) = 0;

    Encode_Status prepareForOutput(VideoEncOutputBuffer *outBuffer, bool *useLocalBuffer);
    Encode_Status cleanupForOutput();
    Encode_Status outputAllData(VideoEncOutputBuffer *outBuffer);
    Encode_Status renderDynamicFrameRate();
    Encode_Status renderDynamicBitrate();
    Encode_Status renderHrd();
    void setKeyFrame(int32_t keyFramePeriod);

private:
    void setDefaultParams(void);
    Encode_Status setUpstreamBuffer(VideoParamsUpstreamBuffer *upStreamBuffer);
    Encode_Status getNewUsrptrFromSurface(uint32_t width, uint32_t height, uint32_t format,
            uint32_t expectedSize, uint32_t *outsize, uint32_t *stride, uint8_t **usrptr);
    Encode_Status generateVideoBufferAndAttachToList(uint32_t index, uint8_t *usrptr);
    Encode_Status surfaceMappingForSurfaceList();
    Encode_Status surfaceMappingForGfxHandle();
    Encode_Status surfaceMappingForCIFrameList();
    Encode_Status surfaceMappingForKbufHandle();

    VideoEncSurfaceBuffer *appendVideoSurfaceBuffer(
            VideoEncSurfaceBuffer *head, VideoEncSurfaceBuffer *buffer);
    VideoEncSurfaceBuffer *removeVideoSurfaceBuffer(
            VideoEncSurfaceBuffer *head, VideoEncSurfaceBuffer *buffer);
    VideoEncSurfaceBuffer *getVideoSurfaceBufferByIndex(
            VideoEncSurfaceBuffer *head, uint32_t index);

    Encode_Status manageSrcSurface(VideoEncRawBuffer *inBuffer);
    void updateProperities(void);
    void decideFrameType(void);
    Encode_Status uploadDataToSurface(VideoEncRawBuffer *inBuffer);
    Encode_Status syncEncode(VideoEncRawBuffer *inBuffer);
    Encode_Status asyncEncode(VideoEncRawBuffer *inBuffer);

protected:

    bool mInitialized;
    VADisplay mVADisplay;
    VADisplay mVADecoderDisplay;
    VAContextID mVAContext;
    VAConfigID mVAConfig;
    VAEntrypoint mVAEntrypoint;

    VACodedBufferSegment *mCurSegment;
    uint32_t mOffsetInSeg;
    uint32_t mTotalSize;
    uint32_t mTotalSizeCopied;

    VideoParamsCommon mComParams;
    VideoParamsHRD mHrdParam;

    VideoBufferSharingMode mBufferMode;
    uint32_t *mUpstreamBufferList;
    uint32_t mUpstreamBufferCnt;
    ExternalBufferAttrib *mBufAttrib;

    bool mForceKeyFrame;
    bool mNewHeader;
    bool mFirstFrame;

    bool mRenderMaxSliceSize; //Max Slice Size
    bool mRenderQP;
    bool mRenderAIR;
    bool mRenderFrameRate;
    bool mRenderBitRate;
    bool mRenderHrd;

    VABufferID mVACodedBuffer[2];
    VABufferID mLastCodedBuffer;
    VABufferID mOutCodedBuffer;
    VABufferID mSeqParamBuf;
    VABufferID mRcParamBuf;
    VABufferID mFrameRateParamBuf;
    VABufferID mPicParamBuf;
    VABufferID mSliceParamBuf;

    VASurfaceID *mSharedSurfaces;
    VASurfaceID *mSurfaces;
    uint32_t mSurfaceCnt;
    uint32_t mSharedSurfacesCnt;
    uint32_t mReqSurfacesCnt;
    uint8_t **mUsrPtr;

    VideoEncSurfaceBuffer *mVideoSrcBufferList;
    VideoEncSurfaceBuffer *mCurFrame;	//current input frame to be encoded;
    VideoEncSurfaceBuffer *mRefFrame;   //reference frame
    VideoEncSurfaceBuffer *mRecFrame;	//reconstructed frame;
    VideoEncSurfaceBuffer *mLastFrame;	//last frame;

    VideoEncRawBuffer *mLastInputRawBuffer;

    uint32_t mEncodedFrames;
    uint32_t mFrameNum;
    uint32_t mCodedBufSize;
    uint32_t mCodedBufIndex;

    bool mPicSkipped;
    bool mIsIntra;
    bool mSliceSizeOverflow;
    bool mCodedBufferMapped;
    bool mDataCopiedOut;
    bool mKeyFrame;

    // Constants
    static const uint32_t VENCODER_NUMBER_EXTRA_SURFACES_SHARED_MODE = 2;
    static const uint32_t VENCODER_NUMBER_EXTRA_SURFACES_NON_SHARED_MODE = 8;
};


#endif /* __VIDEO_ENCODER_BASE_H__ */
