Revert of Delete method cricket::VideoFrame::Copy. (patchset #7 id:120001 of https://codereview.webrtc.org/2080253002/ )
Reason for revert:
It broke a downstream build by removing VideoFrame::Copy method.
Original issue's description:
> Delete method cricket::VideoFrame::Copy.
>
> Should be unused in Chrome since cl
> https://codereview.chromium.org/2068703002/
>
> TBR=tkchin@webrtc.org,magjed@webrtc.org
> BUG=webrtc:5682
>
> Committed: https://crrev.com/9c00f646f0b3cd33506a1944c7bc6724af041237
> Committed: https://crrev.com/7e4e00d189a5dfac2b463a5100ee65ee2f11ed79
> Cr-Original-Commit-Position: refs/heads/master@{#13236}
> Cr-Commit-Position: refs/heads/master@{#13244}
TBR=pbos@webrtc.org,tkchin@webrtc.org,magjed@webrtc.org,sergeyu@chromium.org,nisse@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5682
Review-Url: https://codereview.webrtc.org/2087923004
Cr-Commit-Position: refs/heads/master@{#13246}
diff --git a/talk/app/webrtc/objc/RTCI420Frame.mm b/talk/app/webrtc/objc/RTCI420Frame.mm
index 1646510..6c6c564 100644
--- a/talk/app/webrtc/objc/RTCI420Frame.mm
+++ b/talk/app/webrtc/objc/RTCI420Frame.mm
@@ -29,7 +29,7 @@
#include <memory>
-#include "webrtc/media/engine/webrtcvideoframe.h"
+#include "webrtc/media/base/videoframe.h"
@implementation RTCI420Frame {
std::unique_ptr<cricket::VideoFrame> _videoFrame;
@@ -98,10 +98,7 @@
if (self = [super init]) {
// Keep a shallow copy of the video frame. The underlying frame buffer is
// not copied.
- _videoFrame.reset(new cricket::WebRtcVideoFrame(
- videoFrame->video_frame_buffer(),
- videoFrame->rotation(),
- videoFrame->timestamp_us()));
+ _videoFrame.reset(videoFrame->Copy());
}
return self;
}
diff --git a/webrtc/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc
index 2b08f75..a5ba254 100644
--- a/webrtc/api/java/jni/peerconnection_jni.cc
+++ b/webrtc/api/java/jni/peerconnection_jni.cc
@@ -768,8 +768,7 @@
// ownership of the frame, and the frame should be released with
// VideoRenderer.releaseNativeFrame().
static jlong javaShallowCopy(const cricket::VideoFrame* frame) {
- return jlongFromPointer(new cricket::WebRtcVideoFrame(
- frame->video_frame_buffer(), frame->rotation(), frame->timestamp_us()));
+ return jlongFromPointer(frame->Copy());
}
// Return a VideoRenderer.I420Frame referring to the data in |frame|.
diff --git a/webrtc/media/base/videoframe.h b/webrtc/media/base/videoframe.h
index 10dc1bd..4015f90 100644
--- a/webrtc/media/base/videoframe.h
+++ b/webrtc/media/base/videoframe.h
@@ -51,6 +51,11 @@
// Indicates the rotation angle in degrees.
virtual webrtc::VideoRotation rotation() const = 0;
+ // Make a shallow copy of the frame. The frame buffer itself is not copied.
+ // Both the current and new VideoFrame will share a single reference-counted
+ // frame buffer.
+ virtual VideoFrame *Copy() const = 0;
+
// Return a copy of frame which has its pending rotation applied. The
// ownership of the returned frame is held by this frame.
virtual const VideoFrame* GetCopyWithRotationApplied() const = 0;
diff --git a/webrtc/media/base/videoframe_unittest.h b/webrtc/media/base/videoframe_unittest.h
index 38c3f85..3998561 100644
--- a/webrtc/media/base/videoframe_unittest.h
+++ b/webrtc/media/base/videoframe_unittest.h
@@ -1808,6 +1808,31 @@
EXPECT_TRUE(IsEqual(frame1, frame2, 1));
}
+ ///////////////////
+ // General tests //
+ ///////////////////
+
+ void Copy() {
+ std::unique_ptr<T> source(new T);
+ std::unique_ptr<cricket::VideoFrame> target;
+ ASSERT_TRUE(LoadFrameNoRepeat(source.get()));
+ target.reset(source->Copy());
+ EXPECT_TRUE(IsEqual(*source, *target, 0));
+ source.reset();
+ ASSERT_TRUE(target->video_frame_buffer() != NULL);
+ EXPECT_TRUE(target->video_frame_buffer()->DataY() != NULL);
+ }
+
+ void CopyIsRef() {
+ std::unique_ptr<T> source(new T);
+ std::unique_ptr<const cricket::VideoFrame> target;
+ ASSERT_TRUE(LoadFrameNoRepeat(source.get()));
+ target.reset(source->Copy());
+ EXPECT_TRUE(IsEqual(*source, *target, 0));
+ const T* const_source = source.get();
+ EXPECT_EQ(const_source->video_frame_buffer(), target->video_frame_buffer());
+ }
+
int repeat_;
};
diff --git a/webrtc/media/engine/webrtcvideoframe.cc b/webrtc/media/engine/webrtcvideoframe.cc
index 067c80f..4f89c8b 100644
--- a/webrtc/media/engine/webrtcvideoframe.cc
+++ b/webrtc/media/engine/webrtcvideoframe.cc
@@ -78,6 +78,10 @@
return video_frame_buffer_;
}
+VideoFrame* WebRtcVideoFrame::Copy() const {
+ return new WebRtcVideoFrame(video_frame_buffer_, rotation_, timestamp_us_);
+}
+
size_t WebRtcVideoFrame::ConvertToRgbBuffer(uint32_t to_fourcc,
uint8_t* buffer,
size_t size,
diff --git a/webrtc/media/engine/webrtcvideoframe.h b/webrtc/media/engine/webrtcvideoframe.h
index cec2f83..487e32e 100644
--- a/webrtc/media/engine/webrtcvideoframe.h
+++ b/webrtc/media/engine/webrtcvideoframe.h
@@ -75,6 +75,8 @@
webrtc::VideoRotation rotation() const override { return rotation_; }
+ VideoFrame* Copy() const override;
+
size_t ConvertToRgbBuffer(uint32_t to_fourcc,
uint8_t* buffer,
size_t size,
diff --git a/webrtc/media/engine/webrtcvideoframe_unittest.cc b/webrtc/media/engine/webrtcvideoframe_unittest.cc
index a725246..abfd0ae 100644
--- a/webrtc/media/engine/webrtcvideoframe_unittest.cc
+++ b/webrtc/media/engine/webrtcvideoframe_unittest.cc
@@ -245,6 +245,9 @@
// TEST_WEBRTCVIDEOFRAME(ConvertToI422Buffer)
// TEST_WEBRTCVIDEOFRAME(ConstructARGBBlackWhitePixel)
+TEST_WEBRTCVIDEOFRAME(Copy)
+TEST_WEBRTCVIDEOFRAME(CopyIsRef)
+
// These functions test implementation-specific details.
// Tests the Init function with different cropped size.
TEST_F(WebRtcVideoFrameTest, InitEvenSize) {
@@ -289,6 +292,24 @@
EXPECT_EQ(40, frame.timestamp_us());
}
+TEST_F(WebRtcVideoFrameTest, CopyTextureFrame) {
+ webrtc::test::FakeNativeHandle* dummy_handle =
+ new webrtc::test::FakeNativeHandle();
+ webrtc::NativeHandleBuffer* buffer =
+ new rtc::RefCountedObject<webrtc::test::FakeNativeHandleBuffer>(
+ dummy_handle, 640, 480);
+ // Timestamp is converted from ns to us, so last three digits are lost.
+ cricket::WebRtcVideoFrame frame1(buffer, 20000, webrtc::kVideoRotation_0);
+ cricket::VideoFrame* frame2 = frame1.Copy();
+ EXPECT_EQ(frame1.video_frame_buffer()->native_handle(),
+ frame2->video_frame_buffer()->native_handle());
+ EXPECT_EQ(frame1.width(), frame2->width());
+ EXPECT_EQ(frame1.height(), frame2->height());
+ EXPECT_EQ(frame1.GetTimeStamp(), frame2->GetTimeStamp());
+ EXPECT_EQ(frame1.timestamp_us(), frame2->timestamp_us());
+ delete frame2;
+}
+
TEST_F(WebRtcVideoFrameTest, ApplyRotationToFrame) {
WebRtcVideoTestFrame applied0;
EXPECT_TRUE(IsNull(applied0));
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm b/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
index dcce32d..5b2d258 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCVideoFrame.mm
@@ -12,8 +12,6 @@
#include <memory>
-#include "webrtc/media/engine/webrtcvideoframe.h"
-
@implementation RTCVideoFrame {
std::unique_ptr<cricket::VideoFrame> _videoFrame;
rtc::scoped_refptr<webrtc::VideoFrameBuffer> _i420Buffer;
@@ -107,10 +105,7 @@
if (self = [super init]) {
// Keep a shallow copy of the video frame. The underlying frame buffer is
// not copied.
- _videoFrame.reset(new cricket::WebRtcVideoFrame(
- nativeFrame->video_frame_buffer(),
- nativeFrame->rotation(),
- nativeFrame->timestamp_us()));
+ _videoFrame.reset(nativeFrame->Copy());
}
return self;
}