mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 00:01:23 +00:00
98dc7a64a0
Rework gstvp9{decoder|statefulparser} to optionally parse compressed headers. The information in these headers might be needed for accelerators downstream, so optionally parse them if downstream requests it. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012>
694 lines
18 KiB
C
694 lines
18 KiB
C
/* GStreamer
|
|
* Copyright (C) 2021 Seungha Yang <seungha@centricular.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __GST_VP9_STATEFUL_PARSER_H__
|
|
#define __GST_VP9_STATEFUL_PARSER_H__
|
|
|
|
#include <gst/codecs/codecs-prelude.h>
|
|
#include <gst/codecparsers/gstvp9parser.h>
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
typedef struct _GstVp9StatefulParser GstVp9StatefulParser;
|
|
typedef struct _GstVp9LoopFilterParams GstVp9LoopFilterParams;
|
|
typedef struct _GstVp9QuantizationParams GstVp9QuantizationParams;
|
|
typedef struct _GstVp9SegmentationParams GstVp9SegmentationParams;
|
|
typedef struct _GstVp9MvDeltaProbs GstVp9MvDeltaProbs;
|
|
typedef struct _GstVp9DeltaProbabilities GstVp9DeltaProbabilities;
|
|
typedef struct _GstVp9FrameHeader GstVp9FrameHeader;
|
|
|
|
/**
|
|
* GST_VP9_SEG_LVL_ALT_Q:
|
|
*
|
|
* Index for quantizer segment feature
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_SEG_LVL_ALT_Q 0
|
|
|
|
/**
|
|
* GST_VP9_SEG_LVL_ALT_L:
|
|
*
|
|
* Index for loop filter segment feature
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_SEG_LVL_ALT_L 1
|
|
|
|
/**
|
|
* GST_VP9_SEG_LVL_REF_FRAME:
|
|
*
|
|
* Index for reference frame segment feature
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_SEG_LVL_REF_FRAME 2
|
|
|
|
/**
|
|
* GST_VP9_SEG_SEG_LVL_SKIP:
|
|
*
|
|
* Index for skip segment feature
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_SEG_SEG_LVL_SKIP 3
|
|
|
|
/**
|
|
* GST_VP9_SEG_LVL_MAX:
|
|
*
|
|
* Number of segment features
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_SEG_LVL_MAX 4
|
|
/**
|
|
* GST_VP9_TX_SIZE_CONTEXTS:
|
|
*
|
|
* Number of contexts for transform size
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
#define GST_VP9_TX_SIZE_CONTEXTS 2
|
|
|
|
/**
|
|
* GST_VP9_TX_SIZES:
|
|
*
|
|
* Number of values for tx_size
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_TX_SIZES 4
|
|
|
|
/**
|
|
* GST_VP9_SKIP_CONTEXTS:
|
|
*
|
|
* Number of contexts for decoding skip
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_SKIP_CONTEXTS 3
|
|
|
|
/**
|
|
* GST_VP9_INTER_MODE_CONTEXTS:
|
|
*
|
|
* Number of contexts for inter_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_INTER_MODE_CONTEXTS 7
|
|
|
|
/**
|
|
* GST_VP9_INTER_MODES:
|
|
*
|
|
* Number of values for inter_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_INTER_MODES 4
|
|
|
|
/**
|
|
* GST_VP9_INTERP_FILTER_CONTEXTS:
|
|
*
|
|
* Number of contexts for interp_filter
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_INTERP_FILTER_CONTEXTS 4
|
|
|
|
/**
|
|
* GST_VP9_SWITCHABLE_FILTERS:
|
|
*
|
|
* Number of contexts for interp_filter
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_SWITCHABLE_FILTERS 3
|
|
|
|
|
|
/**
|
|
* GST_VP9_IS_INTER_CONTEXTS:
|
|
*
|
|
* Number of contexts for interp_filter
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_IS_INTER_CONTEXTS 4
|
|
|
|
/**
|
|
* GST_VP9_COMP_MODE_CONTEXTS:
|
|
*
|
|
* Number of contexts for comp_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_COMP_MODE_CONTEXTS 5
|
|
|
|
/**
|
|
* GST_VP9_REF_CONTEXTS:
|
|
*
|
|
* Number of contexts for single_ref and comp_ref
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_REF_CONTEXTS 5
|
|
|
|
/**
|
|
* GST_VP9_BLOCK_SIZE_GROUPS:
|
|
*
|
|
* Number of contexts when decoding intra_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_BLOCK_SIZE_GROUPS 4
|
|
|
|
/**
|
|
* GST_VP9_INTRA_MODES:
|
|
*
|
|
* Number of values for intra_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_INTRA_MODES 10
|
|
|
|
/**
|
|
* GST_VP9_PARTITION_CONTEXTS:
|
|
*
|
|
* Number of contexts when decoding partition
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_PARTITION_CONTEXTS 16
|
|
|
|
/**
|
|
* GST_VP9_PARTITION_TYPES:
|
|
*
|
|
* Number of values for partition
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_PARTITION_TYPES 4
|
|
|
|
/**
|
|
* GST_VP9_MV_JOINTS:
|
|
*
|
|
* Number of values for partition
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_MV_JOINTS 4
|
|
|
|
/**
|
|
* GST_VP9_MV_CLASSES:
|
|
*
|
|
* Number of values for mv_class
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_MV_CLASSES 11
|
|
|
|
/**
|
|
* GST_VP9_MV_OFFSET_BITS:
|
|
*
|
|
* Maximum number of bits for decoding motion vectors
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_MV_OFFSET_BITS 10
|
|
|
|
/**
|
|
* GST_VP9_CLASS0_SIZE:
|
|
*
|
|
* Number of values for mv_classO_bit
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_CLASS0_SIZE 2
|
|
|
|
/**
|
|
* GST_VP9_MV_FR_SIZE:
|
|
*
|
|
* Number of values that can be decoded for mv_fr
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_MV_FR_SIZE 4
|
|
|
|
/**
|
|
* GST_VP9_TX_MODES:
|
|
*
|
|
* Number of values for tx_mode
|
|
*
|
|
* Since: 1.20
|
|
*
|
|
*/
|
|
#define GST_VP9_TX_MODES 5
|
|
|
|
/**
|
|
* GstVp9TxMode:
|
|
* @GST_VP9_TX_MODE_ONLY_4x4: Only 4x4
|
|
* @GST_VP9_TX_MODE_ALLOW_8x8: Allow 8x8
|
|
* @GST_VP9_TX_MODE_ALLOW_16x16: Allow 16x16
|
|
* @GST_VP9_TX_MODE_ALLOW_32x32: Allow 32x32
|
|
* @GST_VP9_TX_MODE_SELECT: The choice is specified explicitly for each block
|
|
*
|
|
* TxMode: Specifies how the transform size is determined
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
typedef enum
|
|
{
|
|
GST_VP9_TX_MODE_ONLY_4x4 = 0,
|
|
GST_VP9_TX_MODE_ALLOW_8x8 = 1,
|
|
GST_VP9_TX_MODE_ALLOW_16x16 = 2,
|
|
GST_VP9_TX_MODE_ALLOW_32x32 = 3,
|
|
GST_VP9_TX_MODE_SELECT = 4,
|
|
|
|
} GstVp9TxMode;
|
|
|
|
/**
|
|
* GstVp9ReferenceMode:
|
|
* @GST_VP9_REFERENCE_MODE_SINGLE_REFERENCE: Indicates that all the inter blocks use only a single reference frame
|
|
* @GST_VP9_REFERENCE_MODE_COMPOUND_REFERENCE: Requires all the inter blocks to use compound mode
|
|
* @GST_VP9_REFERENCE_MODE_SELECT: Allows each individual inter block to select between single and compound prediction modes
|
|
*
|
|
* Reference modes: Specify the type of inter prediction to be used
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
typedef enum
|
|
{
|
|
GST_VP9_REFERENCE_MODE_SINGLE_REFERENCE = 0,
|
|
GST_VP9_REFERENCE_MODE_COMPOUND_REFERENCE = 1,
|
|
GST_VP9_REFERENCE_MODE_SELECT = 2,
|
|
} GstVp9ReferenceMode;
|
|
|
|
/**
|
|
* GstVp9TxSize:
|
|
* @GST_VP9_TX_4x4: 4x4
|
|
* @GST_VP9_TX_8x8: 8x8
|
|
* @GST_VP9_TX_16x16: 16x16
|
|
* @GST_VP9_TX_32x32: 32x32
|
|
*
|
|
* TxSize: Specifies the transform size
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
typedef enum
|
|
{
|
|
GST_VP9_TX_4x4 = 0,
|
|
GST_VP9_TX_8x8 = 1,
|
|
GST_VP9_TX_16x16 = 2,
|
|
GST_VP9_TX_32x32 = 3,
|
|
} GstVp9TxSize;
|
|
|
|
/**
|
|
* GstVp9LoopFilterParams:
|
|
* @loop_filter_level: indicates the loop filter strength
|
|
* @loop_filter_sharpness: indicates the sharpness level
|
|
* @loop_filter_delta_enabled: equal to 1 means that the filter level depends
|
|
* on the mode and reference frame used to predict a block
|
|
* @loop_filter_delta_update: equal to 1 means that the bitstream contains
|
|
* additional syntax elements that specify which mode and reference frame
|
|
* deltas are to be updated
|
|
* @update_ref_delta: equal to 1 means that the bitstream contains the syntax
|
|
* element loop_filter_ref_delta
|
|
* @loop_filter_ref_deltas: contains the adjustment needed for the filter level
|
|
* based on the chosen reference frame
|
|
* @update_mode_delta: equal to 1 means that the bitstream contains the syntax
|
|
* element loop_filter_mode_deltas
|
|
* @loop_filter_mode_deltas: contains the adjustment needed for the filter level
|
|
* based on the chosen mode
|
|
*
|
|
* Loop filter params. See "6.2.8 Loop filter params syntax" and
|
|
* "7.2.8 Loop filter semantics".
|
|
*
|
|
* If syntax elements for @update_ref_delta
|
|
* and/or @loop_filter_mode_deltas are not present in bitstream,
|
|
* parser will fill @loop_filter_ref_deltas and @loop_filter_mode_deltas values
|
|
* by using previously parsed values.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9LoopFilterParams
|
|
{
|
|
guint8 loop_filter_level;
|
|
guint8 loop_filter_sharpness;
|
|
guint8 loop_filter_delta_enabled;
|
|
guint8 loop_filter_delta_update;
|
|
|
|
guint8 update_ref_delta[GST_VP9_MAX_REF_LF_DELTAS];
|
|
gint8 loop_filter_ref_deltas[GST_VP9_MAX_REF_LF_DELTAS];
|
|
|
|
guint8 update_mode_delta[GST_VP9_MAX_MODE_LF_DELTAS];
|
|
gint8 loop_filter_mode_deltas[GST_VP9_MAX_MODE_LF_DELTAS];
|
|
};
|
|
|
|
/**
|
|
* GstVp9QuantizationParams:
|
|
* @base_q_idx: indicates the base frame qindex. This is used for Y AC
|
|
* coefficients and as the base value for the other quantizers
|
|
* @delta_q_y_dc: indicates the Y DC quantizer relative to base_q_idx
|
|
* @delta_q_uv_dc: indicates the UV DC quantizer relative to base_q_idx
|
|
* @delta_q_uv_ac: indicates the UV AC quantizer relative to base_q_idx
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9QuantizationParams
|
|
{
|
|
guint8 base_q_idx;
|
|
gint8 delta_q_y_dc;
|
|
gint8 delta_q_uv_dc;
|
|
gint8 delta_q_uv_ac;
|
|
};
|
|
|
|
/**
|
|
* GstVp9SegmentationParams:
|
|
* @segmentation_enabled: equal to 1 indicates that this frame makes use of the
|
|
* segmentation tool
|
|
* @segmentation_update_map: equal to 1 indicates that the segmentation map
|
|
* should be updated during the decoding of this frame
|
|
* @segmentation_tree_probs: specify the probability values to be used when
|
|
* decoding segment_id
|
|
* @segmentation_pred_prob: specify the probability values to be used when
|
|
* decoding seg_id_predicted
|
|
* @segmentation_temporal_update: equal to 1 indicates that the updates to
|
|
* the segmentation map are coded relative to the existing segmentation map
|
|
* @segmentation_update_data: equal to 1 indicates that new parameters are
|
|
* about to be specified for each segment
|
|
* @segmentation_abs_or_delta_update: equal to 0 indicates that the segmentation
|
|
* parameters represent adjustments relative to the standard values.
|
|
* equal to 1 indicates that the segmentation parameters represent the actual
|
|
* values to be used
|
|
* @feature_enabled: indicates whether feature is enabled or not
|
|
* @feature_data: segmentation feature data
|
|
*
|
|
* See "6.2.11 Segmentation params syntax" and
|
|
* "7.2.10 Segmentation params syntax". When @segmentation_update_data is equal
|
|
* to zero, parser will fill @feature_enabled and by @feature_data
|
|
* using previously parsed values.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9SegmentationParams
|
|
{
|
|
guint8 segmentation_enabled;
|
|
guint8 segmentation_update_map;
|
|
guint8 segmentation_tree_probs[GST_VP9_SEG_TREE_PROBS];
|
|
guint8 segmentation_pred_prob[GST_VP9_PREDICTION_PROBS];
|
|
guint8 segmentation_temporal_update;
|
|
|
|
guint8 segmentation_update_data;
|
|
guint8 segmentation_abs_or_delta_update;
|
|
|
|
guint8 feature_enabled[GST_VP9_MAX_SEGMENTS][GST_VP9_SEG_LVL_MAX];
|
|
gint16 feature_data[GST_VP9_MAX_SEGMENTS][GST_VP9_SEG_LVL_MAX];
|
|
};
|
|
|
|
/**
|
|
* GstVp9MvDeltaProbs:
|
|
*
|
|
* Stores motion vectors probabilities updates. This is from the spec
|
|
* and can be used as a binary.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9MvDeltaProbs
|
|
{
|
|
/*< private >*/
|
|
guint8 joint[GST_VP9_MV_JOINTS - 1];
|
|
guint8 sign[2];
|
|
guint8 klass[2][GST_VP9_MV_CLASSES - 1];
|
|
guint8 class0_bit[2];
|
|
guint8 bits[2][GST_VP9_MV_OFFSET_BITS];
|
|
guint8 class0_fr[2][GST_VP9_CLASS0_SIZE][GST_VP9_MV_FR_SIZE - 1];
|
|
guint8 fr[2][GST_VP9_MV_FR_SIZE - 1];
|
|
guint8 class0_hp[2];
|
|
guint8 hp[2];
|
|
};
|
|
|
|
|
|
/**
|
|
* GstVp9DeltaProbabilities:
|
|
*
|
|
* Stores probabilities updates. This is from the spec
|
|
* and can be used as a binary.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9DeltaProbabilities
|
|
{
|
|
/*< private >*/
|
|
guint8 tx_probs_8x8[GST_VP9_TX_SIZE_CONTEXTS][GST_VP9_TX_SIZES - 3];
|
|
guint8 tx_probs_16x16[GST_VP9_TX_SIZE_CONTEXTS][GST_VP9_TX_SIZES - 2];
|
|
guint8 tx_probs_32x32[GST_VP9_TX_SIZE_CONTEXTS][GST_VP9_TX_SIZES - 1];
|
|
guint8 coef[4][2][2][6][6][3];
|
|
guint8 skip[GST_VP9_SKIP_CONTEXTS];
|
|
guint8 inter_mode[GST_VP9_INTER_MODE_CONTEXTS][GST_VP9_INTER_MODES - 1];
|
|
guint8
|
|
interp_filter[GST_VP9_INTERP_FILTER_CONTEXTS][GST_VP9_SWITCHABLE_FILTERS
|
|
- 1];
|
|
guint8 is_inter[GST_VP9_IS_INTER_CONTEXTS];
|
|
guint8 comp_mode[GST_VP9_COMP_MODE_CONTEXTS];
|
|
guint8 single_ref[GST_VP9_REF_CONTEXTS][2];
|
|
guint8 comp_ref[GST_VP9_REF_CONTEXTS];
|
|
guint8 y_mode[GST_VP9_BLOCK_SIZE_GROUPS][GST_VP9_INTRA_MODES - 1];
|
|
guint8 partition[GST_VP9_PARTITION_CONTEXTS][GST_VP9_PARTITION_TYPES - 1];
|
|
GstVp9MvDeltaProbs mv;
|
|
};
|
|
|
|
|
|
/**
|
|
* GstVp9FrameHeader:
|
|
* @profile: encoded profile
|
|
* @bit_depth: encoded bit depth
|
|
* @subsampling_x: specify the chroma subsampling format for x coordinate
|
|
* @subsampling_y: specify the chroma subsampling format for y coordinate
|
|
* @color_space: specifies the color space of the stream
|
|
* @color_range: specifies the black level and range of the luma and chroma
|
|
* signals
|
|
* @show_existing_frame: equal to 1, indicates the frame indexed by
|
|
* frame_to_show_map_idx is to be displayed
|
|
* @frame_to_show_map_idx: specifies the frame to be displayed.
|
|
* It is only available if show_existing_frame is 1
|
|
* @frame_type: equal to 0 indicates that the current frame is a key frame
|
|
* @show_frame: indicate whether it is a displayable frame or not
|
|
* @error_resilient_mode: equal to 1 indicates that error resilient mode is
|
|
* enabled
|
|
* @width: coded frame width
|
|
* @height: coded frame height
|
|
* @render_and_frame_size_different: equal to 0 means that the render width and
|
|
* height are inferred from the frame width and height
|
|
* @render_width: render width of the frame
|
|
* @render_height: render width of the frame
|
|
* @intra_only: equal to 1 indicates that the frame is an intra-only frame
|
|
* @reset_frame_context: specifies whether the frame context should be reset to
|
|
* default values
|
|
* @refresh_frame_flags: contains a bitmask that specifies which reference frame
|
|
* slots will be updated with the current frame after it is decoded
|
|
* @ref_frame_idx: specifies which reference frames are used by inter frames
|
|
* @ref_frame_sign_bias: specifies the intended direction of the motion vector
|
|
* in time for each reference frame. A sign bias equal to 0 indicates that
|
|
* the reference frame is a backwards reference
|
|
* @allow_high_precision_mv: equal to 0 specifies that motion vectors are
|
|
* specified to quarter pel precision
|
|
* @interpolation_filter: specifies the filter selection used for performing
|
|
* inter prediction
|
|
* @refresh_frame_context: equal to 1 indicates that the probabilities computed
|
|
* for this frame
|
|
* @frame_parallel_decoding_mode: equal to 1 indicates that parallel decoding
|
|
* mode is enabled
|
|
* @frame_context_idx: indicates the frame context to use
|
|
* @loop_filter_params: a #GstVp9LoopFilterParams
|
|
* @quantization_params: a #GstVp9QuantizationParams
|
|
* @segmentation_params: a #GstVp9SegmentationParams
|
|
* @tile_cols_log2: specifies the base 2 logarithm of the width of each tile
|
|
* @tile_rows_log2: specifies the base 2 logarithm of the height of each tile
|
|
* @tx_mode: specifies how the transform size is determined
|
|
* @reference_mode: is a derived syntax element that specifies the type of
|
|
* inter prediction to be used
|
|
* @delta_probabilities: modification to the probabilities encoded in the
|
|
* bitstream
|
|
* @lossless_flag: lossless mode decode
|
|
* @frame_header_length_in_bytes: length of uncompressed header
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
/**
|
|
* GstVp9FrameHeader.tx_mode:
|
|
*
|
|
* Specifies how the transform size is determined.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
/**
|
|
* GstVp9FrameHeader.reference_mode:
|
|
*
|
|
* Is a derived syntax element that specifies the type of
|
|
* inter prediction to be used.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
/**
|
|
* GstVp9FrameHeader.delta_probabilities:
|
|
*
|
|
* Modification to the probabilities encoded in the bitstream.
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9FrameHeader
|
|
{
|
|
guint8 profile;
|
|
guint8 bit_depth;
|
|
guint8 subsampling_x;
|
|
guint8 subsampling_y;
|
|
guint8 color_space;
|
|
guint8 color_range;
|
|
guint8 show_existing_frame;
|
|
guint8 frame_to_show_map_idx;
|
|
guint8 frame_type;
|
|
guint8 show_frame;
|
|
guint8 error_resilient_mode;
|
|
guint32 width;
|
|
guint32 height;
|
|
guint8 render_and_frame_size_different;
|
|
guint32 render_width;
|
|
guint32 render_height;
|
|
guint8 intra_only;
|
|
guint8 reset_frame_context;
|
|
guint8 refresh_frame_flags;
|
|
guint8 ref_frame_idx[GST_VP9_REFS_PER_FRAME];
|
|
guint8 ref_frame_sign_bias[4];
|
|
guint8 allow_high_precision_mv;
|
|
guint8 interpolation_filter;
|
|
|
|
guint8 refresh_frame_context;
|
|
guint8 frame_parallel_decoding_mode;
|
|
guint8 frame_context_idx;
|
|
|
|
GstVp9LoopFilterParams loop_filter_params;
|
|
GstVp9QuantizationParams quantization_params;
|
|
GstVp9SegmentationParams segmentation_params;
|
|
|
|
guint8 tile_cols_log2;
|
|
guint8 tile_rows_log2;
|
|
|
|
guint16 header_size_in_bytes;
|
|
|
|
/* compressed header */
|
|
GstVp9TxMode tx_mode;
|
|
GstVp9ReferenceMode reference_mode;
|
|
GstVp9DeltaProbabilities delta_probabilities;
|
|
|
|
/* calculated values */
|
|
guint8 lossless_flag;
|
|
guint32 frame_header_length_in_bytes;
|
|
};
|
|
|
|
/**
|
|
* GstVp9StatefulParser:
|
|
*
|
|
* Opaque VP9 parser struct.
|
|
* The size of this object and member variables are not API
|
|
*
|
|
* Since: 1.20
|
|
*/
|
|
struct _GstVp9StatefulParser
|
|
{
|
|
/*< private >*/
|
|
guint8 bit_depth;
|
|
guint8 subsampling_x;
|
|
guint8 subsampling_y;
|
|
guint8 color_space;
|
|
guint8 color_range;
|
|
|
|
guint mi_cols;
|
|
guint mi_rows;
|
|
guint sb64_cols;
|
|
guint sb64_rows;
|
|
|
|
GstVp9LoopFilterParams loop_filter_params;
|
|
GstVp9SegmentationParams segmentation_params;
|
|
|
|
struct {
|
|
guint32 width;
|
|
guint32 height;
|
|
} reference[GST_VP9_REF_FRAMES];
|
|
};
|
|
|
|
GST_CODECS_API
|
|
GstVp9StatefulParser * gst_vp9_stateful_parser_new (void);
|
|
|
|
GST_CODECS_API
|
|
void gst_vp9_stateful_parser_free (GstVp9StatefulParser * parser);
|
|
|
|
GST_CODECS_API
|
|
GstVp9ParserResult gst_vp9_stateful_parser_parse_compressed_frame_header (GstVp9StatefulParser * parser,
|
|
GstVp9FrameHeader * header,
|
|
const guint8 * data,
|
|
gsize size);
|
|
|
|
GST_CODECS_API
|
|
GstVp9ParserResult gst_vp9_stateful_parser_parse_uncompressed_frame_header (GstVp9StatefulParser * parser,
|
|
GstVp9FrameHeader * header,
|
|
const guint8 * data,
|
|
gsize size);
|
|
|
|
/* Util methods */
|
|
GST_CODECS_API
|
|
gboolean gst_vp9_seg_feature_active (const GstVp9SegmentationParams * params,
|
|
guint8 segment_id,
|
|
guint8 feature);
|
|
|
|
GST_CODECS_API
|
|
guint8 gst_vp9_get_qindex (const GstVp9SegmentationParams * segmentation_params,
|
|
const GstVp9QuantizationParams * quantization_params,
|
|
guint8 segment_id);
|
|
|
|
|
|
GST_CODECS_API
|
|
gint16 gst_vp9_get_dc_quant (guint8 qindex,
|
|
gint8 delta_q_dc,
|
|
guint8 bit_depth);
|
|
|
|
GST_CODECS_API
|
|
gint16 gst_vp9_get_ac_quant (guint8 qindex,
|
|
gint8 delta_q_ac,
|
|
guint8 bit_depth);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GST_VP9_STATEFUL_PARSER_H__ */
|