1/*
2 * Copyright (c) 2007-2011 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_h264.h
27 * \brief The H.264 encoding API
28 *
29 * This file contains the \ref api_enc_h264 "H.264 encoding API".
30 */
31
32#ifndef VA_ENC_H264_H
33#define VA_ENC_H264_H
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/**
40 * \defgroup api_enc_h264 H.264 encoding API
41 *
42 * @{
43 */
44
45/**
46 * @name Picture flags
47 *
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.
50 *
51 * @{
52 */
53/**
54 * \brief Marks the last picture in the sequence.
55 *
56 * i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame.
57 */
58#define H264_LAST_PICTURE_EOSEQ     0x01
59/**
60 * \brief Marks the last picture in the stream.
61 *
62 * i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame.
63 */
64#define H264_LAST_PICTURE_EOSTREAM  0x02
65/**@}*/
66
67/**
68 * \brief Packed header types specific to H.264 encoding.
69 *
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.
74 *
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,
77 * if necessary.
78 */
79typedef enum {
80    /**
81     * \brief Packed Sequence Parameter Set (SPS).
82     *
83     * The corresponding packed header data buffer shall contain the
84     * complete seq_parameter_set_rbsp() syntax element.
85     *
86     * Note: packed \c nal_unit_type shall be equal to 7.
87     */
88    VAEncPackedHeaderH264_SPS   = VAEncPackedHeaderSequence,
89    /**
90     * \brief Packed Picture Parameter Set (PPS).
91     *
92     * The corresponding packed header data buffer shall contain the
93     * complete pic_parameter_set_rbsp() syntax element.
94     *
95     * Note: packed \c nal_unit_type shall be equal to 8.
96     */
97    VAEncPackedHeaderH264_PPS   = VAEncPackedHeaderPicture,
98    /**
99     * \brief Packed slice header.
100     *
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().
106     *
107     * Note: packed \c nal_unit_type shall be equal to 1 (non-IDR
108     * picture), or 5 (IDR picture).
109     */
110    VAEncPackedHeaderH264_Slice = VAEncPackedHeaderSlice,
111    /**
112     * \brief Packed Supplemental Enhancement Information (SEI).
113     *
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.
117     *
118     * Note: packed \c nal_unit_type shall be equal to 6.
119     */
120    VAEncPackedHeaderH264_SEI   = (VAEncPackedHeaderMiscMask | 1),
121} VAEncPackedHeaderTypeH264;
122
123/**
124 * \brief Sequence parameter for H.264 encoding in baseline, main & high
125 * profiles.
126 *
127 * This structure holds information for \c seq_parameter_set_data() as
128 * defined by the H.264 specification.
129 *
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
137 *   header data.
138 *
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.
142 */
143typedef 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;
154    /**
155     * \brief Initial bitrate set for this sequence in CBR or VBR modes.
156     *
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.
161     *
162     * The bitrate can be modified later on through
163     * #VAEncMiscParameterRateControl buffers.
164     */
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;
172
173    union {
174        struct {
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;
193        } bits;
194        unsigned int value;
195    } seq_fields;
196
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;
201
202    /** if pic_order_cnt_type == 1 */
203    /**@{*/
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];
212    /**@}*/
213
214    /** @name Cropping (optional) */
215    /**@{*/
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;
226    /**@}*/
227
228    /** @name VUI parameters (optional) */
229    /**@{*/
230    /** \brief Same as the H.264 bitstream syntax element. */
231    unsigned char   vui_parameters_present_flag;
232    union {
233        struct {
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;
244        } bits;
245        unsigned int value;
246    } vui_fields;
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;
257    /**@}*/
258} VAEncSequenceParameterBufferH264;
259
260/**
261 * \brief Picture parameter for H.264 encoding in baseline, main & high
262 * profiles.
263 *
264 * This structure holds information for \c pic_parameter_set_rbsp() as
265 * defined by the H.264 specification.
266 *
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
274 *   header data.
275 *
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.
279 */
280typedef struct _VAEncPictureParameterBufferH264 {
281    /**
282     * \brief Information about the picture to be encoded.
283     *
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.
287     */
288    VAPictureH264   CurrPic;
289    /**
290     * \brief Decoded Picture Buffer (DPB).
291     *
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.
296     */
297    VAPictureH264   ReferenceFrames[16];
298    /**
299     * \brief Output encoded bitstream.
300     *
301     * \ref coded_buf has type #VAEncCodedBufferType. It should be
302     * large enough to hold the compressed NAL slice and possibly SPS
303     * and PPS NAL units.
304     */
305    VABufferID      coded_buf;
306
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;
311
312    /**
313     * \brief OR'd flags describing whether the picture is the last one or not.
314     *
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.
318     */
319    unsigned char   last_picture;
320
321    /** \brief The picture identifier.
322     *   Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive.
323     */
324    unsigned short  frame_num;
325
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.
330     */
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.
334     */
335    unsigned char   num_ref_idx_l1_active_minus1;
336
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;
341
342    union {
343        struct {
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;
366        } bits;
367        unsigned int value;
368    } pic_fields;
369} VAEncPictureParameterBufferH264;
370
371/**
372 * \brief Slice parameter for H.264 encoding in baseline, main & high profiles.
373 *
374 * This structure holds information for \c
375 * slice_layer_without_partitioning_rbsp() as defined by the H.264
376 * specification.
377 *
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
385 *   header data.
386 *
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.
392 */
393typedef 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;
398    /**
399     * \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID.
400     *
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.
406     *
407     * The \c macroblock_info buffer must hold \ref num_macroblocks
408     * elements.
409     */
410    VABufferID      macroblock_info;
411    /** \brief Slice type.
412     *  Range: 0..2, 5..7, i.e. no switching slices.
413     */
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;
419
420    /** @name If pic_order_cnt_type == 0 */
421    /**@{*/
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;
426    /**@}*/
427    /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */
428    /**@{*/
429    /** \brief [0]: top, [1]: bottom. */
430    int             delta_pic_order_cnt[2];
431    /**@}*/
432
433    /** @name If slice_type == B */
434    /**@{*/
435    unsigned char   direct_spatial_mv_pred_flag;
436    /**@}*/
437
438    /** @name If slice_type == P */
439    /**@{*/
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.
444     */
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.
448     */
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.
452     */
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];
458    /**@}*/
459
460    /** @name pred_weight_table() */
461    /**@{*/
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];
490    /**@}*/
491
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 */
497    /**@{*/
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;
504    /**@}*/
505} VAEncSliceParameterBufferH264;
506
507/**
508 * @name Macroblock neighbour availability bits
509 *
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).
513 *
514 * @{
515 */
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)
524/**@}*/
525
526#ifdef __cplusplus
527}
528#endif
529
530#endif /* VA_ENC_H264_H */
531