decklinkvideosink: Get our own "start time" instead of the one of the pipeline
authorSebastian Dröge <sebastian@centricular.com>
Tue, 13 Jan 2015 16:44:17 +0000 (17:44 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 13 Jan 2015 16:44:17 +0000 (17:44 +0100)
decklinkvideosink might be added later to the pipeline, or its state might
be handled separately from the pipeline. In which case the running time when
we (last) went into PLAYING state will be different from the pipeline's.

However we need our own start time to tell the Decklink API, which running
time should be displayed at the moment we go to PLAYING and start scheduled
rendering.

sys/decklink/gstdecklinkvideosink.cpp

index 72e3b5addbba1c745fdd2256e4c97aa7efff8ea1..62f19a1b28e34183fbcdf61a1623a089da53607e 100644 (file)
@@ -537,9 +537,15 @@ gst_decklink_video_sink_change_state (GstElement * element,
       gst_clock_set_master (self->output->clock, NULL);
       break;
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
-      GstClockTime start_time = gst_element_get_start_time (element);
+      GstClockTime start_time;
       HRESULT res;
 
+      // FIXME: start time is the same for the complete pipeline,
+      // but what we need here is the start time of this element!
+      start_time = gst_element_get_base_time (element);
+      if (start_time != GST_CLOCK_TIME_NONE)
+        start_time = gst_clock_get_time (GST_ELEMENT_CLOCK (self)) - start_time;
+
       // FIXME: This will probably not work
       if (start_time == GST_CLOCK_TIME_NONE)
         start_time = 0;
@@ -563,9 +569,15 @@ gst_decklink_video_sink_change_state (GstElement * element,
       break;
     }
     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:{
-      GstClockTime start_time = gst_element_get_start_time (element);
+      GstClockTime start_time;
       HRESULT res;
 
+      // FIXME: start time is the same for the complete pipeline,
+      // but what we need here is the start time of this element!
+      start_time = gst_element_get_base_time (element);
+      if (start_time != GST_CLOCK_TIME_NONE)
+        start_time = gst_clock_get_time (GST_ELEMENT_CLOCK (self)) - start_time;
+
       // FIXME: This will probably not work
       if (start_time == GST_CLOCK_TIME_NONE)
         start_time = 0;