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}
This commit is contained in:
Tony Herre 2023-03-17 12:59:51 +00:00 committed by WebRTC LUCI CQ
parent ad192a8c5e
commit 5dc09587fa
2 changed files with 40 additions and 14 deletions

View File

@ -216,9 +216,13 @@ std::unique_ptr<TransformableVideoFrameInterface> 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<TransformableVideoSenderFrame>(
encoded_image, new_header, original->GetPayloadType(), new_header.codec,
original->GetTimestamp(),

View File

@ -58,9 +58,12 @@ class RtpSenderVideoFrameTransformerDelegateTest : public ::testing::Test {
~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 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneSenderVideoFrame) {
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 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, MetadataAfterSetMetadata) {
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 @@ 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.