/* * Copyright (c) 2007-2011 Intel Corporation. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * \file va_enc_h264.h * \brief The H.264 encoding API * * This file contains the \ref api_enc_h264 "H.264 encoding API". */ #ifndef VA_ENC_H264_H #define VA_ENC_H264_H #ifdef __cplusplus extern "C" { #endif #include #include /** * \defgroup api_enc_h264 H.264 encoding API * * @{ */ /** * @name Picture flags * * Those flags flags are meant to signal when a picture marks the end * of a sequence, a stream, or even both at once. * * @{ */ /** * \brief Marks the last picture in the sequence. * * i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame. */ #define H264_LAST_PICTURE_EOSEQ VA_ENC_LAST_PICTURE_EOSEQ /** * \brief Marks the last picture in the stream. * * i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame. */ #define H264_LAST_PICTURE_EOSTREAM VA_ENC_LAST_PICTURE_EOSTREAM /**@}*/ /** * \brief Packed header types specific to H.264 encoding. * * Types of packed headers generally used for H.264 encoding. Each * associated packed header data buffer shall contain the start code * prefix 0x000001 followed by the complete NAL unit, thus also * including the \c nal_unit_type. * * Note: the start code prefix can contain an arbitrary number of leading * zeros. The driver will skip them for emulation prevention bytes insertion, * if necessary. */ typedef enum { /** * \brief Packed Sequence Parameter Set (SPS). * * The corresponding packed header data buffer shall contain the * complete seq_parameter_set_rbsp() syntax element. * * Note: packed \c nal_unit_type shall be equal to 7. */ VAEncPackedHeaderH264_SPS = VAEncPackedHeaderSequence, /** * \brief Packed Picture Parameter Set (PPS). * * The corresponding packed header data buffer shall contain the * complete pic_parameter_set_rbsp() syntax element. * * Note: packed \c nal_unit_type shall be equal to 8. */ VAEncPackedHeaderH264_PPS = VAEncPackedHeaderPicture, /** * \brief Packed slice header. * * The corresponding packed header data buffer shall contain the * \c slice_header() syntax element only, along with any start * code prefix and NAL unit type preceeding it. i.e. this means * that the buffer does not contain any of the \c slice_data() or * the \c rbsp_slice_trailing_bits(). * * Note: packed \c nal_unit_type shall be equal to 1 (non-IDR * picture), or 5 (IDR picture). */ VAEncPackedHeaderH264_Slice = VAEncPackedHeaderSlice, /** * \brief Packed Supplemental Enhancement Information (SEI). * * The corresponding packed header data buffer shall contain the * complete sei_rbsp() syntax element, thus including several * sei_message() elements if necessary. * * Note: packed \c nal_unit_type shall be equal to 6. */ VAEncPackedHeaderH264_SEI = (VAEncPackedHeaderMiscMask | 1), } VAEncPackedHeaderTypeH264; /** * \brief Sequence parameter for H.264 encoding in baseline, main & high * profiles. * * This structure holds information for \c seq_parameter_set_data() as * defined by the H.264 specification. * * If packed sequence headers mode is used, i.e. if the encoding * pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE * flag, then the driver expects two more buffers to be provided to * the same \c vaRenderPicture() as this buffer: * - a #VAEncPackedHeaderParameterBuffer with type set to * VAEncPackedHeaderType::VAEncPackedHeaderSequence ; * - a #VAEncPackedHeaderDataBuffer which holds the actual packed * header data. * * If \c seq_scaling_matrix_present_flag is set to \c 1, then a * #VAIQMatrixBufferH264 buffer shall also be provided within the same * \c vaRenderPicture() call as this sequence parameter buffer. */ typedef struct _VAEncSequenceParameterBufferH264 { /** \brief Same as the H.264 bitstream syntax element. */ unsigned char seq_parameter_set_id; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char level_idc; /** \brief Period between I frames. */ unsigned int intra_period; /** \brief Period between IDR frames. */ unsigned int intra_idr_period; /** \brief Period between I/P frames. */ unsigned int ip_period; /** * \brief Initial bitrate set for this sequence in CBR or VBR modes. * * This field represents the initial bitrate value for this * sequence if CBR or VBR mode is used, i.e. if the encoder * pipeline was created with a #VAConfigAttribRateControl * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR. * * The bitrate can be modified later on through * #VAEncMiscParameterRateControl buffers. */ unsigned int bits_per_second; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int max_num_ref_frames; /** \brief Picture width in macroblocks. */ unsigned short picture_width_in_mbs; /** \brief Picture height in macroblocks. */ unsigned short picture_height_in_mbs; union { struct { /** \brief Same as the H.264 bitstream syntax element. */ unsigned int chroma_format_idc : 2; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int frame_mbs_only_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int mb_adaptive_frame_field_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int seq_scaling_matrix_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int direct_8x8_inference_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int log2_max_frame_num_minus4 : 4; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int pic_order_cnt_type : 2; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int log2_max_pic_order_cnt_lsb_minus4 : 4; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int delta_pic_order_always_zero_flag : 1; } bits; unsigned int value; } seq_fields; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char bit_depth_luma_minus8; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char bit_depth_chroma_minus8; /** if pic_order_cnt_type == 1 */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ unsigned char num_ref_frames_in_pic_order_cnt_cycle; /** \brief Same as the H.264 bitstream syntax element. */ int offset_for_non_ref_pic; /** \brief Same as the H.264 bitstream syntax element. */ int offset_for_top_to_bottom_field; /** \brief Same as the H.264 bitstream syntax element. */ int offset_for_ref_frame[256]; /**@}*/ /** @name Cropping (optional) */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ unsigned char frame_cropping_flag; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int frame_crop_left_offset; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int frame_crop_right_offset; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int frame_crop_top_offset; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int frame_crop_bottom_offset; /**@}*/ /** @name VUI parameters (optional) */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ unsigned char vui_parameters_present_flag; union { struct { /** \brief Same as the H.264 bitstream syntax element. */ unsigned int aspect_ratio_info_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int timing_info_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int bitstream_restriction_flag : 1; /** \brief Range: 0 to 16, inclusive. */ unsigned int log2_max_mv_length_horizontal : 5; /** \brief Range: 0 to 16, inclusive. */ unsigned int log2_max_mv_length_vertical : 5; } bits; unsigned int value; } vui_fields; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char aspect_ratio_idc; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int sar_width; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int sar_height; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int num_units_in_tick; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int time_scale; /**@}*/ } VAEncSequenceParameterBufferH264; /** * \brief Picture parameter for H.264 encoding in baseline, main & high * profiles. * * This structure holds information for \c pic_parameter_set_rbsp() as * defined by the H.264 specification. * * If packed picture headers mode is used, i.e. if the encoding * pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE * flag, then the driver expects two more buffers to be provided to * the same \c vaRenderPicture() as this buffer: * - a #VAEncPackedHeaderParameterBuffer with type set to * VAEncPackedHeaderType::VAEncPackedHeaderPicture ; * - a #VAEncPackedHeaderDataBuffer which holds the actual packed * header data. * * If \c pic_scaling_matrix_present_flag is set to \c 1, then a * #VAIQMatrixBufferH264 buffer shall also be provided within the same * \c vaRenderPicture() call as this picture parameter buffer. */ typedef struct _VAEncPictureParameterBufferH264 { /** * \brief Information about the picture to be encoded. * * See #VAPictureH264 for further description of each field. * Note that CurrPic.picture_id represents the reconstructed * (decoded) picture. User provides a scratch VA surface ID here. */ VAPictureH264 CurrPic; /** * \brief Decoded Picture Buffer (DPB). * * This array represents the list of reconstructed (decoded) * frames used as reference. It is important to keep track of * reconstructed frames so that they can be used later on as * reference for P or B-frames encoding. */ VAPictureH264 ReferenceFrames[16]; /** * \brief Output encoded bitstream. * * \ref coded_buf has type #VAEncCodedBufferType. It should be * large enough to hold the compressed NAL slice and possibly SPS * and PPS NAL units. */ VABufferID coded_buf; /** \brief The picture parameter set referred to in the slice header. */ unsigned char pic_parameter_set_id; /** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */ unsigned char seq_parameter_set_id; /** * \brief OR'd flags describing whether the picture is the last one or not. * * This fields holds 0 if the picture to be encoded is not the last * one in the stream or sequence. Otherwise, it is a combination of * \ref H264_LAST_PICTURE_EOSEQ or \ref H264_LAST_PICTURE_EOSTREAM. */ unsigned char last_picture; /** \brief The picture identifier. * Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive. */ unsigned short frame_num; /** \brief \c pic_init_qp_minus26 + 26. */ unsigned char pic_init_qp; /** \brief Maximum reference index for reference picture list 0. * Range: 0 to 31, inclusive. */ unsigned char num_ref_idx_l0_active_minus1; /** \brief Maximum reference index for reference picture list 1. * Range: 0 to 31, inclusive. */ unsigned char num_ref_idx_l1_active_minus1; /** \brief Range: -12 to 12, inclusive. */ signed char chroma_qp_index_offset; /** \brief Range: -12 to 12, inclusive. */ signed char second_chroma_qp_index_offset; union { struct { /** \brief Is picture an IDR picture? */ unsigned int idr_pic_flag : 1; /** \brief Is picture a reference picture? */ unsigned int reference_pic_flag : 2; /** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */ unsigned int entropy_coding_mode_flag : 1; /** \brief Is weighted prediction applied to P slices? */ unsigned int weighted_pred_flag : 1; /** \brief Range: 0 to 2, inclusive. */ unsigned int weighted_bipred_idc : 2; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int constrained_intra_pred_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int transform_8x8_mode_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int deblocking_filter_control_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int redundant_pic_cnt_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int pic_order_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ unsigned int pic_scaling_matrix_present_flag : 1; } bits; unsigned int value; } pic_fields; } VAEncPictureParameterBufferH264; /** * \brief Slice parameter for H.264 encoding in baseline, main & high profiles. * * This structure holds information for \c * slice_layer_without_partitioning_rbsp() as defined by the H.264 * specification. * * If packed slice headers mode is used, i.e. if the encoding * pipeline was configured with the #VA_ENC_PACKED_HEADER_SLICE * flag, then the driver expects two more buffers to be provided to * the same \c vaRenderPicture() as this buffer: * - a #VAEncPackedHeaderParameterBuffer with type set to * VAEncPackedHeaderType::VAEncPackedHeaderSlice ; * - a #VAEncPackedHeaderDataBuffer which holds the actual packed * header data. * * If per-macroblock encoder configuration is needed, \c macroblock_info * references a buffer of type #VAEncMacroblockParameterBufferH264. This * buffer is not passed to vaRenderPicture(). i.e. it is not destroyed * by subsequent calls to vaRenderPicture() and then can be re-used * without re-allocating the whole buffer. */ typedef struct _VAEncSliceParameterBufferH264 { /** \brief Starting MB address for this slice. */ unsigned int macroblock_address; /** \brief Number of macroblocks in this slice. */ unsigned int num_macroblocks; /** * \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID. * * If per-MB encoder configuration is needed, then \ref macroblock_info * references a buffer of type #VAEncMacroblockParameterBufferH264 * (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id * is set to \c VA_INVALID_ID and per-MB configuration is derived * from this slice parameter. * * The \c macroblock_info buffer must hold \ref num_macroblocks * elements. */ VABufferID macroblock_info; /** \brief Slice type. * Range: 0..2, 5..7, i.e. no switching slices. */ unsigned char slice_type; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char pic_parameter_set_id; /** \brief Same as the H.264 bitstream syntax element. */ unsigned short idr_pic_id; /** @name If pic_order_cnt_type == 0 */ /**@{*/ /** \brief The picture order count modulo MaxPicOrderCntLsb. */ unsigned short pic_order_cnt_lsb; /** \brief Valid if \c pic_order_present_flag and this is a bottom field. */ int delta_pic_order_cnt_bottom; /**@}*/ /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */ /**@{*/ /** \brief [0]: top, [1]: bottom. */ int delta_pic_order_cnt[2]; /**@}*/ /** @name If slice_type == B */ /**@{*/ unsigned char direct_spatial_mv_pred_flag; /**@}*/ /** @name If slice_type == P */ /**@{*/ /** \brief Specifies if * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or * \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are * overriden by the values for this slice. */ unsigned char num_ref_idx_active_override_flag; /** \brief Maximum reference index for reference picture list 0. * Range: 0 to 31, inclusive. */ unsigned char num_ref_idx_l0_active_minus1; /** \brief Maximum reference index for reference picture list 1. * Range: 0 to 31, inclusive. */ unsigned char num_ref_idx_l1_active_minus1; /** \brief Reference picture list 0 (for P slices). */ VAPictureH264 RefPicList0[32]; /** \brief Reference picture list 1 (for B slices). */ VAPictureH264 RefPicList1[32]; /**@}*/ /** @name pred_weight_table() */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ unsigned char luma_log2_weight_denom; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char chroma_log2_weight_denom; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char luma_weight_l0_flag; /** \brief Same as the H.264 bitstream syntax element. */ signed short luma_weight_l0[32]; /** \brief Same as the H.264 bitstream syntax element. */ signed short luma_offset_l0[32]; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char chroma_weight_l0_flag; /** \brief Same as the H.264 bitstream syntax element. */ signed short chroma_weight_l0[32][2]; /** \brief Same as the H.264 bitstream syntax element. */ signed short chroma_offset_l0[32][2]; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char luma_weight_l1_flag; /** \brief Same as the H.264 bitstream syntax element. */ signed short luma_weight_l1[32]; /** \brief Same as the H.264 bitstream syntax element. */ signed short luma_offset_l1[32]; /** \brief Same as the H.264 bitstream syntax element. */ unsigned char chroma_weight_l1_flag; /** \brief Same as the H.264 bitstream syntax element. */ signed short chroma_weight_l1[32][2]; /** \brief Same as the H.264 bitstream syntax element. */ signed short chroma_offset_l1[32][2]; /**@}*/ /** \brief Range: 0 to 2, inclusive. */ unsigned char cabac_init_idc; /** \brief Same as the H.264 bitstream syntax element. */ signed char slice_qp_delta; /** @name If deblocking_filter_control_present_flag */ /**@{*/ /** \brief Range: 0 to 2, inclusive. */ unsigned char disable_deblocking_filter_idc; /** \brief Same as the H.264 bitstream syntax element. */ signed char slice_alpha_c0_offset_div2; /** \brief Same as the H.264 bitstream syntax element. */ signed char slice_beta_offset_div2; /**@}*/ } VAEncSliceParameterBufferH264; /** * @name Macroblock neighbour availability bits * * \anchor api_enc_h264_mb_pred_avail_bits * Definitions for macroblock neighbour availability bits used in * intra prediction mode (non MBAFF only). * * @{ */ /** \brief References macroblock in the top-left corner. */ #define VA_MB_PRED_AVAIL_TOP_LEFT (1 << 2) /** \brief References macroblock above the current macroblock. */ #define VA_MB_PRED_AVAIL_TOP (1 << 4) /** \brief References macroblock in the top-right corner. */ #define VA_MB_PRED_AVAIL_TOP_RIGHT (1 << 3) /** \brief References macroblock on the left of the current macroblock. */ #define VA_MB_PRED_AVAIL_LEFT (1 << 6) /**@}*/ /** * \brief Macroblock parameter for H.264 encoding in baseline, main & high * profiles. * * This structure holds per-macroblock information. The buffer must be * allocated with as many elements (macroblocks) as necessary to fit * the slice to be encoded. Besides, the per-macroblock records must * be written in a strict raster order and with no gap. i.e. every * macroblock, regardless of its type, shall have an entry. */ typedef struct _VAEncMacroblockParameterBufferH264 { /** * \brief Quantization parameter. * * Requested quantization parameter. Range: 0 to 51, inclusive. * If \ref qp is set to 0xff, then the actual value is derived * from the slice-level value: \c pic_init_qp + \c slice_qp_delta. */ unsigned char qp; union { /** @name Data for intra macroblock */ /**@{*/ struct { union { /** * \brief Flag specified to override MB neighbour * availability bits from VME stage. * * This flag specifies that macroblock neighbour * availability bits from the VME stage are overriden * by the \ref pred_avail_flags hereunder. */ unsigned int pred_avail_override_flag : 1; /** * \brief Bitwise representation of which macroblocks * are available for intra prediction. * * If the slice is intra-coded, this field represents * the macroblocks available for intra prediction. * See \ref api_enc_h264_mb_pred_avail_bits * "macroblock neighbour availability" bit definitions. */ unsigned int pred_avail_flags : 8; } bits; unsigned int value; } intra_fields; /**@}*/ /** @name Data for inter macroblock */ /**@{*/ struct { union { } bits; unsigned int value; } inter_fields; /**@}*/ } info; } VAEncMacroblockParameterBufferH264; /** * \brief H.264 Mutiview Coding(MVC) Sequence Parameter Buffer * */ typedef struct _VAEncSequenceParameterBufferH264_MVC { /** brief Basic common sequence parameter */ VAEncSequenceParameterBufferH264 base; /** brief Plus 1 specify the max number of views * coded in the video sequence */ uint16_t num_views_minus1; /** brief Specify the view information in all layers */ struct H264SPSExtMVCViewInfo{ /** \brief The current view identifier. */ uint16_t view_id; /** \brief Specifies the number of view components for inter-view * prediction in the initialized RefPicList0 in decoding * anchor views. */ uint8_t num_anchor_refs_l0; /** \brief Specifies the view_id for inter-view prediction in * the initialized RefPicList0 in decoding anchor views. */ uint16_t anchor_ref_l0[15]; /** \brief Specifies the number of view components for inter-view * prediction in the initialized RefPicList1 in decoding * anchor views */ uint8_t num_anchor_refs_l1; /** \brief Specifies the view_id for inter-view prediction in * the initialized RefPicList1 in decoding anchor views. */ uint16_t anchor_ref_l1[15]; /** \brief Specifies the number of view components for inter-view * prediction in the initialized RefPicList0 in decoding * non-anchor views. */ uint8_t num_non_anchor_refs_l0; /** \brief Specifies the view_id for inter-view prediction in * the initialized RefPicList0 in decoding non-anchor views. */ uint16_t non_anchor_ref_l0[15]; /** \brief Specifies the number of view components for inter-view * prediction in the initialized RefPicList1 in decoding * non-anchor view. */ uint8_t num_non_anchor_refs_l1; /** \brief Specifies the view_id for inter-view prediction in * the initialized RefPicList1 in decoding non-anchor views. */ uint16_t non_anchor_ref_l1[15]; }* view_list; /** brief Plus 1 specifies the number of level values * signalled for the coded video sequence */ uint8_t num_level_values_signalled_minus1; /** brief Level values operation for a set of the operation * points in the current sequence */ struct H264SPSExtMVCLevelValue { /** \brief Specifies the level value signalled for the coded video sequence */ uint8_t level_idc; /** \brief Plus 1 specifies the number of operation points to * which the level indicated by level_idc applies */ uint16_t num_applicable_ops_minus1; /** \brief Represent the specific operation to the view in the video sequence */ struct H264SPSExtMVCLevelValueOps { /** \brief Specify a temporal identifier for the NAL unit */ uint8_t temporal_id; /** \brief Specify the number of the views whose level value will be modified */ uint16_t num_target_views_minus1; /** \brief Specify the views whose level value will be modified */ uint16_t* target_view_id_list; /** \brief Specify the number of views whose level value can be modified */ uint16_t num_views_minus1; }* level_value_ops_list; }* level_value_list; } VAEncSequenceParameterBufferH264_MVC; /** * \brief H.264 Multiview Coding(MVC) Picture Parameter Buffer * */ typedef struct _VAEncPictureParameterBufferH264_MVC { /** brief Basic common picture parameter */ VAEncPictureParameterBufferH264 base; /** brief Specifes the view id for current picture */ uint16_t view_id; /** brief Specifes whether the picture is one anchor picture */ uint8_t anchor_pic_flag; /** brief Specifes whether inter view reference frame * is used to encode current picture. */ uint8_t inter_view_flag; } VAEncPictureParameterBufferH264_MVC; typedef struct _VAEncQpBufferH264 { /* * \brief This structure holds luma Qp per 16x16 macroblock. Buffer size shall be * sufficient to fit the slice or frame to be encoded depending on if it is a slice level * or frame level encoding. */ unsigned char qp_y; } VAEncQpBufferH264; /** \brief Bitstream writer attribute types specific to H.264 encoding. */ typedef enum { /** * \brief Flag: specifies whether to insert emulation prevention * bytes (integer). */ VAEncBitstreamAttribEmulationPreventionH264 = ( VAEncBitstreamAttribMiscMask | 1), } VAEncBitstreamAttribTypeH264; /** * \brief Allocates a new H.264 bitstream writer. * * Allocates a new bitstream writer. By default, libva allocates and * maintains its own buffer. However, the user can pass down his own * buffer with the \c VAEncBitstreamAttribBuffer attribute, along with * the size of that buffer with the \c VAEncBitstreamAttribBufferSize * attribute. * * By default, emulation prevention bytes are not inserted. However, * the user can still request emulation prevention by setting the * \c VAEncBitstreamAttribEmulationPreventionH264 attribute to 1. * * @param[in] attribs the optional attributes, or NULL * @param[in] num_attribs the number of attributes available in \c attribs * @return a new #VAEncBitstream, or NULL if an error occurred */ VAEncBitstream * va_enc_bitstream_h264_new( VAEncBitstreamAttrib *attribs, unsigned int num_attribs ); /** * \brief Destroys an H.264 bitstream writer. * * @param[in] bs the bitstream writer to destroy */ void va_enc_bitstream_h264_destroy(VAEncBitstream *bs); /** * \brief Writes an unsigned integer as \c ue(v). * * Writes a 32-bit unsigned int value by following \c ue(v) from the * H.264 specification. * * @param[in] bs the bitstream writer * @param[in] value the unsigned int value * @return the number of bits written, or a negative value to indicate an error */ int va_enc_bitstream_h264_write_ue(VAEncBitstream *bs, unsigned int value); /** * \brief Writes a signed integer as \c se(v). * * Writes a 32-bit signed int value by following \c se(v) from the * H.264 specification. * * @param[in] bs the bitstream writer * @param[in] value the signed int value * @return the number of bits written, or a negative value to indicate an error */ int va_enc_bitstream_h264_write_se(VAEncBitstream *bs, int value); /** * \brief Helper function to write trailing bits into the bitstream. * * @param[in] bs the bitstream writer * @return the number of bits written, or a negative value to indicate an error */ int va_enc_bitstream_h264_write_trailing_bits(VAEncBitstream *bs); /**@}*/ #ifdef __cplusplus } #endif #endif /* VA_ENC_H264_H */