flvdemux: set RESYNC buffer flag when bridging large PTS gaps

So downstream gets notified when this happens.

https://bugzilla.gnome.org/show_bug.cgi?id=725903
This commit is contained in:
Jan Alexander Steffens (heftig) 2014-03-06 16:37:51 +01:00 committed by Nicolas Dufresne
parent 4377dfeadd
commit 303883752e

View file

@ -885,10 +885,11 @@ gst_flv_demux_push_tags (GstFlvDemux * demux)
} }
} }
static void static gboolean
gst_flv_demux_update_resync (GstFlvDemux * demux, guint32 pts, gboolean discont, gst_flv_demux_update_resync (GstFlvDemux * demux, guint32 pts, gboolean discont,
guint32 * last, GstClockTime * offset) guint32 * last, GstClockTime * offset)
{ {
gboolean ret = FALSE;
gint32 dpts = pts - *last; gint32 dpts = pts - *last;
if (!discont && ABS (dpts) >= RESYNC_THRESHOLD) { if (!discont && ABS (dpts) >= RESYNC_THRESHOLD) {
/* Theoretically, we should use substract the duration of the last buffer, /* Theoretically, we should use substract the duration of the last buffer,
@ -898,8 +899,12 @@ gst_flv_demux_update_resync (GstFlvDemux * demux, guint32 pts, gboolean discont,
GST_WARNING_OBJECT (demux, GST_WARNING_OBJECT (demux,
"Large pts gap (%" G_GINT32_FORMAT " ms), assuming resync, offset now %" "Large pts gap (%" G_GINT32_FORMAT " ms), assuming resync, offset now %"
GST_TIME_FORMAT "", dpts, GST_TIME_ARGS (*offset)); GST_TIME_FORMAT "", dpts, GST_TIME_ARGS (*offset));
ret = TRUE;
} }
*last = pts; *last = pts;
return ret;
} }
static GstFlowReturn static GstFlowReturn
@ -1099,8 +1104,10 @@ gst_flv_demux_parse_tag_audio (GstFlvDemux * demux, GstBuffer * buffer)
} }
/* detect (and deem to be resyncs) large pts gaps */ /* detect (and deem to be resyncs) large pts gaps */
gst_flv_demux_update_resync (demux, pts, demux->audio_need_discont, if (gst_flv_demux_update_resync (demux, pts, demux->audio_need_discont,
&demux->last_audio_pts, &demux->audio_time_offset); &demux->last_audio_pts, &demux->audio_time_offset)) {
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_RESYNC);
}
/* Fill buffer with data */ /* Fill buffer with data */
GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->audio_time_offset; GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->audio_time_offset;
@ -1484,8 +1491,10 @@ gst_flv_demux_parse_tag_video (GstFlvDemux * demux, GstBuffer * buffer)
} }
/* detect (and deem to be resyncs) large pts gaps */ /* detect (and deem to be resyncs) large pts gaps */
gst_flv_demux_update_resync (demux, pts, demux->video_need_discont, if (gst_flv_demux_update_resync (demux, pts, demux->video_need_discont,
&demux->last_video_pts, &demux->video_time_offset); &demux->last_video_pts, &demux->video_time_offset)) {
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_RESYNC);
}
/* Fill buffer with data */ /* Fill buffer with data */
GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->video_time_offset; GST_BUFFER_TIMESTAMP (outbuf) = pts * GST_MSECOND + demux->video_time_offset;