Title: [234457] trunk/Source/WebCore
Revision
234457
Author
[email protected]
Date
2018-08-01 06:35:38 -0700 (Wed, 01 Aug 2018)

Log Message

[GStreamer] Make sure that first buffer running time is 0 in GStreamerMediaStreamSource
https://bugs.webkit.org/show_bug.cgi?id=188210

This is a live source and the first frame is the beginning of the stream,
but that doesn't mean that the incoming stream from the camera didn't start
before. We need to set a pad offset on each srcpad of the source to compensate
for that. This is the exact same logic as in webrtc GStreamerVideo/Enc/Dec/oder.

Patch by Thibault Saunier <[email protected]> on 2018-08-01
Reviewed by Alejandro G. Castro.

* platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
(WebCore::webkit_media_stream_src_init):
(WebCore::webkitMediaStreamSrcPushVideoSample):
(WebCore::webkitMediaStreamSrcPushAudioSample):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (234456 => 234457)


--- trunk/Source/WebCore/ChangeLog	2018-08-01 12:10:13 UTC (rev 234456)
+++ trunk/Source/WebCore/ChangeLog	2018-08-01 13:35:38 UTC (rev 234457)
@@ -1,3 +1,20 @@
+2018-08-01  Thibault Saunier  <[email protected]>
+
+        [GStreamer] Make sure that first buffer running time is 0 in GStreamerMediaStreamSource
+        https://bugs.webkit.org/show_bug.cgi?id=188210
+
+        This is a live source and the first frame is the beginning of the stream,
+        but that doesn't mean that the incoming stream from the camera didn't start
+        before. We need to set a pad offset on each srcpad of the source to compensate
+        for that. This is the exact same logic as in webrtc GStreamerVideo/Enc/Dec/oder.
+
+        Reviewed by Alejandro G. Castro.
+
+        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
+        (WebCore::webkit_media_stream_src_init):
+        (WebCore::webkitMediaStreamSrcPushVideoSample):
+        (WebCore::webkitMediaStreamSrcPushAudioSample):
+
 2018-08-01  Zan Dobersek  <[email protected]>
 
         [CoordGraphics] Move CoordinatedBackingStore to WebCore

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (234456 => 234457)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2018-08-01 12:10:13 UTC (rev 234456)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2018-08-01 13:35:38 UTC (rev 234457)
@@ -149,7 +149,9 @@
     gchar* uri;
 
     GstElement* audioSrc;
+    GstClockTime firstAudioBufferPts;
     GstElement* videoSrc;
+    GstClockTime firstFramePts;
 
     std::unique_ptr<WebKitMediaStreamTrackObserver> observer;
     String videoTrackID;
@@ -320,6 +322,8 @@
 {
     self->observer = std::make_unique<WebKitMediaStreamTrackObserver>(self);
     self->flowCombiner = gst_flow_combiner_new();
+    self->firstAudioBufferPts = GST_CLOCK_TIME_NONE;
+    self->firstFramePts = GST_CLOCK_TIME_NONE;
 }
 
 typedef struct {
@@ -485,14 +489,31 @@
 
 static void webkitMediaStreamSrcPushVideoSample(WebKitMediaStreamSrc* self, GstSample* gstsample)
 {
-    if (self->videoSrc)
+    if (self->videoSrc) {
+        if (!GST_CLOCK_TIME_IS_VALID(self->firstFramePts)) {
+            auto buffer = gst_sample_get_buffer(gstsample);
+
+            self->firstFramePts = GST_BUFFER_PTS(buffer);
+            auto pad = adoptGRef(gst_element_get_static_pad(self->videoSrc, "src"));
+            gst_pad_set_offset(pad.get(), -self->firstFramePts);
+        }
+
         gst_app_src_push_sample(GST_APP_SRC(self->videoSrc), gstsample);
+    }
 }
 
 static void webkitMediaStreamSrcPushAudioSample(WebKitMediaStreamSrc* self, GstSample* gstsample)
 {
-    if (self->audioSrc)
+    if (self->audioSrc) {
+        if (!GST_CLOCK_TIME_IS_VALID(self->firstAudioBufferPts)) {
+            auto buffer = gst_sample_get_buffer(gstsample);
+
+            self->firstAudioBufferPts = GST_BUFFER_PTS(buffer);
+            auto pad = adoptGRef(gst_element_get_static_pad(self->audioSrc, "src"));
+            gst_pad_set_offset(pad.get(), -self->firstAudioBufferPts);
+        }
         gst_app_src_push_sample(GST_APP_SRC(self->audioSrc), gstsample);
+    }
 }
 
 static void webkitMediaStreamSrcTrackEnded(WebKitMediaStreamSrc* self,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to