#ifndef MY_VPX_DEFS_H_
#define MY_VPX_DEFS_H_

#define VPX_IMG_FMT_PLANAR 0x100       /**< Image is a planar format. */
#define VPX_IMG_FMT_UV_FLIP 0x200      /**< V plane precedes U in memory. */
#define VPX_IMG_FMT_HAS_ALPHA 0x400    /**< Image has an alpha channel. */
#define VPX_IMG_FMT_HIGHBITDEPTH 0x800 /**< Image uses 16bit framebuffer. */

typedef unsigned char uint8_t;
typedef int vpx_codec_err_t;

enum class RenderMode {
    RENDER_BY_HOST_GPU = 1,
    RENDER_BY_GUEST_CPU = 2,
};

enum vpx_img_fmt_t {
    VPX_IMG_FMT_NONE,
    VPX_IMG_FMT_YV12 =
        VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 1, /**< planar YVU */
    VPX_IMG_FMT_I420 = VPX_IMG_FMT_PLANAR | 2,
    VPX_IMG_FMT_I422 = VPX_IMG_FMT_PLANAR | 5,
    VPX_IMG_FMT_I444 = VPX_IMG_FMT_PLANAR | 6,
    VPX_IMG_FMT_I440 = VPX_IMG_FMT_PLANAR | 7,
    VPX_IMG_FMT_I42016 = VPX_IMG_FMT_I420 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I42216 = VPX_IMG_FMT_I422 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I44416 = VPX_IMG_FMT_I444 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I44016 = VPX_IMG_FMT_I440 | VPX_IMG_FMT_HIGHBITDEPTH
};

struct vpx_image_t {
    vpx_img_fmt_t fmt; /**< Image Format */
    unsigned int d_w;  /**< Displayed image width */
    unsigned int d_h;  /**< Displayed image height */
    void *user_priv;
};

#define VPX_CODEC_OK 0

struct vpx_codec_ctx_t {
    int vpversion; // 8: vp8 or 9: vp9
    int version;   // 100: return decoded frame to guest; 200: render on host
    int hostColorBufferId;
    uint64_t id; // >= 1, unique
    int memory_slot;
    uint64_t address_offset = 0;
    size_t outputBufferWidth;
    size_t outputBufferHeight;
    size_t width;
    size_t height;
    size_t bpp;
    uint8_t *data;
    uint8_t *dst;
    vpx_image_t myImg;
};

int vpx_codec_destroy(vpx_codec_ctx_t *);
int vpx_codec_dec_init(vpx_codec_ctx_t *);
vpx_image_t *vpx_codec_get_frame(vpx_codec_ctx_t *, int hostColorBufferId = -1);
int vpx_codec_flush(vpx_codec_ctx_t *ctx);
int vpx_codec_decode(vpx_codec_ctx_t *ctx, const uint8_t *data,
                     unsigned int data_sz, void *user_priv, long deadline);

#endif // MY_VPX_DEFS_H_
