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:
parent
ad192a8c5e
commit
5dc09587fa
@ -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(),
|
||||
|
||||
@ -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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user