Blame va/va_dec_vp9.h

Packit 38d9dc
/*
Packit 38d9dc
 * Copyright (c) 2014 Intel Corporation. All Rights Reserved.
Packit 38d9dc
 *
Packit 38d9dc
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit 38d9dc
 * copy of this software and associated documentation files (the
Packit 38d9dc
 * "Software"), to deal in the Software without restriction, including
Packit 38d9dc
 * without limitation the rights to use, copy, modify, merge, publish,
Packit 38d9dc
 * distribute, sub license, and/or sell copies of the Software, and to
Packit 38d9dc
 * permit persons to whom the Software is furnished to do so, subject to
Packit 38d9dc
 * the following conditions:
Packit 38d9dc
 *
Packit 38d9dc
 * The above copyright notice and this permission notice (including the
Packit 38d9dc
 * next paragraph) shall be included in all copies or substantial portions
Packit 38d9dc
 * of the Software.
Packit 38d9dc
 *
Packit 38d9dc
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit 38d9dc
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 38d9dc
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Packit 38d9dc
 * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
Packit 38d9dc
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Packit 38d9dc
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Packit 38d9dc
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 38d9dc
 */
Packit 38d9dc
Packit 38d9dc
/**
Packit 38d9dc
 * \file va_dec_vp9.h
Packit 38d9dc
 * \brief The VP9 decoding API
Packit 38d9dc
 *
Packit 38d9dc
 * This file contains the \ref api_dec_vp9 "VP9 decoding API".
Packit 38d9dc
 */
