diff --git a/modules/video_coding/codecs/av1/dav1d_decoder.cc b/modules/video_coding/codecs/av1/dav1d_decoder.cc
index 4b62216..a2cd6d8 100644
--- a/modules/video_coding/codecs/av1/dav1d_decoder.cc
+++ b/modules/video_coding/codecs/av1/dav1d_decoder.cc
@@ -15,7 +15,7 @@
 #include "api/scoped_refptr.h"
 #include "api/video/encoded_image.h"
 #include "api/video/video_frame_buffer.h"
-#include "common_video/include/video_frame_buffer_pool.h"
+#include "common_video/include/video_frame_buffer.h"
 #include "modules/video_coding/include/video_error_codes.h"
 #include "rtc_base/logging.h"
 #include "third_party/dav1d/libdav1d/include/dav1d/dav1d.h"
@@ -44,7 +44,6 @@
   const char* ImplementationName() const override;
 
  private:
-  VideoFrameBufferPool buffer_pool_;
   Dav1dContext* context_ = nullptr;
   DecodedImageCallback* decode_complete_callback_ = nullptr;
 };
@@ -59,11 +58,13 @@
   Dav1dData data_ = {};
 };
 
-class ScopedDav1dPicture {
+class ScopedDav1dPicture
+    : public rtc::RefCountedNonVirtual<ScopedDav1dPicture> {
  public:
   ~ScopedDav1dPicture() { dav1d_picture_unref(&picture_); }
 
   Dav1dPicture& Picture() { return picture_; }
+  using rtc::RefCountedNonVirtual<ScopedDav1dPicture>::HasOneRef;
 
  private:
   Dav1dPicture picture_ = {};
@@ -71,61 +72,10 @@
 
 constexpr char kDav1dName[] = "dav1d";
 
-rtc::scoped_refptr<VideoFrameBuffer> CopyFrameData(
-    VideoFrameBufferPool& buffer_pool,
-    const Dav1dPicture& dav1d_picture) {
-  // PlanarYuv8Buffer can represent both I420 and I444 frames.
-  rtc::scoped_refptr<PlanarYuv8Buffer> buffer;
-  if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I420) {
-    buffer = buffer_pool.CreateI420Buffer(dav1d_picture.p.w, dav1d_picture.p.h);
-  } else if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I444) {
-    buffer = buffer_pool.CreateI444Buffer(dav1d_picture.p.w, dav1d_picture.p.h);
-  } else {
-    RTC_DCHECK_NOTREACHED() << "Unsupported layout: " << dav1d_picture.p.layout;
-  }
-  if (!buffer.get()) {
-    RTC_LOG(LS_ERROR) << "Dav1dDecoder: failed to allocate a video frame.";
-    return nullptr;
-  }
-
-  uint8_t* src_y_data = static_cast<uint8_t*>(dav1d_picture.data[0]);
-  uint8_t* src_u_data = static_cast<uint8_t*>(dav1d_picture.data[1]);
-  uint8_t* src_v_data = static_cast<uint8_t*>(dav1d_picture.data[2]);
-  int src_y_stride = dav1d_picture.stride[0];
-  int src_uv_stride = dav1d_picture.stride[1];
-  uint8_t* dst_y_data = const_cast<uint8_t*>(buffer->DataY());
-  uint8_t* dst_u_data = const_cast<uint8_t*>(buffer->DataU());
-  uint8_t* dst_v_data = const_cast<uint8_t*>(buffer->DataV());
-
-  if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I420) {
-    libyuv::I420Copy(src_y_data, src_y_stride,       //
-                     src_u_data, src_uv_stride,      //
-                     src_v_data, src_uv_stride,      //
-                     dst_y_data, buffer->StrideY(),  //
-                     dst_u_data, buffer->StrideU(),  //
-                     dst_v_data, buffer->StrideV(),  //
-                     dav1d_picture.p.w,              //
-                     dav1d_picture.p.h);             //
-  } else {
-    RTC_DCHECK_EQ(dav1d_picture.p.layout, DAV1D_PIXEL_LAYOUT_I444);
-    libyuv::I444Copy(src_y_data, src_y_stride,       //
-                     src_u_data, src_uv_stride,      //
-                     src_v_data, src_uv_stride,      //
-                     dst_y_data, buffer->StrideY(),  //
-                     dst_u_data, buffer->StrideU(),  //
-                     dst_v_data, buffer->StrideV(),  //
-                     dav1d_picture.p.w,              //
-                     dav1d_picture.p.h);             //
-  }
-
-  return buffer;
-}
-
 // Calling `dav1d_data_wrap` requires a `free_callback` to be registered.
 void NullFreeCallback(const uint8_t* buffer, void* opaque) {}
 
