Blame va/va_enc_h264.h

Packit Service 9402ce
/*
Packit Service 9402ce
 * Copyright (c) 2007-2011 Intel Corporation. All Rights Reserved.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 9402ce
 * copy of this software and associated documentation files (the
Packit Service 9402ce
 * "Software"), to deal in the Software without restriction, including
Packit Service 9402ce
 * without limitation the rights to use, copy, modify, merge, publish,
Packit Service 9402ce
 * distribute, sub license, and/or sell copies of the Software, and to
Packit Service 9402ce
 * permit persons to whom the Software is furnished to do so, subject to
Packit Service 9402ce
 * the following conditions:
Packit Service 9402ce
 *
Packit Service 9402ce
 * The above copyright notice and this permission notice (including the
Packit Service 9402ce
 * next paragraph) shall be included in all copies or substantial portions
Packit Service 9402ce
 * of the Software.
Packit Service 9402ce
 *
Packit Service 9402ce
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit Service 9402ce
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service 9402ce
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Packit Service 9402ce
 * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
Packit Service 9402ce
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Packit Service 9402ce
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Packit Service 9402ce
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 9402ce
 */
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \file va_enc_h264.h
Packit Service 9402ce
 * \brief The H.264 encoding API
Packit Service 9402ce
 *
Packit Service 9402ce
 * This file contains the \ref api_enc_h264 "H.264 encoding API".
Packit Service 9402ce
 */
