2 * Copyright (c) 2007-2011 Intel Corporation. All Rights Reserved.
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:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
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.
27 * \brief The H.264 encoding API
29 * This file contains the \ref api_enc_h264 "H.264 encoding API".
40 * \defgroup api_enc_h264 H.264 encoding API
48 * Those flags flags are meant to signal when a picture marks the end
49 * of a sequence, a stream, or even both at once.
54 * \brief Marks the last picture in the sequence.
56 * i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame.
58 #define H264_LAST_PICTURE_EOSEQ 0x01
60 * \brief Marks the last picture in the stream.
62 * i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame.
64 #define H264_LAST_PICTURE_EOSTREAM 0x02
68 * \brief Packed header types specific to H.264 encoding.
70 * Types of packed headers generally used for H.264 encoding. Each
71 * associated packed header data buffer shall contain the start code
72 * prefix 0x000001 followed by the complete NAL unit, thus also
73 * including the \c nal_unit_type.
75 * Note: the start code prefix can contain an arbitrary number of leading
76 * zeros. The driver will skip them for emulation prevention bytes insertion,
81 * \brief Packed Sequence Parameter Set (SPS).
83 * The corresponding packed header data buffer shall contain the
84 * complete seq_parameter_set_rbsp() syntax element.
86 * Note: packed \c nal_unit_type shall be equal to 7.
88 VAEncPackedHeaderH264_SPS
= VAEncPackedHeaderSequence
,
90 * \brief Packed Picture Parameter Set (PPS).
92 * The corresponding packed header data buffer shall contain the
93 * complete pic_parameter_set_rbsp() syntax element.
95 * Note: packed \c nal_unit_type shall be equal to 8.
97 VAEncPackedHeaderH264_PPS
= VAEncPackedHeaderPicture
,
99 * \brief Packed slice header.
101 * The corresponding packed header data buffer shall contain the
102 * \c slice_header() syntax element only, along with any start
103 * code prefix and NAL unit type preceeding it. i.e. this means
104 * that the buffer does not contain any of the \c slice_data() or
105 * the \c rbsp_slice_trailing_bits().
107 * Note: packed \c nal_unit_type shall be equal to 1 (non-IDR
108 * picture), or 5 (IDR picture).
110 VAEncPackedHeaderH264_Slice
= VAEncPackedHeaderSlice
,
112 * \brief Packed Supplemental Enhancement Information (SEI).
114 * The corresponding packed header data buffer shall contain the
115 * complete sei_rbsp() syntax element, thus including several
116 * sei_message() elements if necessary.
118 * Note: packed \c nal_unit_type shall be equal to 6.
120 VAEncPackedHeaderH264_SEI
= (VAEncPackedHeaderMiscMask
| 1),
121 } VAEncPackedHeaderTypeH264
;
124 * \brief Sequence parameter for H.264 encoding in baseline, main & high
127 * This structure holds information for \c seq_parameter_set_data() as
128 * defined by the H.264 specification.
130 * If packed sequence headers mode is used, i.e. if the encoding
131 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE
132 * flag, then the driver expects two more buffers to be provided to
133 * the same \c vaRenderPicture() as this buffer:
134 * - a #VAEncPackedHeaderParameterBuffer with type set to
135 * VAEncPackedHeaderType::VAEncPackedHeaderSequence ;
136 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
139 * If \c seq_scaling_matrix_present_flag is set to \c 1, then a
140 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
141 * \c vaRenderPicture() call as this sequence parameter buffer.
143 typedef struct _VAEncSequenceParameterBufferH264
{
144 /** \brief Same as the H.264 bitstream syntax element. */
145 unsigned char seq_parameter_set_id
;
146 /** \brief Same as the H.264 bitstream syntax element. */
147 unsigned char level_idc
;
148 /** \brief Period between I frames. */
149 unsigned int intra_period
;
150 /** \brief Period between IDR frames. */
151 unsigned int intra_idr_period
;
152 /** \brief Period between I/P frames. */
153 unsigned int ip_period
;
155 * \brief Initial bitrate set for this sequence in CBR or VBR modes.
157 * This field represents the initial bitrate value for this
158 * sequence if CBR or VBR mode is used, i.e. if the encoder
159 * pipeline was created with a #VAConfigAttribRateControl
160 * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR.
162 * The bitrate can be modified later on through
163 * #VAEncMiscParameterRateControl buffers.
165 unsigned int bits_per_second
;
166 /** \brief Same as the H.264 bitstream syntax element. */
167 unsigned int max_num_ref_frames
;
168 /** \brief Picture width in macroblocks. */
169 unsigned short picture_width_in_mbs
;
170 /** \brief Picture height in macroblocks. */
171 unsigned short picture_height_in_mbs
;
175 /** \brief Same as the H.264 bitstream syntax element. */
176 unsigned int chroma_format_idc
: 2;
177 /** \brief Same as the H.264 bitstream syntax element. */
178 unsigned int frame_mbs_only_flag
: 1;
179 /** \brief Same as the H.264 bitstream syntax element. */
180 unsigned int mb_adaptive_frame_field_flag
: 1;
181 /** \brief Same as the H.264 bitstream syntax element. */
182 unsigned int seq_scaling_matrix_present_flag
: 1;
183 /** \brief Same as the H.264 bitstream syntax element. */
184 unsigned int direct_8x8_inference_flag
: 1;
185 /** \brief Same as the H.264 bitstream syntax element. */
186 unsigned int log2_max_frame_num_minus4
: 4;
187 /** \brief Same as the H.264 bitstream syntax element. */
188 unsigned int pic_order_cnt_type
: 2;
189 /** \brief Same as the H.264 bitstream syntax element. */
190 unsigned int log2_max_pic_order_cnt_lsb_minus4
: 4;
191 /** \brief Same as the H.264 bitstream syntax element. */
192 unsigned int delta_pic_order_always_zero_flag
: 1;
197 /** \brief Same as the H.264 bitstream syntax element. */
198 unsigned char bit_depth_luma_minus8
;
199 /** \brief Same as the H.264 bitstream syntax element. */
200 unsigned char bit_depth_chroma_minus8
;
202 /** if pic_order_cnt_type == 1 */
204 /** \brief Same as the H.264 bitstream syntax element. */
205 unsigned char num_ref_frames_in_pic_order_cnt_cycle
;
206 /** \brief Same as the H.264 bitstream syntax element. */
207 int offset_for_non_ref_pic
;
208 /** \brief Same as the H.264 bitstream syntax element. */
209 int offset_for_top_to_bottom_field
;
210 /** \brief Same as the H.264 bitstream syntax element. */
211 int offset_for_ref_frame
[256];
214 /** @name Cropping (optional) */
216 /** \brief Same as the H.264 bitstream syntax element. */
217 unsigned char frame_cropping_flag
;
218 /** \brief Same as the H.264 bitstream syntax element. */
219 unsigned int frame_crop_left_offset
;
220 /** \brief Same as the H.264 bitstream syntax element. */
221 unsigned int frame_crop_right_offset
;
222 /** \brief Same as the H.264 bitstream syntax element. */
223 unsigned int frame_crop_top_offset
;
224 /** \brief Same as the H.264 bitstream syntax element. */
225 unsigned int frame_crop_bottom_offset
;
228 /** @name VUI parameters (optional) */
230 /** \brief Same as the H.264 bitstream syntax element. */
231 unsigned char vui_parameters_present_flag
;
234 /** \brief Same as the H.264 bitstream syntax element. */
235 unsigned int aspect_ratio_info_present_flag
: 1;
236 /** \brief Same as the H.264 bitstream syntax element. */
237 unsigned int timing_info_present_flag
: 1;
238 /** \brief Same as the H.264 bitstream syntax element. */
239 unsigned int bitstream_restriction_flag
: 1;
240 /** \brief Range: 0 to 16, inclusive. */
241 unsigned int log2_max_mv_length_horizontal
: 5;
242 /** \brief Range: 0 to 16, inclusive. */
243 unsigned int log2_max_mv_length_vertical
: 5;
247 /** \brief Same as the H.264 bitstream syntax element. */
248 unsigned char aspect_ratio_idc
;
249 /** \brief Same as the H.264 bitstream syntax element. */
250 unsigned int sar_width
;
251 /** \brief Same as the H.264 bitstream syntax element. */
252 unsigned int sar_height
;
253 /** \brief Same as the H.264 bitstream syntax element. */
254 unsigned int num_units_in_tick
;
255 /** \brief Same as the H.264 bitstream syntax element. */
256 unsigned int time_scale
;
258 } VAEncSequenceParameterBufferH264
;
261 * \brief Picture parameter for H.264 encoding in baseline, main & high
264 * This structure holds information for \c pic_parameter_set_rbsp() as
265 * defined by the H.264 specification.
267 * If packed picture headers mode is used, i.e. if the encoding
268 * pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE
269 * flag, then the driver expects two more buffers to be provided to
270 * the same \c vaRenderPicture() as this buffer:
271 * - a #VAEncPackedHeaderParameterBuffer with type set to
272 * VAEncPackedHeaderType::VAEncPackedHeaderPicture ;
273 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
276 * If \c pic_scaling_matrix_present_flag is set to \c 1, then a
277 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
278 * \c vaRenderPicture() call as this picture parameter buffer.
280 typedef struct _VAEncPictureParameterBufferH264
{
282 * \brief Information about the picture to be encoded.
284 * See #VAPictureH264 for further description of each field.
285 * Note that CurrPic.picture_id represents the reconstructed
286 * (decoded) picture. User provides a scratch VA surface ID here.
288 VAPictureH264 CurrPic
;
290 * \brief Decoded Picture Buffer (DPB).
292 * This array represents the list of reconstructed (decoded)
293 * frames used as reference. It is important to keep track of
294 * reconstructed frames so that they can be used later on as
295 * reference for P or B-frames encoding.
297 VAPictureH264 ReferenceFrames
[16];
299 * \brief Output encoded bitstream.
301 * \ref coded_buf has type #VAEncCodedBufferType. It should be
302 * large enough to hold the compressed NAL slice and possibly SPS
305 VABufferID coded_buf
;
307 /** \brief The picture parameter set referred to in the slice header. */
308 unsigned char pic_parameter_set_id
;
309 /** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */
310 unsigned char seq_parameter_set_id
;
313 * \brief OR'd flags describing whether the picture is the last one or not.
315 * This fields holds 0 if the picture to be encoded is not the last
316 * one in the stream or sequence. Otherwise, it is a combination of
317 * \ref H264_LAST_PICTURE_EOSEQ or \ref H264_LAST_PICTURE_EOSTREAM.
319 unsigned char last_picture
;
321 /** \brief The picture identifier.
322 * Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive.
324 unsigned short frame_num
;
326 /** \brief \c pic_init_qp_minus26 + 26. */
327 unsigned char pic_init_qp
;
328 /** \brief Maximum reference index for reference picture list 0.
329 * Range: 0 to 31, inclusive.
331 unsigned char num_ref_idx_l0_active_minus1
;
332 /** \brief Maximum reference index for reference picture list 1.
333 * Range: 0 to 31, inclusive.
335 unsigned char num_ref_idx_l1_active_minus1
;
337 /** \brief Range: -12 to 12, inclusive. */
338 signed char chroma_qp_index_offset
;
339 /** \brief Range: -12 to 12, inclusive. */
340 signed char second_chroma_qp_index_offset
;
344 /** \brief Is picture an IDR picture? */
345 unsigned int idr_pic_flag
: 1;
346 /** \brief Is picture a reference picture? */
347 unsigned int reference_pic_flag
: 2;
348 /** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */
349 unsigned int entropy_coding_mode_flag
: 1;
350 /** \brief Is weighted prediction applied to P slices? */
351 unsigned int weighted_pred_flag
: 1;
352 /** \brief Range: 0 to 2, inclusive. */
353 unsigned int weighted_bipred_idc
: 2;
354 /** \brief Same as the H.264 bitstream syntax element. */
355 unsigned int constrained_intra_pred_flag
: 1;
356 /** \brief Same as the H.264 bitstream syntax element. */
357 unsigned int transform_8x8_mode_flag
: 1;
358 /** \brief Same as the H.264 bitstream syntax element. */
359 unsigned int deblocking_filter_control_present_flag
: 1;
360 /** \brief Same as the H.264 bitstream syntax element. */
361 unsigned int redundant_pic_cnt_present_flag
: 1;
362 /** \brief Same as the H.264 bitstream syntax element. */
363 unsigned int pic_order_present_flag
: 1;
364 /** \brief Same as the H.264 bitstream syntax element. */
365 unsigned int pic_scaling_matrix_present_flag
: 1;
369 } VAEncPictureParameterBufferH264
;
372 * \brief Slice parameter for H.264 encoding in baseline, main & high profiles.
374 * This structure holds information for \c
375 * slice_layer_without_partitioning_rbsp() as defined by the H.264
378 * If packed slice headers mode is used, i.e. if the encoding
379 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SLICE
380 * flag, then the driver expects two more buffers to be provided to
381 * the same \c vaRenderPicture() as this buffer:
382 * - a #VAEncPackedHeaderParameterBuffer with type set to
383 * VAEncPackedHeaderType::VAEncPackedHeaderSlice ;
384 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
387 * If per-macroblock encoder configuration is needed, \c macroblock_info
388 * references a buffer of type #VAEncMacroblockParameterBufferH264. This
389 * buffer is not passed to vaRenderPicture(). i.e. it is not destroyed
390 * by subsequent calls to vaRenderPicture() and then can be re-used
391 * without re-allocating the whole buffer.
393 typedef struct _VAEncSliceParameterBufferH264
{
394 /** \brief Starting MB address for this slice. */
395 unsigned int macroblock_address
;
396 /** \brief Number of macroblocks in this slice. */
397 unsigned int num_macroblocks
;
399 * \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID.
401 * If per-MB encoder configuration is needed, then \ref macroblock_info
402 * references a buffer of type #VAEncMacroblockParameterBufferH264
403 * (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id
404 * is set to \c VA_INVALID_ID and per-MB configuration is derived
405 * from this slice parameter.
407 * The \c macroblock_info buffer must hold \ref num_macroblocks
410 VABufferID macroblock_info
;
411 /** \brief Slice type.
412 * Range: 0..2, 5..7, i.e. no switching slices.
414 unsigned char slice_type
;
415 /** \brief Same as the H.264 bitstream syntax element. */
416 unsigned char pic_parameter_set_id
;
417 /** \brief Same as the H.264 bitstream syntax element. */
418 unsigned short idr_pic_id
;
420 /** @name If pic_order_cnt_type == 0 */
422 /** \brief The picture order count modulo MaxPicOrderCntLsb. */
423 unsigned short pic_order_cnt_lsb
;
424 /** \brief Valid if \c pic_order_present_flag and this is a bottom field. */
425 int delta_pic_order_cnt_bottom
;
427 /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */
429 /** \brief [0]: top, [1]: bottom. */
430 int delta_pic_order_cnt
[2];
433 /** @name If slice_type == B */
435 unsigned char direct_spatial_mv_pred_flag
;
438 /** @name If slice_type == P */
440 /** \brief Specifies if
441 * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or
442 * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are
443 * overriden by the values for this slice.
445 unsigned char num_ref_idx_active_override_flag
;
446 /** \brief Maximum reference index for reference picture list 0.
447 * Range: 0 to 31, inclusive.
449 unsigned char num_ref_idx_l0_active_minus1
;
450 /** \brief Maximum reference index for reference picture list 1.
451 * Range: 0 to 31, inclusive.
453 unsigned char num_ref_idx_l1_active_minus1
;
454 /** \brief Reference picture list 0 (for P slices). */
455 VAPictureH264 RefPicList0
[32];
456 /** \brief Reference picture list 1 (for B slices). */
457 VAPictureH264 RefPicList1
[32];
460 /** @name pred_weight_table() */
462 /** \brief Same as the H.264 bitstream syntax element. */
463 unsigned char luma_log2_weight_denom
;
464 /** \brief Same as the H.264 bitstream syntax element. */
465 unsigned char chroma_log2_weight_denom
;
466 /** \brief Same as the H.264 bitstream syntax element. */
467 unsigned char luma_weight_l0_flag
;
468 /** \brief Same as the H.264 bitstream syntax element. */
469 signed short luma_weight_l0
[32];
470 /** \brief Same as the H.264 bitstream syntax element. */
471 signed short luma_offset_l0
[32];
472 /** \brief Same as the H.264 bitstream syntax element. */
473 unsigned char chroma_weight_l0_flag
;
474 /** \brief Same as the H.264 bitstream syntax element. */
475 signed short chroma_weight_l0
[32][2];
476 /** \brief Same as the H.264 bitstream syntax element. */
477 signed short chroma_offset_l0
[32][2];
478 /** \brief Same as the H.264 bitstream syntax element. */
479 unsigned char luma_weight_l1_flag
;
480 /** \brief Same as the H.264 bitstream syntax element. */
481 signed short luma_weight_l1
[32];
482 /** \brief Same as the H.264 bitstream syntax element. */
483 signed short luma_offset_l1
[32];
484 /** \brief Same as the H.264 bitstream syntax element. */
485 unsigned char chroma_weight_l1_flag
;
486 /** \brief Same as the H.264 bitstream syntax element. */
487 signed short chroma_weight_l1
[32][2];
488 /** \brief Same as the H.264 bitstream syntax element. */
489 signed short chroma_offset_l1
[32][2];
492 /** \brief Range: 0 to 2, inclusive. */
493 unsigned char cabac_init_idc
;
494 /** \brief Same as the H.264 bitstream syntax element. */
495 signed char slice_qp_delta
;
496 /** @name If deblocking_filter_control_present_flag */
498 /** \brief Range: 0 to 2, inclusive. */
499 unsigned char disable_deblocking_filter_idc
;
500 /** \brief Same as the H.264 bitstream syntax element. */
501 signed char slice_alpha_c0_offset_div2
;
502 /** \brief Same as the H.264 bitstream syntax element. */
503 signed char slice_beta_offset_div2
;
505 } VAEncSliceParameterBufferH264
;
508 * @name Macroblock neighbour availability bits
510 * \anchor api_enc_h264_mb_pred_avail_bits
511 * Definitions for macroblock neighbour availability bits used in
512 * intra prediction mode (non MBAFF only).
516 /** \brief References macroblock in the top-left corner. */
517 #define VA_MB_PRED_AVAIL_TOP_LEFT (1 << 2)
518 /** \brief References macroblock above the current macroblock. */
519 #define VA_MB_PRED_AVAIL_TOP (1 << 4)
520 /** \brief References macroblock in the top-right corner. */
521 #define VA_MB_PRED_AVAIL_TOP_RIGHT (1 << 3)
522 /** \brief References macroblock on the left of the current macroblock. */
523 #define VA_MB_PRED_AVAIL_LEFT (1 << 6)
527 * \brief Macroblock parameter for H.264 encoding in baseline, main & high
530 * This structure holds per-macroblock information. The buffer must be
531 * allocated with as many elements (macroblocks) as necessary to fit
532 * the slice to be encoded. Besides, the per-macroblock records must
533 * be written in a strict raster order and with no gap. i.e. every
534 * macroblock, regardless of its type, shall have an entry.
536 typedef struct _VAEncMacroblockParameterBufferH264
{
538 * \brief Quantization parameter.
540 * Requested quantization parameter. Range: 0 to 51, inclusive.
541 * If \ref qp is set to 0xff, then the actual value is derived
542 * from the slice-level value: \c pic_init_qp + \c slice_qp_delta.
547 /** @name Data for intra macroblock */
552 * \brief Flag specified to override MB neighbour
553 * availability bits from VME stage.
555 * This flag specifies that macroblock neighbour
556 * availability bits from the VME stage are overriden
557 * by the \ref pred_avail_flags hereunder.
559 unsigned int pred_avail_override_flag
: 1;
561 * \brief Bitwise representation of which macroblocks
562 * are available for intra prediction.
564 * If the slice is intra-coded, this field represents
565 * the macroblocks available for intra prediction.
566 * See \ref api_enc_h264_mb_pred_avail_bits
567 * "macroblock neighbour availability" bit definitions.
569 unsigned int pred_avail_flags
: 8;
575 /** @name Data for inter macroblock */
584 } VAEncMacroblockParameterBufferH264
;
592 #endif /* VA_ENC_H264_H */