aboutsummaryrefslogtreecommitdiff
path: root/webrtc/common_video
diff options
context:
space:
mode:
authorperkj@webrtc.org <perkj@webrtc.org>2015-03-18 09:51:05 +0000
committerperkj@webrtc.org <perkj@webrtc.org>2015-03-18 09:51:44 +0000
commitaf612d5e0769571544952cbe55e675748afa9bdd (patch)
tree9081ccaed48fc7c58b5076f7c566315593f19760 /webrtc/common_video
parent6dba1ebd14d8cd96e6e56adad868b33fdedecc53 (diff)
downloadwebrtc-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.cc8
-rw-r--r--webrtc/common_video/i420_video_frame_unittest.cc56
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);