blob: 0539f4db434eb2eaa1903337d44fcee874ad9783 [file] [log] [blame]
/*
* Copyright (c) 2007-2015 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_vp9.h
* \brief VP9 encoding API
*
* This file contains the \ref api_enc_vp9 "VP9 encoding API".
*
*/
#ifndef VA_ENC_VP9_H
#define VA_ENC_VP9_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \defgroup api_enc_vp9 VP9 encoding API
*
* @{
*/
/**
* \brief VP9 Encoding Status Data Buffer Structure
*
* This structure is used to convey status data from encoder to application.
* Driver allocates VACodedBufferVP9Status as a private data buffer.
* Driver encapsulates the status buffer with a VACodedBufferSegment,
* and sets VACodedBufferSegment.status to be VA_CODED_BUF_STATUS_CODEC_SPECIFIC.
* And driver associates status data segment to the bit stream buffer segment
* by setting VACodedBufferSegment.next of coded_buf (bit stream) to the private
* buffer segment of status data.
* Application accesses it by calling VAMapBuffer() with VAEncCodedBufferType.
*/
typedef struct _VACodedBufferVP9Status
{
/** Final quantization index used (yac), determined by BRC.
* Application is providing quantization index deltas
* ydc(0), y2dc(1), y2ac(2), uvdc(3), uvac(4) that are applied to all segments
* and segmentation qi deltas, they will not be changed by BRC.
*/
uint16_t base_qp_index;
/** Final loopfilter levels for the frame, if segmentation is disabled only
* index 0 is used.
* If loop_filter_level is 0, it indicates loop filter is disabled.
*/
uint8_t loop_filter_level;
/**
* Long term reference frame indication from BRC. BRC recommends the
* current frame that is being queried is a good candidate for a long
* term reference.
*/
uint8_t long_term_indication;
/* suggested next frame width */
uint16_t next_frame_width;
/* suggested next frame height */
uint16_t next_frame_height;
/** \brief Reserved bytes for future use, must be zero */
uint32_t va_reserved[VA_PADDING_LOW];
} VACodedBufferVP9Status;
/**
* \brief VP9 Encoding Sequence Parameter Buffer Structure
*
* This structure conveys sequence level parameters.
*
*/
typedef struct _VAEncSequenceParameterBufferVP9
{
/** \brief Frame size note:
* Picture resolution may change frame by frame.
* Application needs to allocate surfaces and frame buffers based on
* max frame resolution in case resolution changes for later frames.
* The source and recon surfaces allocated should be 64x64(SB) aligned
* on both horizontal and vertical directions.
* But buffers on the surfaces need to be aligned to CU boundaries.
*/
/* maximum frame width in pixels for the whole sequence */
uint32_t max_frame_width;
/* maximum frame height in pixels for the whole sequence */
uint32_t max_frame_height;
/* auto keyframe placement, non-zero means enable auto keyframe placement */
uint32_t kf_auto;
/* keyframe minimum interval */
uint32_t kf_min_dist;
/* keyframe maximum interval */
uint32_t kf_max_dist;
/* RC related fields. RC modes are set with VAConfigAttribRateControl */
/* For VP9, CBR implies HRD conformance and VBR implies no HRD conformance */
/**
* 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.
*/
uint32_t bits_per_second;
/* Period between key frames */
uint32_t intra_period;
/** \brief Reserved bytes for future use, must be zero */
uint32_t va_reserved[VA_PADDING_LOW];
} VAEncSequenceParameterBufferVP9;
/**
* \brief VP9 Encoding Picture Parameter Buffer Structure
*
* This structure conveys picture level parameters.
*
*/
typedef struct _VAEncPictureParameterBufferVP9
{
/** VP9 encoder may support dynamic scaling function.
* If enabled (enable_dynamic_scaling is set), application may request
* GPU encodes picture with a different resolution from the raw source.
* GPU should handle the scaling process of source and
* all reference frames.
*/
/* raw source frame width in pixels */
uint32_t frame_width_src;
/* raw source frame height in pixels */
uint32_t frame_height_src;
/* to be encoded frame width in pixels */
uint32_t frame_width_dst;
/* to be encoded frame height in pixels */
uint32_t frame_height_dst;
/* surface to store reconstructed frame, not used for enc only case */
VASurfaceID reconstructed_frame;
/** \brief reference frame buffers
* Each entry of the array specifies the surface index of the picture
* that is referred by current picture or will be referred by any future
* picture. The valid entries take value from 0 to 127, inclusive.
* Non-valid entries, those do not point to pictures which are referred
* by current picture or future pictures, should take value 0xFF.
* Other values are not allowed.
*
* Application should update this array based on the refreshing
* information expected.
*/
VASurfaceID reference_frames[8];
/* buffer to store coded data */
VABufferID coded_buf;
union {
struct {
/* force this frame to be a keyframe */
uint32_t force_kf : 1;
/** \brief Indiates which frames to be used as reference.
* (Ref_frame_ctrl & 0x01) ? 1: last frame as reference frame, 0: not.
* (Ref_frame_ctrl & 0x02) ? 1: golden frame as reference frame, 0: not.
* (Ref_frame_ctrl & 0x04) ? 1: alt frame as reference frame, 0: not.
* L0 is for forward prediction.
* L1 is for backward prediction.
*/
uint32_t ref_frame_ctrl_l0 : 3;
uint32_t ref_frame_ctrl_l1 : 3;
/** \brief Last Reference Frame index
* Specifies the index to RefFrameList[] which points to the LAST
* reference frame. It corresponds to active_ref_idx[0] in VP9 code.
*/
uint32_t ref_last_idx : 3;
/** \brief Specifies the Sign Bias of the LAST reference frame.
* It corresponds to ref_frame_sign_bias[LAST_FRAME] in VP9 code.
*/
uint32_t ref_last_sign_bias : 1;
/** \brief GOLDEN Reference Frame index
* Specifies the index to RefFrameList[] which points to the Golden
* reference frame. It corresponds to active_ref_idx[1] in VP9 code.
*/
uint32_t ref_gf_idx : 3;
/** \brief Specifies the Sign Bias of the GOLDEN reference frame.
* It corresponds to ref_frame_sign_bias[GOLDEN_FRAME] in VP9 code.
*/
uint32_t ref_gf_sign_bias : 1;
/** \brief Alternate Reference Frame index
* Specifies the index to RefFrameList[] which points to the Alternate
* reference frame. It corresponds to active_ref_idx[2] in VP9 code.
*/
uint32_t ref_arf_idx : 3;
/** \brief Specifies the Sign Bias of the ALTERNATE reference frame.
* It corresponds to ref_frame_sign_bias[ALTREF_FRAME] in VP9 code.
*/
uint32_t ref_arf_sign_bias : 1;
/* The temporal id the frame belongs to */
uint32_t temporal_id : 8;
uint32_t reserved : 5;
} bits;
uint32_t value;
} ref_flags;
union {
struct {
/**
* Indicates if the current frame is a key frame or not.
* Corresponds to the same VP9 syntax element in frame tag.
*/
uint32_t frame_type : 1;
/** \brief show_frame
* 0: current frame is not for display
* 1: current frame is for display
*/
uint32_t show_frame : 1;
/**
* The following fields correspond to the same VP9 syntax elements
* in the frame header.
*/
uint32_t error_resilient_mode : 1;
/** \brief Indicate intra-only for inter pictures.
* Must be 0 for key frames.
* 0: inter frame use both intra and inter blocks
* 1: inter frame use only intra blocks.
*/
uint32_t intra_only : 1;
/** \brief Indicate high precision mode for Motion Vector prediction
* 0: normal mode
* 1: high precision mode
*/
uint32_t allow_high_precision_mv : 1;
/** \brief Motion Compensation Filter type
* 0: eight-tap (only this mode is supported now.)
* 1: eight-tap-smooth
* 2: eight-tap-sharp
* 3: bilinear
* 4: switchable
*/
uint32_t mcomp_filter_type : 3;
uint32_t frame_parallel_decoding_mode : 1;
uint32_t reset_frame_context : 2;
uint32_t refresh_frame_context : 1;
uint32_t frame_context_idx : 2;
uint32_t segmentation_enabled : 1;
/* corresponds to variable temporal_update in VP9 code.
* Indicates whether Segment ID is from bitstream or from previous
* frame.
* 0: Segment ID from bitstream
* 1: Segment ID from previous frame
*/
uint32_t segmentation_temporal_update : 1;
/* corresponds to variable update_mb_segmentation_map in VP9 code.
* Indicates how hardware determines segmentation ID
* 0: intra block - segment id is 0;
* inter block - segment id from previous frame
* 1: intra block - segment id from bitstream (app or GPU decides)
* inter block - depends on segmentation_temporal_update
*/
uint32_t segmentation_update_map : 1;
/** \brief Specifies if the picture is coded in lossless mode.
*
* lossless_mode = base_qindex == 0 && y_dc_delta_q == 0 \
* && uv_dc_delta_q == 0 && uv_ac_delta_q == 0;
* Where base_qindex, y_dc_delta_q, uv_dc_delta_q and uv_ac_delta_q
* are all variables in VP9 code.
*
* When enabled, tx_mode needs to be set to 4x4 only and all
* tu_size in CU record set to 4x4 for entire frame.
* Software also has to program such that final_qindex=0 and
* final_filter_level=0 following the Quant Scale and
* Filter Level Table in Segmentation State section.
* Hardware forces Hadamard Tx when this bit is set.
* When lossless_mode is on, BRC has to be turned off.
* 0: normal mode
* 1: lossless mode
*/
uint32_t lossless_mode : 1;
/** \brief MV prediction mode. Corresponds to VP9 variable with same name.
* comp_prediction_mode = 0: single prediction ony,
* comp_prediction_mode = 1: compound prediction,
* comp_prediction_mode = 2: hybrid prediction
*
* Not mandatory. App may suggest the setting based on power or
* performance. Kernal may use it as a guildline and decide the proper
* setting on its own.
*/
uint32_t comp_prediction_mode : 2;
/** \brief Indicate how segmentation is specified
* 0 application specifies segmentation partitioning and
* relevant parameters.
* 1 GPU may decide on segmentation. If application already
* provides segmentation information, GPU may choose to
* honor it and further split into more levels if possible.
*/
uint32_t auto_segmentation : 1;
/** \brief Indicate super frame syntax should be inserted
* 0 current frame is not encapsulated in super frame structure
* 1 current fame is to be encapsulated in super frame structure.
* super frame index syntax will be inserted by encoder at
* the end of current frame.
*/
uint32_t super_frame_flag : 1;
uint32_t reserved : 10;
} bits;
uint32_t value;
} pic_flags;
/** \brief indicate which frames in DPB should be refreshed.
* same syntax and semantic as in VP9 code.
*/
uint8_t refresh_frame_flags;
/** \brief Base Q index in the VP9 term.
* Added with per segment delta Q index to get Q index of Luma AC.
*/
uint8_t luma_ac_qindex;
/**
* Q index delta from base Q index in the VP9 term for Luma DC.
*/
int8_t luma_dc_qindex_delta;
/**
* Q index delta from base Q index in the VP9 term for Chroma AC.
*/
int8_t chroma_ac_qindex_delta;
/**
* Q index delta from base Q index in the VP9 term for Chroma DC.
*/
int8_t chroma_dc_qindex_delta;
/** \brief filter level
* Corresponds to the same VP9 syntax element in frame header.
*/
uint8_t filter_level;
/**
* Controls the deblocking filter sensitivity.
* Corresponds to the same VP9 syntax element in frame header.
*/
uint8_t sharpness_level;
/** \brief Loop filter level reference delta values.
* Contains a list of 4 delta values for reference frame based block-level
* loop filter adjustment.
* If no update, set to 0.
* value range [-63..63]
*/
int8_t ref_lf_delta[4];
/** \brief Loop filter level mode delta values.
* Contains a list of 4 delta values for coding mode based MB-level loop
* filter adjustment.
* If no update, set to 0.
* value range [-63..63]
*/
int8_t mode_lf_delta[2];
/**
* Offset from starting position of output bitstream in bits where
* ref_lf_delta[] should be inserted. This offset should cover any metadata
* ahead of uncompressed header in inserted bit stream buffer (the offset
* should be same as that for final output bitstream buffer).
*
* In BRC mode, always insert ref_lf_delta[] (This implies uncompressed
* header should have mode_ref_delta_enabled=1 and mode_ref_delta_update=1).
*/
uint16_t bit_offset_ref_lf_delta;
/**
* Offset from starting position of output bitstream in bits where
* mode_lf_delta[] should be inserted.
*
* In BRC mode, always insert mode_lf_delta[] (This implies uncompressed
* header should have mode_ref_delta_enabled=1 and mode_ref_delta_update=1).
*/
uint16_t bit_offset_mode_lf_delta;
/**
* Offset from starting position of output bitstream in bits where (loop)
* filter_level should be inserted.
*/
uint16_t bit_offset_lf_level;
/**
* Offset from starting position of output bitstream in bits where
* Base Qindex should be inserted.
*/
uint16_t bit_offset_qindex;
/**
* Offset from starting position of output bitstream in bits where
* First Partition Size should be inserted.
*/
uint16_t bit_offset_first_partition_size;
/**
* Offset from starting position of output bitstream in bits where
* segmentation_enabled is located in bitstream. When auto_segmentation
* is enabled, GPU uses this offset to locate and update the
* segmentation related information.
*/
uint16_t bit_offset_segmentation;
/** \brief length in bit of segmentation portion from the location
* in bit stream where segmentation_enabled syntax is coded.
* When auto_segmentation is enabled, GPU uses this bit size to locate
* and update the information after segmentation.
*/
uint16_t bit_size_segmentation;
/** \brief log2 of number of tile rows
* Corresponds to the same VP9 syntax element in frame header.
* value range [0..2]
*/
uint8_t log2_tile_rows;
/** \brief log2 of number of tile columns
* Corresponds to the same VP9 syntax element in frame header.
* value range [0..6]
*/
uint8_t log2_tile_columns;
/** \brief indicate frame-skip happens
* Application may choose to drop/skip one or mulitple encoded frames or
* to-be-encoded frame due to various reasons such as insufficient
* bandwidth.
* Application uses the following three flags to inform GPU about frame-skip.
*
* value range of skip_frame_flag: [0..2]
* 0 - encode as normal, no skip;
* 1 - one or more frames were skipped by application prior to the
* current frame. Encode the current frame as normal. The driver
* will pass the number_skip_frames and skip_frames_size
* to bit rate control for adjustment.
* 2 - the current frame is to be skipped. Do not encode it but encrypt
* the packed header contents. This is for the secure encoding case
* where application generates a frame of all skipped blocks.
* The packed header will contain the skipped frame.
*/
uint8_t skip_frame_flag;
/** \brief The number of frames skipped prior to the current frame.
* It includes only the skipped frames that were not counted before,
* and does not include the frame with skip_frame_flag == 2.
* Valid when skip_frame_flag = 1.
*/
uint8_t number_skip_frames;
/** \brief When skip_frame_flag = 1, the size of the skipped frames in bits.
* It includes only the skipped frames that were not counted before,
* and does not include the frame size with skip_frame_flag = 2.
* When skip_frame_flag = 2, it is the size of the current skipped frame
* that is to be encrypted.
*/
uint32_t skip_frames_size;
/** \brief Reserved bytes for future use, must be zero */
uint32_t va_reserved[VA_PADDING_MEDIUM];
} VAEncPictureParameterBufferVP9;
/**
* \brief Per segment parameters
*/
typedef struct _VAEncSegParamVP9
{
union {
struct {
/** \brief Indicates if per segment reference frame indicator is enabled.
* Corresponding to variable feature_enabled when
* j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
*/
uint8_t segment_reference_enabled : 1;
/** \brief Specifies per segment reference indication.
* 0: reserved
* 1: Last ref
* 2: golden
* 3: altref
* Value can be derived from variable data when
* j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
* value range: [0..3]
*/
uint8_t segment_reference : 2;
/** \brief Indicates if per segment skip mode is enabled.
* Corresponding to variable feature_enabled when
* j == SEG_LVL_SKIP in function setup_segmentation() VP9 code.
*/
uint8_t segment_reference_skipped : 1;
uint8_t reserved : 4;
} bits;
uint8_t value;
} seg_flags;
/** \brief Specifies per segment Loop Filter Delta.
* Must be 0 when segmentation_enabled == 0.
* value range: [-63..63]
*/
int8_t segment_lf_level_delta;
/** \brief Specifies per segment QIndex Delta.
* Must be 0 when segmentation_enabled == 0.
* value range: [-255..255]
*/
int16_t segment_qindex_delta;
/** \brief Reserved bytes for future use, must be zero */
uint32_t va_reserved[VA_PADDING_LOW];
} VAEncSegParamVP9;
/**
* Structure to convey all segment related information.
* If segmentation is disabled, this data structure is still required.
* In this case, only seg_data[0] contains valid data.
* This buffer is sent once per frame.
*
* The buffer is created with VABufferType VAQMatrixBufferType.
*
*/
typedef struct _VAEncMiscParameterTypeVP9PerSegmantParam
{
/**
* Parameters for 8 segments.
*/
VAEncSegParamVP9 seg_data[8];
/** \brief Reserved bytes for future use, must be zero */
uint32_t va_reserved[VA_PADDING_LOW];
} VAEncMiscParameterTypeVP9PerSegmantParam;
/**
* \brief VP9 Block Segmentation ID Buffer
*
* The application provides a buffer of VAEncMacroblockMapBufferType containing
* the initial segmentation id for each 8x8 block, one byte each, in raster scan order.
* Rate control may reassign it. For example, a 640x480 video, the buffer has 4800 entries.
* The value of each entry should be in the range [0..7], inclusive.
* If segmentation is not enabled, the application does not need to provide it.
*/
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* VA_ENC_VP9_H */