diff --git a/api/frame_transformer_interface.h b/api/frame_transformer_interface.h index 73d27027cc..8effdcf26d 100644 --- a/api/frame_transformer_interface.h +++ b/api/frame_transformer_interface.h @@ -36,6 +36,8 @@ class TransformableFrameInterface { virtual uint8_t GetPayloadType() const = 0; virtual uint32_t GetSsrc() const = 0; virtual uint32_t GetTimestamp() const = 0; + virtual void SetRTPTimestamp(uint32_t timestamp) = 0; + // TODO(https://bugs.webrtc.org/14878): Change this to pure virtual after it // is implemented everywhere. virtual absl::optional GetCaptureTimeIdentifier() const { @@ -68,8 +70,6 @@ class TransformableAudioFrameInterface : public TransformableFrameInterface { public: virtual ~TransformableAudioFrameInterface() = default; - virtual void SetRTPTimestamp(uint32_t timestamp) = 0; - // TODO(crbug.com/1453226): Remove after a few weeks. [[deprecated("Use specific getters instead.")]] virtual const RTPHeader& GetHeader() const = 0; diff --git a/api/test/mock_transformable_video_frame.h b/api/test/mock_transformable_video_frame.h index eab02d7e00..749d2bddab 100644 --- a/api/test/mock_transformable_video_frame.h +++ b/api/test/mock_transformable_video_frame.h @@ -24,6 +24,7 @@ class MockTransformableVideoFrame MOCK_METHOD(rtc::ArrayView, GetData, (), (const, override)); MOCK_METHOD(void, SetData, (rtc::ArrayView data), (override)); MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override)); + MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override)); MOCK_METHOD(uint32_t, GetSsrc, (), (const, override)); MOCK_METHOD(bool, IsKeyFrame, (), (const, override)); MOCK_METHOD(void, 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 29c33f7b0e..928c73f5cc 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 @@ -64,6 +64,8 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { } uint32_t GetTimestamp() const override { return timestamp_; } + void SetRTPTimestamp(uint32_t timestamp) override { timestamp_ = timestamp; } + uint32_t GetSsrc() const override { return ssrc_; } bool IsKeyFrame() const override { @@ -104,7 +106,7 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { const VideoFrameType frame_type_; const uint8_t payload_type_; const absl::optional codec_type_ = absl::nullopt; - const uint32_t timestamp_; + uint32_t timestamp_; const int64_t capture_time_ms_; const absl::optional capture_time_identifier_; const absl::optional expected_retransmission_time_ms_; diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc index 51de035ea5..50af8e9b34 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc @@ -270,5 +270,23 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, event.Wait(TimeDelta::Seconds(1)); } +TEST_F(RtpSenderVideoFrameTransformerDelegateTest, SettingRTPTimestamp) { + auto delegate = rtc::make_ref_counted( + &test_sender_, frame_transformer_, + /*ssrc=*/1111, /*csrcs=*/std::vector(), + time_controller_.CreateTaskQueueFactory().get()); + + std::unique_ptr frame = + GetTransformableFrame(delegate); + ASSERT_TRUE(frame); + auto& video_frame = static_cast(*frame); + + uint32_t rtp_timestamp = 12345; + ASSERT_FALSE(video_frame.GetTimestamp() == rtp_timestamp); + + video_frame.SetRTPTimestamp(rtp_timestamp); + EXPECT_EQ(video_frame.GetTimestamp(), rtp_timestamp); +} + } // namespace } // namespace webrtc 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 aa5c8dfa28..e9359b85da 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 @@ -48,6 +48,9 @@ class TransformableVideoReceiverFrame uint8_t GetPayloadType() const override { return frame_->PayloadType(); } uint32_t GetSsrc() const override { return metadata_.GetSsrc(); } uint32_t GetTimestamp() const override { return frame_->Timestamp(); } + void SetRTPTimestamp(uint32_t timestamp) override { + frame_->SetTimestamp(timestamp); + } bool IsKeyFrame() const override { return frame_->FrameType() == VideoFrameType::kVideoFrameKey; diff --git a/test/mock_transformable_frame.h b/test/mock_transformable_frame.h index 039013f218..9361aaeb06 100644 --- a/test/mock_transformable_frame.h +++ b/test/mock_transformable_frame.h @@ -23,6 +23,7 @@ class MockTransformableFrame : public TransformableFrameInterface { MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override)); MOCK_METHOD(uint32_t, GetSsrc, (), (const, override)); MOCK_METHOD(uint32_t, GetTimestamp, (), (const, override)); + MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override)); }; } // namespace webrtc