From: Sebastian Dröge Date: Tue, 5 Apr 2016 11:49:51 +0000 (+0300) Subject: decklinkaudiosrc: Don't accept packets without timestamps after a discont X-Git-Tag: 1.19.3~507^2~6776 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f06647fd0ce6ae1682426c446f9066ecdf942045;p=platform%2Fupstream%2Fgstreamer.git decklinkaudiosrc: Don't accept packets without timestamps after a discont We have no idea which timestamps they are supposed to have so the only thing we can do at this point is to drop them. Packets without timestamps happen if audio was captured but no corresponding video, which shouldn't happen under normal circumstances. https://bugzilla.gnome.org/show_bug.cgi?id=747633 --- diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index 4211741..56d92b0 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -411,7 +411,8 @@ gst_decklink_audio_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter) static void gst_decklink_audio_src_got_packet (GstElement * element, - IDeckLinkAudioInputPacket * packet, GstClockTime capture_time, gboolean discont) + IDeckLinkAudioInputPacket * packet, GstClockTime capture_time, + gboolean discont) { GstDecklinkAudioSrc *self = GST_DECKLINK_AUDIO_SRC_CAST (element); GstDecklinkVideoSrc *videosrc = NULL; @@ -470,6 +471,7 @@ gst_decklink_audio_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) guint64 start_offset, end_offset; gboolean discont = FALSE; +retry: g_mutex_lock (&self->lock); while (g_queue_is_empty (&self->current_packets) && !self->flushing) { g_cond_wait (&self->cond, &self->lock); @@ -489,6 +491,13 @@ gst_decklink_audio_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) sample_count = p->packet->GetSampleFrameCount (); data_size = self->info.bpf * sample_count; + if (p->capture_time == GST_CLOCK_TIME_NONE && self->next_offset == (guint64) - 1) { + GST_DEBUG_OBJECT (self, "Got packet without timestamp before initial " + "timestamp after discont - dropping"); + capture_packet_free (p); + goto retry; + } + ap = (AudioPacket *) g_malloc0 (sizeof (AudioPacket)); *buffer =