Skip to content

Instantly share code, notes, and snippets.

Created March 3, 2016 19:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/4134e375bffdc4052819 to your computer and use it in GitHub Desktop.
Save anonymous/4134e375bffdc4052819 to your computer and use it in GitHub Desktop.
diff --git a/gstdvbaudiosink.c b/gstdvbaudiosink.c
index 3a92624..c8a24e4 100644
--- a/gstdvbaudiosink.c
+++ b/gstdvbaudiosink.c
@@ -911,7 +911,7 @@ static gboolean gst_dvbaudiosink_event(GstBaseSink *sink, GstEvent *event)
pos = segment->position;
#endif
GST_DEBUG_OBJECT(self, "GST_EVENT_NEWSEGMENT rate=%f %d\n", rate, format);
-
+ GST_DEBUG_OBJECT (self, "configured segment %" GST_SEGMENT_FORMAT, segment);
if (format == GST_FORMAT_TIME)
{
self->timestamp_offset = start - pos;
diff --git a/gstdvbvideosink.c b/gstdvbvideosink.c
index f8cd1a5..54ea2f0 100644
--- a/gstdvbvideosink.c
+++ b/gstdvbvideosink.c
@@ -339,6 +339,7 @@ static void gst_dvbvideosink_init(GstDVBVideoSink *self, GstDVBVideoSinkClass *g
static void gst_dvbvideosink_init(GstDVBVideoSink *self)
#endif
{
+ self->wait_for_keyframe = FALSE;
self->must_send_header = TRUE;
self->h264_nal_len_size = 0;
self->pesheader_buffer = NULL;
@@ -456,6 +457,7 @@ static gboolean gst_dvbvideosink_event(GstBaseSink *sink, GstEvent *event)
queue_pop(&self->queue);
}
self->flushing = FALSE;
+ self->wait_for_keyframe = TRUE;
GST_OBJECT_UNLOCK(self);
break;
case GST_EVENT_EOS:
@@ -531,6 +533,7 @@ static gboolean gst_dvbvideosink_event(GstBaseSink *sink, GstEvent *event)
pos = segment->position;
#endif
GST_DEBUG_OBJECT(self, "GST_EVENT_NEWSEGMENT rate=%f\n", rate);
+ GST_DEBUG_OBJECT (self, "configured segment %" GST_SEGMENT_FORMAT, segment);
if (format == GST_FORMAT_TIME)
{
self->timestamp_offset = start - pos;
@@ -750,6 +753,16 @@ static GstFlowReturn gst_dvbvideosink_render(GstBaseSink *sink, GstBuffer *buffe
{
return GST_FLOW_OK;
}
+ if (self->wait_for_keyframe)
+ {
+ if (GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT))
+ {
+ GST_DEBUG_OBJECT(self, "dropping non-keyframe buffer");
+ return GST_FLOW_OK;
+ }
+ else
+ self->wait_for_keyframe = FALSE;
+ }
#if GST_VERSION_MAJOR < 1
pes_header = GST_BUFFER_DATA(self->pesheader_buffer);
diff --git a/gstdvbvideosink.h b/gstdvbvideosink.h
index c889e24..a0f0d55 100644
--- a/gstdvbvideosink.h
+++ b/gstdvbvideosink.h
@@ -109,6 +109,7 @@ struct _GstDVBVideoSink
char saved_fallback_framerate[16];
+ gboolean wait_for_keyframe;
gdouble rate;
gboolean playing, paused, flushing, unlocking;
gboolean pts_written;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment