aom.h 5.3 KB
Newer Older
Adrian Grange's avatar
Adrian Grange committed
1
2
3
4
5
6
7
8
9
10
11
/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

Adrian Grange's avatar
Adrian Grange committed
12
/*!\defgroup aom AOM
Adrian Grange's avatar
Adrian Grange committed
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 * \ingroup codecs
 * AOM is aom's newest video compression algorithm that uses motion
 * compensated prediction, Discrete Cosine Transform (DCT) coding of the
 * prediction error signal and context dependent entropy coding techniques
 * based on arithmetic principles. It features:
 *  - YUV 4:2:0 image format
 *  - Macro-block based coding (16x16 luma plus two 8x8 chroma)
 *  - 1/4 (1/8) pixel accuracy motion compensated prediction
 *  - 4x4 DCT transform
 *  - 128 level linear quantizer
 *  - In loop deblocking filter
 *  - Context-based entropy coding
 *
 * @{
 */
/*!\file
 * \brief Provides controls common to both the AOM encoder and decoder.
 */
#ifndef AOM_AOM_H_
#define AOM_AOM_H_

#include "./aom_codec.h"
#include "./aom_image.h"

#ifdef __cplusplus
extern "C" {
#endif

/*!\brief Control functions
 *
 * The set of macros define the control functions of AOM interface
 */
Adrian Grange's avatar
Adrian Grange committed
45
enum aom_com_control_id {
Adrian Grange's avatar
Adrian Grange committed
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  AOM_SET_REFERENCE =
      1, /**< pass in an external frame into decoder to be used as reference
            frame */
  AOM_COPY_REFERENCE = 2, /**< get a copy of reference frame from the decoder */
  AOM_SET_POSTPROC = 3,   /**< set the decoder's post processing settings  */
  AOM_SET_DBG_COLOR_REF_FRAME =
      4, /**< set the reference frames to color for each macroblock */
  AOM_SET_DBG_COLOR_MB_MODES = 5, /**< set which macro block modes to color */
  AOM_SET_DBG_COLOR_B_MODES = 6,  /**< set which blocks modes to color */
  AOM_SET_DBG_DISPLAY_MV = 7,     /**< set which motion vector modes to draw */

  /* TODO(jkoleszar): The encoder incorrectly reuses some of these values (5+)
   * for its control ids. These should be migrated to something like the
   * AOM_DECODER_CTRL_ID_START range next time we're ready to break the ABI.
   */
  AV1_GET_REFERENCE = 128, /**< get a pointer to a reference frame */
  AOM_COMMON_CTRL_ID_MAX,
  AOM_DECODER_CTRL_ID_START = 256
};

/*!\brief post process flags
 *
 * The set of macros define AOM decoder post processing flags
 */
Adrian Grange's avatar
Adrian Grange committed
70
enum aom_postproc_level {
Adrian Grange's avatar
Adrian Grange committed
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  AOM_NOFILTERING = 0,
  AOM_DEBLOCK = 1 << 0,
  AOM_DEMACROBLOCK = 1 << 1,
  AOM_ADDNOISE = 1 << 2,
  AOM_DEBUG_TXT_FRAME_INFO = 1 << 3, /**< print frame information */
  AOM_DEBUG_TXT_MBLK_MODES =
      1 << 4, /**< print macro block modes over each macro block */
  AOM_DEBUG_TXT_DC_DIFF = 1 << 5,   /**< print dc diff for each macro block */
  AOM_DEBUG_TXT_RATE_INFO = 1 << 6, /**< print video rate info (encoder only) */
  AOM_MFQE = 1 << 10
};

/*!\brief post process flags
 *
 * This define a structure that describe the post processing settings. For
 * the best objective measure (using the PSNR metric) set post_proc_flag
 * to AOM_DEBLOCK and deblocking_level to 1.
 */

Adrian Grange's avatar
Adrian Grange committed
90
typedef struct aom_postproc_cfg {
Adrian Grange's avatar
Adrian Grange committed
91
  int post_proc_flag;   /**< the types of post processing to be done, should be
Adrian Grange's avatar
Adrian Grange committed
92
                           combination of "aom_postproc_level" */
Adrian Grange's avatar
Adrian Grange committed
93
94
  int deblocking_level; /**< the strength of deblocking, valid range [0, 16] */
  int noise_level; /**< the strength of additive noise, valid range [0, 16] */
Adrian Grange's avatar
Adrian Grange committed
95
} aom_postproc_cfg_t;
Adrian Grange's avatar
Adrian Grange committed
96
97
98
99
100
101
102
103
104
105
106
107
108

/*!\brief reference frame type
 *
 * The set of macros define the type of AOM reference frames
 */
typedef enum aom_ref_frame_type {
  AOM_LAST_FRAME = 1,
  AOM_GOLD_FRAME = 2,
  AOM_ALTR_FRAME = 4
} aom_ref_frame_type_t;

/*!\brief reference frame data struct
 *
Adrian Grange's avatar
Adrian Grange committed
109
 * Define the data struct to access aom reference frames.
Adrian Grange's avatar
Adrian Grange committed
110
111
112
113
114
115
116
117
 */
typedef struct aom_ref_frame {
  aom_ref_frame_type_t frame_type; /**< which reference frame */
  aom_image_t img;                 /**< reference frame data in image format */
} aom_ref_frame_t;

/*!\brief AV1 specific reference frame data struct
 *
Adrian Grange's avatar
Adrian Grange committed
118
 * Define the data struct to access av1 reference frames.
Adrian Grange's avatar
Adrian Grange committed
119
 */
Adrian Grange's avatar
Adrian Grange committed
120
typedef struct av1_ref_frame {
Adrian Grange's avatar
Adrian Grange committed
121
122
  int idx;         /**< frame index to get (input) */
  aom_image_t img; /**< img structure to populate (output) */
Adrian Grange's avatar
Adrian Grange committed
123
} av1_ref_frame_t;
Adrian Grange's avatar
Adrian Grange committed
124
125

/*!\cond */
Adrian Grange's avatar
Adrian Grange committed
126
/*!\brief aom decoder control function parameter type
Adrian Grange's avatar
Adrian Grange committed
127
128
129
130
131
132
133
 *
 * defines the data type for each of AOM decoder control function requires
 */
AOM_CTRL_USE_TYPE(AOM_SET_REFERENCE, aom_ref_frame_t *)
#define AOM_CTRL_AOM_SET_REFERENCE
AOM_CTRL_USE_TYPE(AOM_COPY_REFERENCE, aom_ref_frame_t *)
#define AOM_CTRL_AOM_COPY_REFERENCE
Adrian Grange's avatar
Adrian Grange committed
134
AOM_CTRL_USE_TYPE(AOM_SET_POSTPROC, aom_postproc_cfg_t *)
Adrian Grange's avatar
Adrian Grange committed
135
136
137
138
139
140
141
142
143
#define AOM_CTRL_AOM_SET_POSTPROC
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_REF_FRAME, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_REF_FRAME
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_MB_MODES, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_MB_MODES
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_B_MODES, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_B_MODES
AOM_CTRL_USE_TYPE(AOM_SET_DBG_DISPLAY_MV, int)
#define AOM_CTRL_AOM_SET_DBG_DISPLAY_MV
Adrian Grange's avatar
Adrian Grange committed
144
AOM_CTRL_USE_TYPE(AV1_GET_REFERENCE, av1_ref_frame_t *)
Adrian Grange's avatar
Adrian Grange committed
145
146
147
#define AOM_CTRL_AV1_GET_REFERENCE

/*!\endcond */
Adrian Grange's avatar
Adrian Grange committed
148
/*! @} - end defgroup aom */
Adrian Grange's avatar
Adrian Grange committed
149
150
151
152
153
154

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AOM_H_