| 1 | /* | 
| 2 |  * Copyright (c) 2007-2012 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_enc_vp8.h | 
| 27 |  * \brief VP8 encoding API | 
| 28 |  * | 
| 29 |  * This file contains the \ref api_enc_vp8 "VP8 encoding API". | 
| 30 |  */ | 
| 31 |  | 
| 32 | #ifndef VA_ENC_VP8_H | 
| 33 | #define VA_ENC_VP8_H | 
| 34 |  | 
| 35 | #ifdef __cplusplus | 
| 36 | extern "C"  { | 
| 37 | #endif | 
| 38 |  | 
| 39 | /** | 
| 40 |  * \defgroup api_enc_vp8 VP8 encoding API | 
| 41 |  * | 
| 42 |  * @{ | 
| 43 |  */ | 
| 44 |  | 
| 45 | /** | 
| 46 |  * \brief VP8 Encoding Sequence Parameter Buffer Structure | 
| 47 |  * | 
| 48 |  * This structure conveys sequence level parameters. | 
| 49 |  * | 
| 50 |  */ | 
| 51 | typedef struct  _VAEncSequenceParameterBufferVP8 { | 
| 52 |     /* frame width in pixels */ | 
| 53 |     uint32_t frame_width; | 
| 54 |     /* frame height in pixels */ | 
| 55 |     uint32_t frame_height; | 
| 56 |     /* horizontal scale */ | 
| 57 |     uint32_t frame_width_scale; | 
| 58 |     /* vertical scale */ | 
| 59 |     uint32_t frame_height_scale; | 
| 60 |  | 
| 61 |     /* whether to enable error resilience features */ | 
| 62 |     uint32_t error_resilient; | 
| 63 |     /* auto keyframe placement, non-zero means enable auto keyframe placement */ | 
| 64 |     uint32_t kf_auto; | 
| 65 |     /* keyframe minimum interval */ | 
| 66 |     uint32_t kf_min_dist; | 
| 67 |     /* keyframe maximum interval */ | 
| 68 |     uint32_t kf_max_dist; | 
| 69 |  | 
| 70 |  | 
| 71 |     /* RC related fields. RC modes are set with VAConfigAttribRateControl */ | 
| 72 |     /* For VP8, CBR implies HRD conformance and VBR implies no HRD conformance */ | 
| 73 |  | 
| 74 |     /** | 
| 75 |      * Initial bitrate set for this sequence in CBR or VBR modes. | 
| 76 |      * | 
| 77 |      * This field represents the initial bitrate value for this | 
| 78 |      * sequence if CBR or VBR mode is used, i.e. if the encoder | 
| 79 |      * pipeline was created with a #VAConfigAttribRateControl | 
| 80 |      * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR. | 
| 81 |      * | 
| 82 |      * The bitrate can be modified later on through | 
| 83 |      * #VAEncMiscParameterRateControl buffers. | 
| 84 |      */ | 
| 85 |     uint32_t bits_per_second; | 
| 86 |     /* Period between I frames. */ | 
| 87 |     uint32_t intra_period; | 
| 88 |  | 
| 89 |     /* reference and reconstructed frame buffers | 
| 90 |      * Used for driver auto reference management when configured through | 
| 91 |      * VAConfigAttribEncAutoReference. | 
| 92 |      */ | 
| 93 |     VASurfaceID reference_frames[4]; | 
| 94 |  | 
| 95 |     /** \brief Reserved bytes for future use, must be zero */ | 
| 96 |     uint32_t                va_reserved[VA_PADDING_LOW]; | 
| 97 | } VAEncSequenceParameterBufferVP8; | 
| 98 |  | 
| 99 |  | 
| 100 | /** | 
| 101 |  * \brief VP8 Encoding Picture Parameter Buffer Structure | 
| 102 |  * | 
| 103 |  * This structure conveys picture level parameters. | 
| 104 |  * | 
| 105 |  */ | 
| 106 | typedef struct  _VAEncPictureParameterBufferVP8 { | 
| 107 |     /* surface to store reconstructed frame  */ | 
| 108 |     VASurfaceID reconstructed_frame; | 
| 109 |  | 
| 110 |     /* | 
| 111 |      * surfaces to store reference frames in non auto reference mode | 
| 112 |      * VA_INVALID_SURFACE can be used to denote an invalid reference frame. | 
| 113 |      */ | 
| 114 |     VASurfaceID ref_last_frame; | 
| 115 |     VASurfaceID ref_gf_frame; | 
| 116 |     VASurfaceID ref_arf_frame; | 
| 117 |  | 
| 118 |     /* buffer to store coded data */ | 
| 119 |     VABufferID coded_buf; | 
| 120 |  | 
| 121 |     union { | 
| 122 |         struct { | 
| 123 |             /* force this frame to be a keyframe */ | 
| 124 |             uint32_t force_kf                       : 1; | 
| 125 |             /* don't reference the last frame */ | 
| 126 |             uint32_t no_ref_last                    : 1; | 
| 127 |             /* don't reference the golden frame */ | 
| 128 |             uint32_t no_ref_gf                      : 1; | 
| 129 |             /* don't reference the alternate reference frame */ | 
| 130 |             uint32_t no_ref_arf                     : 1; | 
| 131 |             /* The temporal id the frame belongs to. */ | 
| 132 |             uint32_t temporal_id                    : 8; | 
| 133 |             /** | 
| 134 |             *  following two flags indicate the reference order | 
| 135 |             *  LastRef is specified by 01b; | 
| 136 |             *  GoldRef is specified by 10b; | 
| 137 |             *  AltRef  is specified by 11b; | 
| 138 |             *  first_ref specifies the reference frame which is searched first. | 
| 139 |             *  second_ref specifies the reference frame which is searched second | 
| 140 |             *  if there is. | 
| 141 |             */ | 
| 142 |             uint32_t first_ref                      : 2; | 
| 143 |             uint32_t second_ref                     : 2; | 
| 144 |             /** \brief Reserved for future use, must be zero */ | 
| 145 |             uint32_t reserved                       : 16; | 
| 146 |         } bits; | 
| 147 |         uint32_t value; | 
| 148 |     } ref_flags; | 
| 149 |  | 
| 150 |     union { | 
| 151 |         struct { | 
| 152 |             /* version */ | 
| 153 |             uint32_t frame_type                     : 1; | 
| 154 |             uint32_t version                        : 3; | 
| 155 |             /* show_frame */ | 
| 156 |             uint32_t show_frame                     : 1; | 
| 157 |             /* color_space */ | 
| 158 |             uint32_t color_space                    : 1; | 
| 159 |             /*  0: bicubic, 1: bilinear, other: none */ | 
| 160 |             uint32_t recon_filter_type              : 2; | 
| 161 |             /*  0: no loop fitler, 1: simple loop filter */ | 
| 162 |             uint32_t loop_filter_type               : 2; | 
| 163 |             /* 0: disabled, 1: normal, 2: simple */ | 
| 164 |             uint32_t auto_partitions                : 1; | 
| 165 |             /* same as log2_nbr_of_dct_partitions in frame header syntax */ | 
| 166 |             uint32_t num_token_partitions           : 2; | 
| 167 |  | 
| 168 |             /** | 
| 169 |              * The following fields correspond to the same VP8 syntax elements | 
| 170 |              * in the frame header. | 
| 171 |              */ | 
| 172 |             /** | 
| 173 |                  * 0: clamping of reconstruction pixels is disabled, | 
| 174 |                  * 1: clamping enabled. | 
| 175 |                  */ | 
| 176 |             uint32_t clamping_type                  : 1; | 
| 177 |             /* indicate segmentation is enabled for the current frame. */ | 
| 178 |             uint32_t segmentation_enabled           : 1; | 
| 179 |             /** | 
| 180 |              * Determines if the MB segmentation map is updated in the current | 
| 181 |              * frame. | 
| 182 |              */ | 
| 183 |             uint32_t update_mb_segmentation_map     : 1; | 
| 184 |             /** | 
| 185 |              * Indicates if the segment feature data is updated in the current | 
| 186 |              * frame. | 
| 187 |              */ | 
| 188 |             uint32_t update_segment_feature_data    : 1; | 
| 189 |             /** | 
| 190 |              * indicates if the MB level loop filter adjustment is enabled for | 
| 191 |              * the current frame (0 off, 1 on). | 
| 192 |              */ | 
| 193 |             uint32_t loop_filter_adj_enable         : 1; | 
| 194 |             /** | 
| 195 |              * Determines whether updated token probabilities are used only for | 
| 196 |              * this frame or until further update. | 
| 197 |              * It may be used by application to enable error resilient mode. | 
| 198 |              * In this mode probability updates are allowed only at Key Frames. | 
| 199 |              */ | 
| 200 |             uint32_t refresh_entropy_probs          : 1; | 
| 201 |             /** | 
| 202 |              * Determines if the current decoded frame refreshes the golden frame. | 
| 203 |              */ | 
| 204 |             uint32_t refresh_golden_frame           : 1; | 
| 205 |             /** | 
| 206 |              * Determines if the current decoded frame refreshes the alternate | 
| 207 |              * reference frame. | 
| 208 |              */ | 
| 209 |             uint32_t refresh_alternate_frame        : 1; | 
| 210 |             /** | 
| 211 |              * Determines if the current decoded frame refreshes the last frame | 
| 212 |              * reference buffer. | 
| 213 |              */ | 
| 214 |             uint32_t refresh_last                   : 1; | 
| 215 |             /** | 
| 216 |              * Determines if the golden reference is replaced by another reference. | 
| 217 |              */ | 
| 218 |             uint32_t copy_buffer_to_golden          : 2; | 
| 219 |             /** | 
| 220 |              * Determines if the alternate reference is replaced by another reference. | 
| 221 |              */ | 
| 222 |             uint32_t copy_buffer_to_alternate       : 2; | 
| 223 |             /** | 
| 224 |              * Controls the sign of motion vectors when the golden frame is referenced. | 
| 225 |              */ | 
| 226 |             uint32_t sign_bias_golden               : 1; | 
| 227 |             /** | 
| 228 |              * Controls the sign of motion vectors when the alternate frame is | 
| 229 |              * referenced. | 
| 230 |              */ | 
| 231 |             uint32_t sign_bias_alternate            : 1; | 
| 232 |             /** | 
| 233 |              * Enables or disables the skipping of macroblocks containing no | 
| 234 |              * non-zero coefficients. | 
| 235 |              */ | 
| 236 |             uint32_t mb_no_coeff_skip               : 1; | 
| 237 |             /** | 
| 238 |              * Enforces unconditional per-MB loop filter delta update setting frame | 
| 239 |              * header flags mode_ref_lf_delta_update, all mb_mode_delta_update_flag[4], | 
| 240 |              * and all ref_frame_delta_update_flag[4] to 1. | 
| 241 |             * Since loop filter deltas are not automatically refreshed to default | 
| 242 |              * values at key frames, dropped frame with delta update may prevent | 
| 243 |              * correct decoding from the next key frame. | 
| 244 |             * Encoder application is advised to set this flag to 1 at key frames. | 
| 245 |             */ | 
| 246 |             uint32_t forced_lf_adjustment           : 1; | 
| 247 |             uint32_t reserved                       : 2; | 
| 248 |         } bits; | 
| 249 |         uint32_t value; | 
| 250 |     } pic_flags; | 
| 251 |  | 
| 252 |     /** | 
| 253 |      * Contains a list of 4 loop filter level values (updated value if applicable) | 
| 254 |      * controlling the deblocking filter strength. Each entry represents a segment. | 
| 255 |      * When segmentation is disabled, use entry 0. | 
| 256 |      * When loop_filter_level is 0, loop filter shall be disabled. | 
| 257 |      */ | 
| 258 |     int8_t loop_filter_level[4]; | 
| 259 |  | 
| 260 |     /** | 
| 261 |      * Contains a list of 4 delta values for reference frame based MB-level | 
| 262 |      * loop filter adjustment. | 
| 263 |      * If no update, then set to 0. | 
| 264 |      */ | 
| 265 |     int8_t ref_lf_delta[4]; | 
| 266 |  | 
| 267 |     /** | 
| 268 |      * Contains a list of 4 delta values for coding mode based MB-level loop | 
| 269 |      * filter adjustment. | 
| 270 |      * If no update, then set to 0. | 
| 271 |      */ | 
| 272 |     int8_t mode_lf_delta[4]; | 
| 273 |  | 
| 274 |     /** | 
| 275 |      * Controls the deblocking filter sensitivity. | 
| 276 |      * Corresponds to the same VP8 syntax element in frame header. | 
| 277 |      */ | 
| 278 |     uint8_t sharpness_level; | 
| 279 |  | 
| 280 |     /** | 
| 281 |      * Application supplied maximum clamp value for Qindex used in quantization. | 
| 282 |      * Qindex will not be allowed to exceed this value. | 
| 283 |      * It has a valid range [0..127] inclusive. | 
| 284 |      */ | 
| 285 |     uint8_t clamp_qindex_high; | 
| 286 |  | 
| 287 |     /** | 
| 288 |      * Application supplied minimum clamp value for Qindex used in quantization. | 
| 289 |      * Qindex will not be allowed to be lower than this value. | 
| 290 |      * It has a valid range [0..127] inclusive. | 
| 291 |      * Condition clamp_qindex_low <= clamp_qindex_high must be guaranteed, | 
| 292 |      * otherwise they are ignored. | 
| 293 |      */ | 
| 294 |     uint8_t clamp_qindex_low; | 
| 295 |  | 
| 296 |     /** \brief Reserved bytes for future use, must be zero */ | 
| 297 |     uint32_t                va_reserved[VA_PADDING_LOW]; | 
| 298 | } VAEncPictureParameterBufferVP8; | 
| 299 |  | 
| 300 |  | 
| 301 | /** | 
| 302 |  * \brief VP8 MB Segmentation ID Buffer | 
| 303 |  * | 
| 304 |  * application provides buffer containing the initial segmentation id for each | 
| 305 |  * MB, in raster scan order. Rate control may reassign it. | 
| 306 |  * For an 640x480 video, the buffer has 1200 entries. | 
| 307 |  * the value of each entry should be in the range [0..3], inclusive. | 
| 308 |  * If segmentation is not enabled, application does not need to provide it. | 
| 309 |  */ | 
| 310 | typedef struct _VAEncMBMapBufferVP8 { | 
| 311 |     /** | 
| 312 |      * number of MBs in the frame. | 
| 313 |      * It is also the number of entries of mb_segment_id[]; | 
| 314 |      */ | 
| 315 |     uint32_t num_mbs; | 
| 316 |     /** | 
| 317 |      * per MB Segmentation ID Buffer | 
| 318 |      */ | 
| 319 |     uint8_t *mb_segment_id; | 
| 320 |  | 
| 321 |     /** \brief Reserved bytes for future use, must be zero */ | 
| 322 |     uint32_t                va_reserved[VA_PADDING_LOW]; | 
| 323 | } VAEncMBMapBufferVP8; | 
| 324 |  | 
| 325 |  | 
| 326 | /** | 
| 327 |  * \brief VP8 Quantization Matrix Buffer Structure | 
| 328 |  * | 
| 329 |  * Contains quantization index for yac(0-3) for each segment and quantization | 
| 330 |  * index deltas, ydc(0), y2dc(1), y2ac(2), uvdc(3), uvac(4) that are applied | 
| 331 |  * to all segments.  When segmentation is disabled, only quantization_index[0] | 
| 332 |  * will be used. This structure is sent once per frame. | 
| 333 |  */ | 
| 334 | typedef struct _VAQMatrixBufferVP8 { | 
| 335 |     uint16_t quantization_index[4]; | 
| 336 |     int16_t quantization_index_delta[5]; | 
| 337 |  | 
| 338 |     /** \brief Reserved bytes for future use, must be zero */ | 
| 339 |     uint32_t                va_reserved[VA_PADDING_LOW]; | 
| 340 | } VAQMatrixBufferVP8; | 
| 341 |  | 
| 342 |  | 
| 343 |  | 
| 344 | /**@}*/ | 
| 345 |  | 
| 346 | #ifdef __cplusplus | 
| 347 | } | 
| 348 | #endif | 
| 349 |  | 
| 350 | #endif /* VA_ENC_VP8_H */ | 
| 351 |  |