diff --git a/api/video/i010_buffer.cc b/api/video/i010_buffer.cc
index 74d37d1..aeea050 100644
--- a/api/video/i010_buffer.cc
+++ b/api/video/i010_buffer.cc
@@ -232,35 +232,4 @@
   CropAndScaleFrom(src, 0, 0, src.width(), src.height());
 }
 
-void I010Buffer::PasteFrom(const I010BufferInterface& picture,
-                           int offset_col,
-                           int offset_row) {
-  RTC_CHECK_LE(picture.width() + offset_col, width());
-  RTC_CHECK_LE(picture.height() + offset_row, height());
-  RTC_CHECK_GE(offset_col, 0);
-  RTC_CHECK_GE(offset_row, 0);
-
-  // Pasted picture has to be aligned so subsumpled UV plane isn't corrupted.
-  RTC_CHECK(offset_col % 2 == 0);
-  RTC_CHECK(offset_row % 2 == 0);
-  RTC_CHECK(picture.width() % 2 == 0 ||
-            picture.width() + offset_col == width());
-  RTC_CHECK(picture.height() % 2 == 0 ||
-            picture.height() + offset_row == height());
-
-  libyuv::CopyPlane_16(picture.DataY(), picture.StrideY(),
-                       MutableDataY() + StrideY() * offset_row + offset_col,
-                       StrideY(), picture.width(), picture.height());
-
-  libyuv::CopyPlane_16(
-      picture.DataU(), picture.StrideU(),
-      MutableDataU() + StrideU() * offset_row / 2 + offset_col / 2, StrideU(),
-      picture.width() / 2, picture.height() / 2);
-
-  libyuv::CopyPlane_16(
-      picture.DataV(), picture.StrideV(),
-      MutableDataV() + StrideV() * offset_row / 2 + offset_col / 2, StrideV(),
-      picture.width() / 2, picture.height() / 2);
-}
-
 }  // namespace webrtc
diff --git a/api/video/i010_buffer.h b/api/video/i010_buffer.h
index 7767975..11e0879 100644
--- a/api/video/i010_buffer.h
+++ b/api/video/i010_buffer.h
@@ -66,12 +66,6 @@
   // Scale all of `src` to the size of `this` buffer, with no cropping.
   void ScaleFrom(const I010BufferInterface& src);
 
-  // Pastes whole picture to canvas at (offset_row, offset_col).
-  // Offsets and picture dimensions must be even.
-  void PasteFrom(const I010BufferInterface& picture,
-                 int offset_col,
-                 int offset_row);
-
  protected:
   I010Buffer(int width, int height, int stride_y, int stride_u, int stride_v);
   ~I010Buffer() override;
diff --git a/api/video/i420_buffer.cc b/api/video/i420_buffer.cc
index 8783a4a..deecf1d 100644
--- a/api/video/i420_buffer.cc
+++ b/api/video/i420_buffer.cc
@@ -229,35 +229,4 @@
   CropAndScaleFrom(src, 0, 0, src.width(), src.height());
 }
 
-void I420Buffer::PasteFrom(const I420BufferInterface& picture,
-                           int offset_col,
-                           int offset_row) {
-  RTC_CHECK_LE(picture.width() + offset_col, width());
-  RTC_CHECK_LE(picture.height() + offset_row, height());
-  RTC_CHECK_GE(offset_col, 0);
-  RTC_CHECK_GE(offset_row, 0);
-
-  // Pasted picture has to be aligned so subsumpled UV plane isn't corrupted.
-  RTC_CHECK(offset_col % 2 == 0);
-  RTC_CHECK(offset_row % 2 == 0);
-  RTC_CHECK(picture.width() % 2 == 0 ||
-            picture.width() + offset_col == width());
-  RTC_CHECK(picture.height() % 2 == 0 ||
-            picture.height() + offset_row == height());
-
-  libyuv::CopyPlane(picture.DataY(), picture.StrideY(),
-                    MutableDataY() + StrideY() * offset_row + offset_col,
-                    StrideY(), picture.width(), picture.height());
-
-  libyuv::CopyPlane(
-      picture.DataU(), picture.StrideU(),
-      MutableDataU() + StrideU() * offset_row / 2 + offset_col / 2, StrideU(),
-      picture.width() / 2, picture.height() / 2);
-
-  libyuv::CopyPlane(
-      picture.DataV(), picture.StrideV(),
-      MutableDataV() + StrideV() * offset_row / 2 + offset_col / 2, StrideV(),
-      picture.width() / 2, picture.height() / 2);
-}
-
 }  // namespace webrtc
diff --git a/api/video/i420_buffer.h b/api/video/i420_buffer.h
index b60df09..af52c64 100644
--- a/api/video/i420_buffer.h
+++ b/api/video/i420_buffer.h
@@ -98,12 +98,6 @@
   // Scale all of `src` to the size of `this` buffer, with no cropping.
   void ScaleFrom(const I420BufferInterface& src);
 
