Ensure frame type is copied over for cloned sender frames
Previously cloned frames ended up with the metadata saying it was a
delta frame, even for keyframes.
Bug: chromium:1425362
Change-Id: I7a9438f124b75f6be9a5705d20fa65b2f7179a22
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298020
Commit-Queue: Tony Herre <herre@google.com>
Auto-Submit: Tony Herre <herre@google.com>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39588}
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 7ced8dd..3b26214 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 @@
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<TransformableVideoSenderFrame>(
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 075f680..ad1d0b3 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 @@
~RtpSenderVideoFrameTransformerDelegateTest() override = default;
std::unique_ptr<TransformableFrameInterface> GetTransformableFrame(
- rtc::scoped_refptr<RTPSenderVideoFrameTransformerDelegate> delegate) {
+ rtc::scoped_refptr<RTPSenderVideoFrameTransformerDelegate> 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<TransformableFrameInterface> frame = nullptr;
EXPECT_CALL(*frame_transformer_, Transform)
.WillOnce([&](std::unique_ptr<TransformableFrameInterface>
@@ -154,16 +157,36 @@
GetTransformableFrame(delegate);
ASSERT_TRUE(frame);
- TransformableVideoFrameInterface* video_frame =
- static_cast<TransformableVideoFrameInterface*>(frame.get());
+ auto& video_frame = static_cast<TransformableVideoFrameInterface&>(*frame);
std::unique_ptr<TransformableVideoFrameInterface> 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<RTPSenderVideoFrameTransformerDelegate>(
+ &test_sender_, frame_transformer_,
+ /*ssrc=*/1111, /*csrcs=*/std::vector<uint32_t>(),
+ time_controller_.CreateTaskQueueFactory().get());
+
+ std::unique_ptr<TransformableFrameInterface> frame =
+ GetTransformableFrame(delegate, /*key_frame=*/true);
+ ASSERT_TRUE(frame);
+
+ auto& video_frame = static_cast<TransformableVideoFrameInterface&>(*frame);
+ std::unique_ptr<TransformableVideoFrameInterface> 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 @@
std::unique_ptr<TransformableFrameInterface> frame =
GetTransformableFrame(delegate);
ASSERT_TRUE(frame);
- TransformableVideoFrameInterface* video_frame =
- static_cast<TransformableVideoFrameInterface*>(frame.get());
+ auto& video_frame = static_cast<TransformableVideoFrameInterface&>(*frame);
VideoFrameMetadata metadata;
metadata.SetFrameType(VideoFrameType::kVideoFrameKey);
@@ -184,8 +206,8 @@
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.