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