Packit Service 9402ce
Packit Service 9402ce
#ifndef VA_ENC_H264_H
Packit Service 9402ce
#define VA_ENC_H264_H
Packit Service 9402ce
Packit Service 9402ce
#ifdef __cplusplus
Packit Service 9402ce
extern "C" {
Packit Service 9402ce
#endif
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \defgroup api_enc_h264 H.264 encoding API
Packit Service 9402ce
 *
Packit Service 9402ce
 * @{
Packit Service 9402ce
 */
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * @name Picture flags
Packit Service 9402ce
 *
Packit Service 9402ce
 * Those flags flags are meant to signal when a picture marks the end
Packit Service 9402ce
 * of a sequence, a stream, or even both at once.
Packit Service 9402ce
 *
Packit Service 9402ce
 * @{
Packit Service 9402ce
 */
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Marks the last picture in the sequence.
Packit Service 9402ce
 *
Packit Service 9402ce
 * i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame.
Packit Service 9402ce
 */
Packit Service 9402ce
#define H264_LAST_PICTURE_EOSEQ     0x01
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Marks the last picture in the stream.
Packit Service 9402ce
 *
Packit Service 9402ce
 * i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame.
Packit Service 9402ce
 */
Packit Service 9402ce
#define H264_LAST_PICTURE_EOSTREAM  0x02
Packit Service 9402ce
/**@}*/
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Packed header types specific to H.264 encoding.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Types of packed headers generally used for H.264 encoding. Each
Packit Service 9402ce
 * associated packed header data buffer shall contain the start code
Packit Service 9402ce
 * prefix 0x000001 followed by the complete NAL unit, thus also
Packit Service 9402ce
 * including the \c nal_unit_type.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Note: the start code prefix can contain an arbitrary number of leading
Packit Service 9402ce
 * zeros. The driver will skip them for emulation prevention bytes insertion,
Packit Service 9402ce
 * if necessary.
Packit Service 9402ce
 */
Packit Service 9402ce
typedef enum {
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Packed Sequence Parameter Set (SPS).
Packit Service 9402ce
     *
Packit Service 9402ce
     * The corresponding packed header data buffer shall contain the
Packit Service 9402ce
     * complete seq_parameter_set_rbsp() syntax element.
Packit Service 9402ce
     *
Packit Service 9402ce
     * Note: packed \c nal_unit_type shall be equal to 7.
Packit Service 9402ce
     */
Packit Service 9402ce
    VAEncPackedHeaderH264_SPS   = VAEncPackedHeaderSequence,
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Packed Picture Parameter Set (PPS).
Packit Service 9402ce
     *
Packit Service 9402ce
     * The corresponding packed header data buffer shall contain the
Packit Service 9402ce
     * complete pic_parameter_set_rbsp() syntax element.
Packit Service 9402ce
     *
Packit Service 9402ce
     * Note: packed \c nal_unit_type shall be equal to 8.
Packit Service 9402ce
     */
Packit Service 9402ce
    VAEncPackedHeaderH264_PPS   = VAEncPackedHeaderPicture,
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Packed slice header.
Packit Service 9402ce
     *
Packit Service 9402ce
     * The corresponding packed header data buffer shall contain the
Packit Service 9402ce
     * \c slice_header() syntax element only, along with any start
Packit Service 9402ce
     * code prefix and NAL unit type preceeding it. i.e. this means
Packit Service 9402ce
     * that the buffer does not contain any of the \c slice_data() or
Packit Service 9402ce
     * the \c rbsp_slice_trailing_bits().
Packit Service 9402ce
     *
Packit Service 9402ce
     * Note: packed \c nal_unit_type shall be equal to 1 (non-IDR
Packit Service 9402ce
     * picture), or 5 (IDR picture).
Packit Service 9402ce
     */
Packit Service 9402ce
    VAEncPackedHeaderH264_Slice = VAEncPackedHeaderSlice,
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Packed Supplemental Enhancement Information (SEI).
Packit Service 9402ce
     *
Packit Service 9402ce
     * The corresponding packed header data buffer shall contain the
Packit Service 9402ce
     * complete sei_rbsp() syntax element, thus including several
Packit Service 9402ce
     * sei_message() elements if necessary.
Packit Service 9402ce
     *
Packit Service 9402ce
     * Note: packed \c nal_unit_type shall be equal to 6.
Packit Service 9402ce
     *
Packit Service 9402ce
     * @deprecated
Packit Service 9402ce
     * This is a deprecated packed header flag, All applications can use
Packit Service 9402ce
     * \c VA_ENC_PACKED_HEADER_RAW_DATA to pass the corresponding packed
Packit Service 9402ce
     * SEI header data buffer to the driver
Packit Service 9402ce
     */
Packit Service 9402ce
    VAEncPackedHeaderH264_SEI va_deprecated_enum  = (0x80000000 | 1),
Packit Service 9402ce
} VAEncPackedHeaderTypeH264;
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Sequence parameter for H.264 encoding in baseline, main & high 
Packit Service 9402ce
 * profiles.
Packit Service 9402ce
 *
Packit Service 9402ce
 * This structure holds information for \c seq_parameter_set_data() as
Packit Service 9402ce
 * defined by the H.264 specification.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If packed sequence headers mode is used, i.e. if the encoding
Packit Service 9402ce
 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE
Packit Service 9402ce
 * flag, then the driver expects two more buffers to be provided to
Packit Service 9402ce
 * the same \c vaRenderPicture() as this buffer:
Packit Service 9402ce
 * - a #VAEncPackedHeaderParameterBuffer with type set to
Packit Service 9402ce
 *   VAEncPackedHeaderType::VAEncPackedHeaderSequence ;
Packit Service 9402ce
 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
Packit Service 9402ce
 *   header data.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If \c seq_scaling_matrix_present_flag is set to \c 1, then a
Packit Service 9402ce
 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
Packit Service 9402ce
 * \c vaRenderPicture() call as this sequence parameter buffer.
Packit Service 9402ce
 */
Packit Service 9402ce
typedef struct _VAEncSequenceParameterBufferH264 {
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   seq_parameter_set_id;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   level_idc;
Packit Service 9402ce
    /** \brief Period between I frames. */
Packit Service 9402ce
    uint32_t    intra_period;
Packit Service 9402ce
    /** \brief Period between IDR frames. */
Packit Service 9402ce
    uint32_t    intra_idr_period;
Packit Service 9402ce
    /** \brief Period between I/P frames. */
Packit Service 9402ce
    uint32_t    ip_period;
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Initial bitrate set for this sequence in CBR or VBR modes.
Packit Service 9402ce
     *
Packit Service 9402ce
     * This field represents the initial bitrate value for this
Packit Service 9402ce
     * sequence if CBR or VBR mode is used, i.e. if the encoder
Packit Service 9402ce
     * pipeline was created with a #VAConfigAttribRateControl
Packit Service 9402ce
     * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR.
Packit Service 9402ce
     *
Packit Service 9402ce
     * The bitrate can be modified later on through
Packit Service 9402ce
     * #VAEncMiscParameterRateControl buffers.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint32_t    bits_per_second;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    max_num_ref_frames;
Packit Service 9402ce
    /** \brief Picture width in macroblocks. */
Packit Service 9402ce
    uint16_t  picture_width_in_mbs;
Packit Service 9402ce
    /** \brief Picture height in macroblocks. */
Packit Service 9402ce
    uint16_t  picture_height_in_mbs;
Packit Service 9402ce
Packit Service 9402ce
    union {
Packit Service 9402ce
        struct {
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t chroma_format_idc                      : 2;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t frame_mbs_only_flag                    : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t mb_adaptive_frame_field_flag           : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t seq_scaling_matrix_present_flag        : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t direct_8x8_inference_flag              : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t log2_max_frame_num_minus4              : 4;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t pic_order_cnt_type                     : 2;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t log2_max_pic_order_cnt_lsb_minus4      : 4;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t delta_pic_order_always_zero_flag       : 1;
Packit Service 9402ce
        } bits;
Packit Service 9402ce
        uint32_t value;
Packit Service 9402ce
    } seq_fields;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   bit_depth_luma_minus8;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   bit_depth_chroma_minus8;
Packit Service 9402ce
Packit Service 9402ce
    /** if pic_order_cnt_type == 1 */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   num_ref_frames_in_pic_order_cnt_cycle;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int32_t             offset_for_non_ref_pic;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int32_t             offset_for_top_to_bottom_field;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int32_t             offset_for_ref_frame[256];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** @name Cropping (optional) */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   frame_cropping_flag;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    frame_crop_left_offset;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    frame_crop_right_offset;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    frame_crop_top_offset;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    frame_crop_bottom_offset;
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** @name VUI parameters (optional) */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   vui_parameters_present_flag;
Packit Service 9402ce
    union {
Packit Service 9402ce
        struct {
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t aspect_ratio_info_present_flag         : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t timing_info_present_flag               : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t bitstream_restriction_flag             : 1;
Packit Service 9402ce
            /** \brief Range: 0 to 16, inclusive. */
Packit Service 9402ce
            uint32_t log2_max_mv_length_horizontal          : 5;
Packit Service 9402ce
            /** \brief Range: 0 to 16, inclusive. */
Packit Service 9402ce
            uint32_t log2_max_mv_length_vertical            : 5;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t fixed_frame_rate_flag                  : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t low_delay_hrd_flag                     : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t motion_vectors_over_pic_boundaries_flag: 1;
Packit Service 9402ce
            /** \brief Reserved for future use, must be zero */
Packit Service 9402ce
            uint32_t reserved                               : 16;
Packit Service 9402ce
        } bits;
Packit Service 9402ce
        uint32_t value;
Packit Service 9402ce
    } vui_fields;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   aspect_ratio_idc;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    sar_width;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    sar_height;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    num_units_in_tick;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint32_t    time_scale;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Reserved bytes for future use, must be zero */
Packit Service 9402ce
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
} VAEncSequenceParameterBufferH264;
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Picture parameter for H.264 encoding in baseline, main & high 
Packit Service 9402ce
 * profiles.
Packit Service 9402ce
 *
Packit Service 9402ce
 * This structure holds information for \c pic_parameter_set_rbsp() as
Packit Service 9402ce
 * defined by the H.264 specification.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If packed picture headers mode is used, i.e. if the encoding
Packit Service 9402ce
 * pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE
Packit Service 9402ce
 * flag, then the driver expects two more buffers to be provided to
Packit Service 9402ce
 * the same \c vaRenderPicture() as this buffer:
Packit Service 9402ce
 * - a #VAEncPackedHeaderParameterBuffer with type set to
Packit Service 9402ce
 *   VAEncPackedHeaderType::VAEncPackedHeaderPicture ;
Packit Service 9402ce
 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
Packit Service 9402ce
 *   header data.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If \c pic_scaling_matrix_present_flag is set to \c 1, then a
Packit Service 9402ce
 * #VAIQMatrixBufferH264 buffer shall also be provided within the same
Packit Service 9402ce
 * \c vaRenderPicture() call as this picture parameter buffer.
Packit Service 9402ce
 */
Packit Service 9402ce
typedef struct _VAEncPictureParameterBufferH264 {
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Information about the picture to be encoded.
Packit Service 9402ce
     *
Packit Service 9402ce
     * See #VAPictureH264 for further description of each field.
Packit Service 9402ce
     * Note that CurrPic.picture_id represents the reconstructed
Packit Service 9402ce
     * (decoded) picture. User provides a scratch VA surface ID here.
Packit Service 9402ce
     */
Packit Service 9402ce
    VAPictureH264   CurrPic;
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Decoded Picture Buffer (DPB).
Packit Service 9402ce
     *
Packit Service 9402ce
     * This array represents the list of reconstructed (decoded)
Packit Service 9402ce
     * frames used as reference. It is important to keep track of
Packit Service 9402ce
     * reconstructed frames so that they can be used later on as
Packit Service 9402ce
     * reference for P or B-frames encoding.
Packit Service 9402ce
     */
Packit Service 9402ce
    VAPictureH264   ReferenceFrames[16];
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Output encoded bitstream.
Packit Service 9402ce
     *
Packit Service 9402ce
     * \ref coded_buf has type #VAEncCodedBufferType. It should be
Packit Service 9402ce
     * large enough to hold the compressed NAL slice and possibly SPS
Packit Service 9402ce
     * and PPS NAL units.
Packit Service 9402ce
     */
Packit Service 9402ce
    VABufferID      coded_buf;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief The picture parameter set referred to in the slice header. */
Packit Service 9402ce
    uint8_t   pic_parameter_set_id;
Packit Service 9402ce
    /** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */
Packit Service 9402ce
    uint8_t   seq_parameter_set_id;
Packit Service 9402ce
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief OR'd flags describing whether the picture is the last one or not.
Packit Service 9402ce
     *
Packit Service 9402ce
     * This fields holds 0 if the picture to be encoded is not the last
Packit Service 9402ce
     * one in the stream or sequence. Otherwise, it is a combination of
Packit Service 9402ce
     * \ref H264_LAST_PICTURE_EOSEQ or \ref H264_LAST_PICTURE_EOSTREAM.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   last_picture;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief The picture identifier.
Packit Service 9402ce
     *   Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint16_t  frame_num;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief \c pic_init_qp_minus26 + 26. */
Packit Service 9402ce
    uint8_t   pic_init_qp;
Packit Service 9402ce
    /** \brief Maximum reference index for reference picture list 0.
Packit Service 9402ce
     *   Range: 0 to 31, inclusive.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   num_ref_idx_l0_active_minus1;
Packit Service 9402ce
    /** \brief Maximum reference index for reference picture list 1.
Packit Service 9402ce
     *  Range: 0 to 31, inclusive.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   num_ref_idx_l1_active_minus1;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Range: -12 to 12, inclusive. */
Packit Service 9402ce
    int8_t     chroma_qp_index_offset;
Packit Service 9402ce
    /** \brief Range: -12 to 12, inclusive. */
Packit Service 9402ce
    int8_t     second_chroma_qp_index_offset;
Packit Service 9402ce
Packit Service 9402ce
    union {
Packit Service 9402ce
        struct {
Packit Service 9402ce
            /** \brief Is picture an IDR picture? */
Packit Service 9402ce
            uint32_t idr_pic_flag                           : 1;
Packit Service 9402ce
            /** \brief Is picture a reference picture? */
Packit Service 9402ce
            uint32_t reference_pic_flag                     : 2;
Packit Service 9402ce
            /** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */
Packit Service 9402ce
            uint32_t entropy_coding_mode_flag               : 1;
Packit Service 9402ce
            /** \brief Is weighted prediction applied to P slices? */
Packit Service 9402ce
            uint32_t weighted_pred_flag                     : 1;
Packit Service 9402ce
            /** \brief Range: 0 to 2, inclusive. */
Packit Service 9402ce
            uint32_t weighted_bipred_idc                    : 2;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t constrained_intra_pred_flag            : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t transform_8x8_mode_flag                : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t deblocking_filter_control_present_flag : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t redundant_pic_cnt_present_flag         : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t pic_order_present_flag                 : 1;
Packit Service 9402ce
            /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
            uint32_t pic_scaling_matrix_present_flag        : 1;
Packit Service 9402ce
        } bits;
Packit Service 9402ce
        uint32_t value;
Packit Service 9402ce
    } pic_fields;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Reserved bytes for future use, must be zero */
Packit Service 9402ce
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit Service 9402ce
} VAEncPictureParameterBufferH264;
Packit Service 9402ce
Packit Service 9402ce
typedef struct _VAEncQPBufferH264 {
Packit Service 9402ce
    /*
Packit Service 9402ce
     * \brief This structure holds QP per 16x16 macroblock. Buffer size shall be
Packit Service 9402ce
     * sufficient to fit the slice or frame to be encoded depending on if it is a
Packit Service 9402ce
     * slice level or frame level encoding.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t qp;
Packit Service 9402ce
} VAEncQPBufferH264;
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Slice parameter for H.264 encoding in baseline, main & high profiles.
Packit Service 9402ce
 *
Packit Service 9402ce
 * This structure holds information for \c
Packit Service 9402ce
 * slice_layer_without_partitioning_rbsp() as defined by the H.264
Packit Service 9402ce
 * specification.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If packed slice headers mode is used, i.e. if the encoding
Packit Service 9402ce
 * pipeline was configured with the #VA_ENC_PACKED_HEADER_SLICE
Packit Service 9402ce
 * flag, then the driver expects two more buffers to be provided to
Packit Service 9402ce
 * the same \c vaRenderPicture() as this buffer:
Packit Service 9402ce
 * - a #VAEncPackedHeaderParameterBuffer with type set to
Packit Service 9402ce
 *   VAEncPackedHeaderType::VAEncPackedHeaderSlice ;
Packit Service 9402ce
 * - a #VAEncPackedHeaderDataBuffer which holds the actual packed
Packit Service 9402ce
 *   header data.
Packit Service 9402ce
 *
Packit Service 9402ce
 * If per-macroblock encoder configuration is needed, \c macroblock_info
Packit Service 9402ce
 * references a buffer of type #VAEncMacroblockParameterBufferH264. This
Packit Service 9402ce
 * buffer is not passed to vaRenderPicture() and it can be re-used
Packit Service 9402ce
 * without re-allocating the whole buffer.
Packit Service 9402ce
 */
Packit Service 9402ce
typedef struct _VAEncSliceParameterBufferH264 {
Packit Service 9402ce
    /** \brief Starting MB address for this slice. */
Packit Service 9402ce
    uint32_t    macroblock_address;
Packit Service 9402ce
    /** \brief Number of macroblocks in this slice. */
Packit Service 9402ce
    uint32_t    num_macroblocks;
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID.
Packit Service 9402ce
     *
Packit Service 9402ce
     * If per-MB encoder configuration is needed, then \ref macroblock_info
Packit Service 9402ce
     * references a buffer of type #VAEncMacroblockParameterBufferH264
Packit Service 9402ce
     * (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id
Packit Service 9402ce
     * is set to \c VA_INVALID_ID and per-MB configuration is derived
Packit Service 9402ce
     * from this slice parameter.
Packit Service 9402ce
     *
Packit Service 9402ce
     * The \c macroblock_info buffer must hold \ref num_macroblocks
Packit Service 9402ce
     * elements.
Packit Service 9402ce
     */
Packit Service 9402ce
    VABufferID      macroblock_info;
Packit Service 9402ce
    /** \brief Slice type.
Packit Service 9402ce
     *  Range: 0..2, 5..7, i.e. no switching slices.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   slice_type;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   pic_parameter_set_id;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint16_t  idr_pic_id;
Packit Service 9402ce
Packit Service 9402ce
    /** @name If pic_order_cnt_type == 0 */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief The picture order count modulo MaxPicOrderCntLsb. */
Packit Service 9402ce
    uint16_t  pic_order_cnt_lsb;
Packit Service 9402ce
    /** \brief Valid if \c pic_order_present_flag and this is a bottom field. */
Packit Service 9402ce
    int32_t             delta_pic_order_cnt_bottom;
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
    /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief [0]: top, [1]: bottom. */
Packit Service 9402ce
    int32_t             delta_pic_order_cnt[2];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** @name If slice_type == B */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    uint8_t   direct_spatial_mv_pred_flag;
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** @name If slice_type == P */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Specifies if
Packit Service 9402ce
     * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or
Packit Service 9402ce
     * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are
Packit Service 9402ce
     * overriden by the values for this slice.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   num_ref_idx_active_override_flag;
Packit Service 9402ce
    /** \brief Maximum reference index for reference picture list 0.
Packit Service 9402ce
     *  Range: 0 to 31, inclusive.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   num_ref_idx_l0_active_minus1;
Packit Service 9402ce
    /** \brief Maximum reference index for reference picture list 1.
Packit Service 9402ce
     *  Range: 0 to 31, inclusive.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   num_ref_idx_l1_active_minus1;
Packit Service 9402ce
    /** \brief Reference picture list 0 (for P slices). */
Packit Service 9402ce
    VAPictureH264   RefPicList0[32];
Packit Service 9402ce
    /** \brief Reference picture list 1 (for B slices). */
Packit Service 9402ce
    VAPictureH264   RefPicList1[32];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** @name pred_weight_table() */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   luma_log2_weight_denom;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   chroma_log2_weight_denom;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   luma_weight_l0_flag;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    luma_weight_l0[32];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    luma_offset_l0[32];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   chroma_weight_l0_flag;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    chroma_weight_l0[32][2];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    chroma_offset_l0[32][2];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   luma_weight_l1_flag;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    luma_weight_l1[32];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    luma_offset_l1[32];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    uint8_t   chroma_weight_l1_flag;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    chroma_weight_l1[32][2];
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    signed short    chroma_offset_l1[32][2];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Range: 0 to 2, inclusive. */
Packit Service 9402ce
    uint8_t   cabac_init_idc;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int8_t     slice_qp_delta;
Packit Service 9402ce
    /** @name If deblocking_filter_control_present_flag */
Packit Service 9402ce
    /**@{*/
Packit Service 9402ce
    /** \brief Range: 0 to 2, inclusive. */
Packit Service 9402ce
    uint8_t   disable_deblocking_filter_idc;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int8_t     slice_alpha_c0_offset_div2;
Packit Service 9402ce
    /** \brief Same as the H.264 bitstream syntax element. */
Packit Service 9402ce
    int8_t     slice_beta_offset_div2;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Reserved bytes for future use, must be zero */
Packit Service 9402ce
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit Service 9402ce
    /**@}*/
Packit Service 9402ce
} VAEncSliceParameterBufferH264;
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * @name Macroblock neighbour availability bits
Packit Service 9402ce
 *
Packit Service 9402ce
 * \anchor api_enc_h264_mb_pred_avail_bits
Packit Service 9402ce
 * Definitions for macroblock neighbour availability bits used in
Packit Service 9402ce
 * intra prediction mode (non MBAFF only).
Packit Service 9402ce
 *
Packit Service 9402ce
 * @{
Packit Service 9402ce
 */
Packit Service 9402ce
/** \brief References macroblock in the top-left corner. */
Packit Service 9402ce
#define VA_MB_PRED_AVAIL_TOP_LEFT         (1 << 2)
Packit Service 9402ce
/** \brief References macroblock above the current macroblock. */
Packit Service 9402ce
#define VA_MB_PRED_AVAIL_TOP              (1 << 4)
Packit Service 9402ce
/** \brief References macroblock in the top-right corner. */
Packit Service 9402ce
#define VA_MB_PRED_AVAIL_TOP_RIGHT        (1 << 3)
Packit Service 9402ce
/** \brief References macroblock on the left of the current macroblock. */
Packit Service 9402ce
#define VA_MB_PRED_AVAIL_LEFT             (1 << 6)
Packit Service 9402ce
/**@}*/
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief Macroblock parameter for H.264 encoding in baseline, main & high 
Packit Service 9402ce
 * profiles.
Packit Service 9402ce
 *
Packit Service 9402ce
 * This structure holds per-macroblock information. The buffer must be
Packit Service 9402ce
 * allocated with as many elements (macroblocks) as necessary to fit
Packit Service 9402ce
 * the slice to be encoded. Besides, the per-macroblock records must
Packit Service 9402ce
 * be written in a strict raster order and with no gap. i.e. every
Packit Service 9402ce
 * macroblock, regardless of its type, shall have an entry.
Packit Service 9402ce
 */
Packit Service 9402ce
typedef struct _VAEncMacroblockParameterBufferH264 {
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Quantization parameter.
Packit Service 9402ce
     *
Packit Service 9402ce
     * Requested quantization parameter. Range: 0 to 51, inclusive.
Packit Service 9402ce
     * If \ref qp is set to 0xff, then the actual value is derived
Packit Service 9402ce
     * from the slice-level value: \c pic_init_qp + \c slice_qp_delta.
Packit Service 9402ce
     */
Packit Service 9402ce
    uint8_t   qp;
Packit Service 9402ce
Packit Service 9402ce
    union {
Packit Service 9402ce
        /** @name Data for intra macroblock */
Packit Service 9402ce
        /**@{*/
Packit Service 9402ce
        union {
Packit Service 9402ce
            struct {
Packit Service 9402ce
                /**
Packit Service 9402ce
                 * \brief Flag specified to override MB neighbour
Packit Service 9402ce
                 * availability bits from VME stage.
Packit Service 9402ce
                 *
Packit Service 9402ce
                 * This flag specifies that macroblock neighbour
Packit Service 9402ce
                 * availability bits from the VME stage are overriden
Packit Service 9402ce
                 * by the \ref pred_avail_flags hereunder.
Packit Service 9402ce
                 */
Packit Service 9402ce
                uint32_t    pred_avail_override_flag        : 1;
Packit Service 9402ce
                /**
Packit Service 9402ce
                 * \brief Bitwise representation of which macroblocks
Packit Service 9402ce
                 * are available for intra prediction.
Packit Service 9402ce
                 *
Packit Service 9402ce
                 * If the slice is intra-coded, this field represents
Packit Service 9402ce
                 * the macroblocks available for intra prediction.
Packit Service 9402ce
                 * See \ref api_enc_h264_mb_pred_avail_bits
Packit Service 9402ce
                 * "macroblock neighbour availability" bit definitions.
Packit Service 9402ce
                 */
Packit Service 9402ce
                uint32_t    pred_avail_flags                : 8;
Packit Service 9402ce
            } bits;
Packit Service 9402ce
            uint32_t value;
Packit Service 9402ce
        } intra_fields;
Packit Service 9402ce
        /**@}*/
Packit Service 9402ce
Packit Service 9402ce
        /** @name Data for inter macroblock */
Packit Service 9402ce
        /**@{*/
Packit Service 9402ce
        union {
Packit Service 9402ce
            struct {
Packit Service 9402ce
                uint32_t reserved;
Packit Service 9402ce
            } bits;
Packit Service 9402ce
            uint32_t value;
Packit Service 9402ce
        } inter_fields;
Packit Service 9402ce
        /**@}*/
Packit Service 9402ce
    } info;
Packit Service 9402ce
Packit Service 9402ce
    /** \brief Reserved bytes for future use, must be zero */
Packit Service 9402ce
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit Service 9402ce
} VAEncMacroblockParameterBufferH264;
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * \brief MB partition modes and 1/2 1/4 motion search configuration
Packit Service 9402ce
 *
Packit Service 9402ce
 * Specifies MB partition modes that are disabled. Specifies Half-pel
Packit Service 9402ce
 * mode and Quarter-pel mode searching
Packit Service 9402ce
 */
Packit Service 9402ce
typedef struct _VAEncMiscParameterSubMbPartPelH264
Packit Service 9402ce
{
Packit Service 9402ce
    uint32_t disable_inter_sub_mb_partition;
Packit Service 9402ce
    union {
Packit Service 9402ce
        struct {
Packit Service 9402ce
            uint32_t disable_16x16_inter_mb_partition        : 1;
Packit Service 9402ce
            uint32_t disable_16x8_inter_mb_partition         : 1;
Packit Service 9402ce
            uint32_t disable_8x16_inter_mb_partition         : 1;
Packit Service 9402ce
            uint32_t disable_8x8_inter_mb_partition          : 1;
Packit Service 9402ce
            uint32_t disable_8x4_inter_mb_partition          : 1;
Packit Service 9402ce
            uint32_t disable_4x8_inter_mb_partition          : 1;
Packit Service 9402ce
            uint32_t disable_4x4_inter_mb_partition          : 1;
Packit Service 9402ce
            uint32_t reserved                                : 1;
Packit Service 9402ce
        } bits;
Packit Service 9402ce
         uint8_t value;
Packit Service 9402ce
    } inter_sub_mb_partition_mask;
Packit Service 9402ce
Packit Service 9402ce
    /**
Packit Service 9402ce
     * \brief Precison of motion search
Packit Service 9402ce
     * 0:Integer mode searching
Packit Service 9402ce
     * 1:Half-pel mode searching
Packit Service 9402ce
     * 2:Reserved
Packit Service 9402ce
     * 3:Quarter-pel mode searching
Packit Service 9402ce
     */
Packit Service 9402ce
    uint32_t enable_sub_pel_mode;
Packit Service 9402ce
    uint8_t sub_pel_mode;
Packit Service 9402ce
    uint8_t reserved[3];
Packit Service 9402ce
} VAEncMiscParameterSubMbPartPelH264;
Packit Service 9402ce
/**@}*/
Packit Service 9402ce
Packit Service 9402ce
#ifdef __cplusplus
Packit Service 9402ce
}
Packit Service 9402ce
#endif
Packit Service 9402ce
Packit Service 9402ce
#endif /* VA_ENC_H264_H */