Skip to content

Commit 6f314f3

Browse files
committed
[GStreamer][WebRTC] Request video key-frame when connecting incoming streams
https://bugs.webkit.org/show_bug.cgi?id=273238 Reviewed by Xabier Rodriguez-Calvar. In some cases of remote peer sending H.264, the resulting depayloaded bitstream might not contain SPS/PPS informations required for decoding. Without these the parser would discard frames until the stream can be parsed, potentially leading to delay in setting up the video decoder. To workaround this issue, issue a key-frame request as soon as a new src pad is exposed on webrtcbin, and also when adding video pads to the mediastreamsrc element. * Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.cpp: (WebCore::GStreamerIncomingTrackProcessor::incomingTrackProcessor): * Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp: (webkitMediaStreamSrcPadProbeCb): Canonical link: https://commits.webkit.org/277980@main
1 parent 95cae32 commit 6f314f3

2 files changed

Lines changed: 8 additions & 0 deletions

File tree

Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ GRefPtr<GstElement> GStreamerIncomingTrackProcessor::incomingTrackProcessor()
128128
if (m_data.type == RealtimeMediaSource::Type::Audio)
129129
return createParser();
130130

131+
GST_DEBUG_OBJECT(m_bin.get(), "Requesting a key-frame");
132+
gst_pad_send_event(m_pad.get(), gst_video_event_new_upstream_force_key_unit(GST_CLOCK_TIME_NONE, TRUE, 1));
133+
131134
bool forceEarlyVideoDecoding = !g_strcmp0(g_getenv("WEBKIT_GST_WEBRTC_FORCE_EARLY_VIDEO_DECODING"), "1");
132135
GST_DEBUG_OBJECT(m_bin.get(), "Configuring for input caps: %" GST_PTR_FORMAT "%s", m_data.caps.get(), forceEarlyVideoDecoding ? " and early decoding" : "");
133136
if (!forceEarlyVideoDecoding) {

Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,11 @@ static GstPadProbeReturn webkitMediaStreamSrcPadProbeCb(GstPad* pad, GstPadProbe
10571057
return GST_PAD_PROBE_REMOVE;
10581058
}
10591059

1060+
if (data->sourceType == RealtimeMediaSource::Type::Video) {
1061+
GST_DEBUG_OBJECT(self, "Requesting a key-frame");
1062+
gst_pad_send_event(pad, gst_video_event_new_upstream_force_key_unit(GST_CLOCK_TIME_NONE, TRUE, 1));
1063+
}
1064+
10601065
auto* streamStart = gst_event_new_stream_start(data->trackId.get());
10611066
gst_event_set_group_id(streamStart, 1);
10621067
gst_pad_push_event(pad, streamStart);

0 commit comments

Comments
 (0)