codecparser: vp9: move persistent fields from GstVp9FrameHdr to GstVp9Parser

The subsampling_x, subsampling_y, bit_depth, color_space and color_range
fileds are moved from GstVp9FrameHdr to the global GstVp9Parser structure.
These fields are only present in keyframe or intra-only frame, no need to
duplicate them for inter-frames. This is an ABI change.

https://bugzilla.gnome.org/show_bug.cgi?id=764370
This commit is contained in:
Sreerenj Balachandran 2016-04-01 14:12:08 +03:00
parent 78cb53ad3c
commit 88a3b4da3c
2 changed files with 43 additions and 47 deletions

View File

@ -103,26 +103,26 @@ verify_sync_code (GstBitReader * const br)
} }
static gboolean static gboolean
parse_bitdepth_colorspace_sampling (GstBitReader * const br, parse_bitdepth_colorspace_sampling (GstVp9Parser * parser,
GstVp9FrameHdr * frame_hdr) GstBitReader * const br, GstVp9FrameHdr * frame_hdr)
{ {
if (frame_hdr->profile > GST_VP9_PROFILE_1) if (frame_hdr->profile > GST_VP9_PROFILE_1)
frame_hdr->bit_depth = parser->bit_depth =
gst_vp9_read_bit (br) ? GST_VP9_BIT_DEPTH_12 : GST_VP9_BIT_DEPTH_10; gst_vp9_read_bit (br) ? GST_VP9_BIT_DEPTH_12 : GST_VP9_BIT_DEPTH_10;
else else
frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8; parser->bit_depth = GST_VP9_BIT_DEPTH_8;
frame_hdr->color_space = gst_vp9_read_bits (br, 3); parser->color_space = gst_vp9_read_bits (br, 3);
if (frame_hdr->color_space != GST_VP9_CS_SRGB) { if (parser->color_space != GST_VP9_CS_SRGB) {
frame_hdr->color_range = gst_vp9_read_bit (br); parser->color_range = gst_vp9_read_bit (br);
if (frame_hdr->profile == GST_VP9_PROFILE_1 if (frame_hdr->profile == GST_VP9_PROFILE_1
|| frame_hdr->profile == GST_VP9_PROFILE_3) { || frame_hdr->profile == GST_VP9_PROFILE_3) {
frame_hdr->subsampling_x = gst_vp9_read_bit (br); parser->subsampling_x = gst_vp9_read_bit (br);
frame_hdr->subsampling_y = gst_vp9_read_bit (br); parser->subsampling_y = gst_vp9_read_bit (br);
if (frame_hdr->subsampling_x == 1 && frame_hdr->subsampling_y == 1) { if (parser->subsampling_x == 1 && parser->subsampling_y == 1) {
GST_ERROR GST_ERROR
("4:2:0 subsampling is not supported in profile_1 or profile_3"); ("4:2:0 subsampling is not supported in profile_1 or profile_3");
goto error; goto error;
@ -133,10 +133,10 @@ parse_bitdepth_colorspace_sampling (GstBitReader * const br,
goto error; goto error;
} }
} else { } else {
frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1; parser->subsampling_y = parser->subsampling_x = 1;
} }
} else { } else {
frame_hdr->color_range = GST_VP9_CR_FULL; parser->color_range = GST_VP9_CR_FULL;
if (frame_hdr->profile == GST_VP9_PROFILE_1 if (frame_hdr->profile == GST_VP9_PROFILE_1
|| frame_hdr->profile == GST_VP9_PROFILE_3) { || frame_hdr->profile == GST_VP9_PROFILE_3) {
@ -481,12 +481,12 @@ segmentation_update (GstVp9Parser * parser, const GstVp9FrameHdr * frame_hdr)
const GstVp9SegmentationInfoData *info = priv->segmentation + i; const GstVp9SegmentationInfoData *info = priv->segmentation + i;
seg->luma_dc_quant_scale = seg->luma_dc_quant_scale =
gst_vp9_dc_quant (q, quant_indices->y_dc_delta, frame_hdr->bit_depth); gst_vp9_dc_quant (q, quant_indices->y_dc_delta, parser->bit_depth);
seg->luma_ac_quant_scale = gst_vp9_ac_quant (q, 0, frame_hdr->bit_depth); seg->luma_ac_quant_scale = gst_vp9_ac_quant (q, 0, parser->bit_depth);
seg->chroma_dc_quant_scale = seg->chroma_dc_quant_scale =
gst_vp9_dc_quant (q, quant_indices->uv_dc_delta, frame_hdr->bit_depth); gst_vp9_dc_quant (q, quant_indices->uv_dc_delta, parser->bit_depth);
seg->chroma_ac_quant_scale = seg->chroma_ac_quant_scale =
gst_vp9_ac_quant (q, quant_indices->uv_ac_delta, frame_hdr->bit_depth); gst_vp9_ac_quant (q, quant_indices->uv_ac_delta, parser->bit_depth);
if (lf->filter_level) { if (lf->filter_level) {
guint8 filter = seg_get_filter_level (parser, frame_hdr, i); guint8 filter = seg_get_filter_level (parser, frame_hdr, i);
@ -578,13 +578,17 @@ setup_past_independence (GstVp9Parser * parser,
} }
static void static void
gst_vp9_parser_init (GstVp9Parser * parser) gst_vp9_parser_reset (GstVp9Parser * parser)
{ {
GstVp9ParserPrivate *priv = parser->priv; GstVp9ParserPrivate *priv = parser->priv;
memset (parser, 0, sizeof (GstVp9Parser)); parser->priv = NULL;
memset (priv, 0, sizeof (GstVp9ParserPrivate)); memset (parser->mb_segment_tree_probs, 0,
sizeof (parser->mb_segment_tree_probs));
memset (parser->segment_pred_probs, 0, sizeof (parser->segment_pred_probs));
memset (parser->segmentation, 0, sizeof (parser->segmentation));
memset (priv, 0, sizeof (GstVp9ParserPrivate));
parser->priv = priv; parser->priv = priv;
} }
@ -592,7 +596,7 @@ static GstVp9ParserResult
gst_vp9_parser_update (GstVp9Parser * parser, GstVp9FrameHdr * const frame_hdr) gst_vp9_parser_update (GstVp9Parser * parser, GstVp9FrameHdr * const frame_hdr)
{ {
if (frame_hdr->frame_type == GST_VP9_KEY_FRAME) if (frame_hdr->frame_type == GST_VP9_KEY_FRAME)
gst_vp9_parser_init (parser); gst_vp9_parser_reset (parser);
if (frame_is_intra_only (frame_hdr) || frame_hdr->error_resilient_mode) if (frame_is_intra_only (frame_hdr) || frame_hdr->error_resilient_mode)
setup_past_independence (parser, frame_hdr); setup_past_independence (parser, frame_hdr);
@ -626,16 +630,15 @@ gst_vp9_parser_new (void)
INITIALIZE_DEBUG_CATEGORY; INITIALIZE_DEBUG_CATEGORY;
GST_DEBUG ("Create VP9 Parser"); GST_DEBUG ("Create VP9 Parser");
parser = g_slice_new (GstVp9Parser); parser = g_slice_new0 (GstVp9Parser);
if (!parser) if (!parser)
return NULL; return NULL;
priv = g_slice_new (GstVp9ParserPrivate); priv = g_slice_new0 (GstVp9ParserPrivate);
if (!priv) if (!priv)
return NULL; return NULL;
parser->priv = priv; parser->priv = priv;
gst_vp9_parser_init (parser);
return parser; return parser;
} }
@ -712,7 +715,7 @@ gst_vp9_parser_parse_frame_header (GstVp9Parser * parser,
goto error; goto error;
} }
if (!parse_bitdepth_colorspace_sampling (br, frame_hdr)) { if (!parse_bitdepth_colorspace_sampling (parser, br, frame_hdr)) {
GST_ERROR ("Failed to parse color_space/bit_depth info !"); GST_ERROR ("Failed to parse color_space/bit_depth info !");
goto error; goto error;
} }
@ -734,15 +737,15 @@ gst_vp9_parser_parse_frame_header (GstVp9Parser * parser,
} }
if (frame_hdr->profile > GST_VP9_PROFILE_0) { if (frame_hdr->profile > GST_VP9_PROFILE_0) {
if (!parse_bitdepth_colorspace_sampling (br, frame_hdr)) { if (!parse_bitdepth_colorspace_sampling (parser, br, frame_hdr)) {
GST_ERROR ("Failed to parse color_space/bit_depth info !"); GST_ERROR ("Failed to parse color_space/bit_depth info !");
goto error; goto error;
} }
} else { } else {
frame_hdr->color_space = GST_VP9_CS_BT_601; parser->color_space = GST_VP9_CS_BT_601;
frame_hdr->color_range = GST_VP9_CR_LIMITED; parser->color_range = GST_VP9_CR_LIMITED;
frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1; parser->subsampling_y = parser->subsampling_x = 1;
frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8; parser->bit_depth = GST_VP9_BIT_DEPTH_8;
} }
frame_hdr->refresh_frame_flags = frame_hdr->refresh_frame_flags =
@ -766,12 +769,6 @@ gst_vp9_parser_parse_frame_header (GstVp9Parser * parser,
frame_hdr->allow_high_precision_mv = gst_vp9_read_bit (br); frame_hdr->allow_high_precision_mv = gst_vp9_read_bit (br);
frame_hdr->mcomp_filter_type = parse_interp_filter (br); frame_hdr->mcomp_filter_type = parse_interp_filter (br);
/* Assing defalut values */
frame_hdr->color_space = GST_VP9_CS_BT_601;
frame_hdr->color_range = GST_VP9_CR_LIMITED;
frame_hdr->subsampling_y = frame_hdr->subsampling_x = 1;
frame_hdr->bit_depth = GST_VP9_BIT_DEPTH_8;
} }
} }
@ -811,7 +808,6 @@ gst_vp9_parser_parse_frame_header (GstVp9Parser * parser,
frame_hdr->frame_header_length_in_bytes = frame_hdr->frame_header_length_in_bytes =
(gst_bit_reader_get_pos (br) + 7) / 8; (gst_bit_reader_get_pos (br) + 7) / 8;
return gst_vp9_parser_update (parser, frame_hdr); return gst_vp9_parser_update (parser, frame_hdr);
error: error:

View File

@ -350,17 +350,12 @@ struct _GstVp9SegmentationInfo {
* @frame_type: frame type * @frame_type: frame type
* @show_frame: indicate whether it is a displayable frame or not * @show_frame: indicate whether it is a displayable frame or not
* @error_resilient_mode: error resilent mode * @error_resilient_mode: error resilent mode
* @subsampling_x: horizontal subsampling
* @subsampling_y: vertical subsampling
* @width: frame width * @width: frame width
* @height: frame height * @height: frame height
* @display_size_enabled: display size enabled (cropping) * @display_size_enabled: display size enabled (cropping)
* @display_width: display width * @display_width: display width
* @display_height: display height * @display_height: display height
* @frame_context_idx: frame context index * @frame_context_idx: frame context index
* @bit_depth: bit depth of the stream
* @color_space: color space standard
* @color_range: color range standard
* @intra_only: intra only frame * @intra_only: intra only frame
* @reset_frame_context: reset frame context * @reset_frame_context: reset frame context
* @refresh_frame_flags: refresh reference frame flags * @refresh_frame_flags: refresh reference frame flags
@ -391,8 +386,6 @@ struct _GstVp9FrameHdr
guint frame_type; guint frame_type;
guint8 show_frame; guint8 show_frame;
guint8 error_resilient_mode; guint8 error_resilient_mode;
gint subsampling_x;
gint subsampling_y;
guint32 width; guint32 width;
guint32 height; guint32 height;
guint8 display_size_enabled; guint8 display_size_enabled;
@ -400,10 +393,6 @@ struct _GstVp9FrameHdr
guint32 display_height; guint32 display_height;
guint frame_context_idx; guint frame_context_idx;
guint bit_depth;
guint color_space;
guint color_range;
guint8 intra_only; guint8 intra_only;
gint reset_frame_context; gint reset_frame_context;
gint refresh_frame_flags; gint refresh_frame_flags;
@ -464,6 +453,11 @@ struct _GstVp9Segmentation
/** /**
* GstVp9Parser: * GstVp9Parser:
* @priv: GstVp9ParserPrivate struct to keep track of state variables * @priv: GstVp9ParserPrivate struct to keep track of state variables
* @subsampling_x: horizontal subsampling
* @subsampling_y: vertical subsampling
* @bit_depth: bit depth of the stream
* @color_space: color space standard
* @color_range: color range standard
* @mb_segment_tree_probs: decoding tree probabilities * @mb_segment_tree_probs: decoding tree probabilities
* @segment_pred_probs: segment prediction probabiilties * @segment_pred_probs: segment prediction probabiilties
* @segmentation: Segmentation info * @segmentation: Segmentation info
@ -477,6 +471,12 @@ struct _GstVp9Parser
/* private stuct for tracking state variables across frames */ /* private stuct for tracking state variables across frames */
void *priv; void *priv;
gint subsampling_x;
gint subsampling_y;
guint bit_depth;
guint color_space;
guint color_range;
guint8 mb_segment_tree_probs[GST_VP9_SEG_TREE_PROBS]; guint8 mb_segment_tree_probs[GST_VP9_SEG_TREE_PROBS];
guint8 segment_pred_probs[GST_VP9_PREDICTION_PROBS]; guint8 segment_pred_probs[GST_VP9_PREDICTION_PROBS];
GstVp9Segmentation segmentation[GST_VP9_MAX_SEGMENTS]; GstVp9Segmentation segmentation[GST_VP9_MAX_SEGMENTS];