Skip to content

Commit

Permalink
Cherry-pick 275226@main (277513e). https://bugs.webkit.org/show_bug.c…
Browse files Browse the repository at this point in the history
…gi?id=269903

    [LibWebRTC][GStreamer] Clean-up GstSample ownership semantics in LibWebRTC VideoFrame
    https://bugs.webkit.org/show_bug.cgi?id=269903

    Reviewed by Xabier Rodriguez-Calvar.

    The sample reference can be moved to the VideoFrame.

    * Source/WebCore/platform/mediastream/libwebrtc/gstreamer/GStreamerVideoDecoderFactory.cpp:
    (WebCore::GStreamerVideoDecoder::pullSample):
    * Source/WebCore/platform/mediastream/libwebrtc/gstreamer/GStreamerVideoFrameLibWebRTC.cpp:
    (WebCore::convertGStreamerSampleToLibWebRTCVideoFrame):
    (WebCore::GStreamerVideoFrameLibWebRTC::create):
    * Source/WebCore/platform/mediastream/libwebrtc/gstreamer/GStreamerVideoFrameLibWebRTC.h:
    (WebCore::GStreamerVideoFrameLibWebRTC::GStreamerVideoFrameLibWebRTC):

    Canonical link: https://commits.webkit.org/275226@main

Canonical link: https://commits.webkit.org/274313.181@webkitglib/2.44
  • Loading branch information
philn authored and aperezdc committed Apr 30, 2024
1 parent e8ae6ff commit eef9441
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ class GStreamerWebRTCVideoDecoder : public webrtc::VideoDecoder {
auto timestamps = m_dtsPtsMap[GST_BUFFER_PTS(buffer)];
m_dtsPtsMap.erase(GST_BUFFER_PTS(buffer));

auto frame(convertGStreamerSampleToLibWebRTCVideoFrame(sample, webrtc::kVideoRotation_0,
auto frame(convertGStreamerSampleToLibWebRTCVideoFrame(WTFMove(sample), webrtc::kVideoRotation_0,
timestamps.timestamp, timestamps.renderTimeMs));

GST_BUFFER_DTS(buffer) = GST_CLOCK_TIME_NONE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,20 @@ GRefPtr<GstSample> convertLibWebRTCVideoFrameToGStreamerSample(const webrtc::Vid
return sample;
}

std::unique_ptr<webrtc::VideoFrame> convertGStreamerSampleToLibWebRTCVideoFrame(GRefPtr<GstSample>& sample, webrtc::VideoRotation rotation, int64_t timestamp, int64_t renderTimeMs)
std::unique_ptr<webrtc::VideoFrame> convertGStreamerSampleToLibWebRTCVideoFrame(GRefPtr<GstSample>&& sample, webrtc::VideoRotation rotation, int64_t timestamp, int64_t renderTimeMs)
{
auto frameBuffer(GStreamerVideoFrameLibWebRTC::create(sample));
return std::unique_ptr<webrtc::VideoFrame>(new webrtc::VideoFrame(frameBuffer, timestamp, renderTimeMs, rotation));
auto frameBuffer(GStreamerVideoFrameLibWebRTC::create(WTFMove(sample)));
return std::unique_ptr<webrtc::VideoFrame>(new webrtc::VideoFrame(WTFMove(frameBuffer), timestamp, renderTimeMs, rotation));
}

rtc::scoped_refptr<webrtc::VideoFrameBuffer> GStreamerVideoFrameLibWebRTC::create(const GRefPtr<GstSample>& sample)
rtc::scoped_refptr<webrtc::VideoFrameBuffer> GStreamerVideoFrameLibWebRTC::create(GRefPtr<GstSample>&& sample)
{
GstVideoInfo info;

if (!gst_video_info_from_caps(&info, gst_sample_get_caps(sample.get())))
ASSERT_NOT_REACHED();

return rtc::scoped_refptr<webrtc::VideoFrameBuffer>(new GStreamerVideoFrameLibWebRTC(sample, info));
return rtc::scoped_refptr<webrtc::VideoFrameBuffer>(new GStreamerVideoFrameLibWebRTC(WTFMove(sample), info));
}

rtc::scoped_refptr<webrtc::I420BufferInterface> GStreamerVideoFrameLibWebRTC::ToI420()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,17 @@ namespace WebCore {

WARN_UNUSED_RETURN GRefPtr<GstSample> convertLibWebRTCVideoFrameToGStreamerSample(const webrtc::VideoFrame&);

std::unique_ptr<webrtc::VideoFrame> convertGStreamerSampleToLibWebRTCVideoFrame(GRefPtr<GstSample>&, webrtc::VideoRotation, int64_t timestamp, int64_t renderTimeMs);
std::unique_ptr<webrtc::VideoFrame> convertGStreamerSampleToLibWebRTCVideoFrame(GRefPtr<GstSample>&&, webrtc::VideoRotation, int64_t timestamp, int64_t renderTimeMs);

class GStreamerVideoFrameLibWebRTC : public rtc::RefCountedObject<webrtc::VideoFrameBuffer> {
public:
GStreamerVideoFrameLibWebRTC(const GRefPtr<GstSample>& sample, GstVideoInfo info)
: m_sample(sample)
, m_info(info) { }
GStreamerVideoFrameLibWebRTC(GRefPtr<GstSample>&& sample, GstVideoInfo info)
: m_sample(WTFMove(sample))
, m_info(info)
{
}

static rtc::scoped_refptr<webrtc::VideoFrameBuffer> create(const GRefPtr<GstSample>&);
static rtc::scoped_refptr<webrtc::VideoFrameBuffer> create(GRefPtr<GstSample>&&);

GstSample* getSample() const { return m_sample.get(); }
rtc::scoped_refptr<webrtc::I420BufferInterface> ToI420() final;
Expand Down

0 comments on commit eef9441

Please sign in to comment.