-Dav1dDecoder::Dav1dDecoder()
-    : buffer_pool_(/*zero_initialize=*/false, /*max_number_of_buffers=*/150) {}
+Dav1dDecoder::Dav1dDecoder() = default;
 
 Dav1dDecoder::~Dav1dDecoder() {
   Release();
@@ -154,7 +104,6 @@
   if (context_ != nullptr) {
     return WEBRTC_VIDEO_CODEC_MEMORY;
   }
-  buffer_pool_.Release();
   return WEBRTC_VIDEO_CODEC_OK;
 }
 
@@ -189,8 +138,9 @@
     return WEBRTC_VIDEO_CODEC_ERROR;
   }
 
-  ScopedDav1dPicture scoped_dav1d_picture;
-  Dav1dPicture& dav1d_picture = scoped_dav1d_picture.Picture();
+  rtc::scoped_refptr<ScopedDav1dPicture> scoped_dav1d_picture(
+      new ScopedDav1dPicture{});
+  Dav1dPicture& dav1d_picture = scoped_dav1d_picture->Picture();
   if (int get_picture_res = dav1d_get_picture(context_, &dav1d_picture)) {
     RTC_LOG(LS_WARNING)
         << "Dav1dDecoder::Decode getting picture failed with error code "
@@ -205,13 +155,23 @@
     return WEBRTC_VIDEO_CODEC_ERROR;
   }
 
-  rtc::scoped_refptr<VideoFrameBuffer> buffer;
-  if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I420 ||
-      dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I444) {
-    buffer = CopyFrameData(buffer_pool_, dav1d_picture);
-    if (!buffer.get()) {
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
+  rtc::scoped_refptr<VideoFrameBuffer> wrapped_buffer;
+  if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I420) {
+    wrapped_buffer = WrapI420Buffer(
+        dav1d_picture.p.w, dav1d_picture.p.h,
+        static_cast<uint8_t*>(dav1d_picture.data[0]), dav1d_picture.stride[0],
+        static_cast<uint8_t*>(dav1d_picture.data[1]), dav1d_picture.stride[1],
+        static_cast<uint8_t*>(dav1d_picture.data[2]), dav1d_picture.stride[1],
+        // To keep |scoped_dav1d_picture.Picture()| alive
+        [scoped_dav1d_picture] {});
+  } else if (dav1d_picture.p.layout == DAV1D_PIXEL_LAYOUT_I444) {
+    wrapped_buffer = WrapI444Buffer(
+        dav1d_picture.p.w, dav1d_picture.p.h,
+        static_cast<uint8_t*>(dav1d_picture.data[0]), dav1d_picture.stride[0],
+        static_cast<uint8_t*>(dav1d_picture.data[1]), dav1d_picture.stride[1],
+        static_cast<uint8_t*>(dav1d_picture.data[2]), dav1d_picture.stride[1],
+        // To keep |scoped_dav1d_picture.Picture()| alive
+        [scoped_dav1d_picture] {});
   } else {
     // Only accept I420 or I444 pixel format.
     RTC_LOG(LS_ERROR) << "Dav1dDecoder::Decode unhandled pixel layout: "
@@ -219,8 +179,12 @@
     return WEBRTC_VIDEO_CODEC_ERROR;
   }
 
+  if (!wrapped_buffer.get()) {
+    return WEBRTC_VIDEO_CODEC_ERROR;
+  }
+
   VideoFrame decoded_frame = VideoFrame::Builder()
-                                 .set_video_frame_buffer(buffer)
+                                 .set_video_frame_buffer(wrapped_buffer)
                                  .set_timestamp_rtp(encoded_image.Timestamp())
                                  .set_ntp_time_ms(encoded_image.ntp_time_ms_)
                                  .set_color_space(encoded_image.ColorSpace())