Packit 38d9dc
Packit 38d9dc
#ifndef VA_DEC_VP9_H
Packit 38d9dc
#define VA_DEC_VP9_H
Packit 38d9dc
Packit 38d9dc
#ifdef __cplusplus
Packit 38d9dc
extern "C" {
Packit 38d9dc
#endif
Packit 38d9dc
Packit 38d9dc
/**
Packit 38d9dc
 * \defgroup api_dec_vp9 VP9 decoding API
Packit 38d9dc
 *
Packit 38d9dc
 * This VP9 decoding API supports 8-bit 420 format only.
Packit 38d9dc
 *
Packit 38d9dc
 * @{
Packit 38d9dc
 */
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
/**
Packit 38d9dc
 * \brief VP9 Decoding Picture Parameter Buffer Structure
Packit 38d9dc
 *
Packit 38d9dc
 * This structure conveys picture level parameters.
Packit 38d9dc
 * App should send a surface with this data structure down to VAAPI once
Packit 38d9dc
 * per frame.
Packit 38d9dc
 *
Packit 38d9dc
 */
Packit 38d9dc
typedef struct  _VADecPictureParameterBufferVP9
Packit 38d9dc
{
Packit 38d9dc
    /** \brief picture width
Packit 38d9dc
     *  Picture original resolution. The value may not be multiple of 8.
Packit 38d9dc
     */
Packit 38d9dc
    uint16_t                frame_width;
Packit 38d9dc
    /** \brief picture height
Packit 38d9dc
     *  Picture original resolution. The value may not be multiple of 8.
Packit 38d9dc
     */
Packit 38d9dc
    uint16_t                frame_height;
Packit 38d9dc
Packit 38d9dc
    /** \brief Surface indices of reference frames in DPB.
Packit 38d9dc
     *
Packit 38d9dc
     *  Each entry of the list specifies the surface index of the picture
Packit 38d9dc
     *  that is referred by current picture or will be referred by any future
Packit 38d9dc
     *  picture.
Packit 38d9dc
     *  Application who calls this API should update this list based on the
Packit 38d9dc
     *  refreshing information from VP9 bitstream.
Packit 38d9dc
     */
Packit 38d9dc
    VASurfaceID             reference_frames[8];
Packit 38d9dc
Packit 38d9dc
    union
Packit 38d9dc
    {
Packit 38d9dc
        struct
Packit 38d9dc
        {
Packit 38d9dc
            /** \brief flags for current picture
Packit 38d9dc
             *  same syntax and semantic as those in VP9 code
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        subsampling_x                               : 1;
Packit 38d9dc
            uint32_t        subsampling_y                               : 1;
Packit 38d9dc
            uint32_t        frame_type                                  : 1;
Packit 38d9dc
            uint32_t        show_frame                                  : 1;
Packit 38d9dc
            uint32_t        error_resilient_mode                        : 1;
Packit 38d9dc
            uint32_t        intra_only                                  : 1;
Packit 38d9dc
            uint32_t        allow_high_precision_mv                     : 1;
Packit 38d9dc
            uint32_t        mcomp_filter_type                           : 3;
Packit 38d9dc
            uint32_t        frame_parallel_decoding_mode                : 1;
Packit 38d9dc
            uint32_t        reset_frame_context                         : 2;
Packit 38d9dc
            uint32_t        refresh_frame_context                       : 1;
Packit 38d9dc
            uint32_t        frame_context_idx                           : 2;
Packit 38d9dc
            uint32_t        segmentation_enabled                        : 1;
Packit 38d9dc
Packit 38d9dc
            /** \brief corresponds to variable temporal_update in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        segmentation_temporal_update                : 1;
Packit 38d9dc
            /** \brief corresponds to variable update_mb_segmentation_map
Packit 38d9dc
             *  in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        segmentation_update_map                     : 1;
Packit 38d9dc
Packit 38d9dc
            /** \brief Index of reference_frames[] and points to the
Packit 38d9dc
             *  LAST reference frame.
Packit 38d9dc
             *  It corresponds to active_ref_idx[0] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        last_ref_frame                              : 3;
Packit 38d9dc
            /** \brief Sign Bias of the LAST reference frame.
Packit 38d9dc
             *  It corresponds to ref_frame_sign_bias[LAST_FRAME] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        last_ref_frame_sign_bias                    : 1;
Packit 38d9dc
            /** \brief Index of reference_frames[] and points to the
Packit 38d9dc
             *  GOLDERN reference frame.
Packit 38d9dc
             *  It corresponds to active_ref_idx[1] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        golden_ref_frame                            : 3;
Packit 38d9dc
            /** \brief Sign Bias of the GOLDERN reference frame.
Packit 38d9dc
             *  Corresponds to ref_frame_sign_bias[GOLDERN_FRAME] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        golden_ref_frame_sign_bias                  : 1;
Packit 38d9dc
            /** \brief Index of reference_frames[] and points to the
Packit 38d9dc
             *  ALTERNATE reference frame.
Packit 38d9dc
             *  Corresponds to active_ref_idx[2] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        alt_ref_frame                               : 3;
Packit 38d9dc
            /** \brief Sign Bias of the ALTERNATE reference frame.
Packit 38d9dc
             *  Corresponds to ref_frame_sign_bias[ALTREF_FRAME] in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        alt_ref_frame_sign_bias                     : 1;
Packit 38d9dc
            /** \brief Lossless Mode
Packit 38d9dc
             *  LosslessFlag = base_qindex == 0 &&
Packit 38d9dc
             *                 y_dc_delta_q == 0 &&
Packit 38d9dc
             *                 uv_dc_delta_q == 0 &&
Packit 38d9dc
             *                 uv_ac_delta_q == 0;
Packit 38d9dc
             *  Where base_qindex, y_dc_delta_q, uv_dc_delta_q and uv_ac_delta_q
Packit 38d9dc
             *  are all variables in VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint32_t        lossless_flag                               : 1;
Packit 38d9dc
        } bits;
Packit 38d9dc
        uint32_t            value;
Packit 38d9dc
    } pic_fields;
Packit 38d9dc
Packit 38d9dc
    /* following parameters have same syntax with those in VP9 code */
Packit 38d9dc
    uint8_t                 filter_level;
Packit 38d9dc
    uint8_t                 sharpness_level;
Packit 38d9dc
Packit 38d9dc
    /** \brief number of tile rows specified by (1 << log2_tile_rows).
Packit 38d9dc
     *  It corresponds the variable with same name in VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 log2_tile_rows;
Packit 38d9dc
    /** \brief number of tile columns specified by (1 << log2_tile_columns).
Packit 38d9dc
     *  It corresponds the variable with same name in VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 log2_tile_columns;
Packit 38d9dc
    /** \brief Number of bytes taken up by the uncompressed frame header,
Packit 38d9dc
     *  which corresponds to byte length of function
Packit 38d9dc
     *  read_uncompressed_header() in VP9 code.
Packit 38d9dc
     *  Specifically, it is the byte count from bit stream buffer start to
Packit 38d9dc
     *  the last byte of uncompressed frame header.
Packit 38d9dc
     *  If there are other meta data in the buffer before uncompressed header,
Packit 38d9dc
     *  its size should be also included here.
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 frame_header_length_in_bytes;
Packit 38d9dc
Packit 38d9dc
    /** \brief The byte count of compressed header the bitstream buffer,
Packit 38d9dc
     *  which corresponds to syntax first_partition_size in code.
Packit 38d9dc
     */
Packit 38d9dc
    uint16_t                first_partition_size;
Packit 38d9dc
Packit 38d9dc
    /** These values are segment probabilities with same names in VP9
Packit 38d9dc
     *  function setup_segmentation(). They should be parsed directly from
Packit 38d9dc
     *  bitstream by application.
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 mb_segment_tree_probs[7];
Packit 38d9dc
    uint8_t                 segment_pred_probs[3];
Packit 38d9dc
Packit 38d9dc
    /** \brief VP9 Profile definition
Packit 38d9dc
     *  value range [0..3].
Packit 38d9dc
      */
Packit 38d9dc
    uint8_t                 profile;
Packit 38d9dc
Packit 38d9dc
    /** \brief VP9 bit depth per sample
Packit 38d9dc
     *  same for both luma and chroma samples.
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 bit_depth;
Packit 38d9dc
Packit 38d9dc
    /** \brief Reserved bytes for future use, must be zero */
Packit 38d9dc
    uint32_t                va_reserved[VA_PADDING_MEDIUM];
Packit 38d9dc
Packit 38d9dc
} VADecPictureParameterBufferVP9;
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
/**
Packit 38d9dc
 * \brief VP9 Segmentation Parameter Data Structure
Packit 38d9dc
 *
Packit 38d9dc
 * This structure conveys per segment parameters.
Packit 38d9dc
 * 8 of this data structure will be included in VASegmentationParameterBufferVP9
Packit 38d9dc
 * and sent to API in a single buffer.
Packit 38d9dc
 *
Packit 38d9dc
 */
Packit 38d9dc
typedef struct  _VASegmentParameterVP9
Packit 38d9dc
{
Packit 38d9dc
    union
Packit 38d9dc
    {
Packit 38d9dc
        struct
Packit 38d9dc
        {
Packit 38d9dc
            /** \brief Indicates if per segment reference frame indicator
Packit 38d9dc
             *  is enabled.
Packit 38d9dc
             *  Corresponding to variable feature_enabled when
Packit 38d9dc
             *  j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint16_t        segment_reference_enabled                   : 1;
Packit 38d9dc
            /** \brief Specifies per segment reference indication.
Packit 38d9dc
             *  0: reserved
Packit 38d9dc
             *  1: Last ref
Packit 38d9dc
             *  2: golden
Packit 38d9dc
             *  3: altref
Packit 38d9dc
             *  Value can be derived from variable data when
Packit 38d9dc
             *  j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint16_t        segment_reference                           : 2;
Packit 38d9dc
            /** \brief Indicates if per segment skip feature is enabled.
Packit 38d9dc
             *  Corresponding to variable feature_enabled when
Packit 38d9dc
             *  j == SEG_LVL_SKIP in function setup_segmentation() VP9 code.
Packit 38d9dc
             */
Packit 38d9dc
            uint16_t        segment_reference_skipped                   : 1;
Packit 38d9dc
        } fields;
Packit 38d9dc
        uint16_t            value;
Packit 38d9dc
    } segment_flags;
Packit 38d9dc
Packit 38d9dc
    /** \brief Specifies the filter level information per segment.
Packit 38d9dc
     *  The value corresponds to variable lfi->lvl[seg][ref][mode] in VP9 code,
Packit 38d9dc
     *  where m is [ref], and n is [mode] in FilterLevel[m][n].
Packit 38d9dc
     */
Packit 38d9dc
    uint8_t                 filter_level[4][2];
Packit 38d9dc
    /** \brief Specifies per segment Luma AC quantization scale.
Packit 38d9dc
     *  Corresponding to y_dequant[qindex][1] in vp9_mb_init_quantizer()
Packit 38d9dc
     *  function of VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    int16_t                 luma_ac_quant_scale;
Packit 38d9dc
    /** \brief Specifies per segment Luma DC quantization scale.
Packit 38d9dc
     *  Corresponding to y_dequant[qindex][0] in vp9_mb_init_quantizer()
Packit 38d9dc
     *  function of VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    int16_t                 luma_dc_quant_scale;
Packit 38d9dc
    /** \brief Specifies per segment Chroma AC quantization scale.
Packit 38d9dc
     *  Corresponding to uv_dequant[qindex][1] in vp9_mb_init_quantizer()
Packit 38d9dc
     *  function of VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    int16_t                 chroma_ac_quant_scale;
Packit 38d9dc
    /** \brief Specifies per segment Chroma DC quantization scale.
Packit 38d9dc
     *  Corresponding to uv_dequant[qindex][0] in vp9_mb_init_quantizer()
Packit 38d9dc
     *  function of VP9 code.
Packit 38d9dc
     */
Packit 38d9dc
    int16_t                 chroma_dc_quant_scale;
Packit 38d9dc
Packit 38d9dc
    /** \brief Reserved bytes for future use, must be zero */
Packit 38d9dc
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit 38d9dc
Packit 38d9dc
} VASegmentParameterVP9;
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
/**
Packit 38d9dc
 * \brief VP9 Slice Parameter Buffer Structure
Packit 38d9dc
 *
Packit 38d9dc
 * This structure conveys parameters related to segmentation data and should be
Packit 38d9dc
 * sent once per frame.
Packit 38d9dc
 *
Packit 38d9dc
 * When segmentation is disabled, only SegParam[0] has valid values,
Packit 38d9dc
 * all other entries should be populated with 0.
Packit 38d9dc
 * Otherwise, all eight entries should be valid.
Packit 38d9dc
 *
Packit 38d9dc
 * Slice data buffer of VASliceDataBufferType is used
Packit 38d9dc
 * to send the bitstream which should include whole or part of partition 0
Packit 38d9dc
 * (at least compressed header) to the end of frame.
Packit 38d9dc
 *
Packit 38d9dc
 */
Packit 38d9dc
typedef struct _VASliceParameterBufferVP9
Packit 38d9dc
{
Packit 38d9dc
    /** \brief The byte count of current frame in the bitstream buffer,
Packit 38d9dc
     *  starting from first byte of the buffer.
Packit 38d9dc
     *  It uses the name slice_data_size to be consitent with other codec,
Packit 38d9dc
     *  but actually means frame_data_size.
Packit 38d9dc
     */
Packit 38d9dc
    uint32_t slice_data_size;
Packit 38d9dc
    /**
Packit 38d9dc
     * offset to the first byte of partition data (control partition)
Packit 38d9dc
     */
Packit 38d9dc
    uint32_t slice_data_offset;
Packit 38d9dc
    /**
Packit 38d9dc
     * see VA_SLICE_DATA_FLAG_XXX definitions
Packit 38d9dc
     */
Packit 38d9dc
    uint32_t slice_data_flag;
Packit 38d9dc
Packit 38d9dc
    /**
Packit 38d9dc
     * \brief per segment information
Packit 38d9dc
     */
Packit 38d9dc
    VASegmentParameterVP9   seg_param[8];
Packit 38d9dc
Packit 38d9dc
    /** \brief Reserved bytes for future use, must be zero */
Packit 38d9dc
    uint32_t                va_reserved[VA_PADDING_LOW];
Packit 38d9dc
Packit 38d9dc
} VASliceParameterBufferVP9;
Packit 38d9dc
Packit 38d9dc
Packit 38d9dc
/**@}*/
Packit 38d9dc
Packit 38d9dc
#ifdef __cplusplus
Packit 38d9dc
}
Packit 38d9dc
#endif
Packit 38d9dc
Packit 38d9dc
#endif /* VA_DEC_VP9_H */