/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#ifndef __INC_VP8D_H
#define __INC_VP8D_H


/* Create/destroy static data structures. */
#ifdef __cplusplus
extern "C"
{
#endif
#include "type_aliases.h"
#include "vpx_scale/yv12config.h"
#include "ppflags.h"
#include "vpx_ports/mem.h"
#include "vpx/vpx_codec.h"

  typedef void   *VP8D_PTR;
  typedef struct {
    int     Width;
    int     Height;
    int     Version;
    int     postprocess;
    int     max_threads;
    int     input_partition;
  } VP8D_CONFIG;
  typedef enum {
    VP8_LAST_FLAG = 1,
    VP8_GOLD_FLAG = 2,
    VP8_ALT_FLAG = 4
  } VP8_REFFRAME;

  typedef enum {
    VP8D_OK = 0
  } VP8D_SETTING;

  void vp8dx_initialize(void);

  void vp8dx_set_setting(VP8D_PTR comp, VP8D_SETTING oxst, int x);

  int vp8dx_get_setting(VP8D_PTR comp, VP8D_SETTING oxst);

  int vp8dx_receive_compressed_data(VP8D_PTR comp, unsigned long size, const unsigned char *dest, int64_t time_stamp);
  int vp8dx_get_raw_frame(VP8D_PTR comp, YV12_BUFFER_CONFIG *sd, int64_t *time_stamp, int64_t *time_end_stamp, vp8_ppflags_t *flags);

  vpx_codec_err_t vp8dx_get_reference(VP8D_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
  vpx_codec_err_t vp8dx_set_reference(VP8D_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);

  VP8D_PTR vp8dx_create_decompressor(VP8D_CONFIG *oxcf);

  void vp8dx_remove_decompressor(VP8D_PTR comp);

#ifdef __cplusplus
}
#endif


#endif
