• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (c) 2007-2014 Intel Corporation. All Rights Reserved.
3   *
4   * Permission is hereby granted, free of charge, to any person obtaining a
5   * copy of this software and associated documentation files (the
6   * "Software"), to deal in the Software without restriction, including
7   * without limitation the rights to use, copy, modify, merge, publish,
8   * distribute, sub license, and/or sell copies of the Software, and to
9   * permit persons to whom the Software is furnished to do so, subject to
10   * the following conditions:
11   *
12   * The above copyright notice and this permission notice (including the
13   * next paragraph) shall be included in all copies or substantial portions
14   * of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17   * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19   * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
20   * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23   */
24  
25  /**
26   * \file va_dec_vp9.h
27   * \brief The VP9 decoding API
28   *
29   * This file contains the \ref api_dec_vp9 "VP9 decoding API".
30   */
31  
32  #ifndef VA_DEC_VP9_H
33  #define VA_DEC_VP9_H
34  
35  #include <stdint.h>
36  
37  #ifdef __cplusplus
38  extern "C" {
39  #endif
40  
41  /**
42   * \defgroup api_dec_vp9 VP9 decoding API
43   *
44   * This VP9 decoding API supports 8-bit 420 format only.
45   *
46   * @{
47   */
48  
49  
50  
51  
52  /**
53   * \brief VP9 Decoding Picture Parameter Buffer Structure
54   *
55   * This structure conveys picture level parameters.
56   * App should send a surface with this data structure down to VAAPI once
57   * per frame.
58   *
59   */
60  typedef struct  _VADecPictureParameterBufferVP9
61  {
62      /**@{*/
63  
64      /** \brief picture width
65       *  The value must be multiple of 8.
66       */
67      uint16_t                frame_width;
68      /** \brief picture height
69       *  The value must be multiple of 8.
70       */
71      uint16_t                frame_height;
72  
73      /** \brief Surface index of decoded current picture
74       */
75      VASurfaceID             curr_pic;
76      /** \brief Surface indices of reference frames in DPB.
77       *
78       *  Each entry of the list specifies the surface index of the picture
79       *  that is referred by current picture or will be referred by any future
80       *  picture.
81       *  Application who calls this API should update this list based on the
82       *  refreshing information from VP9 bitstream.
83       */
84      VASurfaceID             reference_frames[8];
85  
86      union
87      {
88          struct
89          {
90              /** \brief flags for current picture
91               *  same syntax and semantic as those in VP9 code
92               */
93              uint32_t        subsampling_x                               : 1;
94              uint32_t        subsampling_y                               : 1;
95              uint32_t        frame_type                                  : 1;
96              uint32_t        show_frame                                  : 1;
97              uint32_t        error_resilient_mode                        : 1;
98              uint32_t        intra_only                                  : 1;
99              uint32_t        allow_high_precision_mv                     : 1;
100              uint32_t        mcomp_filter_type                           : 3;
101              uint32_t        frame_parallel_decoding_mode                : 1;
102              uint32_t        reset_frame_context                         : 2;
103              uint32_t        refresh_frame_context                       : 1;
104              uint32_t        frame_context_idx                           : 2;
105              uint32_t        segmentation_enabled                        : 1;
106  
107              /** \brief corresponds to variable temporal_update in VP9 code.
108               */
109              uint32_t        segmentation_temporal_update                : 1;
110              /** \brief corresponds to variable update_mb_segmentation_map
111               *  in VP9 code.
112               */
113              uint32_t        segmentation_update_map                     : 1;
114  
115              /** \brief Index of reference_frames[] and points to the
116               *  LAST reference frame.
117               *  It corresponds to active_ref_idx[0] in VP9 code.
118               */
119              uint32_t        last_ref_frame                              : 3;
120              /** \brief Sign Bias of the LAST reference frame.
121               *  It corresponds to ref_frame_sign_bias[LAST_FRAME] in VP9 code.
122               */
123              uint32_t        last_ref_frame_sign_bias                    : 1;
124              /** \brief Index of reference_frames[] and points to the
125               *  GOLDERN reference frame.
126               *  It corresponds to active_ref_idx[1] in VP9 code.
127               */
128              uint32_t        golden_ref_frame                            : 3;
129              /** \brief Sign Bias of the GOLDERN reference frame.
130               *  Corresponds to ref_frame_sign_bias[GOLDERN_FRAME] in VP9 code.
131               */
132              uint32_t        golden_ref_frame_sign_bias                  : 1;
133              /** \brief Index of reference_frames[] and points to the
134               *  ALTERNATE reference frame.
135               *  Corresponds to active_ref_idx[2] in VP9 code.
136               */
137              uint32_t        alt_ref_frame                               : 3;
138              /** \brief Sign Bias of the ALTERNATE reference frame.
139               *  Corresponds to ref_frame_sign_bias[ALTREF_FRAME] in VP9 code.
140               */
141              uint32_t        alt_ref_frame_sign_bias                     : 1;
142              /** \brief Lossless Mode
143               *  LosslessFlag = base_qindex == 0 &&
144               *                 y_dc_delta_q == 0 &&
145               *                 uv_dc_delta_q == 0 &&
146               *                 uv_ac_delta_q == 0;
147               *  Where base_qindex, y_dc_delta_q, uv_dc_delta_q and uv_ac_delta_q
148               *  are all variables in VP9 code.
149               */
150              uint32_t        lossless_flag                               : 1;
151          } bits;
152          uint32_t            value;
153      } pic_fields;
154  
155      /* following parameters have same syntax with those in VP9 code */
156      uint8_t                 filter_level;
157      uint8_t                 sharpness_level;
158  
159      /** \brief number of tile rows specified by (1 << log2_tile_rows).
160       *  It corresponds the variable with same name in VP9 code.
161       */
162      uint8_t                 log2_tile_rows;
163      /** \brief number of tile columns specified by (1 << log2_tile_columns).
164       *  It corresponds the variable with same name in VP9 code.
165       */
166      uint8_t                 log2_tile_columns;
167      /** \brief Number of bytes taken up by the uncompressed frame header,
168       *  which corresponds to byte length of function
169       *  read_uncompressed_header() in VP9 code.
170       *  Specifically, it is the byte count from bit stream buffer start to
171       *  the last byte of uncompressed frame header.
172       */
173      uint8_t                 frame_header_length_in_bytes;
174  
175      /** \brief The byte count of compressed header the bitstream buffer,
176       *  which corresponds to syntax first_partition_size in code.
177       */
178      uint16_t                first_partition_size;
179  
180      /** \brief The byte count of current frame in the bitstream buffer,
181       *  starting from first byte of the buffer.
182       */
183      uint32_t                frame_data_size;
184  
185      /** These values are segment probabilities with same names in VP9
186       *  function setup_segmentation(). They should be parsed directly from
187       *  bitstream by application.
188       */
189      uint8_t                 mb_segment_tree_probs[7];
190      uint8_t                 segment_pred_probs[3];
191  
192      /** \brief VP9 version number
193       *  value can be 0 or 1.
194       */
195      uint8_t                 version;
196      /**@}*/
197  
198  } VADecPictureParameterBufferVP9;
199  
200  
201  
202  /**
203   * \brief VP9 Segmentation Parameter Data Structure
204   *
205   * This structure conveys per segment parameters.
206   * 8 of this data structure will be included in VASegmentationParameterBufferVP9
207   * and sent to API in a single buffer.
208   *
209   */
210  typedef struct  _VASegmentParameterVP9
211  {
212      /**@{*/
213  
214      union
215      {
216          struct
217          {
218              /** \brief Indicates if per segment reference frame indicator
219               *  is enabled.
220               *  Corresponding to variable feature_enabled when
221               *  j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
222               */
223              uint16_t        segment_reference_enabled                   : 1;
224              /** \brief Specifies per segment reference indication.
225               *  0: reserved
226               *  1: Last ref
227               *  2: golden
228               *  3: altref
229               *  Value can be derived from variable data when
230               *  j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
231               */
232              uint16_t        segment_reference                           : 2;
233              /** \brief Indicates if per segment skip feature is enabled.
234               *  Corresponding to variable feature_enabled when
235               *  j == SEG_LVL_SKIP in function setup_segmentation() VP9 code.
236               */
237              uint16_t        segment_reference_skipped                   : 1;
238          } fields;
239          uint16_t            value;
240      } segment_flags;
241  
242      /** \brief Specifies the filter level information per segment.
243       *  The value corresponds to variable lfi->lvl[seg][ref][mode] in VP9 code,
244       *  where m is [ref], and n is [mode] in FilterLevel[m][n].
245       */
246      uint8_t                 filter_level[4][2];
247      /** \brief Specifies per segment Luma AC quantization scale.
248       *  Corresponding to y_dequant[qindex][1] in vp9_mb_init_quantizer()
249       *  function of VP9 code.
250       */
251      int16_t                 luma_ac_quant_scale;
252      /** \brief Specifies per segment Luma DC quantization scale.
253       *  Corresponding to y_dequant[qindex][0] in vp9_mb_init_quantizer()
254       *  function of VP9 code.
255       */
256      int16_t                 luma_dc_quant_scale;
257      /** \brief Specifies per segment Chroma AC quantization scale.
258       *  Corresponding to uv_dequant[qindex][1] in vp9_mb_init_quantizer()
259       *  function of VP9 code.
260       */
261      int16_t                 chroma_ac_quant_scale;
262      /** \brief Specifies per segment Chroma DC quantization scale.
263       *  Corresponding to uv_dequant[qindex][0] in vp9_mb_init_quantizer()
264       *  function of VP9 code.
265       */
266      int16_t                 chroma_dc_quant_scale;
267  
268      /**@}*/
269  
270  } VASegmentParameterVP9;
271  
272  
273  
274  /**
275   * \brief VP9 Slice Parameter Buffer Structure
276   *
277   * This structure conveys parameters related to segmentation data and should be
278   * sent once per frame.
279   *
280   * When segmentation is disabled, only SegParam[0] has valid values,
281   * all other entries should be populated with 0.
282   * Otherwise, all eight entries should be valid.
283   *
284   * Slice data buffer of VASliceDataBufferType is used
285   * to send the bitstream which should include whole or part of partition 0
286   * (at least compressed header) to the end of frame.
287   *
288   */
289  typedef struct _VASliceParameterBufferVP9
290  {
291      /**@{*/
292      /**
293       * \brief per segment information
294       */
295      VASegmentParameterVP9   seg_param[8];
296  
297      /**@}*/
298  
299  } VASliceParameterBufferVP9;
300  
301  
302  /**@}*/
303  
304  #ifdef __cplusplus
305  }
306  #endif
307  
308  #endif /* VA_DEC_VP9_H */
309