Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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
  36. extern "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.  */
  79. typedef 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.  */
  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;
  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.  */
  280. typedef 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.  */
  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;
  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. /**
  527.  * \brief Macroblock parameter for H.264 encoding in baseline, main & high
  528.  * profiles.
  529.  *
  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.
  535.  */
  536. typedef struct _VAEncMacroblockParameterBufferH264 {
  537.     /**
  538.      * \brief Quantization parameter.
  539.      *
  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.
  543.      */
  544.     unsigned char   qp;
  545.  
  546.     union {
  547.         /** @name Data for intra macroblock */
  548.         /**@{*/
  549.         struct {
  550.             union {
  551.                 /**
  552.                  * \brief Flag specified to override MB neighbour
  553.                  * availability bits from VME stage.
  554.                  *
  555.                  * This flag specifies that macroblock neighbour
  556.                  * availability bits from the VME stage are overriden
  557.                  * by the \ref pred_avail_flags hereunder.
  558.                  */
  559.                 unsigned int    pred_avail_override_flag        : 1;
  560.                 /**
  561.                  * \brief Bitwise representation of which macroblocks
  562.                  * are available for intra prediction.
  563.                  *
  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.
  568.                  */
  569.                 unsigned int    pred_avail_flags                : 8;
  570.             } bits;
  571.             unsigned int value;
  572.         } intra_fields;
  573.         /**@}*/
  574.  
  575.         /** @name Data for inter macroblock */
  576.         /**@{*/
  577.         struct {
  578.             union {
  579.             } bits;
  580.             unsigned int value;
  581.         } inter_fields;
  582.         /**@}*/
  583.     } info;
  584. } VAEncMacroblockParameterBufferH264;
  585.  
  586. /**@}*/
  587.  
  588. #ifdef __cplusplus
  589. }
  590. #endif
  591.  
  592. #endif /* VA_ENC_H264_H */
  593.