diff options
author | Thiago Santos <thiagoss@osg.samsung.com> | 2015-03-03 11:42:09 -0300 |
---|---|---|
committer | Thiago Santos <thiagoss@osg.samsung.com> | 2015-03-04 08:00:52 -0300 |
commit | 14f6fcdbd89f1934700b26f3e3afa54c654cbabb (patch) | |
tree | ffbe4be40209ec1373cce5953b72630c9208b6c4 | |
parent | 87f8d7890cc196d9fc341e24d269a148868f717e (diff) |
h264parse: reset the parser information when caps changes
This prevents it from going into passthrough after receiving 2
byte-stream caps (different ones) as it would keep the have_pps and
have_sps set to true and would just go into passthrough without
updating its caps.
This patch makes it reset its stream information to restart properly
when new caps are received.
https://bugzilla.gnome.org/show_bug.cgi?id=745409
-rw-r--r-- | gst/videoparsers/gsth264parse.c | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index f60f175a0..f7a56e2c3 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -195,8 +195,10 @@ gst_h264_parse_reset_frame (GstH264Parse * h264parse) } static void -gst_h264_parse_reset (GstH264Parse * h264parse) +gst_h264_parse_reset_stream_info (GstH264Parse * h264parse) { + gint i; + h264parse->width = 0; h264parse->height = 0; h264parse->fps_num = 0; @@ -205,19 +207,32 @@ gst_h264_parse_reset (GstH264Parse * h264parse) h264parse->upstream_par_d = -1; h264parse->parsed_par_n = 0; h264parse->parsed_par_d = 0; - gst_buffer_replace (&h264parse->codec_data, NULL); - gst_buffer_replace (&h264parse->codec_data_in, NULL); - h264parse->nal_length_size = 4; - h264parse->packetized = FALSE; - h264parse->transform = FALSE; + h264parse->have_pps = FALSE; + h264parse->have_sps = FALSE; h264parse->align = GST_H264_PARSE_ALIGN_NONE; h264parse->format = GST_H264_PARSE_FORMAT_NONE; - h264parse->last_report = GST_CLOCK_TIME_NONE; + h264parse->transform = FALSE; + h264parse->nal_length_size = 4; + h264parse->packetized = FALSE; h264parse->push_codec = FALSE; - h264parse->have_pps = FALSE; - h264parse->have_sps = FALSE; + + gst_buffer_replace (&h264parse->codec_data, NULL); + gst_buffer_replace (&h264parse->codec_data_in, NULL); + + gst_h264_parse_reset_frame (h264parse); + + for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) + gst_buffer_replace (&h264parse->sps_nals[i], NULL); + for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) + gst_buffer_replace (&h264parse->pps_nals[i], NULL); +} + +static void +gst_h264_parse_reset (GstH264Parse * h264parse) +{ + h264parse->last_report = GST_CLOCK_TIME_NONE; h264parse->dts = GST_CLOCK_TIME_NONE; h264parse->ts_trn_nb = GST_CLOCK_TIME_NONE; @@ -230,7 +245,7 @@ gst_h264_parse_reset (GstH264Parse * h264parse) h264parse->discont = FALSE; - gst_h264_parse_reset_frame (h264parse); + gst_h264_parse_reset_stream_info (h264parse); } static gboolean @@ -257,17 +272,11 @@ gst_h264_parse_start (GstBaseParse * parse) static gboolean gst_h264_parse_stop (GstBaseParse * parse) { - guint i; GstH264Parse *h264parse = GST_H264_PARSE (parse); GST_DEBUG_OBJECT (parse, "stop"); gst_h264_parse_reset (h264parse); - for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) - gst_buffer_replace (&h264parse->sps_nals[i], NULL); - for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) - gst_buffer_replace (&h264parse->pps_nals[i], NULL); - gst_h264_nal_parser_free (h264parse->nalparser); return TRUE; @@ -2079,12 +2088,20 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps) guint format, align, off; GstH264NalUnit nalu; GstH264ParserResult parseres; + GstCaps *old_caps; h264parse = GST_H264_PARSE (parse); /* reset */ h264parse->push_codec = FALSE; + old_caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (parse)); + if (old_caps) { + if (!gst_caps_is_equal (old_caps, caps)) + gst_h264_parse_reset_stream_info (h264parse); + gst_caps_unref (old_caps); + } + str = gst_caps_get_structure (caps, 0); /* accept upstream info if provided */ |