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() and it can be re-used
390
* without re-allocating the whole buffer.
392
typedef struct _VAEncSliceParameterBufferH264 {
393
/** \brief Starting MB address for this slice. */
394
unsigned int macroblock_address;
395
/** \brief Number of macroblocks in this slice. */
396
unsigned int num_macroblocks;
398
* \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID.
400
* If per-MB encoder configuration is needed, then \ref macroblock_info
401
* references a buffer of type #VAEncMacroblockParameterBufferH264
402
* (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id
403
* is set to \c VA_INVALID_ID and per-MB configuration is derived
404
* from this slice parameter.
406
* The \c macroblock_info buffer must hold \ref num_macroblocks
409
VABufferID macroblock_info;
410
/** \brief Slice type.
411
* Range: 0..2, 5..7, i.e. no switching slices.
413
unsigned char slice_type;
414
/** \brief Same as the H.264 bitstream syntax element. */
415
unsigned char pic_parameter_set_id;
416
/** \brief Same as the H.264 bitstream syntax element. */
417
unsigned short idr_pic_id;
419
/** @name If pic_order_cnt_type == 0 */
421
/** \brief The picture order count modulo MaxPicOrderCntLsb. */
422
unsigned short pic_order_cnt_lsb;
423
/** \brief Valid if \c pic_order_present_flag and this is a bottom field. */
424
int delta_pic_order_cnt_bottom;
426
/** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */
428
/** \brief [0]: top, [1]: bottom. */
429
int delta_pic_order_cnt[2];
432
/** @name If slice_type == B */
434
unsigned char direct_spatial_mv_pred_flag;
437
/** @name If slice_type == P */
439
/** \brief Specifies if
440
* \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or
441
* \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are
442
* overriden by the values for this slice.
444
unsigned char num_ref_idx_active_override_flag;
445
/** \brief Maximum reference index for reference picture list 0.
446
* Range: 0 to 31, inclusive.
448
unsigned char num_ref_idx_l0_active_minus1;
449
/** \brief Maximum reference index for reference picture list 1.
450
* Range: 0 to 31, inclusive.
452
unsigned char num_ref_idx_l1_active_minus1;
453
/** \brief Reference picture list 0 (for P slices). */
454
VAPictureH264 RefPicList0[32];
455
/** \brief Reference picture list 1 (for B slices). */
456
VAPictureH264 RefPicList1[32];
459
/** @name pred_weight_table() */
461
/** \brief Same as the H.264 bitstream syntax element. */
462
unsigned char luma_log2_weight_denom;
463
/** \brief Same as the H.264 bitstream syntax element. */
464
unsigned char chroma_log2_weight_denom;
465
/** \brief Same as the H.264 bitstream syntax element. */
466
unsigned char luma_weight_l0_flag;
467
/** \brief Same as the H.264 bitstream syntax element. */
468
signed short luma_weight_l0[32];
469
/** \brief Same as the H.264 bitstream syntax element. */
470
signed short luma_offset_l0[32];
471
/** \brief Same as the H.264 bitstream syntax element. */
472
unsigned char chroma_weight_l0_flag;
473
/** \brief Same as the H.264 bitstream syntax element. */
474
signed short chroma_weight_l0[32][2];
475
/** \brief Same as the H.264 bitstream syntax element. */
476
signed short chroma_offset_l0[32][2];
477
/** \brief Same as the H.264 bitstream syntax element. */
478
unsigned char luma_weight_l1_flag;
479
/** \brief Same as the H.264 bitstream syntax element. */
480
signed short luma_weight_l1[32];
481
/** \brief Same as the H.264 bitstream syntax element. */
482
signed short luma_offset_l1[32];
483
/** \brief Same as the H.264 bitstream syntax element. */
484
unsigned char chroma_weight_l1_flag;
485
/** \brief Same as the H.264 bitstream syntax element. */
486
signed short chroma_weight_l1[32][2];
487
/** \brief Same as the H.264 bitstream syntax element. */
488
signed short chroma_offset_l1[32][2];
491
/** \brief Range: 0 to 2, inclusive. */
492
unsigned char cabac_init_idc;
493
/** \brief Same as the H.264 bitstream syntax element. */
494
signed char slice_qp_delta;
495
/** @name If deblocking_filter_control_present_flag */
497
/** \brief Range: 0 to 2, inclusive. */
498
unsigned char disable_deblocking_filter_idc;
499
/** \brief Same as the H.264 bitstream syntax element. */
500
signed char slice_alpha_c0_offset_div2;
501
/** \brief Same as the H.264 bitstream syntax element. */
502
signed char slice_beta_offset_div2;
504
} VAEncSliceParameterBufferH264;
507
* @name Macroblock neighbour availability bits
509
* \anchor api_enc_h264_mb_pred_avail_bits
510
* Definitions for macroblock neighbour availability bits used in
511
* intra prediction mode (non MBAFF only).
515
/** \brief References macroblock in the top-left corner. */
516
#define VA_MB_PRED_AVAIL_TOP_LEFT (1 << 2)
517
/** \brief References macroblock above the current macroblock. */
518
#define VA_MB_PRED_AVAIL_TOP (1 << 4)
519
/** \brief References macroblock in the top-right corner. */
520
#define VA_MB_PRED_AVAIL_TOP_RIGHT (1 << 3)
521
/** \brief References macroblock on the left of the current macroblock. */
522
#define VA_MB_PRED_AVAIL_LEFT (1 << 6)
526
* \brief Macroblock parameter for H.264 encoding in baseline, main & high
529
* This structure holds per-macroblock information. The buffer must be
530
* allocated with as many elements (macroblocks) as necessary to fit
531
* the slice to be encoded. Besides, the per-macroblock records must
532
* be written in a strict raster order and with no gap. i.e. every
533
* macroblock, regardless of its type, shall have an entry.
535
typedef struct _VAEncMacroblockParameterBufferH264 {
537
* \brief Quantization parameter.
539
* Requested quantization parameter. Range: 0 to 51, inclusive.
540
* If \ref qp is set to 0xff, then the actual value is derived
541
* from the slice-level value: \c pic_init_qp + \c slice_qp_delta.
546
/** @name Data for intra macroblock */
551
* \brief Flag specified to override MB neighbour
552
* availability bits from VME stage.
554
* This flag specifies that macroblock neighbour
555
* availability bits from the VME stage are overriden
556
* by the \ref pred_avail_flags hereunder.
558
unsigned int pred_avail_override_flag : 1;
560
* \brief Bitwise representation of which macroblocks
561
* are available for intra prediction.
563
* If the slice is intra-coded, this field represents
564
* the macroblocks available for intra prediction.
565
* See \ref api_enc_h264_mb_pred_avail_bits
566
* "macroblock neighbour availability" bit definitions.
568
unsigned int pred_avail_flags : 8;
574
/** @name Data for inter macroblock */
583
} VAEncMacroblockParameterBufferH264;
591
#endif /* VA_ENC_H264_H */