• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3  *
4  * This source code is subject to the terms of the BSD 2 Clause License and
5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6  * was not distributed with this source code in the LICENSE file, you can
7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8  * Media Patent License 1.0 was not distributed with this source code in the
9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10  */
11 
12 /*!\defgroup aom_decoder AOMedia AOM/AV1 Decoder
13  * \ingroup aom
14  *
15  * @{
16  */
17 /*!\file
18  * \brief Provides definitions for using AOM or AV1 within the aom Decoder
19  *        interface.
20  */
21 #ifndef AOM_AOM_AOMDX_H_
22 #define AOM_AOM_AOMDX_H_
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /* Include controls common to both the encoder and decoder */
29 #include "aom/aom.h"
30 
31 /*!\name Algorithm interface for AV1
32  *
33  * This interface provides the capability to decode AV1 streams.
34  * @{
35  */
36 extern aom_codec_iface_t aom_codec_av1_dx_algo;
37 extern aom_codec_iface_t *aom_codec_av1_dx(void);
38 /*!@} - end algorithm interface member group*/
39 
40 /** Data structure that stores bit accounting for debug
41  */
42 typedef struct Accounting Accounting;
43 
44 #ifndef AOM_INSPECTION_H_
45 /** Callback that inspects decoder frame data.
46  */
47 typedef void (*aom_inspect_cb)(void *decoder, void *ctx);
48 
49 #endif
50 
51 /*!\brief Structure to hold inspection callback and context.
52  *
53  * Defines a structure to hold the inspection callback function and calling
54  * context.
55  */
56 typedef struct aom_inspect_init {
57   /*! Inspection callback. */
58   aom_inspect_cb inspect_cb;
59 
60   /*! Inspection context. */
61   void *inspect_ctx;
62 } aom_inspect_init;
63 
64 /*!\brief Structure to collect a buffer index when inspecting.
65  *
66  * Defines a structure to hold the buffer and return an index
67  * when calling decode from inspect. This enables us to decode
68  * non showable sub frames.
69  */
70 typedef struct {
71   /*! Pointer for new position in compressed buffer after decoding 1 OBU. */
72   const unsigned char *buf;
73   /*! Index into reference buffer array to see result of decoding 1 OBU. */
74   int idx;
75   /*! Is a show existing frame. */
76   int show_existing;
77 } Av1DecodeReturn;
78 
79 /*!\brief Structure to hold a tile's start address and size in the bitstream.
80  *
81  * Defines a structure to hold a tile's start address and size in the bitstream.
82  */
83 typedef struct aom_tile_data {
84   /*! Tile data size. */
85   size_t coded_tile_data_size;
86   /*! Tile's start address. */
87   const void *coded_tile_data;
88   /*! Extra size information. */
89   size_t extra_size;
90 } aom_tile_data;
91 
92 /*!\brief Structure to hold the external reference frame pointer.
93  *
94  * Define a structure to hold the external reference frame pointer.
95  */
96 typedef struct av1_ext_ref_frame {
97   /*! Start pointer of external references. */
98   aom_image_t *img;
99   /*! Number of available external references. */
100   int num;
101 } av1_ext_ref_frame_t;
102 
103 /*!\enum aom_dec_control_id
104  * \brief AOM decoder control functions
105  *
106  * This set of macros define the control functions available for the AOM
107  * decoder interface.
108  *
109  * \sa #aom_codec_control
110  */
111 enum aom_dec_control_id {
112   /** control function to get info on which reference frames were updated
113    *  by the last decode
114    */
115   AOMD_GET_LAST_REF_UPDATES = AOM_DECODER_CTRL_ID_START,
116 
117   /** check if the indicated frame is corrupted */
118   AOMD_GET_FRAME_CORRUPTED,
119 
120   /** control function to get info on which reference frames were used
121    *  by the last decode
122    */
123   AOMD_GET_LAST_REF_USED,
124 
125   /** control function to get the dimensions that the current frame is decoded
126    * at. This may be different to the intended display size for the frame as
127    * specified in the wrapper or frame header (see AV1D_GET_DISPLAY_SIZE). */
128   AV1D_GET_FRAME_SIZE,
129 
130   /** control function to get the current frame's intended display dimensions
131    * (as specified in the wrapper or frame header). This may be different to
132    * the decoded dimensions of this frame (see AV1D_GET_FRAME_SIZE). */
133   AV1D_GET_DISPLAY_SIZE,
134 
135   /** control function to get the bit depth of the stream. */
136   AV1D_GET_BIT_DEPTH,
137 
138   /** control function to get the image format of the stream. */
139   AV1D_GET_IMG_FORMAT,
140 
141   /** control function to get the size of the tile. */
142   AV1D_GET_TILE_SIZE,
143 
144   /** control function to get the tile count in a tile list. */
145   AV1D_GET_TILE_COUNT,
146 
147   /** control function to set the byte alignment of the planes in the reference
148    * buffers. Valid values are power of 2, from 32 to 1024. A value of 0 sets
149    * legacy alignment. I.e. Y plane is aligned to 32 bytes, U plane directly
150    * follows Y plane, and V plane directly follows U plane. Default value is 0.
151    */
152   AV1_SET_BYTE_ALIGNMENT,
153 
154   /** control function to invert the decoding order to from right to left. The
155    * function is used in a test to confirm the decoding independence of tile
156    * columns. The function may be used in application where this order
157    * of decoding is desired.
158    *
159    * TODO(yaowu): Rework the unit test that uses this control, and in a future
160    *              release, this test-only control shall be removed.
161    */
162   AV1_INVERT_TILE_DECODE_ORDER,
163 
164   /** control function to set the skip loop filter flag. Valid values are
165    * integers. The decoder will skip the loop filter when its value is set to
166    * nonzero. If the loop filter is skipped the decoder may accumulate decode
167    * artifacts. The default value is 0.
168    */
169   AV1_SET_SKIP_LOOP_FILTER,
170 
171   /** control function to retrieve a pointer to the Accounting struct.  When
172    * compiled without --enable-accounting, this returns AOM_CODEC_INCAPABLE.
173    * If called before a frame has been decoded, this returns AOM_CODEC_ERROR.
174    * The caller should ensure that AOM_CODEC_OK is returned before attempting
175    * to dereference the Accounting pointer.
176    */
177   AV1_GET_ACCOUNTING,
178 
179   /** control function to get last decoded frame quantizer. Returned value uses
180    * internal quantizer scale defined by the codec.
181    */
182   AOMD_GET_LAST_QUANTIZER,
183 
184   /** control function to set the range of tile decoding. A value that is
185    * greater and equal to zero indicates only the specific row/column is
186    * decoded. A value that is -1 indicates the whole row/column is decoded.
187    * A special case is both values are -1 that means the whole frame is
188    * decoded.
189    */
190   AV1_SET_DECODE_TILE_ROW,
191   AV1_SET_DECODE_TILE_COL,
192   /** control function to set the tile coding mode. A value that is equal to
193    *  zero indicates the tiles are coded in normal tile mode. A value that is
194    *  1 indicates the tiles are coded in large-scale tile mode.
195    */
196   AV1_SET_TILE_MODE,
197   /** control function to get the frame header information of an encoded frame
198    * in the bitstream. This provides a way to access a frame's header data.
199    */
200   AV1D_GET_FRAME_HEADER_INFO,
201   /** control function to get the start address and size of a tile in the coded
202    * bitstream. This provides a way to access a specific tile's bitstream data.
203    */
204   AV1D_GET_TILE_DATA,
205   /** control function to set the external references' pointers in the decoder.
206    *  This is used while decoding the tile list OBU in large-scale tile coding
207    *  mode.
208    */
209   AV1D_SET_EXT_REF_PTR,
210   /** control function to enable the ext-tile software debug and testing code in
211    * the decoder.
212    */
213   AV1D_EXT_TILE_DEBUG,
214 
215   /** control function to enable the row based multi-threading of decoding. A
216    * value that is equal to 1 indicates that row based multi-threading is
217    * enabled.
218    */
219   AV1D_SET_ROW_MT,
220 
221   /** control function to indicate whether bitstream is in Annex-B format. */
222   AV1D_SET_IS_ANNEXB,
223 
224   /** control function to indicate which operating point to use. A scalable
225    *  stream may define multiple operating points, each of which defines a
226    *  set of temporal and spatial layers to be processed. The operating point
227    *  index may take a value between 0 and operating_points_cnt_minus_1 (which
228    *  is at most 31).
229    */
230   AV1D_SET_OPERATING_POINT,
231 
232   /** control function to indicate whether to output one frame per temporal
233    *  unit (the default), or one frame per spatial layer.
234    *  In a scalable stream, each temporal unit corresponds to a single "frame"
235    *  of video, and within a temporal unit there may be multiple spatial layers
236    *  with different versions of that frame.
237    *  For video playback, only the highest-quality version (within the
238    *  selected operating point) is needed, but for some use cases it is useful
239    *  to have access to multiple versions of a frame when they are available.
240    */
241   AV1D_SET_OUTPUT_ALL_LAYERS,
242 
243   /** control function to set an aom_inspect_cb callback that is invoked each
244    * time a frame is decoded.  When compiled without --enable-inspection, this
245    * returns AOM_CODEC_INCAPABLE.
246    */
247   AV1_SET_INSPECTION_CALLBACK,
248 
249   /** control function to set the skip film grain flag. Valid values are
250    * integers. The decoder will skip the film grain when its value is set to
251    * nonzero. The default value is 0.
252    */
253   AV1D_SET_SKIP_FILM_GRAIN,
254 
255   AOM_DECODER_CTRL_ID_MAX,
256 };
257 
258 /*!\cond */
259 /*!\brief AOM decoder control function parameter type
260  *
261  * Defines the data types that AOMD control functions take. Note that
262  * additional common controls are defined in aom.h
263  *
264  */
265 
266 AOM_CTRL_USE_TYPE(AOMD_GET_LAST_REF_UPDATES, int *)
267 #define AOM_CTRL_AOMD_GET_LAST_REF_UPDATES
268 AOM_CTRL_USE_TYPE(AOMD_GET_FRAME_CORRUPTED, int *)
269 #define AOM_CTRL_AOMD_GET_FRAME_CORRUPTED
270 AOM_CTRL_USE_TYPE(AOMD_GET_LAST_REF_USED, int *)
271 #define AOM_CTRL_AOMD_GET_LAST_REF_USED
272 AOM_CTRL_USE_TYPE(AOMD_GET_LAST_QUANTIZER, int *)
273 #define AOM_CTRL_AOMD_GET_LAST_QUANTIZER
274 AOM_CTRL_USE_TYPE(AV1D_GET_DISPLAY_SIZE, int *)
275 #define AOM_CTRL_AV1D_GET_DISPLAY_SIZE
276 AOM_CTRL_USE_TYPE(AV1D_GET_BIT_DEPTH, unsigned int *)
277 #define AOM_CTRL_AV1D_GET_BIT_DEPTH
278 AOM_CTRL_USE_TYPE(AV1D_GET_IMG_FORMAT, aom_img_fmt_t *)
279 #define AOM_CTRL_AV1D_GET_IMG_FORMAT
280 AOM_CTRL_USE_TYPE(AV1D_GET_TILE_SIZE, unsigned int *)
281 #define AOM_CTRL_AV1D_GET_TILE_SIZE
282 AOM_CTRL_USE_TYPE(AV1D_GET_TILE_COUNT, unsigned int *)
283 #define AOM_CTRL_AV1D_GET_TILE_COUNT
284 AOM_CTRL_USE_TYPE(AV1D_GET_FRAME_SIZE, int *)
285 #define AOM_CTRL_AV1D_GET_FRAME_SIZE
286 AOM_CTRL_USE_TYPE(AV1_INVERT_TILE_DECODE_ORDER, int)
287 #define AOM_CTRL_AV1_INVERT_TILE_DECODE_ORDER
288 AOM_CTRL_USE_TYPE(AV1_GET_ACCOUNTING, Accounting **)
289 #define AOM_CTRL_AV1_GET_ACCOUNTING
290 AOM_CTRL_USE_TYPE(AV1_SET_DECODE_TILE_ROW, int)
291 #define AOM_CTRL_AV1_SET_DECODE_TILE_ROW
292 AOM_CTRL_USE_TYPE(AV1_SET_DECODE_TILE_COL, int)
293 #define AOM_CTRL_AV1_SET_DECODE_TILE_COL
294 AOM_CTRL_USE_TYPE(AV1_SET_TILE_MODE, unsigned int)
295 #define AOM_CTRL_AV1_SET_TILE_MODE
296 AOM_CTRL_USE_TYPE(AV1D_GET_FRAME_HEADER_INFO, aom_tile_data *)
297 #define AOM_CTRL_AV1D_GET_FRAME_HEADER_INFO
298 AOM_CTRL_USE_TYPE(AV1D_GET_TILE_DATA, aom_tile_data *)
299 #define AOM_CTRL_AV1D_GET_TILE_DATA
300 AOM_CTRL_USE_TYPE(AV1D_SET_EXT_REF_PTR, av1_ext_ref_frame_t *)
301 #define AOM_CTRL_AV1D_SET_EXT_REF_PTR
302 AOM_CTRL_USE_TYPE(AV1D_EXT_TILE_DEBUG, unsigned int)
303 #define AOM_CTRL_AV1D_EXT_TILE_DEBUG
304 AOM_CTRL_USE_TYPE(AV1D_SET_ROW_MT, unsigned int)
305 #define AOM_CTRL_AV1D_SET_ROW_MT
306 AOM_CTRL_USE_TYPE(AV1D_SET_SKIP_FILM_GRAIN, int)
307 #define AOM_CTRL_AV1D_SET_SKIP_FILM_GRAIN
308 AOM_CTRL_USE_TYPE(AV1D_SET_IS_ANNEXB, unsigned int)
309 #define AOM_CTRL_AV1D_SET_IS_ANNEXB
310 AOM_CTRL_USE_TYPE(AV1D_SET_OPERATING_POINT, int)
311 #define AOM_CTRL_AV1D_SET_OPERATING_POINT
312 AOM_CTRL_USE_TYPE(AV1D_SET_OUTPUT_ALL_LAYERS, int)
313 #define AOM_CTRL_AV1D_SET_OUTPUT_ALL_LAYERS
314 AOM_CTRL_USE_TYPE(AV1_SET_INSPECTION_CALLBACK, aom_inspect_init *)
315 #define AOM_CTRL_AV1_SET_INSPECTION_CALLBACK
316 /*!\endcond */
317 /*! @} - end defgroup aom_decoder */
318 
319 #ifdef __cplusplus
320 }  // extern "C"
321 #endif
322 
323 #endif  // AOM_AOM_AOMDX_H_
324