Update I420Buffer to new VideoFrameBuffer interface
This is a follow-up cleanup for CL https://codereview.webrtc.org/2847383002/.
BUG=webrtc:7632
TBR=stefan
Review-Url: https://codereview.webrtc.org/2906053002
Cr-Commit-Position: refs/heads/master@{#18388}
diff --git a/webrtc/api/video/i420_buffer.cc b/webrtc/api/video/i420_buffer.cc
index ae770c6..495009c 100644
--- a/webrtc/api/video/i420_buffer.cc
+++ b/webrtc/api/video/i420_buffer.cc
@@ -77,7 +77,7 @@
// static
rtc::scoped_refptr<I420Buffer> I420Buffer::Copy(
- const VideoFrameBuffer& source) {
+ const I420BufferInterface& source) {
return Copy(source.width(), source.height(),
source.DataY(), source.StrideY(),
source.DataU(), source.StrideU(),
@@ -104,7 +104,8 @@
// static
rtc::scoped_refptr<I420Buffer> I420Buffer::Rotate(
- const VideoFrameBuffer& src, VideoRotation rotation) {
+ const I420BufferInterface& src,
+ VideoRotation rotation) {
RTC_CHECK(src.DataY());
RTC_CHECK(src.DataU());
RTC_CHECK(src.DataV());
@@ -183,12 +184,11 @@
0, 128, 128) == 0);
}
-void I420Buffer::CropAndScaleFrom(
- const VideoFrameBuffer& src,
- int offset_x,
- int offset_y,
- int crop_width,
- int crop_height) {
+void I420Buffer::CropAndScaleFrom(const I420BufferInterface& src,
+ int offset_x,
+ int offset_y,
+ int crop_width,
+ int crop_height) {
RTC_CHECK_LE(crop_width, src.width());
RTC_CHECK_LE(crop_height, src.height());
RTC_CHECK_LE(crop_width + offset_x, src.width());
@@ -220,8 +220,7 @@
RTC_DCHECK_EQ(res, 0);
}
-void I420Buffer::CropAndScaleFrom(
- const VideoFrameBuffer& src) {
+void I420Buffer::CropAndScaleFrom(const I420BufferInterface& src) {
const int crop_width =
std::min(src.width(), width() * src.height() / height());
const int crop_height =
@@ -233,7 +232,7 @@
crop_width, crop_height);
}
-void I420Buffer::ScaleFrom(const VideoFrameBuffer& src) {
+void I420Buffer::ScaleFrom(const I420BufferInterface& src) {
CropAndScaleFrom(src, 0, 0, src.width(), src.height());
}
diff --git a/webrtc/api/video/i420_buffer.h b/webrtc/api/video/i420_buffer.h
index c849ab2..31014a3 100644
--- a/webrtc/api/video/i420_buffer.h
+++ b/webrtc/api/video/i420_buffer.h
@@ -30,7 +30,11 @@
int stride_v);
// Create a new buffer and copy the pixel data.
- static rtc::scoped_refptr<I420Buffer> Copy(const VideoFrameBuffer& buffer);
+ static rtc::scoped_refptr<I420Buffer> Copy(const I420BufferInterface& buffer);
+ // Deprecated.
+ static rtc::scoped_refptr<I420Buffer> Copy(const VideoFrameBuffer& buffer) {
+ return Copy(*buffer.GetI420());
+ }
static rtc::scoped_refptr<I420Buffer> Copy(
int width, int height,
@@ -39,8 +43,13 @@
const uint8_t* data_v, int stride_v);
// Returns a rotated copy of |src|.
- static rtc::scoped_refptr<I420Buffer> Rotate(const VideoFrameBuffer& src,
+ static rtc::scoped_refptr<I420Buffer> Rotate(const I420BufferInterface& src,
VideoRotation rotation);
+ // Deprecated.
+ static rtc::scoped_refptr<I420Buffer> Rotate(const VideoFrameBuffer& src,
+ VideoRotation rotation) {
+ return Rotate(*src.GetI420(), rotation);
+ }
// Sets the buffer to all black.
static void SetBlack(I420Buffer* buffer);
@@ -69,7 +78,7 @@
// Scale the cropped area of |src| to the size of |this| buffer, and
// write the result into |this|.
- void CropAndScaleFrom(const VideoFrameBuffer& src,
+ void CropAndScaleFrom(const I420BufferInterface& src,
int offset_x,
int offset_y,
int crop_width,
@@ -77,10 +86,10 @@
// The common case of a center crop, when needed to adjust the
// aspect ratio without distorting the image.
- void CropAndScaleFrom(const VideoFrameBuffer& src);
+ void CropAndScaleFrom(const I420BufferInterface& src);
// Scale all of |src| to the size of |this| buffer, with no cropping.
- void ScaleFrom(const VideoFrameBuffer& src);
+ void ScaleFrom(const I420BufferInterface& src);
protected:
I420Buffer(int width, int height);
diff --git a/webrtc/api/video/video_frame.h b/webrtc/api/video/video_frame.h
index 82c348d..3ee381b 100644
--- a/webrtc/api/video/video_frame.h
+++ b/webrtc/api/video/video_frame.h
@@ -98,7 +98,7 @@
// TODO(nisse): Deprecated.
// Return true if the frame is stored in a texture.
bool is_texture() const {
- return video_frame_buffer()->native_handle() != nullptr;
+ return video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative;
}
private:
diff --git a/webrtc/api/video/video_frame_buffer.cc b/webrtc/api/video/video_frame_buffer.cc
index bb31717..3fc442b 100644
--- a/webrtc/api/video/video_frame_buffer.cc
+++ b/webrtc/api/video/video_frame_buffer.cc
@@ -26,7 +26,7 @@
// VideoFrameBuffer) vs ToI420 (returns I420BufferInterface).
class I420InterfaceAdapter : public I420BufferInterface {
public:
- explicit I420InterfaceAdapter(rtc::scoped_refptr<VideoFrameBuffer> buffer)
+ explicit I420InterfaceAdapter(const VideoFrameBuffer* buffer)
: buffer_(buffer) {}
int width() const override { return buffer_->width(); }
@@ -41,7 +41,7 @@
int StrideV() const override { return buffer_->StrideV(); }
private:
- rtc::scoped_refptr<VideoFrameBuffer> buffer_;
+ rtc::scoped_refptr<const VideoFrameBuffer> buffer_;
};
} // namespace
@@ -54,28 +54,28 @@
}
const uint8_t* VideoFrameBuffer::DataY() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->DataY();
+ return GetI420()->DataY();
}
const uint8_t* VideoFrameBuffer::DataU() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->DataU();
+ return GetI420()->DataU();
}
const uint8_t* VideoFrameBuffer::DataV() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->DataV();
+ return GetI420()->DataV();
}
// Returns the number of bytes between successive rows for a given plane.
int VideoFrameBuffer::StrideY() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->StrideY();
+ return GetI420()->StrideY();
}
int VideoFrameBuffer::StrideU() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->StrideU();
+ return GetI420()->StrideU();
}
int VideoFrameBuffer::StrideV() const {
- return const_cast<VideoFrameBuffer*>(this)->GetI420()->StrideV();
+ return GetI420()->StrideV();
}
void* VideoFrameBuffer::native_handle() const {
@@ -98,11 +98,24 @@
return new rtc::RefCountedObject<I420InterfaceAdapter>(this);
}
-rtc::scoped_refptr<I444BufferInterface> VideoFrameBuffer::GetI444() {
+rtc::scoped_refptr<const I420BufferInterface> VideoFrameBuffer::GetI420()
+ const {
+ RTC_CHECK(type() == Type::kI420);
+ // TODO(magjed): static_cast to I420BufferInterface instead once external
+ // clients are updated.
+ return new rtc::RefCountedObject<I420InterfaceAdapter>(this);
+}
+
+I444BufferInterface* VideoFrameBuffer::GetI444() {
RTC_CHECK(type() == Type::kI444);
return static_cast<I444BufferInterface*>(this);
}
+const I444BufferInterface* VideoFrameBuffer::GetI444() const {
+ RTC_CHECK(type() == Type::kI444);
+ return static_cast<const I444BufferInterface*>(this);
+}
+
VideoFrameBuffer::Type I420BufferInterface::type() const {
return Type::kI420;
}
diff --git a/webrtc/api/video/video_frame_buffer.h b/webrtc/api/video/video_frame_buffer.h
index 13005af..fa711d8 100644
--- a/webrtc/api/video/video_frame_buffer.h
+++ b/webrtc/api/video/video_frame_buffer.h
@@ -63,8 +63,12 @@
// These functions should only be called if type() is of the correct type.
// Calling with a different type will result in a crash.
+ // TODO(magjed): Return raw pointers for GetI420 once deprecated interface is
+ // removed.
rtc::scoped_refptr<I420BufferInterface> GetI420();
- rtc::scoped_refptr<I444BufferInterface> GetI444();
+ rtc::scoped_refptr<const I420BufferInterface> GetI420() const;
+ I444BufferInterface* GetI444();
+ const I444BufferInterface* GetI444() const;
// Deprecated - use ToI420() first instead.
// Returns pointer to the pixel data for a given plane. The memory is owned by
diff --git a/webrtc/common_video/i420_buffer_pool_unittest.cc b/webrtc/common_video/i420_buffer_pool_unittest.cc
index a4dda0c..77aa086 100644
--- a/webrtc/common_video/i420_buffer_pool_unittest.cc
+++ b/webrtc/common_video/i420_buffer_pool_unittest.cc
@@ -17,7 +17,7 @@
TEST(TestI420BufferPool, SimpleFrameReuse) {
I420BufferPool pool;
- rtc::scoped_refptr<VideoFrameBuffer> buffer = pool.CreateBuffer(16, 16);
+ rtc::scoped_refptr<I420BufferInterface> buffer = pool.CreateBuffer(16, 16);
EXPECT_EQ(16, buffer->width());
EXPECT_EQ(16, buffer->height());
// Extract non-refcounted pointers for testing.
@@ -37,7 +37,7 @@
TEST(TestI420BufferPool, FailToReuse) {
I420BufferPool pool;
- rtc::scoped_refptr<VideoFrameBuffer> buffer = pool.CreateBuffer(16, 16);
+ rtc::scoped_refptr<I420BufferInterface> buffer = pool.CreateBuffer(16, 16);
// Extract non-refcounted pointers for testing.
const uint8_t* u_ptr = buffer->DataU();
const uint8_t* v_ptr = buffer->DataV();
@@ -65,7 +65,7 @@
TEST(TestI420BufferPool, MaxNumberOfBuffers) {
I420BufferPool pool(false, 1);
- rtc::scoped_refptr<VideoFrameBuffer> buffer1 = pool.CreateBuffer(16, 16);
+ rtc::scoped_refptr<I420BufferInterface> buffer1 = pool.CreateBuffer(16, 16);
EXPECT_NE(nullptr, buffer1.get());
EXPECT_EQ(nullptr, pool.CreateBuffer(16, 16).get());
}
diff --git a/webrtc/common_video/i420_video_frame_unittest.cc b/webrtc/common_video/i420_video_frame_unittest.cc
index f3ee931..1e4f207 100644
--- a/webrtc/common_video/i420_video_frame_unittest.cc
+++ b/webrtc/common_video/i420_video_frame_unittest.cc
@@ -33,8 +33,8 @@
128 * (x * height + y * width) / (width * height);
}
}
- int chroma_width = (width + 1) / 2;
- int chroma_height = (height + 1) / 2;
+ int chroma_width = buffer->ChromaWidth();
+ int chroma_height = buffer->ChromaHeight();
for (int x = 0; x < chroma_width; x++) {
for (int y = 0; y < chroma_height; y++) {
buffer->MutableDataU()[x + y * chroma_width] =
@@ -49,7 +49,7 @@
// The offsets and sizes describe the rectangle extracted from the
// original (gradient) frame, in relative coordinates where the
// original frame correspond to the unit square, 0.0 <= x, y < 1.0.
-void CheckCrop(const webrtc::VideoFrameBuffer& frame,
+void CheckCrop(const webrtc::I420BufferInterface& frame,
double offset_x,
double offset_y,
double rel_width,
@@ -78,8 +78,10 @@
}
}
-void CheckRotate(int width, int height, webrtc::VideoRotation rotation,
- const webrtc::VideoFrameBuffer& rotated) {
+void CheckRotate(int width,
+ int height,
+ webrtc::VideoRotation rotation,
+ const webrtc::I420BufferInterface& rotated) {
int rotated_width = width;
int rotated_height = height;
@@ -160,12 +162,13 @@
VideoFrame frame2(frame1);
EXPECT_EQ(frame1.video_frame_buffer(), frame2.video_frame_buffer());
- EXPECT_EQ(frame1.video_frame_buffer()->DataY(),
- frame2.video_frame_buffer()->DataY());
- EXPECT_EQ(frame1.video_frame_buffer()->DataU(),
- frame2.video_frame_buffer()->DataU());
- EXPECT_EQ(frame1.video_frame_buffer()->DataV(),
- frame2.video_frame_buffer()->DataV());
+ rtc::scoped_refptr<I420BufferInterface> yuv1 =
+ frame1.video_frame_buffer()->GetI420();
+ rtc::scoped_refptr<I420BufferInterface> yuv2 =
+ frame2.video_frame_buffer()->GetI420();
+ EXPECT_EQ(yuv1->DataY(), yuv2->DataY());
+ EXPECT_EQ(yuv1->DataU(), yuv2->DataU());
+ EXPECT_EQ(yuv1->DataV(), yuv2->DataV());
EXPECT_EQ(frame2.timestamp(), frame1.timestamp());
EXPECT_EQ(frame2.ntp_time_ms(), frame1.ntp_time_ms());
@@ -280,8 +283,8 @@
: public ::testing::TestWithParam<webrtc::VideoRotation> {};
TEST_P(TestI420BufferRotate, Rotates) {
- rtc::scoped_refptr<VideoFrameBuffer> buffer = CreateGradient(640, 480);
- rtc::scoped_refptr<VideoFrameBuffer> rotated_buffer =
+ rtc::scoped_refptr<I420BufferInterface> buffer = CreateGradient(640, 480);
+ rtc::scoped_refptr<I420BufferInterface> rotated_buffer =
I420Buffer::Rotate(*buffer, GetParam());
CheckRotate(640, 480, GetParam(), *rotated_buffer);
}
diff --git a/webrtc/common_video/libyuv/include/webrtc_libyuv.h b/webrtc/common_video/libyuv/include/webrtc_libyuv.h
index 0924f68..b0c6ab6 100644
--- a/webrtc/common_video/libyuv/include/webrtc_libyuv.h
+++ b/webrtc/common_video/libyuv/include/webrtc_libyuv.h
@@ -50,9 +50,9 @@
// already open for writing.
// Return value: 0 if OK, < 0 otherwise.
int PrintVideoFrame(const VideoFrame& frame, FILE* file);
-int PrintVideoFrame(const VideoFrameBuffer& frame, FILE* file);
+int PrintVideoFrame(const I420BufferInterface& frame, FILE* file);
-// Extract buffer from VideoFrame or VideoFrameBuffer (consecutive
+// Extract buffer from VideoFrame or I420BufferInterface (consecutive
// planes, no stride)
// Input:
// - frame : Reference to video frame.
@@ -60,7 +60,7 @@
// insufficient, an error will be returned.
// - buffer : Pointer to buffer
// Return value: length of buffer if OK, < 0 otherwise.
-int ExtractBuffer(const rtc::scoped_refptr<VideoFrameBuffer>& input_frame,
+int ExtractBuffer(const rtc::scoped_refptr<I420BufferInterface>& input_frame,
size_t size,
uint8_t* buffer);
int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer);
@@ -108,13 +108,13 @@
// Compute PSNR for an I420 frame (all planes).
// Returns the PSNR in decibel, to a maximum of kInfinitePSNR.
double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame);
-double I420PSNR(const VideoFrameBuffer& ref_buffer,
- const VideoFrameBuffer& test_buffer);
+double I420PSNR(const I420BufferInterface& ref_buffer,
+ const I420BufferInterface& test_buffer);
// Compute SSIM for an I420 frame (all planes).
double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame);
-double I420SSIM(const VideoFrameBuffer& ref_buffer,
- const VideoFrameBuffer& test_buffer);
+double I420SSIM(const I420BufferInterface& ref_buffer,
+ const I420BufferInterface& test_buffer);
// Helper function for scaling NV12 to NV12.
void NV12Scale(std::vector<uint8_t>* tmp_buffer,
diff --git a/webrtc/common_video/libyuv/libyuv_unittest.cc b/webrtc/common_video/libyuv/libyuv_unittest.cc
index c60085c..ea90ec4 100644
--- a/webrtc/common_video/libyuv/libyuv_unittest.cc
+++ b/webrtc/common_video/libyuv/libyuv_unittest.cc
@@ -62,7 +62,7 @@
ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<<
input_file_name << "\n";
- rtc::scoped_refptr<VideoFrameBuffer> buffer(
+ rtc::scoped_refptr<I420BufferInterface> buffer(
test::ReadI420Buffer(width_, height_, source_file_));
orig_frame_.reset(new VideoFrame(buffer, kVideoRotation_0, 0));
@@ -89,8 +89,8 @@
double psnr = 0.0;
- rtc::scoped_refptr<I420Buffer> res_i420_buffer = I420Buffer::Create(
- width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2);
+ rtc::scoped_refptr<I420Buffer> res_i420_buffer =
+ I420Buffer::Create(width_, height_);
printf("\nConvert #%d I420 <-> I420 \n", j);
std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]);
@@ -103,7 +103,8 @@
if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
return;
}
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
EXPECT_EQ(48.0, psnr);
j++;
@@ -125,7 +126,8 @@
if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
return;
}
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
// Optimization Speed- quality trade-off => 45 dB only (platform dependant).
EXPECT_GT(ceil(psnr), 44);
@@ -138,7 +140,8 @@
EXPECT_EQ(0,
ConvertToI420(VideoType::kUYVY, out_uyvy_buffer.get(), 0, 0, width_,
height_, 0, kVideoRotation_0, res_i420_buffer.get()));
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
EXPECT_EQ(48.0, psnr);
if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
return;
@@ -158,7 +161,8 @@
return;
}
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
EXPECT_EQ(48.0, psnr);
printf("\nConvert #%d I420 <-> RGB565\n", j);
@@ -175,7 +179,8 @@
}
j++;
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
// TODO(leozwang) Investigate the right psnr should be set for I420ToRGB565,
// Another example is I420ToRGB24, the psnr is 44
// TODO(mikhal): Add psnr for RGB565, 1555, 4444, convert to ARGB.
@@ -195,7 +200,8 @@
return;
}
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
// TODO(leozwang) Investigate the right psnr should be set for
// I420ToARGB8888,
EXPECT_GT(ceil(psnr), 42);
@@ -228,7 +234,8 @@
if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
return;
}
- psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer);
+ psnr =
+ I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
EXPECT_EQ(48.0, psnr);
}
@@ -241,7 +248,8 @@
int stride_uv;
// Assume compact layout, no padding.
- const uint8_t *orig_buffer = orig_frame_->video_frame_buffer()->DataY();
+ const uint8_t* orig_buffer =
+ orig_frame_->video_frame_buffer()->GetI420()->DataY();
Calc16ByteAlignedStride(rotated_width, &stride_y, &stride_uv);
rtc::scoped_refptr<I420Buffer> rotated_res_i420_buffer = I420Buffer::Create(
@@ -252,8 +260,7 @@
EXPECT_EQ(
0, ConvertToI420(VideoType::kI420, orig_buffer, 0, 0, width_, height_, 0,
kVideoRotation_270, rotated_res_i420_buffer.get()));
- rotated_res_i420_buffer = I420Buffer::Create(
- width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2);
+ rotated_res_i420_buffer = I420Buffer::Create(width_, height_);
EXPECT_EQ(
0, ConvertToI420(VideoType::kI420, orig_buffer, 0, 0, width_, height_, 0,
kVideoRotation_180, rotated_res_i420_buffer.get()));
diff --git a/webrtc/common_video/libyuv/webrtc_libyuv.cc b/webrtc/common_video/libyuv/webrtc_libyuv.cc
index fd08029..2f60e09 100644
--- a/webrtc/common_video/libyuv/webrtc_libyuv.cc
+++ b/webrtc/common_video/libyuv/webrtc_libyuv.cc
@@ -70,11 +70,11 @@
}
// TODO(nisse): Belongs with the test code?
-int PrintVideoFrame(const VideoFrameBuffer& frame, FILE* file) {
+int PrintVideoFrame(const I420BufferInterface& frame, FILE* file) {
int width = frame.width();
int height = frame.height();
- int chroma_width = (width + 1) / 2;
- int chroma_height = (height + 1) / 2;
+ int chroma_width = frame.ChromaWidth();
+ int chroma_height = frame.ChromaHeight();
if (PrintPlane(frame.DataY(), width, height,
frame.StrideY(), file) < 0) {
@@ -94,10 +94,10 @@
}
int PrintVideoFrame(const VideoFrame& frame, FILE* file) {
- return PrintVideoFrame(*frame.video_frame_buffer(), file);
+ return PrintVideoFrame(*frame.video_frame_buffer()->ToI420(), file);
}
-int ExtractBuffer(const rtc::scoped_refptr<VideoFrameBuffer>& input_frame,
+int ExtractBuffer(const rtc::scoped_refptr<I420BufferInterface>& input_frame,
size_t size,
uint8_t* buffer) {
RTC_DCHECK(buffer);
@@ -110,8 +110,8 @@
return -1;
}
- int chroma_width = (width + 1) / 2;
- int chroma_height = (height + 1) / 2;
+ int chroma_width = input_frame->ChromaWidth();
+ int chroma_height = input_frame->ChromaHeight();
libyuv::I420Copy(input_frame->DataY(),
input_frame->StrideY(),
@@ -129,7 +129,8 @@
}
int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer) {
- return ExtractBuffer(input_frame.video_frame_buffer(), size, buffer);
+ return ExtractBuffer(input_frame.video_frame_buffer()->ToI420(), size,
+ buffer);
}
int ConvertNV12ToRGB565(const uint8_t* src_frame,
@@ -240,21 +241,18 @@
VideoType dst_video_type,
int dst_sample_size,
uint8_t* dst_frame) {
+ rtc::scoped_refptr<I420BufferInterface> i420_buffer =
+ src_frame.video_frame_buffer()->ToI420();
return libyuv::ConvertFromI420(
- src_frame.video_frame_buffer()->DataY(),
- src_frame.video_frame_buffer()->StrideY(),
- src_frame.video_frame_buffer()->DataU(),
- src_frame.video_frame_buffer()->StrideU(),
- src_frame.video_frame_buffer()->DataV(),
- src_frame.video_frame_buffer()->StrideV(),
- dst_frame, dst_sample_size,
- src_frame.width(), src_frame.height(),
+ i420_buffer->DataY(), i420_buffer->StrideY(), i420_buffer->DataU(),
+ i420_buffer->StrideU(), i420_buffer->DataV(), i420_buffer->StrideV(),
+ dst_frame, dst_sample_size, src_frame.width(), src_frame.height(),
ConvertVideoType(dst_video_type));
}
// Compute PSNR for an I420 frame (all planes). Can upscale test frame.
-double I420PSNR(const VideoFrameBuffer& ref_buffer,
- const VideoFrameBuffer& test_buffer) {
+double I420PSNR(const I420BufferInterface& ref_buffer,
+ const I420BufferInterface& test_buffer) {
RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
if ((ref_buffer.width() != test_buffer.width()) ||
@@ -279,13 +277,13 @@
double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
if (!ref_frame || !test_frame)
return -1;
- return I420PSNR(*ref_frame->video_frame_buffer(),
- *test_frame->video_frame_buffer());
+ return I420PSNR(*ref_frame->video_frame_buffer()->ToI420(),
+ *test_frame->video_frame_buffer()->ToI420());
}
// Compute SSIM for an I420 frame (all planes). Can upscale test_buffer.
-double I420SSIM(const VideoFrameBuffer& ref_buffer,
- const VideoFrameBuffer& test_buffer) {
+double I420SSIM(const I420BufferInterface& ref_buffer,
+ const I420BufferInterface& test_buffer) {
RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
if ((ref_buffer.width() != test_buffer.width()) ||
@@ -305,8 +303,8 @@
double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
if (!ref_frame || !test_frame)
return -1;
- return I420SSIM(*ref_frame->video_frame_buffer(),
- *test_frame->video_frame_buffer());
+ return I420SSIM(*ref_frame->video_frame_buffer()->ToI420(),
+ *test_frame->video_frame_buffer()->ToI420());
}
void NV12Scale(std::vector<uint8_t>* tmp_buffer,
diff --git a/webrtc/examples/peerconnection/client/linux/main_wnd.cc b/webrtc/examples/peerconnection/client/linux/main_wnd.cc
index 55a59ae..151faaa 100644
--- a/webrtc/examples/peerconnection/client/linux/main_wnd.cc
+++ b/webrtc/examples/peerconnection/client/linux/main_wnd.cc
@@ -523,8 +523,8 @@
const webrtc::VideoFrame& video_frame) {
gdk_threads_enter();
- rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer(
- video_frame.video_frame_buffer());
+ rtc::scoped_refptr<webrtc::I420BufferInterface> buffer(
+ video_frame.video_frame_buffer()->ToI420());
if (video_frame.rotation() != webrtc::kVideoRotation_0) {
buffer = webrtc::I420Buffer::Rotate(*buffer, video_frame.rotation());
}
diff --git a/webrtc/examples/peerconnection/client/main_wnd.cc b/webrtc/examples/peerconnection/client/main_wnd.cc
index a869f5b..e7c4c6e 100644
--- a/webrtc/examples/peerconnection/client/main_wnd.cc
+++ b/webrtc/examples/peerconnection/client/main_wnd.cc
@@ -606,8 +606,8 @@
{
AutoLock<VideoRenderer> lock(this);
- rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer(
- video_frame.video_frame_buffer());
+ rtc::scoped_refptr<webrtc::I420BufferInterface> buffer(
+ video_frame.video_frame_buffer()->ToI420());
if (video_frame.rotation() != webrtc::kVideoRotation_0) {
buffer = webrtc::I420Buffer::Rotate(*buffer, video_frame.rotation());
}
diff --git a/webrtc/media/base/adaptedvideotracksource.cc b/webrtc/media/base/adaptedvideotracksource.cc
index 7a3e9f2..9513be8 100644
--- a/webrtc/media/base/adaptedvideotracksource.cc
+++ b/webrtc/media/base/adaptedvideotracksource.cc
@@ -45,12 +45,11 @@
true was just added. The VideoBroadcaster enforces
synchronization for us in this case, by not passing the frame on
to sinks which don't want it. */
- if (apply_rotation() &&
- frame.rotation() != webrtc::kVideoRotation_0 &&
- !buffer->native_handle()) {
+ 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, frame.rotation()),
+ webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()),
webrtc::kVideoRotation_0, frame.timestamp_us()));
} else {
broadcaster_.OnFrame(frame);
diff --git a/webrtc/media/base/videocapturer.cc b/webrtc/media/base/videocapturer.cc
index 704840b..df1eafc 100644
--- a/webrtc/media/base/videocapturer.cc
+++ b/webrtc/media/base/videocapturer.cc
@@ -205,17 +205,17 @@
if (apply_rotation_ && frame.rotation() != webrtc::kVideoRotation_0) {
rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer(
frame.video_frame_buffer());
- if (buffer->native_handle()) {
- // Sources producing native frames must handle apply_rotation
+ if (buffer->type() != webrtc::VideoFrameBuffer::Type::kI420) {
+ // Sources producing non-I420 frames must handle apply_rotation
// themselves. But even if they do, we may occasionally end up
// in this case, for frames in flight at the time
// applied_rotation is set to true. In that case, we just drop
// the frame.
- LOG(LS_WARNING) << "Native frame requiring rotation. Discarding.";
+ LOG(LS_WARNING) << "Non-I420 frame requiring rotation. Discarding.";
return;
}
broadcaster_.OnFrame(webrtc::VideoFrame(
- webrtc::I420Buffer::Rotate(*buffer, frame.rotation()),
+ webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()),
webrtc::kVideoRotation_0, frame.timestamp_us()));
} else {
broadcaster_.OnFrame(frame);
diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor.cc b/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
index 8a310c1..f919ced 100644
--- a/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
+++ b/webrtc/modules/video_coding/codecs/test/videoprocessor.cc
@@ -256,7 +256,7 @@
<< "Must process frames without gaps.";
RTC_DCHECK(initialized_) << "Attempting to use uninitialized VideoProcessor";
- rtc::scoped_refptr<VideoFrameBuffer> buffer(
+ rtc::scoped_refptr<I420BufferInterface> buffer(
analysis_frame_reader_->ReadFrame());
if (!buffer) {
@@ -483,12 +483,7 @@
rtc::scoped_refptr<I420Buffer> scaled_buffer(I420Buffer::Create(
config_.codec_settings->width, config_.codec_settings->height));
// Should be the same aspect ratio, no cropping needed.
- if (image.video_frame_buffer()->native_handle()) {
- scaled_buffer->ScaleFrom(
- *image.video_frame_buffer()->NativeToI420Buffer());
- } else {
- scaled_buffer->ScaleFrom(*image.video_frame_buffer());
- }
+ scaled_buffer->ScaleFrom(*image.video_frame_buffer()->ToI420());
size_t length = CalcBufferSize(VideoType::kI420, scaled_buffer->width(),
scaled_buffer->height());
@@ -500,14 +495,8 @@
size_t length =
CalcBufferSize(VideoType::kI420, image.width(), image.height());
extracted_buffer.SetSize(length);
- if (image.video_frame_buffer()->native_handle()) {
- extracted_length =
- ExtractBuffer(image.video_frame_buffer()->NativeToI420Buffer(),
- length, extracted_buffer.data());
- } else {
- extracted_length = ExtractBuffer(image.video_frame_buffer(), length,
- extracted_buffer.data());
- }
+ extracted_length = ExtractBuffer(image.video_frame_buffer()->ToI420(),
+ length, extracted_buffer.data());
}
RTC_DCHECK_EQ(extracted_length, analysis_frame_writer_->FrameLength());
diff --git a/webrtc/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc b/webrtc/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
index c3453d8..a3db4fd 100644
--- a/webrtc/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
+++ b/webrtc/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
@@ -157,7 +157,7 @@
// Processing only one frame.
source_file_ = fopen(test::ResourcePath("paris_qcif", "yuv").c_str(), "rb");
ASSERT_TRUE(source_file_ != nullptr);
- rtc::scoped_refptr<VideoFrameBuffer> compact_buffer(
+ rtc::scoped_refptr<I420BufferInterface> compact_buffer(
test::ReadI420Buffer(kWidth, kHeight, source_file_));
ASSERT_TRUE(compact_buffer);
codec_settings_.width = kWidth;
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm b/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
index 2b2ea2a..a060b51 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
@@ -160,8 +160,7 @@
// Applying rotation is only supported for legacy reasons and performance is
// not critical here.
if (apply_rotation() && rotation != kVideoRotation_0) {
- buffer = I420Buffer::Rotate(*buffer->NativeToI420Buffer(),
- rotation);
+ buffer = I420Buffer::Rotate(*buffer->ToI420(), rotation);
if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) {
std::swap(captured_width, captured_height);
}
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm b/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
index 1cc772f..387bb1b 100644
--- a/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
+++ b/webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
@@ -53,7 +53,8 @@
// Adapted I420 frame.
// TODO(magjed): Optimize this I420 path.
rtc::scoped_refptr<I420Buffer> i420_buffer = I420Buffer::Create(adapted_width, adapted_height);
- i420_buffer->CropAndScaleFrom(*frame.videoBuffer, crop_x, crop_y, crop_width, crop_height);
+ i420_buffer->CropAndScaleFrom(
+ *frame.videoBuffer->ToI420(), crop_x, crop_y, crop_width, crop_height);
buffer = i420_buffer;
}
@@ -61,7 +62,7 @@
// not critical here.
webrtc::VideoRotation rotation = static_cast<webrtc::VideoRotation>(frame.rotation);
if (apply_rotation() && rotation != kVideoRotation_0) {
- buffer = I420Buffer::Rotate(*buffer->NativeToI420Buffer(), rotation);
+ buffer = I420Buffer::Rotate(*buffer->ToI420(), rotation);
rotation = kVideoRotation_0;
}
diff --git a/webrtc/test/testsupport/metrics/video_metrics.cc b/webrtc/test/testsupport/metrics/video_metrics.cc
index 2895337..e150f36 100644
--- a/webrtc/test/testsupport/metrics/video_metrics.cc
+++ b/webrtc/test/testsupport/metrics/video_metrics.cc
@@ -38,8 +38,8 @@
// Calculates metrics for a frame and adds statistics to the result for it.
void CalculateFrame(VideoMetricsType video_metrics_type,
- const VideoFrameBuffer& ref,
- const VideoFrameBuffer& test,
+ const I420BufferInterface& ref,
+ const I420BufferInterface& test,
int frame_number,
QualityMetricsResult* result) {
FrameResult frame_result = {0, 0};
diff --git a/webrtc/test/video_capturer.cc b/webrtc/test/video_capturer.cc
index c8b3826..d0b5c37 100644
--- a/webrtc/test/video_capturer.cc
+++ b/webrtc/test/video_capturer.cc
@@ -37,7 +37,7 @@
// return scaled version.
rtc::scoped_refptr<I420Buffer> scaled_buffer =
I420Buffer::Create(out_width, out_height);
- scaled_buffer->ScaleFrom(*frame.video_frame_buffer().get());
+ scaled_buffer->ScaleFrom(*frame.video_frame_buffer()->ToI420());
out_frame.emplace(
VideoFrame(scaled_buffer, kVideoRotation_0, frame.timestamp_us()));
} else {