From b58245ac0a53336ea90e6462a0a3ca3d70e3d8d0 Mon Sep 17 00:00:00 2001 From: Ilya Konstantinov Date: Tue, 28 Apr 2015 17:54:51 +0300 Subject: [PATCH] baseparse: fix GST_BASE_PARSE_FLAG_LOST_SYNC Since frame->priv->discont was cleared earlier, GST_BASE_PARSE_FLAG_LOST_SYNC was never being set. Take the chance to refactor the frame creation a bit to organize the flags setting and reset. https://bugzilla.gnome.org/show_bug.cgi?id=738237 --- libs/gst/base/gstbaseparse.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 193bdf8..eee3c92 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -760,11 +760,8 @@ gst_base_parse_frame_new (GstBuffer * buffer, GstBaseParseFrameFlags flags, } static inline void -gst_base_parse_frame_update (GstBaseParse * parse, GstBaseParseFrame * frame, - GstBuffer * buf) +gst_base_parse_update_flags (GstBaseParse * parse) { - gst_buffer_replace (&frame->buffer, buf); - parse->flags = 0; /* set flags one by one for clarity */ @@ -776,6 +773,22 @@ gst_base_parse_frame_update (GstBaseParse * parse, GstBaseParseFrame * frame, parse->flags |= GST_BASE_PARSE_FLAG_LOST_SYNC; } +static inline void +gst_base_parse_update_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + if (G_UNLIKELY (parse->priv->discont)) { + GST_DEBUG_OBJECT (parse, "marking DISCONT"); + GST_BUFFER_FLAG_SET (frame->buffer, GST_BUFFER_FLAG_DISCONT); + } + + if (parse->priv->prev_offset != parse->priv->offset || parse->priv->new_frame) { + GST_LOG_OBJECT (parse, "marking as new frame"); + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_NEW_FRAME; + } + + frame->offset = parse->priv->prev_offset = parse->priv->offset; +} + static void gst_base_parse_reset (GstBaseParse * parse) { @@ -1920,27 +1933,17 @@ gst_base_parse_prepare_frame (GstBaseParse * parse, GstBuffer * buffer) GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET (buffer), gst_buffer_get_size (buffer)); - if (parse->priv->discont) { - GST_DEBUG_OBJECT (parse, "marking DISCONT"); - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); - parse->priv->discont = FALSE; - } - GST_BUFFER_OFFSET (buffer) = parse->priv->offset; - frame = gst_base_parse_frame_new (buffer, 0, 0); + gst_base_parse_update_flags (parse); - /* also ensure to update state flags */ - gst_base_parse_frame_update (parse, frame, buffer); + frame = gst_base_parse_frame_new (buffer, 0, 0); gst_buffer_unref (buffer); + gst_base_parse_update_frame (parse, frame); - if (parse->priv->prev_offset != parse->priv->offset || parse->priv->new_frame) { - GST_LOG_OBJECT (parse, "marking as new frame"); - parse->priv->new_frame = FALSE; - frame->flags |= GST_BASE_PARSE_FRAME_FLAG_NEW_FRAME; - } - - frame->offset = parse->priv->prev_offset = parse->priv->offset; + /* clear flags for next frame */ + parse->priv->discont = FALSE; + parse->priv->new_frame = FALSE; /* use default handler to provide initial (upstream) metadata */ gst_base_parse_parse_frame (parse, frame); -- 2.7.4