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