From b459deaf380fb95ad0275dbe9e92cb7a8b4b99e5 Mon Sep 17 00:00:00 2001 From: Tony Herre Date: Mon, 6 Feb 2023 16:37:43 +0100 Subject: [PATCH] Add ssrc to VideoFrameMetadata used in encoded transforms This allows callers to modify an encoded video frame's SSRC via the setMetadata() call, which we'd like to do from Chrome, to allow using an encoded frame from one PC on a different one. Bug: webrtc:14709 Change-Id: Ia6b33761a3f63038f6eabbcd848916877e24454b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/292380 Auto-Submit: Tony Herre Reviewed-by: Harald Alvestrand Commit-Queue: Harald Alvestrand Cr-Commit-Position: refs/heads/main@{#39266} --- api/video/video_frame_metadata.cc | 8 ++++++++ api/video/video_frame_metadata.h | 4 ++++ .../rtp_sender_video_frame_transformer_delegate.cc | 9 +++++---- ...p_video_stream_receiver_frame_transformer_delegate.cc | 7 +++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/api/video/video_frame_metadata.cc b/api/video/video_frame_metadata.cc index 6efb6ad875..df33cf5566 100644 --- a/api/video/video_frame_metadata.cc +++ b/api/video/video_frame_metadata.cc @@ -136,6 +136,14 @@ void VideoFrameMetadata::SetRTPVideoHeaderCodecSpecifics( codec_specifics_ = std::move(codec_specifics); } +uint32_t VideoFrameMetadata::GetSsrc() const { + return ssrc_; +} + +void VideoFrameMetadata::SetSsrc(uint32_t ssrc) { + ssrc_ = ssrc; +} + std::vector VideoFrameMetadata::GetCsrcs() const { return csrcs_; } diff --git a/api/video/video_frame_metadata.h b/api/video/video_frame_metadata.h index f8f144e9b9..5a1c0edde7 100644 --- a/api/video/video_frame_metadata.h +++ b/api/video/video_frame_metadata.h @@ -89,6 +89,8 @@ class RTC_EXPORT VideoFrameMetadata { void SetRTPVideoHeaderCodecSpecifics( RTPVideoHeaderCodecSpecifics codec_specifics); + uint32_t GetSsrc() const; + void SetSsrc(uint32_t ssrc); std::vector GetCsrcs() const; void SetCsrcs(std::vector csrcs); @@ -111,6 +113,8 @@ class RTC_EXPORT VideoFrameMetadata { VideoCodecType codec_ = VideoCodecType::kVideoCodecGeneric; RTPVideoHeaderCodecSpecifics codec_specifics_; + // RTP info. + uint32_t ssrc_; std::vector csrcs_; }; } // namespace webrtc diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc index ecf8aedf83..bcdfc1f829 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -41,10 +41,10 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { codec_type_(codec_type), timestamp_(rtp_timestamp), capture_time_ms_(encoded_image.capture_time_ms_), - expected_retransmission_time_ms_(expected_retransmission_time_ms), - ssrc_(ssrc) { + expected_retransmission_time_ms_(expected_retransmission_time_ms) { RTC_DCHECK_GE(payload_type_, 0); RTC_DCHECK_LE(payload_type_, 127); + metadata_.SetSsrc(ssrc); metadata_.SetCsrcs(std::move(csrcs)); } @@ -60,7 +60,7 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { } uint32_t GetTimestamp() const override { return timestamp_; } - uint32_t GetSsrc() const override { return ssrc_; } + uint32_t GetSsrc() const override { return metadata_.GetSsrc(); } bool IsKeyFrame() const override { return frame_type_ == VideoFrameType::kVideoFrameKey; @@ -73,11 +73,13 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { const VideoFrameMetadata& GetMetadata() const override { return metadata_; } void SetMetadata(const VideoFrameMetadata& metadata) override { header_.SetFromMetadata(metadata); + uint32_t ssrc = metadata.GetSsrc(); std::vector csrcs = metadata.GetCsrcs(); // We have to keep a local copy because GetMetadata() has to return a // reference. metadata_ = header_.GetAsMetadata(); + metadata_.SetSsrc(ssrc); metadata_.SetCsrcs(std::move(csrcs)); } @@ -106,7 +108,6 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { const uint32_t timestamp_; const int64_t capture_time_ms_; const absl::optional expected_retransmission_time_ms_; - const uint32_t ssrc_; }; } // namespace diff --git a/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.cc b/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.cc index 501337a0d2..1554625baa 100644 --- a/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.cc +++ b/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate.cc @@ -27,8 +27,8 @@ class TransformableVideoReceiverFrame TransformableVideoReceiverFrame(std::unique_ptr frame, uint32_t ssrc) : frame_(std::move(frame)), - metadata_(frame_->GetRtpVideoHeader().GetAsMetadata()), - ssrc_(ssrc) { + metadata_(frame_->GetRtpVideoHeader().GetAsMetadata()) { + metadata_.SetSsrc(ssrc); metadata_.SetCsrcs(frame_->Csrcs()); } ~TransformableVideoReceiverFrame() override = default; @@ -44,7 +44,7 @@ class TransformableVideoReceiverFrame } uint8_t GetPayloadType() const override { return frame_->PayloadType(); } - uint32_t GetSsrc() const override { return ssrc_; } + uint32_t GetSsrc() const override { return metadata_.GetSsrc(); } uint32_t GetTimestamp() const override { return frame_->Timestamp(); } bool IsKeyFrame() const override { @@ -70,7 +70,6 @@ class TransformableVideoReceiverFrame private: std::unique_ptr frame_; VideoFrameMetadata metadata_; - const uint32_t ssrc_; }; } // namespace