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 7ced8ddf41..3b262141fa 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 @@ -216,9 +216,13 @@ std::unique_ptr CloneSenderVideoFrame( original->GetData().data(), original->GetData().size()); EncodedImage encoded_image; encoded_image.SetEncodedData(encoded_image_buffer); + encoded_image._frameType = original->IsKeyFrame() + ? VideoFrameType::kVideoFrameKey + : VideoFrameType::kVideoFrameDelta; + // TODO(bugs.webrtc.org/14708): Fill in other EncodedImage parameters + VideoFrameMetadata metadata = original->Metadata(); RTPVideoHeader new_header = RTPVideoHeader::FromMetadata(metadata); - // TODO(bugs.webrtc.org/14708): Fill in other EncodedImage parameters return std::make_unique( encoded_image, new_header, original->GetPayloadType(), new_header.codec, original->GetTimestamp(), 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 075f680d11..ad1d0b3d99 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 @@ -58,9 +58,12 @@ class RtpSenderVideoFrameTransformerDelegateTest : public ::testing::Test { ~RtpSenderVideoFrameTransformerDelegateTest() override = default; std::unique_ptr GetTransformableFrame( - rtc::scoped_refptr delegate) { + rtc::scoped_refptr delegate, + bool key_frame = false) { EncodedImage encoded_image; encoded_image.SetEncodedData(EncodedImageBuffer::Create(1)); + encoded_image._frameType = key_frame ? VideoFrameType::kVideoFrameKey + : VideoFrameType::kVideoFrameDelta; std::unique_ptr frame = nullptr; EXPECT_CALL(*frame_transformer_, Transform) .WillOnce([&](std::unique_ptr @@ -154,16 +157,36 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneSenderVideoFrame) { GetTransformableFrame(delegate); ASSERT_TRUE(frame); - TransformableVideoFrameInterface* video_frame = - static_cast(frame.get()); + auto& video_frame = static_cast(*frame); std::unique_ptr clone = - CloneSenderVideoFrame(video_frame); + CloneSenderVideoFrame(&video_frame); - EXPECT_EQ(video_frame->IsKeyFrame(), clone->IsKeyFrame()); - EXPECT_EQ(video_frame->GetPayloadType(), clone->GetPayloadType()); - EXPECT_EQ(video_frame->GetSsrc(), clone->GetSsrc()); - EXPECT_EQ(video_frame->GetTimestamp(), clone->GetTimestamp()); - EXPECT_EQ(video_frame->Metadata(), clone->Metadata()); + EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame()); + EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType()); + EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc()); + EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp()); + EXPECT_EQ(clone->Metadata(), video_frame.Metadata()); +} + +TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneKeyFrame) { + 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, /*key_frame=*/true); + ASSERT_TRUE(frame); + + auto& video_frame = static_cast(*frame); + std::unique_ptr clone = + CloneSenderVideoFrame(&video_frame); + + EXPECT_EQ(clone->IsKeyFrame(), video_frame.IsKeyFrame()); + EXPECT_EQ(clone->GetPayloadType(), video_frame.GetPayloadType()); + EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc()); + EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp()); + EXPECT_EQ(clone->Metadata(), video_frame.Metadata()); } TEST_F(RtpSenderVideoFrameTransformerDelegateTest, MetadataAfterSetMetadata) { @@ -175,8 +198,7 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, MetadataAfterSetMetadata) { std::unique_ptr frame = GetTransformableFrame(delegate); ASSERT_TRUE(frame); - TransformableVideoFrameInterface* video_frame = - static_cast(frame.get()); + auto& video_frame = static_cast(*frame); VideoFrameMetadata metadata; metadata.SetFrameType(VideoFrameType::kVideoFrameKey); @@ -184,8 +206,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, MetadataAfterSetMetadata) { metadata.SetSsrc(2222); metadata.SetCsrcs({1, 2, 3}); - video_frame->SetMetadata(metadata); - VideoFrameMetadata actual_metadata = video_frame->Metadata(); + video_frame.SetMetadata(metadata); + VideoFrameMetadata actual_metadata = video_frame.Metadata(); // TODO(bugs.webrtc.org/14708): Just EXPECT_EQ the whole Metadata once the // equality operator lands.