From 1ebfb6aac7534cffc1c671c3b775b1a4d8e4594b Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Thu, 3 Jan 2019 23:49:37 +0100 Subject: [PATCH] Introduce VideoFrame::id to keep track of frames inside application. Also switch webrtc code from deprecated constructors to the builder API. Change-Id: Ie325bf1e9b4ff1e413fef3431ced8ed9ff725107 Bug: webrtc:10138 Reviewed-on: https://webrtc-review.googlesource.com/c/114422 Reviewed-by: Stefan Holmer Reviewed-by: Niels Moller Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/master@{#26132} --- api/video/video_frame.cc | 13 +++- api/video/video_frame.h | 15 +++- api/video_codecs/test/BUILD.gn | 1 + ...oder_software_fallback_wrapper_unittest.cc | 9 ++- common_video/BUILD.gn | 1 + common_video/libyuv/libyuv_unittest.cc | 8 ++- common_video/video_frame_unittest.cc | 19 +++-- media/base/adaptedvideotracksource.cc | 12 +++- media/base/fakeframesource.cc | 7 +- media/base/fakevideocapturer.cc | 10 ++- media/base/videobroadcaster.cc | 12 +++- media/base/videobroadcaster_unittest.cc | 20 ++++-- media/base/videocapturer.cc | 12 +++- media/engine/simulcast_encoder_adapter.cc | 10 ++- .../simulcast_encoder_adapter_unittest.cc | 35 +++++++-- media/engine/webrtcvideoengine_unittest.cc | 37 +++++++--- modules/video_capture/BUILD.gn | 1 + .../test/video_capture_unittest.cc | 9 ++- modules/video_capture/video_capture_impl.cc | 9 ++- modules/video_coding/BUILD.gn | 1 + .../codecs/h264/h264_decoder_impl.cc | 15 ++-- .../multiplex/multiplex_decoder_adapter.cc | 21 ++++-- .../multiplex/multiplex_encoder_adapter.cc | 9 ++- .../test/multiplex_adapter_unittest.cc | 41 +++++++---- .../codecs/test/videoprocessor.cc | 19 +++-- modules/video_coding/generic_encoder.cc | 9 ++- .../utility/simulcast_test_fixture_impl.cc | 33 ++++++--- modules/video_coding/video_sender.cc | 11 +-- modules/video_coding/video_sender_unittest.cc | 9 ++- sdk/android/src/jni/androidmediadecoder.cc | 7 +- sdk/android/src/jni/androidmediaencoder.cc | 9 ++- .../src/jni/androidvideotracksource.cc | 6 +- sdk/android/src/jni/videoframe.cc | 9 ++- .../native/src/objc_video_decoder_factory.mm | 11 +-- .../native/src/objc_video_track_source.mm | 6 +- .../objc_video_encoder_factory_tests.mm | 12 +++- test/fake_decoder.cc | 9 ++- test/fake_texture_frame.cc | 9 ++- test/fake_vp8_decoder.cc | 9 ++- test/frame_generator.cc | 42 +++++++---- test/test_video_capturer.cc | 8 ++- video/overuse_frame_detector_unittest.cc | 72 ++++++++++++++----- video/receive_statistics_proxy_unittest.cc | 42 ++++++++--- video/video_send_stream_tests.cc | 7 +- video/video_stream_decoder_impl.cc | 8 ++- video/video_stream_encoder.cc | 10 ++- video/video_stream_encoder_unittest.cc | 33 ++++++--- 47 files changed, 538 insertions(+), 179 deletions(-) diff --git a/api/video/video_frame.cc b/api/video/video_frame.cc index eaae33b2b3..c80ee8bc3b 100644 --- a/api/video/video_frame.cc +++ b/api/video/video_frame.cc @@ -20,7 +20,7 @@ VideoFrame::Builder::Builder() = default; VideoFrame::Builder::~Builder() = default; VideoFrame VideoFrame::Builder::build() { - return VideoFrame(video_frame_buffer_, timestamp_us_, timestamp_rtp_, + return VideoFrame(id_, video_frame_buffer_, timestamp_us_, timestamp_rtp_, ntp_time_ms_, rotation_, color_space_); } @@ -71,6 +71,11 @@ VideoFrame::Builder& VideoFrame::Builder::set_color_space( return *this; } +VideoFrame::Builder& VideoFrame::Builder::set_id(uint16_t id) { + id_ = id; + return *this; +} + VideoFrame::VideoFrame(const rtc::scoped_refptr& buffer, webrtc::VideoRotation rotation, int64_t timestamp_us) @@ -92,13 +97,15 @@ VideoFrame::VideoFrame(const rtc::scoped_refptr& buffer, RTC_DCHECK(buffer); } -VideoFrame::VideoFrame(const rtc::scoped_refptr& buffer, +VideoFrame::VideoFrame(uint16_t id, + const rtc::scoped_refptr& buffer, int64_t timestamp_us, uint32_t timestamp_rtp, int64_t ntp_time_ms, VideoRotation rotation, const absl::optional& color_space) - : video_frame_buffer_(buffer), + : id_(id), + video_frame_buffer_(buffer), timestamp_rtp_(timestamp_rtp), ntp_time_ms_(ntp_time_ms), timestamp_us_(timestamp_us), diff --git a/api/video/video_frame.h b/api/video/video_frame.h index cc61fee5b1..728d818eae 100644 --- a/api/video/video_frame.h +++ b/api/video/video_frame.h @@ -41,8 +41,10 @@ class RTC_EXPORT VideoFrame { Builder& set_rotation(VideoRotation rotation); Builder& set_color_space(const ColorSpace& color_space); Builder& set_color_space(const ColorSpace* color_space); + Builder& set_id(uint16_t id); private: + uint16_t id_ = 0; rtc::scoped_refptr video_frame_buffer_; int64_t timestamp_us_ = 0; uint32_t timestamp_rtp_ = 0; @@ -75,6 +77,15 @@ class RTC_EXPORT VideoFrame { // Get frame size in pixels. uint32_t size() const; + // Get frame ID. Returns 0 if ID is not set. Not guarantee to be transferred + // from the sender to the receiver, but preserved on single side. The id + // should be propagated between all frame modifications during its lifetime + // from capturing to sending as encoded image. It is intended to be unique + // over a time window of a few minutes for peer connection, to which + // corresponding video stream belongs to. + uint16_t id() const { return id_; } + void set_id(uint16_t id) { id_ = id; } + // System monotonic clock, same timebase as rtc::TimeMicros(). int64_t timestamp_us() const { return timestamp_us_; } void set_timestamp_us(int64_t timestamp_us) { timestamp_us_ = timestamp_us; } @@ -138,13 +149,15 @@ class RTC_EXPORT VideoFrame { } private: - VideoFrame(const rtc::scoped_refptr& buffer, + VideoFrame(uint16_t id, + const rtc::scoped_refptr& buffer, int64_t timestamp_us, uint32_t timestamp_rtp, int64_t ntp_time_ms, VideoRotation rotation, const absl::optional& color_space); + uint16_t id_; // An opaque reference counted handle that stores the pixel data. rtc::scoped_refptr video_frame_buffer_; uint32_t timestamp_rtp_; diff --git a/api/video_codecs/test/BUILD.gn b/api/video_codecs/test/BUILD.gn index fced5608ef..acb77cc537 100644 --- a/api/video_codecs/test/BUILD.gn +++ b/api/video_codecs/test/BUILD.gn @@ -37,6 +37,7 @@ if (rtc_include_tests) { "../../video:video_frame", "../../video:video_frame_i420", "//testing/gtest", + "//third_party/abseil-cpp/absl/memory:memory", ] } } diff --git a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc index ddaabd08f6..9fd5aed835 100644 --- a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc +++ b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc @@ -14,6 +14,7 @@ #include #include +#include "absl/memory/memory.h" #include "absl/types/optional.h" #include "api/test/mock_video_encoder.h" #include "api/video/encoded_image.h" @@ -182,8 +183,12 @@ void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) { I420Buffer::SetBlack(buffer); std::vector types(1, kVideoFrameKey); - frame_.reset( - new VideoFrame(buffer, webrtc::kVideoRotation_0, 0 /* timestamp_us */)); + frame_ = + absl::make_unique(VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); EXPECT_EQ(expected_ret, fallback_wrapper_->Encode(*frame_, nullptr, &types)); } diff --git a/common_video/BUILD.gn b/common_video/BUILD.gn index 14755aff5f..fc36ff8221 100644 --- a/common_video/BUILD.gn +++ b/common_video/BUILD.gn @@ -102,6 +102,7 @@ if (rtc_include_tests) { "../test:test_support", "../test:video_test_common", "//testing/gtest", + "//third_party/abseil-cpp/absl/memory:memory", "//third_party/libyuv", ] diff --git a/common_video/libyuv/libyuv_unittest.cc b/common_video/libyuv/libyuv_unittest.cc index 79e7cb61b9..9f2c241985 100644 --- a/common_video/libyuv/libyuv_unittest.cc +++ b/common_video/libyuv/libyuv_unittest.cc @@ -13,6 +13,7 @@ #include +#include "absl/memory/memory.h" #include "api/video/i420_buffer.h" #include "api/video/video_frame.h" #include "common_video/libyuv/include/webrtc_libyuv.h" @@ -66,7 +67,12 @@ void TestLibYuv::SetUp() { rtc::scoped_refptr buffer( test::ReadI420Buffer(width_, height_, source_file_)); - orig_frame_.reset(new VideoFrame(buffer, kVideoRotation_0, 0)); + orig_frame_ = + absl::make_unique(VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); } void TestLibYuv::TearDown() { diff --git a/common_video/video_frame_unittest.cc b/common_video/video_frame_unittest.cc index 9d01339146..6a2c45296b 100644 --- a/common_video/video_frame_unittest.cc +++ b/common_video/video_frame_unittest.cc @@ -270,9 +270,12 @@ void PasteFromBuffer(PlanarYuvBuffer* canvas, } // namespace TEST(TestVideoFrame, WidthHeightValues) { - VideoFrame frame(I420Buffer::Create(10, 10, 10, 14, 90), - webrtc::kVideoRotation_0, - 789 * rtc::kNumMicrosecsPerMillisec); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(10, 10, 10, 14, 90)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_ms(789) + .build(); const int valid_value = 10; EXPECT_EQ(valid_value, frame.width()); EXPECT_EQ(valid_value, frame.height()); @@ -304,9 +307,13 @@ TEST(TestVideoFrame, ShallowCopy) { memset(buffer_u, 8, kSizeU); memset(buffer_v, 4, kSizeV); - VideoFrame frame1(I420Buffer::Copy(width, height, buffer_y, stride_y, - buffer_u, stride_u, buffer_v, stride_v), - kRotation, 0); + VideoFrame frame1 = VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Copy( + width, height, buffer_y, stride_y, buffer_u, + stride_u, buffer_v, stride_v)) + .set_rotation(kRotation) + .set_timestamp_us(0) + .build(); frame1.set_timestamp(timestamp); frame1.set_ntp_time_ms(ntp_time_ms); frame1.set_timestamp_us(timestamp_us); diff --git a/media/base/adaptedvideotracksource.cc b/media/base/adaptedvideotracksource.cc index ff7a1dd1bd..c0a4d3668b 100644 --- a/media/base/adaptedvideotracksource.cc +++ b/media/base/adaptedvideotracksource.cc @@ -54,9 +54,15 @@ void AdaptedVideoTrackSource::OnFrame(const webrtc::VideoFrame& frame) { if (apply_rotation() && frame.rotation() != webrtc::kVideoRotation_0 && buffer->type() == webrtc::VideoFrameBuffer::Type::kI420) { /* Apply pending rotation. */ - broadcaster_.OnFrame(webrtc::VideoFrame( - webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()), - webrtc::kVideoRotation_0, frame.timestamp_us())); + webrtc::VideoFrame rotated_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(webrtc::I420Buffer::Rotate( + *buffer->GetI420(), frame.rotation())) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(frame.timestamp_us()) + .set_id(frame.id()) + .build(); + broadcaster_.OnFrame(rotated_frame); } else { broadcaster_.OnFrame(frame); } diff --git a/media/base/fakeframesource.cc b/media/base/fakeframesource.cc index 7665c14d72..5f829af440 100644 --- a/media/base/fakeframesource.cc +++ b/media/base/fakeframesource.cc @@ -77,8 +77,11 @@ webrtc::VideoFrame FakeFrameSource::GetFrame(int width, webrtc::I420Buffer::Create(width, height)); buffer->InitializeData(); - webrtc::VideoFrame frame = - webrtc::VideoFrame(buffer, rotation, next_timestamp_us_); + webrtc::VideoFrame frame = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(rotation) + .set_timestamp_us(next_timestamp_us_) + .build(); next_timestamp_us_ += interval_us; return frame; diff --git a/media/base/fakevideocapturer.cc b/media/base/fakevideocapturer.cc index 46eb16a117..c6043875f7 100644 --- a/media/base/fakevideocapturer.cc +++ b/media/base/fakevideocapturer.cc @@ -90,8 +90,14 @@ bool FakeVideoCapturer::CaptureFrame(const webrtc::VideoFrame& frame) { webrtc::I420Buffer::Create(adapted_width, adapted_height)); buffer->InitializeData(); - OnFrame(webrtc::VideoFrame(buffer, frame.rotation(), frame.timestamp_us()), - frame.width(), frame.height()); + webrtc::VideoFrame adapted_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(frame.rotation()) + .set_timestamp_us(frame.timestamp_us()) + .set_id(frame.id()) + .build(); + OnFrame(adapted_frame, frame.width(), frame.height()); } return true; diff --git a/media/base/videobroadcaster.cc b/media/base/videobroadcaster.cc index 125cf17c97..4ee6045f4e 100644 --- a/media/base/videobroadcaster.cc +++ b/media/base/videobroadcaster.cc @@ -63,9 +63,15 @@ void VideoBroadcaster::OnFrame(const webrtc::VideoFrame& frame) { continue; } if (sink_pair.wants.black_frames) { - sink_pair.sink->OnFrame( - webrtc::VideoFrame(GetBlackFrameBuffer(frame.width(), frame.height()), - frame.rotation(), frame.timestamp_us())); + webrtc::VideoFrame black_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer( + GetBlackFrameBuffer(frame.width(), frame.height())) + .set_rotation(frame.rotation()) + .set_timestamp_us(frame.timestamp_us()) + .set_id(frame.id()) + .build(); + sink_pair.sink->OnFrame(black_frame); } else { sink_pair.sink->OnFrame(frame); } diff --git a/media/base/videobroadcaster_unittest.cc b/media/base/videobroadcaster_unittest.cc index 66cdbbada0..5b191a7ab0 100644 --- a/media/base/videobroadcaster_unittest.cc +++ b/media/base/videobroadcaster_unittest.cc @@ -49,7 +49,11 @@ TEST(VideoBroadcasterTest, OnFrame) { // Initialize, to avoid warnings on use of initialized values. webrtc::I420Buffer::SetBlack(buffer); - webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0); + webrtc::VideoFrame frame = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); broadcaster.OnFrame(frame); EXPECT_EQ(1, sink1.num_rendered_frames()); @@ -172,8 +176,11 @@ TEST(VideoBroadcasterTest, SinkWantsBlackFrames) { // Makes it not all black. buffer->InitializeData(); - webrtc::VideoFrame frame1(buffer, webrtc::kVideoRotation_0, - 10 /* timestamp_us */); + webrtc::VideoFrame frame1 = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(10) + .build(); broadcaster.OnFrame(frame1); EXPECT_TRUE(sink1.black_frame()); EXPECT_EQ(10, sink1.timestamp_us()); @@ -186,8 +193,11 @@ TEST(VideoBroadcasterTest, SinkWantsBlackFrames) { wants2.black_frames = true; broadcaster.AddOrUpdateSink(&sink2, wants2); - webrtc::VideoFrame frame2(buffer, webrtc::kVideoRotation_0, - 30 /* timestamp_us */); + webrtc::VideoFrame frame2 = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(30) + .build(); broadcaster.OnFrame(frame2); EXPECT_FALSE(sink1.black_frame()); EXPECT_EQ(30, sink1.timestamp_us()); diff --git a/media/base/videocapturer.cc b/media/base/videocapturer.cc index 03a6b96e58..20dcf4e502 100644 --- a/media/base/videocapturer.cc +++ b/media/base/videocapturer.cc @@ -227,9 +227,15 @@ void VideoCapturer::OnFrame(const webrtc::VideoFrame& frame, RTC_LOG(LS_WARNING) << "Non-I420 frame requiring rotation. Discarding."; return; } - broadcaster_.OnFrame(webrtc::VideoFrame( - webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()), - webrtc::kVideoRotation_0, frame.timestamp_us())); + webrtc::VideoFrame rotated_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(webrtc::I420Buffer::Rotate( + *buffer->GetI420(), frame.rotation())) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(frame.timestamp_us()) + .set_id(frame.id()) + .build(); + broadcaster_.OnFrame(rotated_frame); } else { broadcaster_.OnFrame(frame); } diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index ca35362ffb..563ca45532 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -409,10 +409,14 @@ int SimulcastEncoderAdapter::Encode( dst_buffer->StrideV(), dst_width, dst_height, libyuv::kFilterBilinear); + VideoFrame frame = VideoFrame::Builder() + .set_video_frame_buffer(dst_buffer) + .set_timestamp_rtp(input_image.timestamp()) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_ms(input_image.render_time_ms()) + .build(); int ret = streaminfos_[stream_idx].encoder->Encode( - VideoFrame(dst_buffer, input_image.timestamp(), - input_image.render_time_ms(), webrtc::kVideoRotation_0), - codec_specific_info, &stream_frame_types); + frame, codec_specific_info, &stream_frame_types); if (ret != WEBRTC_VIDEO_CODEC_OK) { return ret; } diff --git a/media/engine/simulcast_encoder_adapter_unittest.cc b/media/engine/simulcast_encoder_adapter_unittest.cc index 02f40c65ca..741e3fced0 100644 --- a/media/engine/simulcast_encoder_adapter_unittest.cc +++ b/media/engine/simulcast_encoder_adapter_unittest.cc @@ -539,7 +539,12 @@ TEST_F(TestSimulcastEncoderAdapterFake, ReusesEncodersInOrder) { // Input data. rtc::scoped_refptr buffer(I420Buffer::Create(1280, 720)); - VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(100) + .set_timestamp_ms(1000) + .set_rotation(kVideoRotation_180) + .build(); std::vector frame_types; // Encode with three streams. @@ -864,7 +869,12 @@ TEST_F(TestSimulcastEncoderAdapterFake, rtc::scoped_refptr buffer( new rtc::RefCountedObject(1280, 720)); - VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(100) + .set_timestamp_ms(1000) + .set_rotation(kVideoRotation_180) + .build(); // Expect calls with the given video frame verbatim, since it's a texture // frame and can't otherwise be modified/resized. for (MockVideoEncoder* encoder : helper_->factory()->encoders()) @@ -889,7 +899,12 @@ TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) { rtc::scoped_refptr input_buffer = I420Buffer::Create(kDefaultWidth, kDefaultHeight); input_buffer->InitializeData(); - VideoFrame input_frame(input_buffer, 0, 0, webrtc::kVideoRotation_0); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(input_buffer) + .set_timestamp_rtp(0) + .set_timestamp_us(0) + .set_rotation(kVideoRotation_0) + .build(); std::vector frame_types(3, kVideoFrameKey); EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE, adapter_->Encode(input_frame, nullptr, &frame_types)); @@ -954,7 +969,12 @@ TEST_F(TestSimulcastEncoderAdapterFake, ActivatesCorrectStreamsInInitEncode) { // Input data. rtc::scoped_refptr buffer(I420Buffer::Create(1280, 720)); - VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(100) + .set_timestamp_ms(1000) + .set_rotation(kVideoRotation_180) + .build(); // Encode with three streams. EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); @@ -987,7 +1007,12 @@ TEST_F(TestSimulcastEncoderAdapterFake, TrustedRateControl) { // Input data. rtc::scoped_refptr buffer(I420Buffer::Create(1280, 720)); - VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(100) + .set_timestamp_ms(1000) + .set_rotation(kVideoRotation_180) + .build(); // No encoder trusted, so simulcast adapter should not be either. EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc index 31dfb55890..590d8bca2d 100644 --- a/media/engine/webrtcvideoengine_unittest.cc +++ b/media/engine/webrtcvideoengine_unittest.cc @@ -3555,9 +3555,13 @@ TEST_F(WebRtcVideoChannelTest, EstimatesNtpStartTimeCorrectly) { cricket::FakeVideoRenderer renderer; EXPECT_TRUE(channel_->SetSink(last_ssrc_, &renderer)); - webrtc::VideoFrame video_frame(CreateBlackFrameBuffer(4, 4), - kInitialTimestamp, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame video_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) + .set_timestamp_rtp(kInitialTimestamp) + .set_timestamp_us(0) + .set_rotation(webrtc::kVideoRotation_0) + .build(); // Initial NTP time is not available on the first frame, but should still be // able to be estimated. stream->InjectFrame(video_frame); @@ -5326,8 +5330,13 @@ TEST_F(WebRtcVideoChannelTest, ReceiveDifferentUnsignaledSsrc) { FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); // Verify that the receive stream sinks to a renderer. - webrtc::VideoFrame video_frame(CreateBlackFrameBuffer(4, 4), 100, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame video_frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) + .set_timestamp_rtp(100) + .set_timestamp_us(0) + .set_rotation(webrtc::kVideoRotation_0) + .build(); recv_stream->InjectFrame(video_frame); EXPECT_EQ(1, renderer.num_rendered_frames()); @@ -5342,8 +5351,13 @@ TEST_F(WebRtcVideoChannelTest, ReceiveDifferentUnsignaledSsrc) { recv_stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); // Verify that the receive stream sinks to a renderer. - webrtc::VideoFrame video_frame2(CreateBlackFrameBuffer(4, 4), 200, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame video_frame2 = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) + .set_timestamp_rtp(200) + .set_timestamp_us(0) + .set_rotation(webrtc::kVideoRotation_0) + .build(); recv_stream->InjectFrame(video_frame2); EXPECT_EQ(2, renderer.num_rendered_frames()); @@ -5359,8 +5373,13 @@ TEST_F(WebRtcVideoChannelTest, ReceiveDifferentUnsignaledSsrc) { recv_stream = fake_call_->GetVideoReceiveStreams()[0]; EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); // Verify that the receive stream sinks to a renderer. - webrtc::VideoFrame video_frame3(CreateBlackFrameBuffer(4, 4), 300, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame video_frame3 = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) + .set_timestamp_rtp(300) + .set_timestamp_us(0) + .set_rotation(webrtc::kVideoRotation_0) + .build(); recv_stream->InjectFrame(video_frame3); EXPECT_EQ(3, renderer.num_rendered_frames()); #endif diff --git a/modules/video_capture/BUILD.gn b/modules/video_capture/BUILD.gn index 44db2eb477..6ff80d4caf 100644 --- a/modules/video_capture/BUILD.gn +++ b/modules/video_capture/BUILD.gn @@ -195,6 +195,7 @@ if (!build_with_chromium) { "../../test:video_test_common", "../utility", "//testing/gtest", + "//third_party/abseil-cpp/absl/memory:memory", ] deps += [ "../../test:test_main" ] } diff --git a/modules/video_capture/test/video_capture_unittest.cc b/modules/video_capture/test/video_capture_unittest.cc index 1fa7144347..8238c20c04 100644 --- a/modules/video_capture/test/video_capture_unittest.cc +++ b/modules/video_capture/test/video_capture_unittest.cc @@ -14,6 +14,7 @@ #include #include +#include "absl/memory/memory.h" #include "api/video/i420_buffer.h" #include "api/video/video_frame.h" #include "common_video/libyuv/include/webrtc_libyuv.h" @@ -366,8 +367,12 @@ class VideoCaptureExternalTest : public testing::Test { buffer->ChromaHeight() * buffer->StrideU()); memset(buffer->MutableDataV(), 127, buffer->ChromaHeight() * buffer->StrideV()); - test_frame_.reset(new webrtc::VideoFrame(buffer, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + test_frame_ = absl::make_unique( + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); SleepMs(1); // Wait 1ms so that two tests can't have the same timestamp. diff --git a/modules/video_capture/video_capture_impl.cc b/modules/video_capture/video_capture_impl.cc index e434d0fc62..bd2ecf4e5a 100644 --- a/modules/video_capture/video_capture_impl.cc +++ b/modules/video_capture/video_capture_impl.cc @@ -196,8 +196,13 @@ int32_t VideoCaptureImpl::IncomingFrame(uint8_t* videoFrame, return -1; } - VideoFrame captureFrame(buffer, 0, rtc::TimeMillis(), - !apply_rotation ? _rotateFrame : kVideoRotation_0); + VideoFrame captureFrame = + VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(0) + .set_timestamp_ms(rtc::TimeMillis()) + .set_rotation(!apply_rotation ? _rotateFrame : kVideoRotation_0) + .build(); captureFrame.set_ntp_time_ms(captureTime); DeliverCapturedFrame(captureFrame); diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index 80f3d6d822..9f6d9f3160 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -615,6 +615,7 @@ if (rtc_include_tests) { "../../rtc_base:checks", "../../rtc_base:rtc_base_approved", "../../test:test_support", + "//third_party/abseil-cpp/absl/memory:memory", ] } diff --git a/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/modules/video_coding/codecs/h264/h264_decoder_impl.cc index ea74cc4177..0853d8f2c9 100644 --- a/modules/video_coding/codecs/h264/h264_decoder_impl.cc +++ b/modules/video_coding/codecs/h264/h264_decoder_impl.cc @@ -20,6 +20,7 @@ extern "C" { #include "third_party/ffmpeg/libavutil/imgutils.h" } // extern "C" +#include "absl/memory/memory.h" #include "api/video/color_space.h" #include "api/video/i420_buffer.h" #include "common_video/include/video_frame_buffer.h" @@ -120,12 +121,14 @@ int H264DecoderImpl::AVGetBuffer2( // TODO(nisse): The VideoFrame's timestamp and rotation info is not used. // Refactor to do not use a VideoFrame object at all. av_frame->buf[0] = av_buffer_create( - av_frame->data[kYPlaneIndex], - total_size, - AVFreeBuffer2, - static_cast(new VideoFrame(frame_buffer, - kVideoRotation_0, - 0 /* timestamp_us */)), + av_frame->data[kYPlaneIndex], total_size, AVFreeBuffer2, + static_cast(absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(frame_buffer) + .set_rotation(kVideoRotation_0) + .set_timestamp_us(0) + .build()) + .release()), 0); RTC_CHECK(av_frame->buf[0]); return 0; diff --git a/modules/video_coding/codecs/multiplex/multiplex_decoder_adapter.cc b/modules/video_coding/codecs/multiplex/multiplex_decoder_adapter.cc index a27bc8d258..0facbe4896 100644 --- a/modules/video_coding/codecs/multiplex/multiplex_decoder_adapter.cc +++ b/modules/video_coding/codecs/multiplex/multiplex_decoder_adapter.cc @@ -58,10 +58,14 @@ class MultiplexDecoderAdapter::AdapterDecodedImageCallback struct MultiplexDecoderAdapter::DecodedImageData { explicit DecodedImageData(AlphaCodecStream stream_idx) : stream_idx_(stream_idx), - decoded_image_(I420Buffer::Create(1 /* width */, 1 /* height */), - 0, - 0, - kVideoRotation_0) { + decoded_image_( + VideoFrame::Builder() + .set_video_frame_buffer( + I420Buffer::Create(1 /* width */, 1 /* height */)) + .set_timestamp_rtp(0) + .set_timestamp_us(0) + .set_rotation(kVideoRotation_0) + .build()) { RTC_DCHECK_EQ(kAXXStream, stream_idx); } DecodedImageData(AlphaCodecStream stream_idx, @@ -253,8 +257,13 @@ void MultiplexDecoderAdapter::MergeAlphaImages( merged_buffer, std::move(augmenting_data), augmenting_data_length)); } - VideoFrame merged_image(merged_buffer, decoded_image->timestamp(), - 0 /* render_time_ms */, decoded_image->rotation()); + VideoFrame merged_image = VideoFrame::Builder() + .set_video_frame_buffer(merged_buffer) + .set_timestamp_rtp(decoded_image->timestamp()) + .set_timestamp_us(0) + .set_rotation(decoded_image->rotation()) + .set_id(decoded_image->id()) + .build(); decoded_complete_callback_->Decoded(merged_image, decode_time_ms, qp); } diff --git a/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc b/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc index 582549e760..4aabec0300 100644 --- a/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc +++ b/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc @@ -197,8 +197,13 @@ int MultiplexEncoderAdapter::Encode( multiplex_dummy_planes_.data(), yuva_buffer->StrideU(), multiplex_dummy_planes_.data(), yuva_buffer->StrideV(), rtc::KeepRefUntilDone(input_image.video_frame_buffer())); - VideoFrame alpha_image(alpha_buffer, input_image.timestamp(), - input_image.render_time_ms(), input_image.rotation()); + VideoFrame alpha_image = VideoFrame::Builder() + .set_video_frame_buffer(alpha_buffer) + .set_timestamp_rtp(input_image.timestamp()) + .set_timestamp_ms(input_image.render_time_ms()) + .set_rotation(input_image.rotation()) + .set_id(input_image.id()) + .build(); rv = encoders_[kAXXStream]->Encode(alpha_image, codec_specific_info, &adjusted_frame_types); return rv; diff --git a/modules/video_coding/codecs/multiplex/test/multiplex_adapter_unittest.cc b/modules/video_coding/codecs/multiplex/test/multiplex_adapter_unittest.cc index 8ced0a94a3..4c904c17e4 100644 --- a/modules/video_coding/codecs/multiplex/test/multiplex_adapter_unittest.cc +++ b/modules/video_coding/codecs/multiplex/test/multiplex_adapter_unittest.cc @@ -95,9 +95,14 @@ class TestMultiplexAdapter rtc::scoped_refptr augmented_video_frame_buffer = new rtc::RefCountedObject( video_buffer, std::move(data), 16); - return absl::WrapUnique( - new VideoFrame(augmented_video_frame_buffer, video_frame->timestamp(), - video_frame->render_time_ms(), video_frame->rotation())); + return absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(augmented_video_frame_buffer) + .set_timestamp_rtp(video_frame->timestamp()) + .set_timestamp_ms(video_frame->render_time_ms()) + .set_rotation(video_frame->rotation()) + .set_id(video_frame->id()) + .build()); } std::unique_ptr CreateI420AInputFrame() { @@ -109,9 +114,13 @@ class TestMultiplexAdapter yuv_buffer->StrideY(), yuv_buffer->DataU(), yuv_buffer->StrideU(), yuv_buffer->DataV(), yuv_buffer->StrideV(), yuv_buffer->DataY(), yuv_buffer->StrideY(), rtc::KeepRefUntilDone(yuv_buffer)); - return absl::WrapUnique( - new VideoFrame(yuva_buffer, 123 /* RTP timestamp */, - 345 /* render_time_ms */, kVideoRotation_0)); + return absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(yuva_buffer) + .set_timestamp_rtp(123) + .set_timestamp_ms(345) + .set_rotation(kVideoRotation_0) + .build()); } std::unique_ptr CreateInputFrame(bool contains_alpha) { @@ -120,9 +129,14 @@ class TestMultiplexAdapter video_frame = CreateI420AInputFrame(); } else { VideoFrame* next_frame = NextInputFrame(); - video_frame = absl::WrapUnique(new VideoFrame( - next_frame->video_frame_buffer(), next_frame->timestamp(), - next_frame->render_time_ms(), next_frame->rotation())); + video_frame = absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(next_frame->video_frame_buffer()) + .set_timestamp_rtp(next_frame->timestamp()) + .set_timestamp_ms(next_frame->render_time_ms()) + .set_rotation(next_frame->rotation()) + .set_id(next_frame->id()) + .build()); } if (supports_augmenting_data_) { video_frame = CreateDataAugmentedInputFrame(video_frame.get()); @@ -158,9 +172,12 @@ class TestMultiplexAdapter yuva_buffer->StrideA(), yuva_buffer->DataU(), yuva_buffer->StrideU(), yuva_buffer->DataV(), yuva_buffer->StrideV(), rtc::KeepRefUntilDone(video_frame_buffer)); - return absl::WrapUnique( - new VideoFrame(axx_buffer, 123 /* RTP timestamp */, - 345 /* render_time_ms */, kVideoRotation_0)); + return absl::make_unique(VideoFrame::Builder() + .set_video_frame_buffer(axx_buffer) + .set_timestamp_rtp(123) + .set_timestamp_ms(345) + .set_rotation(kVideoRotation_0) + .build()); } private: diff --git a/modules/video_coding/codecs/test/videoprocessor.cc b/modules/video_coding/codecs/test/videoprocessor.cc index ac13f9495a..83181a0a3e 100644 --- a/modules/video_coding/codecs/test/videoprocessor.cc +++ b/modules/video_coding/codecs/test/videoprocessor.cc @@ -267,9 +267,13 @@ void VideoProcessor::ProcessFrame() { RTC_CHECK(buffer) << "Tried to read too many frames from the file."; const size_t timestamp = last_inputed_timestamp_ + kVideoPayloadTypeFrequency / framerate_fps_; - VideoFrame input_frame(buffer, static_cast(timestamp), - static_cast(timestamp / kMsToRtpTimestamp), - webrtc::kVideoRotation_0); + VideoFrame input_frame = + VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(static_cast(timestamp)) + .set_timestamp_ms(static_cast(timestamp / kMsToRtpTimestamp)) + .set_rotation(webrtc::kVideoRotation_0) + .build(); // Store input frame as a reference for quality calculations. if (config_.decode && !config_.measure_cpu) { if (input_frames_.size() == kMaxBufferedInputFrames) { @@ -323,8 +327,13 @@ int32_t VideoProcessor::VideoProcessorDecodeCompleteCallback::Decoded( if (!task_queue_->IsCurrent()) { // There might be a limited amount of output buffers, make a copy to make // sure we don't block the decoder. - VideoFrame copy(I420Buffer::Copy(*image.video_frame_buffer()->ToI420()), - image.rotation(), image.timestamp_us()); + VideoFrame copy = VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Copy( + *image.video_frame_buffer()->ToI420())) + .set_rotation(image.rotation()) + .set_timestamp_us(image.timestamp_us()) + .set_id(image.id()) + .build(); copy.set_timestamp(image.timestamp()); task_queue_->PostTask([this, copy]() { diff --git a/modules/video_coding/generic_encoder.cc b/modules/video_coding/generic_encoder.cc index 1f24159e74..9dd07bc130 100644 --- a/modules/video_coding/generic_encoder.cc +++ b/modules/video_coding/generic_encoder.cc @@ -146,9 +146,12 @@ int32_t VCMGenericEncoder::RequestFrame( // VideoSendStreamTest.VideoSendStreamStopSetEncoderRateToZero, set // internal_source to true and use FakeEncoder. And the latter will // happily encode this 1x1 frame and pass it on down the pipeline. - return encoder_->Encode( - VideoFrame(I420Buffer::Create(1, 1), kVideoRotation_0, 0), NULL, - &frame_types); + return encoder_->Encode(VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(1, 1)) + .set_rotation(kVideoRotation_0) + .set_timestamp_us(0) + .build(), + NULL, &frame_types); } bool VCMGenericEncoder::InternalSource() const { diff --git a/modules/video_coding/utility/simulcast_test_fixture_impl.cc b/modules/video_coding/utility/simulcast_test_fixture_impl.cc index 7199dad54e..0230316469 100644 --- a/modules/video_coding/utility/simulcast_test_fixture_impl.cc +++ b/modules/video_coding/utility/simulcast_test_fixture_impl.cc @@ -15,6 +15,7 @@ #include #include +#include "absl/memory/memory.h" #include "api/video/encoded_image.h" #include "api/video_codecs/sdp_video_format.h" #include "common_video/libyuv/include/webrtc_libyuv.h" @@ -273,8 +274,12 @@ void SimulcastTestFixtureImpl::SetUpCodec(const int* temporal_layer_profile) { EXPECT_EQ(0, decoder_->InitDecode(&settings_, 1)); input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight); input_buffer_->InitializeData(); - input_frame_.reset(new VideoFrame(input_buffer_, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + input_frame_ = absl::make_unique( + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(input_buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); } void SimulcastTestFixtureImpl::SetUpRateAllocator() { @@ -591,8 +596,12 @@ void SimulcastTestFixtureImpl::SwitchingToOneStream(int width, int height) { input_buffer_ = I420Buffer::Create(settings_.width, settings_.height); input_buffer_->InitializeData(); - input_frame_.reset(new VideoFrame(input_buffer_, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + input_frame_ = absl::make_unique( + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(input_buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); // The for loop above did not set the bitrate of the highest layer. settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].maxBitrate = @@ -631,8 +640,12 @@ void SimulcastTestFixtureImpl::SwitchingToOneStream(int width, int height) { // Resize |input_frame_| to the new resolution. input_buffer_ = I420Buffer::Create(settings_.width, settings_.height); input_buffer_->InitializeData(); - input_frame_.reset(new VideoFrame(input_buffer_, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + input_frame_ = absl::make_unique( + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(input_buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types)); } @@ -791,8 +804,12 @@ void SimulcastTestFixtureImpl::TestStrideEncodeDecode() { int stride_uv = ((kDefaultWidth + 1) / 2) + 5; input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight, stride_y, stride_uv, stride_uv); - input_frame_.reset(new VideoFrame(input_buffer_, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + input_frame_ = absl::make_unique( + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(input_buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); // Set color. int plane_offset[kNumOfPlanes]; diff --git a/modules/video_coding/video_sender.cc b/modules/video_coding/video_sender.cc index da59fe99e8..eaf270d6b0 100644 --- a/modules/video_coding/video_sender.cc +++ b/modules/video_coding/video_sender.cc @@ -325,10 +325,13 @@ int32_t VideoSender::AddVideoFrame( RTC_LOG(LS_ERROR) << "Frame conversion failed, dropping frame."; return VCM_PARAMETER_ERROR; } - converted_frame = VideoFrame(converted_buffer, - converted_frame.timestamp(), - converted_frame.render_time_ms(), - converted_frame.rotation()); + converted_frame = VideoFrame::Builder() + .set_video_frame_buffer(converted_buffer) + .set_timestamp_rtp(converted_frame.timestamp()) + .set_timestamp_ms(converted_frame.render_time_ms()) + .set_rotation(converted_frame.rotation()) + .set_id(converted_frame.id()) + .build(); } int32_t ret = _encoder->Encode(converted_frame, codecSpecificInfo, next_frame_types); diff --git a/modules/video_coding/video_sender_unittest.cc b/modules/video_coding/video_sender_unittest.cc index 8e727df8f0..986bd3fc48 100644 --- a/modules/video_coding/video_sender_unittest.cc +++ b/modules/video_coding/video_sender_unittest.cc @@ -11,6 +11,7 @@ #include #include +#include "absl/memory/memory.h" #include "api/test/mock_video_encoder.h" #include "api/video/i420_buffer.h" #include "api/video_codecs/vp8_temporal_layers.h" @@ -76,8 +77,12 @@ class EmptyFrameGenerator : public FrameGenerator { public: EmptyFrameGenerator(int width, int height) : width_(width), height_(height) {} VideoFrame* NextFrame() override { - frame_.reset(new VideoFrame(I420Buffer::Create(width_, height_), - webrtc::kVideoRotation_0, 0)); + frame_ = absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width_, height_)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); return frame_.get(); } diff --git a/sdk/android/src/jni/androidmediadecoder.cc b/sdk/android/src/jni/androidmediadecoder.cc index 61a38d8581..70d5b58b22 100644 --- a/sdk/android/src/jni/androidmediadecoder.cc +++ b/sdk/android/src/jni/androidmediadecoder.cc @@ -729,7 +729,12 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(JNIEnv* jni, // If the frame was dropped, frame_buffer is left as nullptr. if (frame_buffer) { - VideoFrame decoded_frame(frame_buffer, 0, 0, kVideoRotation_0); + VideoFrame decoded_frame = VideoFrame::Builder() + .set_video_frame_buffer(frame_buffer) + .set_timestamp_rtp(0) + .set_timestamp_ms(0) + .set_rotation(kVideoRotation_0) + .build(); decoded_frame.set_timestamp(output_timestamps_ms); decoded_frame.set_ntp_time_ms(output_ntp_timestamps_ms); diff --git a/sdk/android/src/jni/androidmediaencoder.cc b/sdk/android/src/jni/androidmediaencoder.cc index aeb510ffc6..0bf7186fbf 100644 --- a/sdk/android/src/jni/androidmediaencoder.cc +++ b/sdk/android/src/jni/androidmediaencoder.cc @@ -670,8 +670,13 @@ int32_t MediaCodecVideoEncoder::Encode( rtc::scoped_refptr input_buffer(frame.video_frame_buffer()); - VideoFrame input_frame(input_buffer, frame.timestamp(), - frame.render_time_ms(), frame.rotation()); + VideoFrame input_frame = VideoFrame::Builder() + .set_video_frame_buffer(input_buffer) + .set_timestamp_rtp(frame.timestamp()) + .set_timestamp_ms(frame.render_time_ms()) + .set_rotation(frame.rotation()) + .set_id(frame.id()) + .build(); if (!MaybeReconfigureEncoder(jni, input_frame)) { ALOGE << "Failed to reconfigure encoder."; diff --git a/sdk/android/src/jni/androidvideotracksource.cc b/sdk/android/src/jni/androidvideotracksource.cc index e72850f249..f573eda67a 100644 --- a/sdk/android/src/jni/androidvideotracksource.cc +++ b/sdk/android/src/jni/androidvideotracksource.cc @@ -113,7 +113,11 @@ void AndroidVideoTrackSource::OnFrameCaptured( buffer = buffer->ToI420(); } - OnFrame(VideoFrame(buffer, rotation, translated_camera_time_us)); + OnFrame(VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(rotation) + .set_timestamp_us(translated_camera_time_us) + .build()); } void AndroidVideoTrackSource::OnOutputFormatRequest(int landscape_width, diff --git a/sdk/android/src/jni/videoframe.cc b/sdk/android/src/jni/videoframe.cc index dd13cb3522..1d52433ab1 100644 --- a/sdk/android/src/jni/videoframe.cc +++ b/sdk/android/src/jni/videoframe.cc @@ -196,9 +196,12 @@ VideoFrame JavaToNativeFrame(JNIEnv* jni, int64_t timestamp_ns = Java_VideoFrame_getTimestampNs(jni, j_video_frame); rtc::scoped_refptr buffer = AndroidVideoBuffer::Create(jni, j_video_frame_buffer); - return VideoFrame(buffer, timestamp_rtp, - timestamp_ns / rtc::kNumNanosecsPerMillisec, - static_cast(rotation)); + return VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp(timestamp_rtp) + .set_timestamp_ms(timestamp_ns / rtc::kNumNanosecsPerMillisec) + .set_rotation(static_cast(rotation)) + .build(); } ScopedJavaLocalRef NativeToJavaVideoFrame(JNIEnv* jni, diff --git a/sdk/objc/native/src/objc_video_decoder_factory.mm b/sdk/objc/native/src/objc_video_decoder_factory.mm index 0af3582338..6e0ff27084 100644 --- a/sdk/objc/native/src/objc_video_decoder_factory.mm +++ b/sdk/objc/native/src/objc_video_decoder_factory.mm @@ -77,10 +77,13 @@ class ObjCVideoDecoder : public VideoDecoder { [decoder_ setCallback:^(RTCVideoFrame *frame) { const rtc::scoped_refptr buffer = new rtc::RefCountedObject(frame.buffer); - VideoFrame videoFrame(buffer, - (uint32_t)(frame.timeStampNs / rtc::kNumNanosecsPerMicrosec), - 0, - (VideoRotation)frame.rotation); + VideoFrame videoFrame = + VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_timestamp_rtp((uint32_t)(frame.timeStampNs / rtc::kNumNanosecsPerMicrosec)) + .set_timestamp_ms(0) + .set_rotation((VideoRotation)frame.rotation) + .build(); videoFrame.set_timestamp(frame.timeStamp); callback->Decoded(videoFrame); diff --git a/sdk/objc/native/src/objc_video_track_source.mm b/sdk/objc/native/src/objc_video_track_source.mm index 49736fe11c..053158a7db 100644 --- a/sdk/objc/native/src/objc_video_track_source.mm +++ b/sdk/objc/native/src/objc_video_track_source.mm @@ -116,7 +116,11 @@ void ObjCVideoTrackSource::OnCapturedFrame(RTCVideoFrame *frame) { rotation = kVideoRotation_0; } - OnFrame(VideoFrame(buffer, rotation, translated_timestamp_us)); + OnFrame(VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(rotation) + .set_timestamp_us(translated_timestamp_us) + .build()); } } // namespace webrtc diff --git a/sdk/objc/unittests/objc_video_encoder_factory_tests.mm b/sdk/objc/unittests/objc_video_encoder_factory_tests.mm index 50c30c0c74..dd19a16728 100644 --- a/sdk/objc/unittests/objc_video_encoder_factory_tests.mm +++ b/sdk/objc/unittests/objc_video_encoder_factory_tests.mm @@ -79,7 +79,11 @@ TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsOKOnSuccess) { rtc::scoped_refptr buffer = new rtc::RefCountedObject( [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]); - webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0); + webrtc::VideoFrame frame = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); webrtc::CodecSpecificInfo info; info.codecType = webrtc::kVideoCodecH264; std::vector frame_types; @@ -95,7 +99,11 @@ TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsErrorOnFail) { rtc::scoped_refptr buffer = new rtc::RefCountedObject( [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]); - webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0); + webrtc::VideoFrame frame = webrtc::VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); webrtc::CodecSpecificInfo info; info.codecType = webrtc::kVideoCodecH264; std::vector frame_types; diff --git a/test/fake_decoder.cc b/test/fake_decoder.cc index c0a2ed67c5..2114c6493f 100644 --- a/test/fake_decoder.cc +++ b/test/fake_decoder.cc @@ -46,9 +46,12 @@ int32_t FakeDecoder::Decode(const EncodedImage& input, height_ = input._encodedHeight; } - VideoFrame frame(I420Buffer::Create(width_, height_), - webrtc::kVideoRotation_0, - render_time_ms * rtc::kNumMicrosecsPerMillisec); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width_, height_)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_ms(render_time_ms) + .build(); frame.set_timestamp(input.Timestamp()); frame.set_ntp_time_ms(input.ntp_time_ms_); diff --git a/test/fake_texture_frame.cc b/test/fake_texture_frame.cc index 68d76dc11f..45d6130210 100644 --- a/test/fake_texture_frame.cc +++ b/test/fake_texture_frame.cc @@ -21,8 +21,13 @@ VideoFrame FakeNativeBuffer::CreateFrame(int width, uint32_t timestamp, int64_t render_time_ms, VideoRotation rotation) { - return VideoFrame(new rtc::RefCountedObject(width, height), - timestamp, render_time_ms, rotation); + return VideoFrame::Builder() + .set_video_frame_buffer( + new rtc::RefCountedObject(width, height)) + .set_timestamp_rtp(timestamp) + .set_timestamp_ms(render_time_ms) + .set_rotation(rotation) + .build(); } VideoFrameBuffer::Type FakeNativeBuffer::type() const { diff --git a/test/fake_vp8_decoder.cc b/test/fake_vp8_decoder.cc index 1cf6f293e3..c5ece83fd7 100644 --- a/test/fake_vp8_decoder.cc +++ b/test/fake_vp8_decoder.cc @@ -54,9 +54,12 @@ int32_t FakeVp8Decoder::Decode(const EncodedImage& input, } ParseFakeVp8(input._buffer, &width_, &height_); - VideoFrame frame(I420Buffer::Create(width_, height_), - webrtc::kVideoRotation_0, - render_time_ms * rtc::kNumMicrosecsPerMillisec); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width_, height_)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_ms(render_time_ms) + .build(); frame.set_timestamp(input.Timestamp()); frame.set_ntp_time_ms(input.ntp_time_ms_); diff --git a/test/frame_generator.cc b/test/frame_generator.cc index e400504aea..9acffb15cc 100644 --- a/test/frame_generator.cc +++ b/test/frame_generator.cc @@ -14,6 +14,7 @@ #include #include +#include "absl/memory/memory.h" #include "api/video/i010_buffer.h" #include "api/video/i420_buffer.h" #include "api/video/video_frame_buffer.h" @@ -100,8 +101,12 @@ class SquareGenerator : public FrameGenerator { buffer = I010Buffer::Copy(*buffer->ToI420()); } - frame_.reset( - new VideoFrame(buffer, webrtc::kVideoRotation_0, 0 /* timestamp_us */)); + frame_ = absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); return frame_.get(); } @@ -203,8 +208,12 @@ class YuvFileGenerator : public FrameGenerator { if (++current_display_count_ >= frame_display_count_) current_display_count_ = 0; - temp_frame_.reset(new VideoFrame( - last_read_buffer_, webrtc::kVideoRotation_0, 0 /* timestamp_us */)); + temp_frame_ = absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(last_read_buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); return temp_frame_.get(); } @@ -260,8 +269,12 @@ class SlideGenerator : public FrameGenerator { if (++current_display_count_ >= frame_display_count_) current_display_count_ = 0; - frame_.reset(new VideoFrame(buffer_, webrtc::kVideoRotation_0, - 0 /* timestamp_us */)); + frame_ = absl::make_unique( + VideoFrame::Builder() + .set_video_frame_buffer(buffer_) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build()); return frame_.get(); } @@ -393,13 +406,16 @@ class ScrollingImageFrameGenerator : public FrameGenerator { int offset_v = (i420_buffer->StrideV() * (pixels_scrolled_y / 2)) + (pixels_scrolled_x / 2); - current_frame_ = webrtc::VideoFrame( - WrapI420Buffer(target_width_, target_height_, - &i420_buffer->DataY()[offset_y], i420_buffer->StrideY(), - &i420_buffer->DataU()[offset_u], i420_buffer->StrideU(), - &i420_buffer->DataV()[offset_v], i420_buffer->StrideV(), - KeepRefUntilDone(i420_buffer)), - kVideoRotation_0, 0); + current_frame_ = + VideoFrame::Builder() + .set_video_frame_buffer(WrapI420Buffer( + target_width_, target_height_, &i420_buffer->DataY()[offset_y], + i420_buffer->StrideY(), &i420_buffer->DataU()[offset_u], + i420_buffer->StrideU(), &i420_buffer->DataV()[offset_v], + i420_buffer->StrideV(), KeepRefUntilDone(i420_buffer))) + .set_rotation(kVideoRotation_0) + .set_timestamp_us(0) + .build(); } Clock* const clock_; diff --git a/test/test_video_capturer.cc b/test/test_video_capturer.cc index 0d57715a2b..ef3d8582ca 100644 --- a/test/test_video_capturer.cc +++ b/test/test_video_capturer.cc @@ -41,8 +41,12 @@ void TestVideoCapturer::OnFrame(const VideoFrame& frame) { rtc::scoped_refptr scaled_buffer = I420Buffer::Create(out_width, out_height); scaled_buffer->ScaleFrom(*frame.video_frame_buffer()->ToI420()); - broadcaster_.OnFrame( - VideoFrame(scaled_buffer, kVideoRotation_0, frame.timestamp_us())); + broadcaster_.OnFrame(VideoFrame::Builder() + .set_video_frame_buffer(scaled_buffer) + .set_rotation(kVideoRotation_0) + .set_timestamp_us(frame.timestamp_us()) + .set_id(frame.id()) + .build()); } else { // No adaptations needed, just return the frame as is. broadcaster_.OnFrame(frame); diff --git a/video/overuse_frame_detector_unittest.cc b/video/overuse_frame_detector_unittest.cc index 91050d5056..f6fa364386 100644 --- a/video/overuse_frame_detector_unittest.cc +++ b/video/overuse_frame_detector_unittest.cc @@ -93,8 +93,12 @@ class OveruseFrameDetectorTest : public ::testing::Test, int width, int height, int delay_us) { - VideoFrame frame(I420Buffer::Create(width, height), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_timestamp(timestamp); @@ -115,8 +119,12 @@ class OveruseFrameDetectorTest : public ::testing::Test, int height, // One element per layer rtc::ArrayView delays_us) { - VideoFrame frame(I420Buffer::Create(width, height), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_timestamp(timestamp); @@ -146,8 +154,12 @@ class OveruseFrameDetectorTest : public ::testing::Test, int delay_us) { webrtc::Random random(17); - VideoFrame frame(I420Buffer::Create(width, height), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_timestamp(timestamp); @@ -359,8 +371,12 @@ TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) { EXPECT_CALL(mock_observer_, AdaptDown(reason_)).Times(testing::AtLeast(1)); static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec; static const size_t kNumFramesEncodingDelay = 3; - VideoFrame frame(I420Buffer::Create(kWidth, kHeight), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); for (size_t i = 0; i < 1000; ++i) { // Unique timestamps. frame.set_timestamp(static_cast(i)); @@ -382,8 +398,12 @@ TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) { EXPECT_CALL(mock_observer_, AdaptDown(reason_)).Times(testing::AtLeast(1)); static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec; static const int kDelayUs = 30 * rtc::kNumMicrosecsPerMillisec; - VideoFrame frame(I420Buffer::Create(kWidth, kHeight), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); uint32_t timestamp = 0; for (size_t i = 0; i < 1000; ++i) { frame.set_timestamp(timestamp); @@ -642,8 +662,12 @@ class OveruseFrameDetectorTest2 : public OveruseFrameDetectorTest { int width, int height, int delay_us) override { - VideoFrame frame(I420Buffer::Create(width, height), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); while (num_frames-- > 0) { int64_t capture_time_us = rtc::TimeMicros(); overuse_detector_->FrameCaptured(frame, capture_time_us /* ignored */); @@ -662,8 +686,12 @@ class OveruseFrameDetectorTest2 : public OveruseFrameDetectorTest { int delay_us) override { webrtc::Random random(17); - VideoFrame frame(I420Buffer::Create(width, height), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); for (int i = 0; i < num_frames; i++) { int interval_us = random.Rand(min_interval_us, max_interval_us); int64_t capture_time_us = rtc::TimeMicros(); @@ -823,8 +851,12 @@ TEST_F(OveruseFrameDetectorTest2, MeasuresMultipleConcurrentSamples) { EXPECT_CALL(mock_observer_, AdaptDown(reason_)).Times(testing::AtLeast(1)); static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec; static const size_t kNumFramesEncodingDelay = 3; - VideoFrame frame(I420Buffer::Create(kWidth, kHeight), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); for (size_t i = 0; i < 1000; ++i) { // Unique timestamps. frame.set_timestamp(static_cast(i)); @@ -846,8 +878,12 @@ TEST_F(OveruseFrameDetectorTest2, UpdatesExistingSamples) { EXPECT_CALL(mock_observer_, AdaptDown(reason_)).Times(testing::AtLeast(1)); static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec; static const int kDelayUs = 30 * rtc::kNumMicrosecsPerMillisec; - VideoFrame frame(I420Buffer::Create(kWidth, kHeight), - webrtc::kVideoRotation_0, 0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); uint32_t timestamp = 0; for (size_t i = 0; i < 1000; ++i) { frame.set_timestamp(timestamp); diff --git a/video/receive_statistics_proxy_unittest.cc b/video/receive_statistics_proxy_unittest.cc index 08d899c0c8..a0f515b85f 100644 --- a/video/receive_statistics_proxy_unittest.cc +++ b/video/receive_statistics_proxy_unittest.cc @@ -68,8 +68,13 @@ class ReceiveStatisticsProxyTest } VideoFrame CreateVideoFrame(int width, int height, int64_t render_time_ms) { - VideoFrame frame(I420Buffer::Create(width, height), 0, render_time_ms, - kVideoRotation_0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_timestamp_rtp(0) + .set_timestamp_ms(render_time_ms) + .set_rotation(kVideoRotation_0) + .build(); frame.set_ntp_time_ms(fake_clock_.CurrentNtpInMilliseconds()); return frame; } @@ -248,8 +253,13 @@ TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameWithoutQpResetsQpSum) { TEST_F(ReceiveStatisticsProxyTest, OnRenderedFrameIncreasesFramesRendered) { EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_rendered); - webrtc::VideoFrame frame(webrtc::I420Buffer::Create(1, 1), 0, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(webrtc::I420Buffer::Create(1, 1)) + .set_timestamp_rtp(0) + .set_timestamp_us(0) + .set_rotation(kVideoRotation_0) + .build(); for (uint32_t i = 1; i <= 3; ++i) { statistics_proxy_->OnRenderedFrame(frame); EXPECT_EQ(i, statistics_proxy_->GetStats().frames_rendered); @@ -724,7 +734,11 @@ TEST_F(ReceiveStatisticsProxyTest, DoesNotReportStaleFramerates) { const int kDefaultFps = 30; rtc::scoped_refptr video_frame_buffer( I420Buffer::Create(kWidth, kHeight)); - VideoFrame frame(video_frame_buffer, kVideoRotation_0, 0); + VideoFrame frame = VideoFrame::Builder() + .set_video_frame_buffer(video_frame_buffer) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(0) + .build(); for (int i = 0; i < kDefaultFps; ++i) { // Since OnRenderedFrame is never called the fps in each sample will be 0, @@ -1058,8 +1072,13 @@ TEST_P(ReceiveStatisticsProxyTest, FreezesAreReported) { const int kFreezeDelayMs = 200; const int kCallDurationMs = kMinRequiredSamples * kInterFrameDelayMs + kFreezeDelayMs; - webrtc::VideoFrame frame(webrtc::I420Buffer::Create(1, 1), 0, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(webrtc::I420Buffer::Create(1, 1)) + .set_timestamp_rtp(0) + .set_timestamp_us(0) + .set_rotation(kVideoRotation_0) + .build(); for (int i = 0; i < kMinRequiredSamples; ++i) { statistics_proxy_->OnDecodedFrame(absl::nullopt, kWidth, kHeight, content_type); @@ -1100,8 +1119,13 @@ TEST_P(ReceiveStatisticsProxyTest, PausesAreIgnored) { const VideoContentType content_type = GetParam(); const int kInterFrameDelayMs = 33; const int kPauseDurationMs = 10000; - webrtc::VideoFrame frame(webrtc::I420Buffer::Create(1, 1), 0, 0, - webrtc::kVideoRotation_0); + webrtc::VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(webrtc::I420Buffer::Create(1, 1)) + .set_timestamp_rtp(0) + .set_timestamp_us(0) + .set_rotation(kVideoRotation_0) + .build(); for (int i = 0; i <= kMinRequiredSamples; ++i) { statistics_proxy_->OnDecodedFrame(absl::nullopt, kWidth, kHeight, content_type); diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index 37613e8f0c..46a8079995 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -2242,7 +2242,12 @@ VideoFrame CreateVideoFrame(int width, int height, uint8_t data) { const int kSizeY = width * height * 2; std::unique_ptr buffer(new uint8_t[kSizeY]); memset(buffer.get(), data, kSizeY); - VideoFrame frame(I420Buffer::Create(width, height), kVideoRotation_0, data); + VideoFrame frame = + webrtc::VideoFrame::Builder() + .set_video_frame_buffer(I420Buffer::Create(width, height)) + .set_rotation(webrtc::kVideoRotation_0) + .set_timestamp_us(data) + .build(); frame.set_timestamp(data); // Use data as a ms timestamp. frame.set_timestamp_us(data * rtc::kNumMicrosecsPerMillisec); diff --git a/video/video_stream_decoder_impl.cc b/video/video_stream_decoder_impl.cc index 2e8fc1a135..d3ecf579b2 100644 --- a/video/video_stream_decoder_impl.cc +++ b/video/video_stream_decoder_impl.cc @@ -272,8 +272,12 @@ void VideoStreamDecoderImpl::Decoded(VideoFrame& decoded_image, frame_timestamps->render_time_us / 1000); callbacks_->OnDecodedFrame( - VideoFrame(decoded_image.video_frame_buffer(), decoded_image.rotation(), - frame_timestamps->render_time_us), + VideoFrame::Builder() + .set_video_frame_buffer(decoded_image.video_frame_buffer()) + .set_rotation(decoded_image.rotation()) + .set_timestamp_us(frame_timestamps->render_time_us) + .set_id(decoded_image.id()) + .build(), casted_decode_time_ms, casted_qp); }); } diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index dfacb217ba..8484708247 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -873,9 +873,13 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame, cropped_buffer->ScaleFrom( *video_frame.video_frame_buffer()->ToI420().get()); } - out_frame = - VideoFrame(cropped_buffer, video_frame.timestamp(), - video_frame.render_time_ms(), video_frame.rotation()); + out_frame = VideoFrame::Builder() + .set_video_frame_buffer(cropped_buffer) + .set_timestamp_rtp(video_frame.timestamp()) + .set_timestamp_ms(video_frame.render_time_ms()) + .set_rotation(video_frame.rotation()) + .set_id(video_frame.id()) + .build(); out_frame.set_ntp_time_ms(video_frame.ntp_time_ms()); } diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc index c45c65f232..84521fb0c7 100644 --- a/video/video_stream_encoder_unittest.cc +++ b/video/video_stream_encoder_unittest.cc @@ -191,9 +191,14 @@ class AdaptingFrameForwarder : public test::FrameForwarder { video_frame.width(), video_frame.height(), video_frame.timestamp_us() * 1000, &cropped_width, &cropped_height, &out_width, &out_height)) { - VideoFrame adapted_frame(new rtc::RefCountedObject( - nullptr, out_width, out_height), - 99, 99, kVideoRotation_0); + VideoFrame adapted_frame = + VideoFrame::Builder() + .set_video_frame_buffer(new rtc::RefCountedObject( + nullptr, out_width, out_height)) + .set_timestamp_rtp(99) + .set_timestamp_ms(99) + .set_rotation(kVideoRotation_0) + .build(); adapted_frame.set_ntp_time_ms(video_frame.ntp_time_ms()); test::FrameForwarder::IncomingCapturedFrame(adapted_frame); last_width_.emplace(adapted_frame.width()); @@ -354,17 +359,27 @@ class VideoStreamEncoderTest : public ::testing::Test { VideoFrame CreateFrame(int64_t ntp_time_ms, rtc::Event* destruction_event) const { - VideoFrame frame(new rtc::RefCountedObject( - destruction_event, codec_width_, codec_height_), - 99, 99, kVideoRotation_0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer(new rtc::RefCountedObject( + destruction_event, codec_width_, codec_height_)) + .set_timestamp_rtp(99) + .set_timestamp_ms(99) + .set_rotation(kVideoRotation_0) + .build(); frame.set_ntp_time_ms(ntp_time_ms); return frame; } VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const { - VideoFrame frame( - new rtc::RefCountedObject(nullptr, width, height), 99, 99, - kVideoRotation_0); + VideoFrame frame = + VideoFrame::Builder() + .set_video_frame_buffer( + new rtc::RefCountedObject(nullptr, width, height)) + .set_timestamp_rtp(99) + .set_timestamp_ms(99) + .set_rotation(kVideoRotation_0) + .build(); frame.set_ntp_time_ms(ntp_time_ms); frame.set_timestamp_us(ntp_time_ms * 1000); return frame;