190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\defgroup vp8 VP8
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \ingroup codecs
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * VP8 is vpx's newest video compression algorithm that uses motion
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * compensated prediction, Discrete Cosine Transform (DCT) coding of the
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * prediction error signal and context dependent entropy coding techniques
1679f15823c34ae1e423108295e416213200bb280fAndreas Huber * based on arithmetic principles. It features:
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - YUV 4:2:0 image format
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - Macro-block based coding (16x16 luma plus two 8x8 chroma)
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - 1/4 (1/8) pixel accuracy motion compensated prediction
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - 4x4 DCT transform
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - 128 level linear quantizer
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - In loop deblocking filter
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  - Context-based entropy coding
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @{
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
2779f15823c34ae1e423108295e416213200bb280fAndreas Huber/*!\file
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \brief Provides controls common to both the VP8 encoder and decoder.
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VPX_VP8_H_
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VPX_VP8_H_
325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_codec.h"
345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "./vpx_image.h"
355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __cplusplus
375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern "C" {
385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief Control functions
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The set of macros define the control functions of VP8 interface
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangenum vp8_com_control_id {
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_REFERENCE           = 1,    /**< pass in an external frame into decoder to be used as reference frame */
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_COPY_REFERENCE          = 2,    /**< get a copy of reference frame from the decoder */
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_POSTPROC            = 3,    /**< set the decoder's post processing settings  */
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_DBG_COLOR_REF_FRAME = 4,    /**< set the reference frames to color for each macroblock */
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_DBG_COLOR_MB_MODES  = 5,    /**< set which macro block modes to color */
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_DBG_COLOR_B_MODES   = 6,    /**< set which blocks modes to color */
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_SET_DBG_DISPLAY_MV      = 7,    /**< set which motion vector modes to draw */
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  /* TODO(jkoleszar): The encoder incorrectly reuses some of these values (5+)
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * for its control ids. These should be migrated to something like the
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   * VP8_DECODER_CTRL_ID_START range next time we're ready to break the ABI.
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang   */
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP9_GET_REFERENCE           = 128,  /**< get a pointer to a reference frame */
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_COMMON_CTRL_ID_MAX,
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DECODER_CTRL_ID_START   = 256
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief post process flags
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The set of macros define VP8 decoder post processing flags
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangenum vp8_postproc_level {
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_NOFILTERING             = 0,
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEBLOCK                 = 1 << 0,
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEMACROBLOCK            = 1 << 1,
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_ADDNOISE                = 1 << 2,
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEBUG_TXT_FRAME_INFO    = 1 << 3, /**< print frame information */
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEBUG_TXT_MBLK_MODES    = 1 << 4, /**< print macro block modes over each macro block */
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEBUG_TXT_DC_DIFF       = 1 << 5, /**< print dc diff for each macro block */
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_DEBUG_TXT_RATE_INFO     = 1 << 6, /**< print video rate info (encoder only) */
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_MFQE                    = 1 << 10
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief post process flags
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This define a structure that describe the post processing settings. For
8179f15823c34ae1e423108295e416213200bb280fAndreas Huber * the best objective measure (using the PSNR metric) set post_proc_flag
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * to VP8_DEBLOCK and deblocking_level to 1.
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct vp8_postproc_cfg {
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int post_proc_flag;         /**< the types of post processing to be done, should be combination of "vp8_postproc_level" */
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int deblocking_level;       /**< the strength of deblocking, valid range [0, 16] */
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int noise_level;            /**< the strength of additive noise, valid range [0, 16] */
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vp8_postproc_cfg_t;
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief reference frame type
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * The set of macros define the type of VP8 reference frames
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum vpx_ref_frame_type {
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_LAST_FRAME = 1,
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_GOLD_FRAME = 2,
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  VP8_ALTR_FRAME = 4
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vpx_ref_frame_type_t;
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\brief reference frame data struct
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Define the data struct to access vp8 reference frames.
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct vpx_ref_frame {
106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_ref_frame_type_t  frame_type;   /**< which reference frame */
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_image_t           img;          /**< reference frame data in image format */
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} vpx_ref_frame_t;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/*!\brief VP9 specific reference frame data struct
1115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *
1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Define the data struct to access vp9 reference frames.
1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct vp9_ref_frame {
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int idx; /**< frame index to get (input) */
116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  vpx_image_t  img; /**< img structure to populate (output) */
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} vp9_ref_frame_t;
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11979f15823c34ae1e423108295e416213200bb280fAndreas Huber/*!\brief vp8 decoder control function parameter type
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
12179f15823c34ae1e423108295e416213200bb280fAndreas Huber * defines the data type for each of VP8 decoder control function requires
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_REFERENCE,           vpx_ref_frame_t *)
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberVPX_CTRL_USE_TYPE(VP8_COPY_REFERENCE,          vpx_ref_frame_t *)
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_POSTPROC,            vp8_postproc_cfg_t *)
12679f15823c34ae1e423108295e416213200bb280fAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_REF_FRAME, int)
12779f15823c34ae1e423108295e416213200bb280fAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_MB_MODES,  int)
12879f15823c34ae1e423108295e416213200bb280fAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_B_MODES,   int)
12979f15823c34ae1e423108295e416213200bb280fAndreas HuberVPX_CTRL_USE_TYPE(VP8_SET_DBG_DISPLAY_MV,      int)
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangVPX_CTRL_USE_TYPE(VP9_GET_REFERENCE,           vp9_ref_frame_t *)
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*! @} - end defgroup vp8 */
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __cplusplus
1355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // extern "C"
1365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
1375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // VPX_VP8_H_
139