From c19d1b46c36ee0e8f8cfcb03b026e8997d70c1c4 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 29 Jun 2016 18:36:56 +0200 Subject: [PATCH] h264parse: Drop filler data When skipping data, check if they are filler bytes. If so, drop the data instead of skipping. We don't want to output filler bytes, but they shouldn't cause a discontinuity. https://bugzilla.gnome.org/show_bug.cgi?id=768125 --- gst/videoparsers/gsth264parse.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index c7098d08fa..e09fd99c10 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -1053,6 +1053,7 @@ gst_h264_parse_handle_frame (GstBaseParse * parse, GstH264NalUnit nalu; GstH264ParserResult pres; gint framesize; + GstFlowReturn ret; if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_DISCONT))) { @@ -1105,6 +1106,22 @@ gst_h264_parse_handle_frame (GstBaseParse * parse, switch (pres) { case GST_H264_PARSER_OK: if (nalu.sc_offset > 0) { + int i; + gboolean is_filler_data = TRUE; + /* Handle filler data */ + for (i = 0; i < nalu.sc_offset; i++) { + if (data[i] != 0x00) { + is_filler_data = FALSE; + break; + } + } + if (is_filler_data) { + GST_DEBUG_OBJECT (parse, "Dropping filler data %d", nalu.sc_offset); + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_DROP; + gst_buffer_unmap (buffer, &map); + ret = gst_base_parse_finish_frame (parse, frame, nalu.sc_offset); + goto drop; + } *skipsize = nalu.sc_offset; goto skip; } @@ -1240,6 +1257,10 @@ out: gst_buffer_unmap (buffer, &map); return GST_FLOW_OK; +drop: + GST_DEBUG_OBJECT (h264parse, "Dropped data"); + return ret; + skip: GST_DEBUG_OBJECT (h264parse, "skipping %d", *skipsize); /* If we are collecting access units, we need to preserve the initial