/* INTEL CONFIDENTIAL
* Copyright (c) 2012 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_DECODER_VP8_H_
#define VIDEO_DECODER_VP8_H_

#include "VideoDecoderBase.h"


class VideoDecoderVP8 : public VideoDecoderBase {
public:
    VideoDecoderVP8(const char *mimeType);
    virtual ~VideoDecoderVP8();

    virtual Decode_Status start(VideoConfigBuffer *buffer);
    virtual void stop(void);
    virtual void flush(void);
    virtual Decode_Status decode(VideoDecodeBuffer *buffer);

protected:
    virtual Decode_Status checkHardwareCapability(VAProfile profile);

private:
    Decode_Status decodeFrame(VideoDecodeBuffer* buffer, vbp_data_vp8 *data);
    Decode_Status decodePicture(vbp_data_vp8 *data, int32_t picIndex);
    Decode_Status setReference(VAPictureParameterBufferVP8 *picParam, int32_t picIndex);
    Decode_Status startVA(vbp_data_vp8 *data);
    void updateReferenceFrames(vbp_data_vp8 *data);
    void refreshLastReference(vbp_data_vp8 *data);
    void refreshGoldenReference(vbp_data_vp8 *data);
    void refreshAltReference(vbp_data_vp8 *data);
    void updateFormatInfo(vbp_data_vp8 *data);
    void invalidateReferenceFrames(int toggle);
    void clearAsReference(int toggle, int ref_type);

private:
    enum {
        VP8_SURFACE_NUMBER = 9,
        VP8_REF_SIZE = 3,
    };

    enum {
        VP8_KEY_FRAME = 0,
        VP8_INTER_FRAME,
        VP8_SKIPPED_FRAME,
    };

    enum {
        VP8_LAST_REF_PIC = 0,
        VP8_GOLDEN_REF_PIC,
        VP8_ALT_REF_PIC,
    };

    enum {
        BufferCopied_NoneToGolden   = 0,
        BufferCopied_LastToGolden   = 1,
        BufferCopied_AltRefToGolden = 2
    };

    enum {
        BufferCopied_NoneToAltRef   = 0,
        BufferCopied_LastToAltRef   = 1,
        BufferCopied_GoldenToAltRef = 2
    };

    struct ReferenceFrameBuffer {
        VideoSurfaceBuffer *surfaceBuffer;
        int32_t index;
    };

    //[2] : [0 for current each reference frame, 1 for the previous each reference frame]
    //[VP8_REF_SIZE] : [0 for last ref pic, 1 for golden ref pic, 2 for alt ref pic]
    ReferenceFrameBuffer mRFBs[2][VP8_REF_SIZE];
};



#endif /* VIDEO_DECODER_VP8_H_ */
