blob: 0b4cb1b9e6d24b9d51a25e229c29d27273f4f932 [file] [log] [blame]
John Koleszar0ea50ce2010-05-18 11:58:33 -04001/*
John Koleszarc2140b82010-09-09 08:16:39 -04002 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar0ea50ce2010-05-18 11:58:33 -04003 *
John Koleszar94c52e42010-06-18 12:39:21 -04004 * Use of this source code is governed by a BSD-style license
John Koleszar09202d82010-06-04 16:19:40 -04005 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
John Koleszar94c52e42010-06-18 12:39:21 -04007 * in the file PATENTS. All contributing project authors may
John Koleszar09202d82010-06-04 16:19:40 -04008 * be found in the AUTHORS file in the root of the source tree.
John Koleszar0ea50ce2010-05-18 11:58:33 -04009 */
10
11
12/*!\defgroup vp8 VP8
13 * \ingroup codecs
14 * VP8 is vpx's newest video compression algorithm that uses motion
15 * compensated prediction, Discrete Cosine Transform (DCT) coding of the
16 * prediction error signal and context dependent entropy coding techniques
James Zernf42d52e2011-02-16 17:54:49 -080017 * based on arithmetic principles. It features:
John Koleszar0ea50ce2010-05-18 11:58:33 -040018 * - YUV 4:2:0 image format
19 * - Macro-block based coding (16x16 luma plus two 8x8 chroma)
20 * - 1/4 (1/8) pixel accuracy motion compensated prediction
21 * - 4x4 DCT transform
22 * - 128 level linear quantizer
23 * - In loop deblocking filter
24 * - Context-based entropy coding
25 *
26 * @{
27 */
James Zernf42d52e2011-02-16 17:54:49 -080028/*!\file
John Koleszar0ea50ce2010-05-18 11:58:33 -040029 * \brief Provides controls common to both the VP8 encoder and decoder.
30 */
John Koleszar83b1d902012-11-05 12:37:14 -080031#ifndef VP8_H
32#define VP8_H
Johann4e4f8352011-06-28 14:46:24 -040033#include "vpx_codec_impl_top.h"
John Koleszar0ea50ce2010-05-18 11:58:33 -040034
35/*!\brief Control functions
36 *
37 * The set of macros define the control functions of VP8 interface
38 */
John Koleszarc6b90392012-07-13 15:21:29 -070039enum vp8_com_control_id {
40 VP8_SET_REFERENCE = 1, /**< pass in an external frame into decoder to be used as reference frame */
41 VP8_COPY_REFERENCE = 2, /**< get a copy of reference frame from the decoder */
42 VP8_SET_POSTPROC = 3, /**< set the decoder's post processing settings */
43 VP8_SET_DBG_COLOR_REF_FRAME = 4, /**< set the reference frames to color for each macroblock */
44 VP8_SET_DBG_COLOR_MB_MODES = 5, /**< set which macro block modes to color */
45 VP8_SET_DBG_COLOR_B_MODES = 6, /**< set which blocks modes to color */
46 VP8_SET_DBG_DISPLAY_MV = 7, /**< set which motion vector modes to draw */
John Koleszarb3c350a2013-03-13 12:15:43 -070047
48 /* TODO(jkoleszar): The encoder incorrectly reuses some of these values (5+)
49 * for its control ids. These should be migrated to something like the
50 * VP8_DECODER_CTRL_ID_START range next time we're ready to break the ABI.
51 */
52 VP9_GET_REFERENCE = 128, /**< get a pointer to a reference frame */
John Koleszarc6b90392012-07-13 15:21:29 -070053 VP8_COMMON_CTRL_ID_MAX,
John Koleszar83b1d902012-11-05 12:37:14 -080054 VP8_DECODER_CTRL_ID_START = 256
John Koleszar0ea50ce2010-05-18 11:58:33 -040055};
56
57/*!\brief post process flags
58 *
59 * The set of macros define VP8 decoder post processing flags
60 */
John Koleszarc6b90392012-07-13 15:21:29 -070061enum vp8_postproc_level {
62 VP8_NOFILTERING = 0,
63 VP8_DEBLOCK = 1 << 0,
64 VP8_DEMACROBLOCK = 1 << 1,
65 VP8_ADDNOISE = 1 << 2,
66 VP8_DEBUG_TXT_FRAME_INFO = 1 << 3, /**< print frame information */
67 VP8_DEBUG_TXT_MBLK_MODES = 1 << 4, /**< print macro block modes over each macro block */
68 VP8_DEBUG_TXT_DC_DIFF = 1 << 5, /**< print dc diff for each macro block */
69 VP8_DEBUG_TXT_RATE_INFO = 1 << 6, /**< print video rate info (encoder only) */
John Koleszar83b1d902012-11-05 12:37:14 -080070 VP8_MFQE = 1 << 10
John Koleszar0ea50ce2010-05-18 11:58:33 -040071};
72
73/*!\brief post process flags
74 *
75 * This define a structure that describe the post processing settings. For
James Zernf42d52e2011-02-16 17:54:49 -080076 * the best objective measure (using the PSNR metric) set post_proc_flag
John Koleszar0ea50ce2010-05-18 11:58:33 -040077 * to VP8_DEBLOCK and deblocking_level to 1.
78 */
79
John Koleszarc6b90392012-07-13 15:21:29 -070080typedef struct vp8_postproc_cfg {
81 int post_proc_flag; /**< the types of post processing to be done, should be combination of "vp8_postproc_level" */
82 int deblocking_level; /**< the strength of deblocking, valid range [0, 16] */
83 int noise_level; /**< the strength of additive noise, valid range [0, 16] */
John Koleszar0ea50ce2010-05-18 11:58:33 -040084} vp8_postproc_cfg_t;
85
86/*!\brief reference frame type
87 *
88 * The set of macros define the type of VP8 reference frames
89 */
John Koleszarc6b90392012-07-13 15:21:29 -070090typedef enum vpx_ref_frame_type {
91 VP8_LAST_FRAME = 1,
92 VP8_GOLD_FRAME = 2,
93 VP8_ALTR_FRAME = 4
John Koleszar0ea50ce2010-05-18 11:58:33 -040094} vpx_ref_frame_type_t;
95
96/*!\brief reference frame data struct
97 *
98 * define the data struct to access vp8 reference frames
99 */
100
John Koleszarc6b90392012-07-13 15:21:29 -0700101typedef struct vpx_ref_frame {
102 vpx_ref_frame_type_t frame_type; /**< which reference frame */
103 vpx_image_t img; /**< reference frame data in image format */
John Koleszar0ea50ce2010-05-18 11:58:33 -0400104} vpx_ref_frame_t;
105
John Koleszarb3c350a2013-03-13 12:15:43 -0700106typedef struct vp9_ref_frame {
107 int idx; /**< frame index to get (input) */
108 vpx_image_t img; /**< img structure to populate (output) */
109} vp9_ref_frame_t;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400110
James Zernf42d52e2011-02-16 17:54:49 -0800111/*!\brief vp8 decoder control function parameter type
John Koleszar0ea50ce2010-05-18 11:58:33 -0400112 *
Fritz Koenig647df002010-11-04 16:03:36 -0700113 * defines the data type for each of VP8 decoder control function requires
John Koleszar0ea50ce2010-05-18 11:58:33 -0400114 */
115
116VPX_CTRL_USE_TYPE(VP8_SET_REFERENCE, vpx_ref_frame_t *)
117VPX_CTRL_USE_TYPE(VP8_COPY_REFERENCE, vpx_ref_frame_t *)
118VPX_CTRL_USE_TYPE(VP8_SET_POSTPROC, vp8_postproc_cfg_t *)
Fritz Koenig647df002010-11-04 16:03:36 -0700119VPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_REF_FRAME, int)
120VPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_MB_MODES, int)
121VPX_CTRL_USE_TYPE(VP8_SET_DBG_COLOR_B_MODES, int)
122VPX_CTRL_USE_TYPE(VP8_SET_DBG_DISPLAY_MV, int)
John Koleszarb3c350a2013-03-13 12:15:43 -0700123VPX_CTRL_USE_TYPE(VP9_GET_REFERENCE, vp9_ref_frame_t *)
John Koleszar0ea50ce2010-05-18 11:58:33 -0400124
125
126/*! @} - end defgroup vp8 */
127
Johann4e4f8352011-06-28 14:46:24 -0400128#include "vpx_codec_impl_bottom.h"
John Koleszar0ea50ce2010-05-18 11:58:33 -0400129#endif