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#include <stdint.h>
40#include <va/va_enc.h>
41
42/**
43 * \defgroup api_enc_h264 H.264 encoding API
44 *
45 * @{
46 */
47
48/**
49 * @name Picture flags
50 *
51 * Those flags flags are meant to signal when a picture marks the end
52 * of a sequence, a stream, or even both at once.
53 *
54 * @{
55 */
56/**
57 * \brief Marks the last picture in the sequence.
58 *
59 * i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame.
60 */
61#define H264_LAST_PICTURE_EOSEQ     VA_ENC_LAST_PICTURE_EOSEQ
62/**
63 * \brief Marks the last picture in the stream.
64 *
65 * i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame.
66 */
67#define H264_LAST_PICTURE_EOSTREAM  VA_ENC_LAST_PICTURE_EOSTREAM
68/**@}*/
69
70/**
71 * \brief Packed header types specific to H.264 encoding.
72 *
73 * Types of packed headers generally used for H.264 encoding. Each
74 * associated packed header data buffer shall contain the start code
75 * prefix 0x000001 followed by the complete NAL unit, thus also
76 * including the \c nal_unit_type.
77 *
78 * Note: the start code prefix can contain an arbitrary number of leading
79 * zeros. The driver will skip them for emulation prevention bytes insertion,
80 * if necessary.
81 */
82typedef enum {
83    /**
84     * \brief Packed Sequence Parameter Set (SPS).
85     *
86     * The corresponding packed header data buffer shall contain the
87     * complete seq_parameter_set_rbsp() syntax element.
88     *
89     * Note: packed \c nal_unit_type shall be equal to 7.
90     */
91    VAEncPackedHeaderH264_SPS   = VAEncPackedHeaderSequence,
92    /**
93     * \brief Packed Picture Parameter Set (PPS).
94     *
95     * The corresponding packed header data buffer shall contain the
96     * complete pic_parameter_set_rbsp() syntax element.
97     *
98     * Note: packed \c nal_unit_type shall be equal to 8.
99     */
100    VAEncPackedHeaderH264_PPS   = VAEncPackedHeaderPicture,
101    /**
102     * \brief Packed slice header.
103     *
104     * The corresponding packed header data buffer shall contain the
105     * \c slice_header() syntax element only, along with any start
106     * code prefix and NAL unit type preceeding it. i.e. this means
107     * that the buffer does not contain any of the \c slice_data() or
108     * the \c rbsp_slice_trailing_bits().
109     *
110     * Note: packed \c nal_unit_type shall be equal to 1 (non-IDR
111     * picture), or 5 (IDR picture).
112     */
113    VAEncPackedHeaderH264_Slice = VAEncPackedHeaderSlice,
114    /**
115     * \brief Packed Supplemental Enhancement Information (SEI).
116     *
117     * The corresponding packed header data buffer shall contain the
118     * complete sei_rbsp() syntax element, thus including several
119     * sei_message() elements if necessary.
120     *
121     * Note: packed \c nal_unit_type shall be equal to 6.
122     */
123    VAEncPackedHeaderH264_SEI   = (VAEncPackedHeaderMiscMask | 1),
124} VAEncPackedHeaderTypeH264;
125
126/**
127 * \brief Sequence parameter for H.264 encoding in baseline, main & high
128 * profiles.
129 *
130 * This structure holds information for \c seq_parameter_set_data() as
131 * defined by the H.264 specification.
132 *
133 * If packed sequence headers mode is used, i.e. if the encoding
134 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE
135 * flag, then the driver expects two more buffers to be provided to
136 * the same \c vaRenderPicture() as this buffer:
137 * - a #VAEncPackedHeaderParameterBuffer with type set to
138 *   VAEncPackedHeaderType::VAEncPackedHeaderSequence ;
139 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
140 *   header data.
141 *
142 * If \c seq_scaling_matrix_present_flag is set to \c 1, then a
143 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
144 * \c vaRenderPicture() call as this sequence parameter buffer.
145 */
146typedef struct _VAEncSequenceParameterBufferH264 {
147    /** \brief Same as the H.264 bitstream syntax element. */
148    unsigned char   seq_parameter_set_id;
149    /** \brief Same as the H.264 bitstream syntax element. */
150    unsigned char   level_idc;
151    /** \brief Period between I frames. */
152    unsigned int    intra_period;
153    /** \brief Period between IDR frames. */
154    unsigned int    intra_idr_period;
155    /** \brief Period between I/P frames. */
156    unsigned int    ip_period;
157    /**
158     * \brief Initial bitrate set for this sequence in CBR or VBR modes.
159     *
160     * This field represents the initial bitrate value for this
161     * sequence if CBR or VBR mode is used, i.e. if the encoder
162     * pipeline was created with a #VAConfigAttribRateControl
163     * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR.
164     *
165     * The bitrate can be modified later on through
166     * #VAEncMiscParameterRateControl buffers.
167     */
168    unsigned int    bits_per_second;
169    /** \brief Same as the H.264 bitstream syntax element. */
170    unsigned int    max_num_ref_frames;
171    /** \brief Picture width in macroblocks. */
172    unsigned short  picture_width_in_mbs;
173    /** \brief Picture height in macroblocks. */
174    unsigned short  picture_height_in_mbs;
175
176    union {
177        struct {
178            /** \brief Same as the H.264 bitstream syntax element. */
179            unsigned int chroma_format_idc                      : 2;
180            /** \brief Same as the H.264 bitstream syntax element. */
181            unsigned int frame_mbs_only_flag                    : 1;
182            /** \brief Same as the H.264 bitstream syntax element. */
183            unsigned int mb_adaptive_frame_field_flag           : 1;
184            /** \brief Same as the H.264 bitstream syntax element. */
185            unsigned int seq_scaling_matrix_present_flag        : 1;
186            /** \brief Same as the H.264 bitstream syntax element. */
187            unsigned int direct_8x8_inference_flag              : 1;
188            /** \brief Same as the H.264 bitstream syntax element. */
189            unsigned int log2_max_frame_num_minus4              : 4;
190            /** \brief Same as the H.264 bitstream syntax element. */
191            unsigned int pic_order_cnt_type                     : 2;
192            /** \brief Same as the H.264 bitstream syntax element. */
193            unsigned int log2_max_pic_order_cnt_lsb_minus4      : 4;
194            /** \brief Same as the H.264 bitstream syntax element. */
195            unsigned int delta_pic_order_always_zero_flag       : 1;
196        } bits;
197        unsigned int value;
198    } seq_fields;
199
200    /** \brief Same as the H.264 bitstream syntax element. */
201    unsigned char   bit_depth_luma_minus8;
202    /** \brief Same as the H.264 bitstream syntax element. */
203    unsigned char   bit_depth_chroma_minus8;
204
205    /** if pic_order_cnt_type == 1 */
206    /**@{*/
207    /** \brief Same as the H.264 bitstream syntax element. */
208    unsigned char   num_ref_frames_in_pic_order_cnt_cycle;
209    /** \brief Same as the H.264 bitstream syntax element. */
210    int             offset_for_non_ref_pic;
211    /** \brief Same as the H.264 bitstream syntax element. */
212    int             offset_for_top_to_bottom_field;
213    /** \brief Same as the H.264 bitstream syntax element. */
214    int             offset_for_ref_frame[256];
215    /**@}*/
216
217    /** @name Cropping (optional) */
218    /**@{*/
219    /** \brief Same as the H.264 bitstream syntax element. */
220    unsigned char   frame_cropping_flag;
221    /** \brief Same as the H.264 bitstream syntax element. */
222    unsigned int    frame_crop_left_offset;
223    /** \brief Same as the H.264 bitstream syntax element. */
224    unsigned int    frame_crop_right_offset;
225    /** \brief Same as the H.264 bitstream syntax element. */
226    unsigned int    frame_crop_top_offset;
227    /** \brief Same as the H.264 bitstream syntax element. */
228    unsigned int    frame_crop_bottom_offset;
229    /**@}*/
230
231    /** @name VUI parameters (optional) */
232    /**@{*/
233    /** \brief Same as the H.264 bitstream syntax element. */
234    unsigned char   vui_parameters_present_flag;
235    union {
236        struct {
237            /** \brief Same as the H.264 bitstream syntax element. */
238            unsigned int aspect_ratio_info_present_flag         : 1;
239            /** \brief Same as the H.264 bitstream syntax element. */
240            unsigned int timing_info_present_flag               : 1;
241            /** \brief Same as the H.264 bitstream syntax element. */
242            unsigned int bitstream_restriction_flag             : 1;
243            /** \brief Range: 0 to 16, inclusive. */
244            unsigned int log2_max_mv_length_horizontal          : 5;
245            /** \brief Range: 0 to 16, inclusive. */
246            unsigned int log2_max_mv_length_vertical            : 5;
247        } bits;
248        unsigned int value;
249    } vui_fields;
250    /** \brief Same as the H.264 bitstream syntax element. */
251    unsigned char   aspect_ratio_idc;
252    /** \brief Same as the H.264 bitstream syntax element. */
253    unsigned int    sar_width;
254    /** \brief Same as the H.264 bitstream syntax element. */
255    unsigned int    sar_height;
256    /** \brief Same as the H.264 bitstream syntax element. */
257    unsigned int    num_units_in_tick;
258    /** \brief Same as the H.264 bitstream syntax element. */
259    unsigned int    time_scale;
260    /**@}*/
261} VAEncSequenceParameterBufferH264;
262
263/**
264 * \brief Picture parameter for H.264 encoding in baseline, main & high
265 * profiles.
266 *
267 * This structure holds information for \c pic_parameter_set_rbsp() as
268 * defined by the H.264 specification.
269 *
270 * If packed picture headers mode is used, i.e. if the encoding
271 * pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE
272 * flag, then the driver expects two more buffers to be provided to
273 * the same \c vaRenderPicture() as this buffer:
274 * - a #VAEncPackedHeaderParameterBuffer with type set to
275 *   VAEncPackedHeaderType::VAEncPackedHeaderPicture ;
276 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
277 *   header data.
278 *
279 * If \c pic_scaling_matrix_present_flag is set to \c 1, then a
280 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
281 * \c vaRenderPicture() call as this picture parameter buffer.
282 */
283typedef struct _VAEncPictureParameterBufferH264 {
284    /**
285     * \brief Information about the picture to be encoded.
286     *
287     * See #VAPictureH264 for further description of each field.
288     * Note that CurrPic.picture_id represents the reconstructed
289     * (decoded) picture. User provides a scratch VA surface ID here.
290     */
291    VAPictureH264   CurrPic;
292    /**
293     * \brief Decoded Picture Buffer (DPB).
294     *
295     * This array represents the list of reconstructed (decoded)
296     * frames used as reference. It is important to keep track of
297     * reconstructed frames so that they can be used later on as
298     * reference for P or B-frames encoding.
299     */
300    VAPictureH264   ReferenceFrames[16];
301    /**
302     * \brief Output encoded bitstream.
303     *
304     * \ref coded_buf has type #VAEncCodedBufferType. It should be
305     * large enough to hold the compressed NAL slice and possibly SPS
306     * and PPS NAL units.
307     */
308    VABufferID      coded_buf;
309
310    /** \brief The picture parameter set referred to in the slice header. */
311    unsigned char   pic_parameter_set_id;
312    /** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */
313    unsigned char   seq_parameter_set_id;
314
315    /**
316     * \brief OR'd flags describing whether the picture is the last one or not.
317     *
318     * This fields holds 0 if the picture to be encoded is not the last
319     * one in the stream or sequence. Otherwise, it is a combination of
320     * \ref H264_LAST_PICTURE_EOSEQ or \ref H264_LAST_PICTURE_EOSTREAM.
321     */
322    unsigned char   last_picture;
323
324    /** \brief The picture identifier.
325     *   Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive.
326     */
327    unsigned short  frame_num;
328
329    /** \brief \c pic_init_qp_minus26 + 26. */
330    unsigned char   pic_init_qp;
331    /** \brief Maximum reference index for reference picture list 0.
332     *   Range: 0 to 31, inclusive.
333     */
334    unsigned char   num_ref_idx_l0_active_minus1;
335    /** \brief Maximum reference index for reference picture list 1.
336     *  Range: 0 to 31, inclusive.
337     */
338    unsigned char   num_ref_idx_l1_active_minus1;
339
340    /** \brief Range: -12 to 12, inclusive. */
341    signed char     chroma_qp_index_offset;
342    /** \brief Range: -12 to 12, inclusive. */
343    signed char     second_chroma_qp_index_offset;
344
345    union {
346        struct {
347            /** \brief Is picture an IDR picture? */
348            unsigned int idr_pic_flag                           : 1;
349            /** \brief Is picture a reference picture? */
350            unsigned int reference_pic_flag                     : 2;
351            /** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */
352            unsigned int entropy_coding_mode_flag               : 1;
353            /** \brief Is weighted prediction applied to P slices? */
354            unsigned int weighted_pred_flag                     : 1;
355            /** \brief Range: 0 to 2, inclusive. */
356            unsigned int weighted_bipred_idc                    : 2;
357            /** \brief Same as the H.264 bitstream syntax element. */
358            unsigned int constrained_intra_pred_flag            : 1;
359            /** \brief Same as the H.264 bitstream syntax element. */
360            unsigned int transform_8x8_mode_flag                : 1;
361            /** \brief Same as the H.264 bitstream syntax element. */
362            unsigned int deblocking_filter_control_present_flag : 1;
363            /** \brief Same as the H.264 bitstream syntax element. */
364            unsigned int redundant_pic_cnt_present_flag         : 1;
365            /** \brief Same as the H.264 bitstream syntax element. */
366            unsigned int pic_order_present_flag                 : 1;
367            /** \brief Same as the H.264 bitstream syntax element. */
368            unsigned int pic_scaling_matrix_present_flag        : 1;
369        } bits;
370        unsigned int value;
371    } pic_fields;
372} VAEncPictureParameterBufferH264;
373
374/**
375 * \brief Slice parameter for H.264 encoding in baseline, main & high profiles.
376 *
377 * This structure holds information for \c
378 * slice_layer_without_partitioning_rbsp() as defined by the H.264
379 * specification.
380 *
381 * If packed slice headers mode is used, i.e. if the encoding
382 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SLICE
383 * flag, then the driver expects two more buffers to be provided to
384 * the same \c vaRenderPicture() as this buffer:
385 * - a #VAEncPackedHeaderParameterBuffer with type set to
386 *   VAEncPackedHeaderType::VAEncPackedHeaderSlice ;
387 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
388 *   header data.
389 *
390 * If per-macroblock encoder configuration is needed, \c macroblock_info
391 * references a buffer of type #VAEncMacroblockParameterBufferH264. This
392 * buffer is not passed to vaRenderPicture(). i.e. it is not destroyed
393 * by subsequent calls to vaRenderPicture() and then can be re-used
394 * without re-allocating the whole buffer.
395 */
396typedef struct _VAEncSliceParameterBufferH264 {
397    /** \brief Starting MB address for this slice. */
398    unsigned int    macroblock_address;
399    /** \brief Number of macroblocks in this slice. */
400    unsigned int    num_macroblocks;
401    /**
402     * \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID.
403     *
404     * If per-MB encoder configuration is needed, then \ref macroblock_info
405     * references a buffer of type #VAEncMacroblockParameterBufferH264
406     * (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id
407     * is set to \c VA_INVALID_ID and per-MB configuration is derived
408     * from this slice parameter.
409     *
410     * The \c macroblock_info buffer must hold \ref num_macroblocks
411     * elements.
412     */
413    VABufferID      macroblock_info;
414    /** \brief Slice type.
415     *  Range: 0..2, 5..7, i.e. no switching slices.
416     */
417    unsigned char   slice_type;
418    /** \brief Same as the H.264 bitstream syntax element. */
419    unsigned char   pic_parameter_set_id;
420    /** \brief Same as the H.264 bitstream syntax element. */
421    unsigned short  idr_pic_id;
422
423    /** @name If pic_order_cnt_type == 0 */
424    /**@{*/
425    /** \brief The picture order count modulo MaxPicOrderCntLsb. */
426    unsigned short  pic_order_cnt_lsb;
427    /** \brief Valid if \c pic_order_present_flag and this is a bottom field. */
428    int             delta_pic_order_cnt_bottom;
429    /**@}*/
430    /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */
431    /**@{*/
432    /** \brief [0]: top, [1]: bottom. */
433    int             delta_pic_order_cnt[2];
434    /**@}*/
435
436    /** @name If slice_type == B */
437    /**@{*/
438    unsigned char   direct_spatial_mv_pred_flag;
439    /**@}*/
440
441    /** @name If slice_type == P */
442    /**@{*/
443    /** \brief Specifies if
444     * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or
445     * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are
446     * overriden by the values for this slice.
447     */
448    unsigned char   num_ref_idx_active_override_flag;
449    /** \brief Maximum reference index for reference picture list 0.
450     *  Range: 0 to 31, inclusive.
451     */
452    unsigned char   num_ref_idx_l0_active_minus1;
453    /** \brief Maximum reference index for reference picture list 1.
454     *  Range: 0 to 31, inclusive.
455     */
456    unsigned char   num_ref_idx_l1_active_minus1;
457    /** \brief Reference picture list 0 (for P slices). */
458    VAPictureH264   RefPicList0[32];
459    /** \brief Reference picture list 1 (for B slices). */
460    VAPictureH264   RefPicList1[32];
461    /**@}*/
462
463    /** @name pred_weight_table() */
464    /**@{*/
465    /** \brief Same as the H.264 bitstream syntax element. */
466    unsigned char   luma_log2_weight_denom;
467    /** \brief Same as the H.264 bitstream syntax element. */
468    unsigned char   chroma_log2_weight_denom;
469    /** \brief Same as the H.264 bitstream syntax element. */
470    unsigned char   luma_weight_l0_flag;
471    /** \brief Same as the H.264 bitstream syntax element. */
472    signed short    luma_weight_l0[32];
473    /** \brief Same as the H.264 bitstream syntax element. */
474    signed short    luma_offset_l0[32];
475    /** \brief Same as the H.264 bitstream syntax element. */
476    unsigned char   chroma_weight_l0_flag;
477    /** \brief Same as the H.264 bitstream syntax element. */
478    signed short    chroma_weight_l0[32][2];
479    /** \brief Same as the H.264 bitstream syntax element. */
480    signed short    chroma_offset_l0[32][2];
481    /** \brief Same as the H.264 bitstream syntax element. */
482    unsigned char   luma_weight_l1_flag;
483    /** \brief Same as the H.264 bitstream syntax element. */
484    signed short    luma_weight_l1[32];
485    /** \brief Same as the H.264 bitstream syntax element. */
486    signed short    luma_offset_l1[32];
487    /** \brief Same as the H.264 bitstream syntax element. */
488    unsigned char   chroma_weight_l1_flag;
489    /** \brief Same as the H.264 bitstream syntax element. */
490    signed short    chroma_weight_l1[32][2];
491    /** \brief Same as the H.264 bitstream syntax element. */
492    signed short    chroma_offset_l1[32][2];
493    /**@}*/
494
495    /** \brief Range: 0 to 2, inclusive. */
496    unsigned char   cabac_init_idc;
497    /** \brief Same as the H.264 bitstream syntax element. */
498    signed char     slice_qp_delta;
499    /** @name If deblocking_filter_control_present_flag */
500    /**@{*/
501    /** \brief Range: 0 to 2, inclusive. */
502    unsigned char   disable_deblocking_filter_idc;
503    /** \brief Same as the H.264 bitstream syntax element. */
504    signed char     slice_alpha_c0_offset_div2;
505    /** \brief Same as the H.264 bitstream syntax element. */
506    signed char     slice_beta_offset_div2;
507    /**@}*/
508} VAEncSliceParameterBufferH264;
509
510/**
511 * @name Macroblock neighbour availability bits
512 *
513 * \anchor api_enc_h264_mb_pred_avail_bits
514 * Definitions for macroblock neighbour availability bits used in
515 * intra prediction mode (non MBAFF only).
516 *
517 * @{
518 */
519/** \brief References macroblock in the top-left corner. */
520#define VA_MB_PRED_AVAIL_TOP_LEFT         (1 << 2)
521/** \brief References macroblock above the current macroblock. */
522#define VA_MB_PRED_AVAIL_TOP              (1 << 4)
523/** \brief References macroblock in the top-right corner. */
524#define VA_MB_PRED_AVAIL_TOP_RIGHT        (1 << 3)
525/** \brief References macroblock on the left of the current macroblock. */
526#define VA_MB_PRED_AVAIL_LEFT             (1 << 6)
527/**@}*/
528
529/**
530 * \brief Macroblock parameter for H.264 encoding in baseline, main & high
531 * profiles.
532 *
533 * This structure holds per-macroblock information. The buffer must be
534 * allocated with as many elements (macroblocks) as necessary to fit
535 * the slice to be encoded. Besides, the per-macroblock records must
536 * be written in a strict raster order and with no gap. i.e. every
537 * macroblock, regardless of its type, shall have an entry.
538 */
539typedef struct _VAEncMacroblockParameterBufferH264 {
540    /**
541     * \brief Quantization parameter.
542     *
543     * Requested quantization parameter. Range: 0 to 51, inclusive.
544     * If \ref qp is set to 0xff, then the actual value is derived
545     * from the slice-level value: \c pic_init_qp + \c slice_qp_delta.
546     */
547    unsigned char   qp;
548
549    union {
550        /** @name Data for intra macroblock */
551        /**@{*/
552        struct {
553            union {
554                /**
555                 * \brief Flag specified to override MB neighbour
556                 * availability bits from VME stage.
557                 *
558                 * This flag specifies that macroblock neighbour
559                 * availability bits from the VME stage are overriden
560                 * by the \ref pred_avail_flags hereunder.
561                 */
562                unsigned int    pred_avail_override_flag        : 1;
563                /**
564                 * \brief Bitwise representation of which macroblocks
565                 * are available for intra prediction.
566                 *
567                 * If the slice is intra-coded, this field represents
568                 * the macroblocks available for intra prediction.
569                 * See \ref api_enc_h264_mb_pred_avail_bits
570                 * "macroblock neighbour availability" bit definitions.
571                 */
572                unsigned int    pred_avail_flags                : 8;
573            } bits;
574            unsigned int value;
575        } intra_fields;
576        /**@}*/
577
578        /** @name Data for inter macroblock */
579        /**@{*/
580        struct {
581            union {
582            } bits;
583            unsigned int value;
584        } inter_fields;
585        /**@}*/
586    } info;
587} VAEncMacroblockParameterBufferH264;
588
589/**
590 * \brief H.264 Mutiview Coding(MVC) Sequence Parameter Buffer
591 *
592 */
593typedef struct _VAEncSequenceParameterBufferH264_MVC {
594    /** brief Basic common sequence parameter */
595    VAEncSequenceParameterBufferH264 base;
596
597    /** brief Plus 1 specify the max number of views
598     * coded in the video sequence
599     */
600    uint16_t num_views_minus1;
601
602    /** brief Specify the view information in all layers */
603    struct H264SPSExtMVCViewInfo{
604        /** \brief The current view identifier. */
605        uint16_t view_id;
606        /** \brief Specifies the number of view components for inter-view
607         * prediction in the initialized RefPicList0 in decoding
608         * anchor views.
609         */
610        uint8_t  num_anchor_refs_l0;
611        /** \brief Specifies the view_id for inter-view prediction in
612         * the initialized RefPicList0 in decoding anchor views.
613         */
614        uint16_t anchor_ref_l0[15];
615        /** \brief Specifies the number of view components for inter-view
616         * prediction in the initialized RefPicList1 in decoding
617         * anchor views
618         */
619        uint8_t  num_anchor_refs_l1;
620        /** \brief Specifies the view_id for inter-view prediction in
621         * the initialized RefPicList1 in decoding anchor views.
622         */
623        uint16_t anchor_ref_l1[15];
624        /** \brief Specifies the number of view components for inter-view
625         * prediction in the initialized RefPicList0 in decoding
626         * non-anchor views.
627         */
628        uint8_t  num_non_anchor_refs_l0;
629        /** \brief Specifies the view_id for inter-view prediction in
630         * the initialized RefPicList0 in decoding non-anchor views.
631         */
632        uint16_t non_anchor_ref_l0[15];
633        /** \brief Specifies the number of view components for inter-view
634         * prediction in the initialized RefPicList1 in decoding
635         * non-anchor view.
636         */
637        uint8_t  num_non_anchor_refs_l1;
638        /** \brief Specifies the view_id for inter-view prediction in
639         * the initialized RefPicList1 in decoding non-anchor views.
640         */
641        uint16_t non_anchor_ref_l1[15];
642    }* view_list;
643
644    /** brief Plus 1 specifies the number of level values
645     * signalled for the coded video sequence
646     */
647    uint8_t num_level_values_signalled_minus1;
648
649    /** brief Level values operation for a set of the operation
650     * points in the current sequence
651     */
652    struct H264SPSExtMVCLevelValue {
653        /** \brief Specifies the level value signalled for the coded video sequence */
654        uint8_t level_idc;
655
656        /** \brief Plus 1 specifies the number of operation points to
657         *  which the level indicated by level_idc applies
658         */
659        uint16_t num_applicable_ops_minus1;
660
661        /** \brief Represent the specific operation to the view in the video sequence */
662        struct H264SPSExtMVCLevelValueOps {
663            /** \brief Specify a temporal identifier for the NAL unit */
664            uint8_t   temporal_id;
665            /** \brief Specify the number of the views whose level value will be modified */
666            uint16_t  num_target_views_minus1;
667            /** \brief Specify the views whose level value will be modified */
668            uint16_t* target_view_id_list;
669            /** \brief Specify the number of views whose level value can be modified */
670            uint16_t  num_views_minus1;
671        }* level_value_ops_list;
672
673    }* level_value_list;
674
675} VAEncSequenceParameterBufferH264_MVC;
676
677/**
678 * \brief H.264 Multiview Coding(MVC) Picture Parameter Buffer
679 *
680 */
681typedef struct _VAEncPictureParameterBufferH264_MVC
682{
683    /** brief Basic common picture parameter */
684    VAEncPictureParameterBufferH264 base;
685
686    /** brief Specifes the view id for current picture */
687    uint16_t view_id;
688
689    /** brief Specifes whether the picture is one anchor picture */
690    uint8_t  anchor_pic_flag;
691
692    /** brief Specifes whether inter view reference frame
693     * is used to encode current picture.
694     */
695    uint8_t  inter_view_flag;
696} VAEncPictureParameterBufferH264_MVC;
697
698typedef struct _VAEncQpBufferH264 {
699    /*
700     * \brief This structure holds luma Qp per 16x16 macroblock. Buffer size shall be
701     * sufficient to fit the slice or frame to be encoded depending on if it is a slice level
702     * or frame level encoding.
703     */
704    unsigned char qp_y;
705} VAEncQpBufferH264;
706
707/** \brief Bitstream writer attribute types specific to H.264 encoding. */
708typedef enum {
709    /**
710     * \brief Flag: specifies whether to insert emulation prevention
711     * bytes (integer).
712     */
713    VAEncBitstreamAttribEmulationPreventionH264 = (
714        VAEncBitstreamAttribMiscMask | 1),
715} VAEncBitstreamAttribTypeH264;
716
717
718/**
719 * \brief Allocates a new H.264 bitstream writer.
720 *
721 * Allocates a new bitstream writer. By default, libva allocates and
722 * maintains its own buffer. However, the user can pass down his own
723 * buffer with the \c VAEncBitstreamAttribBuffer attribute, along with
724 * the size of that buffer with the \c VAEncBitstreamAttribBufferSize
725 * attribute.
726 *
727 * By default, emulation prevention bytes are not inserted. However,
728 * the user can still request emulation prevention by setting the
729 * \c VAEncBitstreamAttribEmulationPreventionH264 attribute to 1.
730 *
731 * @param[in] attribs       the optional attributes, or NULL
732 * @param[in] num_attribs   the number of attributes available in \c attribs
733 * @return a new #VAEncBitstream, or NULL if an error occurred
734 */
735VAEncBitstream *
736va_enc_bitstream_h264_new(
737    VAEncBitstreamAttrib *attribs,
738    unsigned int          num_attribs
739);
740
741/**
742 * \brief Destroys an H.264 bitstream writer.
743 *
744 * @param[in] bs            the bitstream writer to destroy
745 */
746void
747va_enc_bitstream_h264_destroy(VAEncBitstream *bs);
748
749/**
750 * \brief Writes an unsigned integer as \c ue(v).
751 *
752 * Writes a 32-bit unsigned int value by following \c ue(v) from the
753 * H.264 specification.
754 *
755 * @param[in] bs            the bitstream writer
756 * @param[in] value         the unsigned int value
757 * @return the number of bits written, or a negative value to indicate an error
758 */
759int
760va_enc_bitstream_h264_write_ue(VAEncBitstream *bs, unsigned int value);
761
762/**
763 * \brief Writes a signed integer as \c se(v).
764 *
765 * Writes a 32-bit signed int value by following \c se(v) from the
766 * H.264 specification.
767 *
768 * @param[in] bs            the bitstream writer
769 * @param[in] value         the signed int value
770 * @return the number of bits written, or a negative value to indicate an error
771 */
772int
773va_enc_bitstream_h264_write_se(VAEncBitstream *bs, int value);
774
775/**
776 * \brief Helper function to write trailing bits into the bitstream.
777 *
778 * @param[in] bs            the bitstream writer
779 * @return the number of bits written, or a negative value to indicate an error
780 */
781int
782va_enc_bitstream_h264_write_trailing_bits(VAEncBitstream *bs);
783
784/**@}*/
785
786#ifdef __cplusplus
787}
788#endif
789
790#endif /* VA_ENC_H264_H */
791