1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\defgroup vp8 VP8
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * \ingroup codecs
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * VP8 is vpx's newest video compression algorithm that uses motion
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * compensated prediction, Discrete Cosine Transform (DCT) coding of the
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * prediction error signal and context dependent entropy coding techniques
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * based on arithmetic principles. It features:
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - YUV 4:2:0 image format
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - Macro-block based coding (16x16 luma plus two 8x8 chroma)
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - 1/4 (1/8) pixel accuracy motion compensated prediction
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - 4x4 DCT transform
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - 128 level linear quantizer
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - In loop deblocking filter
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  - Context-based entropy coding
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * @{
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\file
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * \brief Provides controls common to both the VP8 encoder and decoder.
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
308b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#ifndef VPX_VP8_H_
318b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#define VPX_VP8_H_
329af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org
339af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#include "./vpx_codec.h"
349af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#include "./vpx_image.h"
359af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org
369af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#ifdef __cplusplus
379af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.orgextern "C" {
389af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#endif
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief Control functions
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * The set of macros define the control functions of VP8 interface
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgenum vp8_com_control_id {
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_REFERENCE           = 1,    /**< pass in an external frame into decoder to be used as reference frame */
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_COPY_REFERENCE          = 2,    /**< get a copy of reference frame from the decoder */
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_POSTPROC            = 3,    /**< set the decoder's post processing settings  */
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_DBG_COLOR_REF_FRAME = 4,    /**< set the reference frames to color for each macroblock */
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_DBG_COLOR_MB_MODES  = 5,    /**< set which macro block modes to color */
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_DBG_COLOR_B_MODES   = 6,    /**< set which blocks modes to color */
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_SET_DBG_DISPLAY_MV      = 7,    /**< set which motion vector modes to draw */
521958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org
531958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org  /* TODO(jkoleszar): The encoder incorrectly reuses some of these values (5+)
541958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   * for its control ids. These should be migrated to something like the
551958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   * VP8_DECODER_CTRL_ID_START range next time we're ready to break the ABI.
561958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org   */
571958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org  VP9_GET_REFERENCE           = 128,  /**< get a pointer to a reference frame */
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_COMMON_CTRL_ID_MAX,
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DECODER_CTRL_ID_START   = 256
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief post process flags
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * The set of macros define VP8 decoder post processing flags
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgenum vp8_postproc_level {
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_NOFILTERING             = 0,
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEBLOCK                 = 1 << 0,
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEMACROBLOCK            = 1 << 1,
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_ADDNOISE                = 1 << 2,
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEBUG_TXT_FRAME_INFO    = 1 << 3, /**< print frame information */
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEBUG_TXT_MBLK_MODES    = 1 << 4, /**< print macro block modes over each macro block */
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEBUG_TXT_DC_DIFF       = 1 << 5, /**< print dc diff for each macro block */
746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_DEBUG_TXT_RATE_INFO     = 1 << 6, /**< print video rate info (encoder only) */
756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_MFQE                    = 1 << 10
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief post process flags
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * This define a structure that describe the post processing settings. For
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * the best objective measure (using the PSNR metric) set post_proc_flag
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * to VP8_DEBLOCK and deblocking_level to 1.
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgtypedef struct vp8_postproc_cfg {
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int post_proc_flag;         /**< the types of post processing to be done, should be combination of "vp8_postproc_level" */
876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int deblocking_level;       /**< the strength of deblocking, valid range [0, 16] */
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  int noise_level;            /**< the strength of additive noise, valid range [0, 16] */
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} vp8_postproc_cfg_t;
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief reference frame type
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * The set of macros define the type of VP8 reference frames
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgtypedef enum vpx_ref_frame_type {
966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_LAST_FRAME = 1,
976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_GOLD_FRAME = 2,
986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  VP8_ALTR_FRAME = 4
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} vpx_ref_frame_type_t;
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief reference frame data struct
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
1039af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org * Define the data struct to access vp8 reference frames.
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgtypedef struct vpx_ref_frame {
1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  vpx_ref_frame_type_t  frame_type;   /**< which reference frame */
1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  vpx_image_t           img;          /**< reference frame data in image format */
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} vpx_ref_frame_t;
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1109af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org/*!\brief VP9 specific reference frame data struct
1119af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org *
1129af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org * Define the data struct to access vp9 reference frames.
1139af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org */
1141958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.orgtypedef struct vp9_ref_frame {
1151958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org  int idx; /**< frame index to get (input) */
1161958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org  vpx_image_t  img; /**< img structure to populate (output) */
1171958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.org} vp9_ref_frame_t;
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\brief vp8 decoder control function parameter type
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * defines the data type for each of VP8 decoder control function requires
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_REFERENCE,           vpx_ref_frame_t *)
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_COPY_REFERENCE,          vpx_ref_frame_t *)
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_POSTPROC,            vp8_postproc_cfg_t *)
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_REF_FRAME, int)
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_MB_MODES,  int)
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_B_MODES,   int)
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgVPX_CTRL_USE_TYPE(VP8_SET_DBG_DISPLAY_MV,      int)
1301958a6b43506c5fdf713554177fdd12c3b255c54johannkoenig@chromium.orgVPX_CTRL_USE_TYPE(VP9_GET_REFERENCE,           vp9_ref_frame_t *)
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*! @} - end defgroup vp8 */
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1349af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#ifdef __cplusplus
1359af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org}  // extern "C"
1369af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org#endif
1379af24c977de5b020fffaf66d24a9f5725423aaaajohannkoenig@chromium.org
1388b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif  // VPX_VP8_H_
139