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