-  // Pastes whole picture to canvas at (offset_row, offset_col).
-  // Offsets and picture dimensions must be even.
-  void PasteFrom(const I420BufferInterface& picture,
-                 int offset_col,
-                 int offset_row);
-
  protected:
   I420Buffer(int width, int height);
   I420Buffer(int width, int height, int stride_y, int stride_u, int stride_v);
diff --git a/common_video/video_frame_unittest.cc b/common_video/video_frame_unittest.cc
index b82c147..53a60e3 100644
--- a/common_video/video_frame_unittest.cc
+++ b/common_video/video_frame_unittest.cc
@@ -250,47 +250,6 @@
   }
 }
 
-int GetU(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) {
-  if (buf->type() == VideoFrameBuffer::Type::kI420) {
-    return buf->GetI420()
-        ->DataU()[row / 2 * buf->GetI420()->StrideU() + col / 2];
-  } else {
-    return buf->GetI010()
-        ->DataU()[row / 2 * buf->GetI010()->StrideU() + col / 2];
-  }
-}
-
-int GetV(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) {
-  if (buf->type() == VideoFrameBuffer::Type::kI420) {
-    return buf->GetI420()
-        ->DataV()[row / 2 * buf->GetI420()->StrideV() + col / 2];
-  } else {
-    return buf->GetI010()
-        ->DataV()[row / 2 * buf->GetI010()->StrideV() + col / 2];
-  }
-}
-
-int GetY(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) {
-  if (buf->type() == VideoFrameBuffer::Type::kI420) {
-    return buf->GetI420()->DataY()[row * buf->GetI420()->StrideY() + col];
-  } else {
-    return buf->GetI010()->DataY()[row * buf->GetI010()->StrideY() + col];
-  }
-}
-
-void PasteFromBuffer(PlanarYuvBuffer* canvas,
-                     const PlanarYuvBuffer& picture,
-                     int offset_col,
-                     int offset_row) {
-  if (canvas->type() == VideoFrameBuffer::Type::kI420) {
-    I420Buffer* buf = static_cast<I420Buffer*>(canvas);
-    buf->PasteFrom(*picture.GetI420(), offset_col, offset_row);
-  } else {
-    I010Buffer* buf = static_cast<I010Buffer*>(canvas);
-    buf->PasteFrom(*picture.GetI010(), offset_col, offset_row);
-  }
-}
-
 }  // namespace
 
 TEST(TestVideoFrame, WidthHeightValues) {
@@ -476,43 +435,6 @@
   CheckCrop(*scaled_buffer->ToI420(), 0.0, 0.125, 1.0, 0.75);
 }
 
-TEST_P(TestPlanarYuvBuffer, PastesIntoBuffer) {
-  const int kOffsetx = 20;
-  const int kOffsety = 30;
-  const int kPicSize = 20;
-  const int kWidth = 160;
-  const int kHeight = 80;
-  rtc::scoped_refptr<PlanarYuvBuffer> buf =
-      CreateGradient(GetParam(), kWidth, kHeight);
-
-  rtc::scoped_refptr<PlanarYuvBuffer> original =
-      CreateGradient(GetParam(), kWidth, kHeight);
-
-  rtc::scoped_refptr<PlanarYuvBuffer> picture =
-      CreateGradient(GetParam(), kPicSize, kPicSize);
-
-  rtc::scoped_refptr<PlanarYuvBuffer> odd_picture =
-      CreateGradient(GetParam(), kPicSize + 1, kPicSize - 1);
-
-  PasteFromBuffer(buf.get(), *picture, kOffsetx, kOffsety);
-
-  for (int i = 0; i < kWidth; ++i) {
-    for (int j = 0; j < kHeight; ++j) {
-      bool is_inside = i >= kOffsetx && i < kOffsetx + kPicSize &&
-                       j >= kOffsety && j < kOffsety + kPicSize;
-      if (!is_inside) {
-        EXPECT_EQ(GetU(original, i, j), GetU(buf, i, j));
-        EXPECT_EQ(GetV(original, i, j), GetV(buf, i, j));
-        EXPECT_EQ(GetY(original, i, j), GetY(buf, i, j));
-      } else {
-        EXPECT_EQ(GetU(picture, i - kOffsetx, j - kOffsety), GetU(buf, i, j));
-        EXPECT_EQ(GetV(picture, i - kOffsetx, j - kOffsety), GetV(buf, i, j));
-        EXPECT_EQ(GetY(picture, i - kOffsetx, j - kOffsety), GetY(buf, i, j));
-      }
-    }
-  }
-}
-
 INSTANTIATE_TEST_SUITE_P(All,
                          TestPlanarYuvBuffer,
                          ::testing::Values(VideoFrameBuffer::Type::kI420,
