Blame va/va_enc_vp9.h

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