xref: /aosp_15_r20/external/webrtc/common_video/video_frame_buffer.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #include "common_video/include/video_frame_buffer.h"
11*d9f75844SAndroid Build Coastguard Worker 
12*d9f75844SAndroid Build Coastguard Worker #include "api/make_ref_counted.h"
13*d9f75844SAndroid Build Coastguard Worker #include "api/video/i420_buffer.h"
14*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
15*d9f75844SAndroid Build Coastguard Worker #include "third_party/libyuv/include/libyuv/convert.h"
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker namespace {
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker // Template to implement a wrapped buffer for a I4??BufferInterface.
22*d9f75844SAndroid Build Coastguard Worker template <typename Base>
23*d9f75844SAndroid Build Coastguard Worker class WrappedYuvBuffer : public Base {
24*d9f75844SAndroid Build Coastguard Worker  public:
WrappedYuvBuffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,std::function<void ()> no_longer_used)25*d9f75844SAndroid Build Coastguard Worker   WrappedYuvBuffer(int width,
26*d9f75844SAndroid Build Coastguard Worker                    int height,
27*d9f75844SAndroid Build Coastguard Worker                    const uint8_t* y_plane,
28*d9f75844SAndroid Build Coastguard Worker                    int y_stride,
29*d9f75844SAndroid Build Coastguard Worker                    const uint8_t* u_plane,
30*d9f75844SAndroid Build Coastguard Worker                    int u_stride,
31*d9f75844SAndroid Build Coastguard Worker                    const uint8_t* v_plane,
32*d9f75844SAndroid Build Coastguard Worker                    int v_stride,
33*d9f75844SAndroid Build Coastguard Worker                    std::function<void()> no_longer_used)
34*d9f75844SAndroid Build Coastguard Worker       : width_(width),
35*d9f75844SAndroid Build Coastguard Worker         height_(height),
36*d9f75844SAndroid Build Coastguard Worker         y_plane_(y_plane),
37*d9f75844SAndroid Build Coastguard Worker         u_plane_(u_plane),
38*d9f75844SAndroid Build Coastguard Worker         v_plane_(v_plane),
39*d9f75844SAndroid Build Coastguard Worker         y_stride_(y_stride),
40*d9f75844SAndroid Build Coastguard Worker         u_stride_(u_stride),
41*d9f75844SAndroid Build Coastguard Worker         v_stride_(v_stride),
42*d9f75844SAndroid Build Coastguard Worker         no_longer_used_cb_(no_longer_used) {}
43*d9f75844SAndroid Build Coastguard Worker 
~WrappedYuvBuffer()44*d9f75844SAndroid Build Coastguard Worker   ~WrappedYuvBuffer() override { no_longer_used_cb_(); }
45*d9f75844SAndroid Build Coastguard Worker 
width() const46*d9f75844SAndroid Build Coastguard Worker   int width() const override { return width_; }
47*d9f75844SAndroid Build Coastguard Worker 
height() const48*d9f75844SAndroid Build Coastguard Worker   int height() const override { return height_; }
49*d9f75844SAndroid Build Coastguard Worker 
DataY() const50*d9f75844SAndroid Build Coastguard Worker   const uint8_t* DataY() const override { return y_plane_; }
51*d9f75844SAndroid Build Coastguard Worker 
DataU() const52*d9f75844SAndroid Build Coastguard Worker   const uint8_t* DataU() const override { return u_plane_; }
53*d9f75844SAndroid Build Coastguard Worker 
DataV() const54*d9f75844SAndroid Build Coastguard Worker   const uint8_t* DataV() const override { return v_plane_; }
55*d9f75844SAndroid Build Coastguard Worker 
StrideY() const56*d9f75844SAndroid Build Coastguard Worker   int StrideY() const override { return y_stride_; }
57*d9f75844SAndroid Build Coastguard Worker 
StrideU() const58*d9f75844SAndroid Build Coastguard Worker   int StrideU() const override { return u_stride_; }
59*d9f75844SAndroid Build Coastguard Worker 
StrideV() const60*d9f75844SAndroid Build Coastguard Worker   int StrideV() const override { return v_stride_; }
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker  private:
63*d9f75844SAndroid Build Coastguard Worker   friend class rtc::RefCountedObject<WrappedYuvBuffer>;
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker   const int width_;
66*d9f75844SAndroid Build Coastguard Worker   const int height_;
67*d9f75844SAndroid Build Coastguard Worker   const uint8_t* const y_plane_;
68*d9f75844SAndroid Build Coastguard Worker   const uint8_t* const u_plane_;
69*d9f75844SAndroid Build Coastguard Worker   const uint8_t* const v_plane_;
70*d9f75844SAndroid Build Coastguard Worker   const int y_stride_;
71*d9f75844SAndroid Build Coastguard Worker   const int u_stride_;
72*d9f75844SAndroid Build Coastguard Worker   const int v_stride_;
73*d9f75844SAndroid Build Coastguard Worker   std::function<void()> no_longer_used_cb_;
74*d9f75844SAndroid Build Coastguard Worker };
75*d9f75844SAndroid Build Coastguard Worker 
76*d9f75844SAndroid Build Coastguard Worker // Template to implement a wrapped buffer for a I4??BufferInterface.
77*d9f75844SAndroid Build Coastguard Worker template <typename BaseWithA>
78*d9f75844SAndroid Build Coastguard Worker class WrappedYuvaBuffer : public WrappedYuvBuffer<BaseWithA> {
79*d9f75844SAndroid Build Coastguard Worker  public:
WrappedYuvaBuffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,const uint8_t * a_plane,int a_stride,std::function<void ()> no_longer_used)80*d9f75844SAndroid Build Coastguard Worker   WrappedYuvaBuffer(int width,
81*d9f75844SAndroid Build Coastguard Worker                     int height,
82*d9f75844SAndroid Build Coastguard Worker                     const uint8_t* y_plane,
83*d9f75844SAndroid Build Coastguard Worker                     int y_stride,
84*d9f75844SAndroid Build Coastguard Worker                     const uint8_t* u_plane,
85*d9f75844SAndroid Build Coastguard Worker                     int u_stride,
86*d9f75844SAndroid Build Coastguard Worker                     const uint8_t* v_plane,
87*d9f75844SAndroid Build Coastguard Worker                     int v_stride,
88*d9f75844SAndroid Build Coastguard Worker                     const uint8_t* a_plane,
89*d9f75844SAndroid Build Coastguard Worker                     int a_stride,
90*d9f75844SAndroid Build Coastguard Worker                     std::function<void()> no_longer_used)
91*d9f75844SAndroid Build Coastguard Worker       : WrappedYuvBuffer<BaseWithA>(width,
92*d9f75844SAndroid Build Coastguard Worker                                     height,
93*d9f75844SAndroid Build Coastguard Worker                                     y_plane,
94*d9f75844SAndroid Build Coastguard Worker                                     y_stride,
95*d9f75844SAndroid Build Coastguard Worker                                     u_plane,
96*d9f75844SAndroid Build Coastguard Worker                                     u_stride,
97*d9f75844SAndroid Build Coastguard Worker                                     v_plane,
98*d9f75844SAndroid Build Coastguard Worker                                     v_stride,
99*d9f75844SAndroid Build Coastguard Worker                                     no_longer_used),
100*d9f75844SAndroid Build Coastguard Worker         a_plane_(a_plane),
101*d9f75844SAndroid Build Coastguard Worker         a_stride_(a_stride) {}
102*d9f75844SAndroid Build Coastguard Worker 
DataA() const103*d9f75844SAndroid Build Coastguard Worker   const uint8_t* DataA() const override { return a_plane_; }
StrideA() const104*d9f75844SAndroid Build Coastguard Worker   int StrideA() const override { return a_stride_; }
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker  private:
107*d9f75844SAndroid Build Coastguard Worker   const uint8_t* const a_plane_;
108*d9f75844SAndroid Build Coastguard Worker   const int a_stride_;
109*d9f75844SAndroid Build Coastguard Worker };
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker class I444BufferBase : public I444BufferInterface {
112*d9f75844SAndroid Build Coastguard Worker  public:
113*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420BufferInterface> ToI420() final;
114*d9f75844SAndroid Build Coastguard Worker };
115*d9f75844SAndroid Build Coastguard Worker 
ToI420()116*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> I444BufferBase::ToI420() {
117*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420Buffer> i420_buffer =
118*d9f75844SAndroid Build Coastguard Worker       I420Buffer::Create(width(), height());
119*d9f75844SAndroid Build Coastguard Worker   libyuv::I444ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
120*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataY(), i420_buffer->StrideY(),
121*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataU(), i420_buffer->StrideU(),
122*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataV(), i420_buffer->StrideV(),
123*d9f75844SAndroid Build Coastguard Worker                      width(), height());
124*d9f75844SAndroid Build Coastguard Worker   return i420_buffer;
125*d9f75844SAndroid Build Coastguard Worker }
126*d9f75844SAndroid Build Coastguard Worker 
127*d9f75844SAndroid Build Coastguard Worker class I422BufferBase : public I422BufferInterface {
128*d9f75844SAndroid Build Coastguard Worker  public:
129*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420BufferInterface> ToI420() final;
130*d9f75844SAndroid Build Coastguard Worker };
131*d9f75844SAndroid Build Coastguard Worker 
ToI420()132*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> I422BufferBase::ToI420() {
133*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420Buffer> i420_buffer =
134*d9f75844SAndroid Build Coastguard Worker       I420Buffer::Create(width(), height());
135*d9f75844SAndroid Build Coastguard Worker   libyuv::I422ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
136*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataY(), i420_buffer->StrideY(),
137*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataU(), i420_buffer->StrideU(),
138*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataV(), i420_buffer->StrideV(),
139*d9f75844SAndroid Build Coastguard Worker                      width(), height());
140*d9f75844SAndroid Build Coastguard Worker   return i420_buffer;
141*d9f75844SAndroid Build Coastguard Worker }
142*d9f75844SAndroid Build Coastguard Worker 
143*d9f75844SAndroid Build Coastguard Worker // Template to implement a wrapped buffer for a PlanarYuv16BBuffer.
144*d9f75844SAndroid Build Coastguard Worker template <typename Base>
145*d9f75844SAndroid Build Coastguard Worker class WrappedYuv16BBuffer : public Base {
146*d9f75844SAndroid Build Coastguard Worker  public:
WrappedYuv16BBuffer(int width,int height,const uint16_t * y_plane,int y_stride,const uint16_t * u_plane,int u_stride,const uint16_t * v_plane,int v_stride,std::function<void ()> no_longer_used)147*d9f75844SAndroid Build Coastguard Worker   WrappedYuv16BBuffer(int width,
148*d9f75844SAndroid Build Coastguard Worker                       int height,
149*d9f75844SAndroid Build Coastguard Worker                       const uint16_t* y_plane,
150*d9f75844SAndroid Build Coastguard Worker                       int y_stride,
151*d9f75844SAndroid Build Coastguard Worker                       const uint16_t* u_plane,
152*d9f75844SAndroid Build Coastguard Worker                       int u_stride,
153*d9f75844SAndroid Build Coastguard Worker                       const uint16_t* v_plane,
154*d9f75844SAndroid Build Coastguard Worker                       int v_stride,
155*d9f75844SAndroid Build Coastguard Worker                       std::function<void()> no_longer_used)
156*d9f75844SAndroid Build Coastguard Worker       : width_(width),
157*d9f75844SAndroid Build Coastguard Worker         height_(height),
158*d9f75844SAndroid Build Coastguard Worker         y_plane_(y_plane),
159*d9f75844SAndroid Build Coastguard Worker         u_plane_(u_plane),
160*d9f75844SAndroid Build Coastguard Worker         v_plane_(v_plane),
161*d9f75844SAndroid Build Coastguard Worker         y_stride_(y_stride),
162*d9f75844SAndroid Build Coastguard Worker         u_stride_(u_stride),
163*d9f75844SAndroid Build Coastguard Worker         v_stride_(v_stride),
164*d9f75844SAndroid Build Coastguard Worker         no_longer_used_cb_(no_longer_used) {}
165*d9f75844SAndroid Build Coastguard Worker 
~WrappedYuv16BBuffer()166*d9f75844SAndroid Build Coastguard Worker   ~WrappedYuv16BBuffer() override { no_longer_used_cb_(); }
167*d9f75844SAndroid Build Coastguard Worker 
width() const168*d9f75844SAndroid Build Coastguard Worker   int width() const override { return width_; }
169*d9f75844SAndroid Build Coastguard Worker 
height() const170*d9f75844SAndroid Build Coastguard Worker   int height() const override { return height_; }
171*d9f75844SAndroid Build Coastguard Worker 
DataY() const172*d9f75844SAndroid Build Coastguard Worker   const uint16_t* DataY() const override { return y_plane_; }
173*d9f75844SAndroid Build Coastguard Worker 
DataU() const174*d9f75844SAndroid Build Coastguard Worker   const uint16_t* DataU() const override { return u_plane_; }
175*d9f75844SAndroid Build Coastguard Worker 
DataV() const176*d9f75844SAndroid Build Coastguard Worker   const uint16_t* DataV() const override { return v_plane_; }
177*d9f75844SAndroid Build Coastguard Worker 
StrideY() const178*d9f75844SAndroid Build Coastguard Worker   int StrideY() const override { return y_stride_; }
179*d9f75844SAndroid Build Coastguard Worker 
StrideU() const180*d9f75844SAndroid Build Coastguard Worker   int StrideU() const override { return u_stride_; }
181*d9f75844SAndroid Build Coastguard Worker 
StrideV() const182*d9f75844SAndroid Build Coastguard Worker   int StrideV() const override { return v_stride_; }
183*d9f75844SAndroid Build Coastguard Worker 
184*d9f75844SAndroid Build Coastguard Worker  private:
185*d9f75844SAndroid Build Coastguard Worker   friend class rtc::RefCountedObject<WrappedYuv16BBuffer>;
186*d9f75844SAndroid Build Coastguard Worker 
187*d9f75844SAndroid Build Coastguard Worker   const int width_;
188*d9f75844SAndroid Build Coastguard Worker   const int height_;
189*d9f75844SAndroid Build Coastguard Worker   const uint16_t* const y_plane_;
190*d9f75844SAndroid Build Coastguard Worker   const uint16_t* const u_plane_;
191*d9f75844SAndroid Build Coastguard Worker   const uint16_t* const v_plane_;
192*d9f75844SAndroid Build Coastguard Worker   const int y_stride_;
193*d9f75844SAndroid Build Coastguard Worker   const int u_stride_;
194*d9f75844SAndroid Build Coastguard Worker   const int v_stride_;
195*d9f75844SAndroid Build Coastguard Worker   std::function<void()> no_longer_used_cb_;
196*d9f75844SAndroid Build Coastguard Worker };
197*d9f75844SAndroid Build Coastguard Worker 
198*d9f75844SAndroid Build Coastguard Worker class I010BufferBase : public I010BufferInterface {
199*d9f75844SAndroid Build Coastguard Worker  public:
200*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420BufferInterface> ToI420() final;
201*d9f75844SAndroid Build Coastguard Worker };
202*d9f75844SAndroid Build Coastguard Worker 
ToI420()203*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> I010BufferBase::ToI420() {
204*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420Buffer> i420_buffer =
205*d9f75844SAndroid Build Coastguard Worker       I420Buffer::Create(width(), height());
206*d9f75844SAndroid Build Coastguard Worker #if 0
207*d9f75844SAndroid Build Coastguard Worker   libyuv::I010ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
208*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataY(), i420_buffer->StrideY(),
209*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataU(), i420_buffer->StrideU(),
210*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataV(), i420_buffer->StrideV(),
211*d9f75844SAndroid Build Coastguard Worker                      width(), height());
212*d9f75844SAndroid Build Coastguard Worker #else
213*d9f75844SAndroid Build Coastguard Worker   abort();
214*d9f75844SAndroid Build Coastguard Worker #endif
215*d9f75844SAndroid Build Coastguard Worker   return i420_buffer;
216*d9f75844SAndroid Build Coastguard Worker }
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker class I210BufferBase : public I210BufferInterface {
219*d9f75844SAndroid Build Coastguard Worker  public:
220*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420BufferInterface> ToI420() final;
221*d9f75844SAndroid Build Coastguard Worker };
222*d9f75844SAndroid Build Coastguard Worker 
ToI420()223*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> I210BufferBase::ToI420() {
224*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<I420Buffer> i420_buffer =
225*d9f75844SAndroid Build Coastguard Worker       I420Buffer::Create(width(), height());
226*d9f75844SAndroid Build Coastguard Worker   libyuv::I210ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
227*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataY(), i420_buffer->StrideY(),
228*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataU(), i420_buffer->StrideU(),
229*d9f75844SAndroid Build Coastguard Worker                      i420_buffer->MutableDataV(), i420_buffer->StrideV(),
230*d9f75844SAndroid Build Coastguard Worker                      width(), height());
231*d9f75844SAndroid Build Coastguard Worker   return i420_buffer;
232*d9f75844SAndroid Build Coastguard Worker }
233*d9f75844SAndroid Build Coastguard Worker 
234*d9f75844SAndroid Build Coastguard Worker }  // namespace
235*d9f75844SAndroid Build Coastguard Worker 
WrapI420Buffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,std::function<void ()> no_longer_used)236*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> WrapI420Buffer(
237*d9f75844SAndroid Build Coastguard Worker     int width,
238*d9f75844SAndroid Build Coastguard Worker     int height,
239*d9f75844SAndroid Build Coastguard Worker     const uint8_t* y_plane,
240*d9f75844SAndroid Build Coastguard Worker     int y_stride,
241*d9f75844SAndroid Build Coastguard Worker     const uint8_t* u_plane,
242*d9f75844SAndroid Build Coastguard Worker     int u_stride,
243*d9f75844SAndroid Build Coastguard Worker     const uint8_t* v_plane,
244*d9f75844SAndroid Build Coastguard Worker     int v_stride,
245*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
246*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I420BufferInterface>(
247*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuvBuffer<I420BufferInterface>>(
248*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
249*d9f75844SAndroid Build Coastguard Worker           v_stride, no_longer_used));
250*d9f75844SAndroid Build Coastguard Worker }
251*d9f75844SAndroid Build Coastguard Worker 
WrapI420ABuffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,const uint8_t * a_plane,int a_stride,std::function<void ()> no_longer_used)252*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420ABufferInterface> WrapI420ABuffer(
253*d9f75844SAndroid Build Coastguard Worker     int width,
254*d9f75844SAndroid Build Coastguard Worker     int height,
255*d9f75844SAndroid Build Coastguard Worker     const uint8_t* y_plane,
256*d9f75844SAndroid Build Coastguard Worker     int y_stride,
257*d9f75844SAndroid Build Coastguard Worker     const uint8_t* u_plane,
258*d9f75844SAndroid Build Coastguard Worker     int u_stride,
259*d9f75844SAndroid Build Coastguard Worker     const uint8_t* v_plane,
260*d9f75844SAndroid Build Coastguard Worker     int v_stride,
261*d9f75844SAndroid Build Coastguard Worker     const uint8_t* a_plane,
262*d9f75844SAndroid Build Coastguard Worker     int a_stride,
263*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
264*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I420ABufferInterface>(
265*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuvaBuffer<I420ABufferInterface>>(
266*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
267*d9f75844SAndroid Build Coastguard Worker           v_stride, a_plane, a_stride, no_longer_used));
268*d9f75844SAndroid Build Coastguard Worker }
269*d9f75844SAndroid Build Coastguard Worker 
WrapI422Buffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,std::function<void ()> no_longer_used)270*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I422BufferInterface> WrapI422Buffer(
271*d9f75844SAndroid Build Coastguard Worker     int width,
272*d9f75844SAndroid Build Coastguard Worker     int height,
273*d9f75844SAndroid Build Coastguard Worker     const uint8_t* y_plane,
274*d9f75844SAndroid Build Coastguard Worker     int y_stride,
275*d9f75844SAndroid Build Coastguard Worker     const uint8_t* u_plane,
276*d9f75844SAndroid Build Coastguard Worker     int u_stride,
277*d9f75844SAndroid Build Coastguard Worker     const uint8_t* v_plane,
278*d9f75844SAndroid Build Coastguard Worker     int v_stride,
279*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
280*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I422BufferBase>(
281*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuvBuffer<I422BufferBase>>(
282*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
283*d9f75844SAndroid Build Coastguard Worker           v_stride, no_longer_used));
284*d9f75844SAndroid Build Coastguard Worker }
285*d9f75844SAndroid Build Coastguard Worker 
WrapI444Buffer(int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,std::function<void ()> no_longer_used)286*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I444BufferInterface> WrapI444Buffer(
287*d9f75844SAndroid Build Coastguard Worker     int width,
288*d9f75844SAndroid Build Coastguard Worker     int height,
289*d9f75844SAndroid Build Coastguard Worker     const uint8_t* y_plane,
290*d9f75844SAndroid Build Coastguard Worker     int y_stride,
291*d9f75844SAndroid Build Coastguard Worker     const uint8_t* u_plane,
292*d9f75844SAndroid Build Coastguard Worker     int u_stride,
293*d9f75844SAndroid Build Coastguard Worker     const uint8_t* v_plane,
294*d9f75844SAndroid Build Coastguard Worker     int v_stride,
295*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
296*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I444BufferInterface>(
297*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuvBuffer<I444BufferBase>>(
298*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
299*d9f75844SAndroid Build Coastguard Worker           v_stride, no_longer_used));
300*d9f75844SAndroid Build Coastguard Worker }
301*d9f75844SAndroid Build Coastguard Worker 
WrapYuvBuffer(VideoFrameBuffer::Type type,int width,int height,const uint8_t * y_plane,int y_stride,const uint8_t * u_plane,int u_stride,const uint8_t * v_plane,int v_stride,std::function<void ()> no_longer_used)302*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PlanarYuvBuffer> WrapYuvBuffer(
303*d9f75844SAndroid Build Coastguard Worker     VideoFrameBuffer::Type type,
304*d9f75844SAndroid Build Coastguard Worker     int width,
305*d9f75844SAndroid Build Coastguard Worker     int height,
306*d9f75844SAndroid Build Coastguard Worker     const uint8_t* y_plane,
307*d9f75844SAndroid Build Coastguard Worker     int y_stride,
308*d9f75844SAndroid Build Coastguard Worker     const uint8_t* u_plane,
309*d9f75844SAndroid Build Coastguard Worker     int u_stride,
310*d9f75844SAndroid Build Coastguard Worker     const uint8_t* v_plane,
311*d9f75844SAndroid Build Coastguard Worker     int v_stride,
312*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
313*d9f75844SAndroid Build Coastguard Worker   switch (type) {
314*d9f75844SAndroid Build Coastguard Worker     case VideoFrameBuffer::Type::kI420:
315*d9f75844SAndroid Build Coastguard Worker       return WrapI420Buffer(width, height, y_plane, y_stride, u_plane, u_stride,
316*d9f75844SAndroid Build Coastguard Worker                             v_plane, v_stride, no_longer_used);
317*d9f75844SAndroid Build Coastguard Worker     case VideoFrameBuffer::Type::kI422:
318*d9f75844SAndroid Build Coastguard Worker       return WrapI422Buffer(width, height, y_plane, y_stride, u_plane, u_stride,
319*d9f75844SAndroid Build Coastguard Worker                             v_plane, v_stride, no_longer_used);
320*d9f75844SAndroid Build Coastguard Worker     case VideoFrameBuffer::Type::kI444:
321*d9f75844SAndroid Build Coastguard Worker       return WrapI444Buffer(width, height, y_plane, y_stride, u_plane, u_stride,
322*d9f75844SAndroid Build Coastguard Worker                             v_plane, v_stride, no_longer_used);
323*d9f75844SAndroid Build Coastguard Worker     default:
324*d9f75844SAndroid Build Coastguard Worker       RTC_CHECK_NOTREACHED();
325*d9f75844SAndroid Build Coastguard Worker   }
326*d9f75844SAndroid Build Coastguard Worker }
327*d9f75844SAndroid Build Coastguard Worker 
WrapI010Buffer(int width,int height,const uint16_t * y_plane,int y_stride,const uint16_t * u_plane,int u_stride,const uint16_t * v_plane,int v_stride,std::function<void ()> no_longer_used)328*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I010BufferInterface> WrapI010Buffer(
329*d9f75844SAndroid Build Coastguard Worker     int width,
330*d9f75844SAndroid Build Coastguard Worker     int height,
331*d9f75844SAndroid Build Coastguard Worker     const uint16_t* y_plane,
332*d9f75844SAndroid Build Coastguard Worker     int y_stride,
333*d9f75844SAndroid Build Coastguard Worker     const uint16_t* u_plane,
334*d9f75844SAndroid Build Coastguard Worker     int u_stride,
335*d9f75844SAndroid Build Coastguard Worker     const uint16_t* v_plane,
336*d9f75844SAndroid Build Coastguard Worker     int v_stride,
337*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
338*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I010BufferInterface>(
339*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuv16BBuffer<I010BufferBase>>(
340*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
341*d9f75844SAndroid Build Coastguard Worker           v_stride, no_longer_used));
342*d9f75844SAndroid Build Coastguard Worker }
343*d9f75844SAndroid Build Coastguard Worker 
WrapI210Buffer(int width,int height,const uint16_t * y_plane,int y_stride,const uint16_t * u_plane,int u_stride,const uint16_t * v_plane,int v_stride,std::function<void ()> no_longer_used)344*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I210BufferInterface> WrapI210Buffer(
345*d9f75844SAndroid Build Coastguard Worker     int width,
346*d9f75844SAndroid Build Coastguard Worker     int height,
347*d9f75844SAndroid Build Coastguard Worker     const uint16_t* y_plane,
348*d9f75844SAndroid Build Coastguard Worker     int y_stride,
349*d9f75844SAndroid Build Coastguard Worker     const uint16_t* u_plane,
350*d9f75844SAndroid Build Coastguard Worker     int u_stride,
351*d9f75844SAndroid Build Coastguard Worker     const uint16_t* v_plane,
352*d9f75844SAndroid Build Coastguard Worker     int v_stride,
353*d9f75844SAndroid Build Coastguard Worker     std::function<void()> no_longer_used) {
354*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<I210BufferInterface>(
355*d9f75844SAndroid Build Coastguard Worker       rtc::make_ref_counted<WrappedYuv16BBuffer<I210BufferBase>>(
356*d9f75844SAndroid Build Coastguard Worker           width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
357*d9f75844SAndroid Build Coastguard Worker           v_stride, no_longer_used));
358*d9f75844SAndroid Build Coastguard Worker }
359*d9f75844SAndroid Build Coastguard Worker 
360*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
361