diff options
author | Thiago Santos <ts.santos@sisa.samsung.com> | 2014-01-08 16:33:05 -0300 |
---|---|---|
committer | Thiago Santos <ts.santos@sisa.samsung.com> | 2014-01-08 16:50:38 -0300 |
commit | 4e283dbb6255a9442621978c42b51a59ba5752d2 (patch) | |
tree | d145d56cfac61f02049da9aa582628922154936f /gst/videoparsers/gstmpeg4videoparse.c | |
parent | c894c2d721a9bc96789c2163b8ffdd9791a3d565 (diff) | |
download | gstreamer-plugins-bad-4e283dbb6255a9442621978c42b51a59ba5752d2.tar.gz |
mpeg4videoparse: do not lose DISCONT flag if buffer isn't pushed
mpeg4videoparse might not push buffers while parsing. If those buffers
contain the DISCONT flag, it gets lost and downstream won't get any
buffer with the flag.
Fix it by adding the DISCONT to the next pushed buffer.
This makes backwards playback work.
Diffstat (limited to 'gst/videoparsers/gstmpeg4videoparse.c')
-rw-r--r-- | gst/videoparsers/gstmpeg4videoparse.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c index badc32d9e..1afaa17c8 100644 --- a/gst/videoparsers/gstmpeg4videoparse.c +++ b/gst/videoparsers/gstmpeg4videoparse.c @@ -211,6 +211,7 @@ gst_mpeg4vparse_reset (GstMpeg4VParse * mp4vparse) mp4vparse->level = NULL; mp4vparse->pending_key_unit_ts = GST_CLOCK_TIME_NONE; mp4vparse->force_key_unit_event = NULL; + mp4vparse->discont = FALSE; gst_buffer_replace (&mp4vparse->config, NULL); memset (&mp4vparse->vol, 0, sizeof (mp4vparse->vol)); @@ -414,6 +415,11 @@ gst_mpeg4vparse_handle_frame (GstBaseParse * parse, gboolean ret = FALSE; guint framesize = 0; + if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (frame->buffer, + GST_BUFFER_FLAG_DISCONT))) { + mp4vparse->discont = TRUE; + } + gst_buffer_map (frame->buffer, &map, GST_MAP_READ); data = map.data; size = map.size; @@ -528,6 +534,10 @@ out: res = gst_mpeg4vparse_parse_frame (parse, frame); if (res == GST_BASE_PARSE_FLOW_DROPPED) frame->flags |= GST_BASE_PARSE_FRAME_FLAG_DROP; + if (G_UNLIKELY (mp4vparse->discont)) { + GST_BUFFER_FLAG_SET (frame->buffer, GST_BUFFER_FLAG_DISCONT); + mp4vparse->discont = FALSE; + } return gst_base_parse_finish_frame (parse, frame, framesize); } |