diff options
author | perkj@webrtc.org <perkj@webrtc.org> | 2015-03-18 09:51:05 +0000 |
---|---|---|
committer | perkj@webrtc.org <perkj@webrtc.org> | 2015-03-18 09:51:44 +0000 |
commit | af612d5e0769571544952cbe55e675748afa9bdd (patch) | |
tree | 9081ccaed48fc7c58b5076f7c566315593f19760 /webrtc/common_video | |
parent | 6dba1ebd14d8cd96e6e56adad868b33fdedecc53 (diff) | |
download | webrtc-af612d5e0769571544952cbe55e675748afa9bdd.tar.gz |
Reland "Make the entry point for VideoFrames to webrtc const ref I420VideoFrame.""
Original cl description:
This removes the none const pointer entry and SwapFrame.
Since frames delivered using VideoSendStream no longer use the external capture module, VideoSendStream will not get an incoming framerate callback. VideoSendStream now uses a rtc::RateTracker.
Also, the video engine must ensure that time stamps are always increasing.
With this, time stamps (ntp, render_time and rtp timestamps ) are checked and set in ViECapturer::OnIncomingCapturedFrame
This cl was previously reverted in https://webrtc-codereview.appspot.com/46549004/.
Patchset 1 contains the original patch after rebase.
Patshet 2 fix webrtc_perf_tests reported in chromium:465306
Note that chromium:465287 is being fixed in https://webrtc-codereview.appspot.com/43829004/
BUG=1128
R=magjed@webrtc.org, mflodman@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/47629004
Cr-Commit-Position: refs/heads/master@{#8776}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8776 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'webrtc/common_video')
-rw-r--r-- | webrtc/common_video/i420_video_frame.cc | 8 | ||||
-rw-r--r-- | webrtc/common_video/i420_video_frame_unittest.cc | 56 |
2 files changed, 64 insertions, 0 deletions
diff --git a/webrtc/common_video/i420_video_frame.cc b/webrtc/common_video/i420_video_frame.cc index edc5112af9..05b72cf629 100644 --- a/webrtc/common_video/i420_video_frame.cc +++ b/webrtc/common_video/i420_video_frame.cc @@ -134,6 +134,14 @@ int I420VideoFrame::CopyFrame(const I420VideoFrame& videoFrame) { return 0; } +void I420VideoFrame::ShallowCopy(const I420VideoFrame& videoFrame) { + video_frame_buffer_ = videoFrame.video_frame_buffer(); + timestamp_ = videoFrame.timestamp_; + ntp_time_ms_ = videoFrame.ntp_time_ms_; + render_time_ms_ = videoFrame.render_time_ms_; + rotation_ = videoFrame.rotation_; +} + I420VideoFrame* I420VideoFrame::CloneFrame() const { rtc::scoped_ptr<I420VideoFrame> new_frame(new I420VideoFrame()); if (new_frame->CopyFrame(*this) == -1) { diff --git a/webrtc/common_video/i420_video_frame_unittest.cc b/webrtc/common_video/i420_video_frame_unittest.cc index fa99211bb8..e9e117eae3 100644 --- a/webrtc/common_video/i420_video_frame_unittest.cc +++ b/webrtc/common_video/i420_video_frame_unittest.cc @@ -130,6 +130,62 @@ TEST(TestI420VideoFrame, CopyFrame) { EXPECT_TRUE(EqualFrames(small_frame, big_frame)); } +TEST(TestI420VideoFrame, ShallowCopy) { + uint32_t timestamp = 1; + int64_t ntp_time_ms = 2; + int64_t render_time_ms = 3; + int stride_y = 15; + int stride_u = 10; + int stride_v = 10; + int width = 15; + int height = 15; + + const int kSizeY = 400; + const int kSizeU = 100; + const int kSizeV = 100; + const VideoRotation kRotation = kVideoRotation_270; + uint8_t buffer_y[kSizeY]; + uint8_t buffer_u[kSizeU]; + uint8_t buffer_v[kSizeV]; + memset(buffer_y, 16, kSizeY); + memset(buffer_u, 8, kSizeU); + memset(buffer_v, 4, kSizeV); + I420VideoFrame frame1; + EXPECT_EQ(0, frame1.CreateFrame(buffer_y, buffer_u, buffer_v, width, height, + stride_y, stride_u, stride_v, kRotation)); + frame1.set_timestamp(timestamp); + frame1.set_ntp_time_ms(ntp_time_ms); + frame1.set_render_time_ms(render_time_ms); + I420VideoFrame frame2; + frame2.ShallowCopy(frame1); + + // To be able to access the buffers, we need const pointers to the frames. + const I420VideoFrame* const_frame1_ptr = &frame1; + const I420VideoFrame* const_frame2_ptr = &frame2; + + EXPECT_TRUE(const_frame1_ptr->buffer(kYPlane) == + const_frame2_ptr->buffer(kYPlane)); + EXPECT_TRUE(const_frame1_ptr->buffer(kUPlane) == + const_frame2_ptr->buffer(kUPlane)); + EXPECT_TRUE(const_frame1_ptr->buffer(kVPlane) == + const_frame2_ptr->buffer(kVPlane)); + + EXPECT_EQ(frame2.timestamp(), frame1.timestamp()); + EXPECT_EQ(frame2.ntp_time_ms(), frame1.ntp_time_ms()); + EXPECT_EQ(frame2.render_time_ms(), frame1.render_time_ms()); + EXPECT_EQ(frame2.rotation(), frame1.rotation()); + + frame2.set_timestamp(timestamp + 1); + frame2.set_ntp_time_ms(ntp_time_ms + 1); + frame2.set_render_time_ms(render_time_ms + 1); + frame2.set_rotation(kVideoRotation_90); + + EXPECT_NE(frame2.timestamp(), frame1.timestamp()); + EXPECT_NE(frame2.ntp_time_ms(), frame1.ntp_time_ms()); + EXPECT_NE(frame2.render_time_ms(), frame1.render_time_ms()); + EXPECT_NE(frame2.rotation(), frame1.rotation()); +} + TEST(TestI420VideoFrame, Reset) { I420VideoFrame frame; ASSERT_TRUE(frame.CreateEmptyFrame(5, 5, 5, 5, 5) == 0); |