Skip to content

Commit 42aac20

Browse files
committed
Enable buffer scaling
Exports VideoFrameBuffer::Scale for every buffer by extending the livekit::*Buffer types.
1 parent 3de6fa6 commit 42aac20

File tree

5 files changed

+189
-0
lines changed

5 files changed

+189
-0
lines changed

libwebrtc/src/native/video_frame.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,14 @@ impl I420Buffer {
312312
)
313313
}
314314
}
315+
316+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::I420Buffer {
317+
vf::I420Buffer {
318+
handle: I420Buffer {
319+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
320+
},
321+
}
322+
}
315323
}
316324

317325
impl I420ABuffer {
@@ -410,6 +418,14 @@ impl I420ABuffer {
410418
)
411419
}
412420
}
421+
422+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::I420ABuffer {
423+
vf::I420ABuffer {
424+
handle: I420ABuffer {
425+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
426+
},
427+
}
428+
}
413429
}
414430

415431
impl I422Buffer {
@@ -516,6 +532,14 @@ impl I422Buffer {
516532
)
517533
}
518534
}
535+
536+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::I422Buffer {
537+
vf::I422Buffer {
538+
handle: I422Buffer {
539+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
540+
},
541+
}
542+
}
519543
}
520544
impl I444Buffer {
521545
pub fn new(
@@ -621,6 +645,14 @@ impl I444Buffer {
621645
)
622646
}
623647
}
648+
649+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::I444Buffer {
650+
vf::I444Buffer {
651+
handle: I444Buffer {
652+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
653+
},
654+
}
655+
}
624656
}
625657

626658
impl I010Buffer {
@@ -738,6 +770,14 @@ impl I010Buffer {
738770
)
739771
}
740772
}
773+
774+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::I010Buffer {
775+
vf::I010Buffer {
776+
handle: I010Buffer {
777+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
778+
},
779+
}
780+
}
741781
}
742782

743783
impl NV12Buffer {
@@ -843,4 +883,12 @@ impl NV12Buffer {
843883
)
844884
}
845885
}
886+
887+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> vf::NV12Buffer {
888+
vf::NV12Buffer {
889+
handle: NV12Buffer {
890+
sys_handle: self.sys_handle.pin_mut().scale(scaled_width, scaled_height),
891+
},
892+
}
893+
}
846894
}

libwebrtc/src/video_frame.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,10 @@ impl I420Buffer {
235235
)
236236
}
237237
}
238+
239+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> I420Buffer {
240+
self.handle.scale(scaled_width, scaled_height)
241+
}
238242
}
239243

240244
impl I420ABuffer {
@@ -274,6 +278,10 @@ impl I420ABuffer {
274278
)
275279
}
276280
}
281+
282+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> I420ABuffer {
283+
self.handle.scale(scaled_width, scaled_height)
284+
}
277285
}
278286

279287
impl I422Buffer {
@@ -317,6 +325,10 @@ impl I422Buffer {
317325
)
318326
}
319327
}
328+
329+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> I422Buffer {
330+
self.handle.scale(scaled_width, scaled_height)
331+
}
320332
}
321333

322334
impl I444Buffer {
@@ -360,6 +372,10 @@ impl I444Buffer {
360372
)
361373
}
362374
}
375+
376+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> I444Buffer {
377+
self.handle.scale(scaled_width, scaled_height)
378+
}
363379
}
364380

365381
impl I010Buffer {
@@ -403,6 +419,10 @@ impl I010Buffer {
403419
)
404420
}
405421
}
422+
423+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> I010Buffer {
424+
self.handle.scale(scaled_width, scaled_height)
425+
}
406426
}
407427

408428
impl NV12Buffer {
@@ -439,6 +459,10 @@ impl NV12Buffer {
439459
)
440460
}
441461
}
462+
463+
pub fn scale(&mut self, scaled_width: i32, scaled_height: i32) -> NV12Buffer {
464+
self.handle.scale(scaled_width, scaled_height)
465+
}
442466
}
443467

444468
#[cfg(not(target_arch = "wasm32"))]

webrtc-sys/include/livekit/video_frame_buffer.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ class BiplanarYuv8Buffer : public BiplanarYuvBuffer {
151151
class I420Buffer : public PlanarYuv8Buffer {
152152
public:
153153
explicit I420Buffer(rtc::scoped_refptr<webrtc::I420BufferInterface> buffer);
154+
155+
std::unique_ptr<I420Buffer> scale(int scaled_width, int scaled_height) const;
156+
157+
private:
158+
webrtc::I420BufferInterface* buffer() const;
154159
};
155160

156161
class I420ABuffer : public I420Buffer {
@@ -160,28 +165,50 @@ class I420ABuffer : public I420Buffer {
160165
unsigned int stride_a() const;
161166
const uint8_t* data_a() const;
162167

168+
std::unique_ptr<I420ABuffer> scale(int scaled_width, int scaled_height) const;
169+
163170
private:
164171
webrtc::I420ABufferInterface* buffer() const;
165172
};
166173

167174
class I422Buffer : public PlanarYuv8Buffer {
168175
public:
169176
explicit I422Buffer(rtc::scoped_refptr<webrtc::I422BufferInterface> buffer);
177+
178+
std::unique_ptr<I422Buffer> scale(int scaled_width, int scaled_height) const;
179+
180+
private:
181+
webrtc::I422BufferInterface* buffer() const;
170182
};
171183

172184
class I444Buffer : public PlanarYuv8Buffer {
173185
public:
174186
explicit I444Buffer(rtc::scoped_refptr<webrtc::I444BufferInterface> buffer);
187+
188+
std::unique_ptr<I444Buffer> scale(int scaled_width, int scaled_height) const;
189+
190+
private:
191+
webrtc::I444BufferInterface* buffer() const;
175192
};
176193

177194
class I010Buffer : public PlanarYuv16BBuffer {
178195
public:
179196
explicit I010Buffer(rtc::scoped_refptr<webrtc::I010BufferInterface> buffer);
197+
198+
std::unique_ptr<I010Buffer> scale(int scaled_width, int scaled_height) const;
199+
200+
private:
201+
webrtc::I010BufferInterface* buffer() const;
180202
};
181203

182204
class NV12Buffer : public BiplanarYuv8Buffer {
183205
public:
184206
explicit NV12Buffer(rtc::scoped_refptr<webrtc::NV12BufferInterface> buffer);
207+
208+
std::unique_ptr<NV12Buffer> scale(int scaled_width, int scaled_height) const;
209+
210+
private:
211+
webrtc::NV12BufferInterface* buffer() const;
185212
};
186213

187214
std::unique_ptr<I420Buffer> copy_i420_buffer(

webrtc-sys/src/video_frame_buffer.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,19 @@ webrtc::BiplanarYuv8Buffer* BiplanarYuv8Buffer::buffer() const {
192192
I420Buffer::I420Buffer(rtc::scoped_refptr<webrtc::I420BufferInterface> buffer)
193193
: PlanarYuv8Buffer(buffer) {}
194194

195+
webrtc::I420BufferInterface* I420Buffer::buffer() const {
196+
return static_cast<webrtc::I420BufferInterface*>(buffer_.get());
197+
}
198+
199+
std::unique_ptr<I420Buffer> I420Buffer::scale(int scaled_width,
200+
int scaled_height) const {
201+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
202+
buffer()->Scale(scaled_width, scaled_height);
203+
return std::make_unique<I420Buffer>(
204+
rtc::scoped_refptr<webrtc::I420BufferInterface>(
205+
const_cast<webrtc::I420BufferInterface*>(result->GetI420())));
206+
}
207+
195208
I420ABuffer::I420ABuffer(
196209
rtc::scoped_refptr<webrtc::I420ABufferInterface> buffer)
197210
: I420Buffer(buffer) {}
@@ -208,18 +221,79 @@ webrtc::I420ABufferInterface* I420ABuffer::buffer() const {
208221
return static_cast<webrtc::I420ABufferInterface*>(buffer_.get());
209222
}
210223

224+
std::unique_ptr<I420ABuffer> I420ABuffer::scale(int scaled_width,
225+
int scaled_height) const {
226+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
227+
buffer()->Scale(scaled_width, scaled_height);
228+
return std::make_unique<I420ABuffer>(
229+
rtc::scoped_refptr<webrtc::I420ABufferInterface>(
230+
const_cast<webrtc::I420ABufferInterface*>(result->GetI420A())));
231+
}
232+
211233
I422Buffer::I422Buffer(rtc::scoped_refptr<webrtc::I422BufferInterface> buffer)
212234
: PlanarYuv8Buffer(buffer) {}
213235

236+
webrtc::I422BufferInterface* I422Buffer::buffer() const {
237+
return static_cast<webrtc::I422BufferInterface*>(buffer_.get());
238+
}
239+
240+
std::unique_ptr<I422Buffer> I422Buffer::scale(int scaled_width,
241+
int scaled_height) const {
242+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
243+
buffer()->Scale(scaled_width, scaled_height);
244+
return std::make_unique<I422Buffer>(
245+
rtc::scoped_refptr<webrtc::I422BufferInterface>(
246+
const_cast<webrtc::I422BufferInterface*>(result->GetI422())));
247+
}
248+
214249
I444Buffer::I444Buffer(rtc::scoped_refptr<webrtc::I444BufferInterface> buffer)
215250
: PlanarYuv8Buffer(buffer) {}
216251

252+
webrtc::I444BufferInterface* I444Buffer::buffer() const {
253+
return static_cast<webrtc::I444BufferInterface*>(buffer_.get());
254+
}
255+
256+
std::unique_ptr<I444Buffer> I444Buffer::scale(int scaled_width,
257+
int scaled_height) const {
258+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
259+
buffer()->Scale(scaled_width, scaled_height);
260+
return std::make_unique<I444Buffer>(
261+
rtc::scoped_refptr<webrtc::I444BufferInterface>(
262+
const_cast<webrtc::I444BufferInterface*>(result->GetI444())));
263+
}
264+
217265
I010Buffer::I010Buffer(rtc::scoped_refptr<webrtc::I010BufferInterface> buffer)
218266
: PlanarYuv16BBuffer(buffer) {}
219267

268+
webrtc::I010BufferInterface* I010Buffer::buffer() const {
269+
return static_cast<webrtc::I010BufferInterface*>(buffer_.get());
270+
}
271+
272+
std::unique_ptr<I010Buffer> I010Buffer::scale(int scaled_width,
273+
int scaled_height) const {
274+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
275+
buffer()->Scale(scaled_width, scaled_height);
276+
return std::make_unique<I010Buffer>(
277+
rtc::scoped_refptr<webrtc::I010BufferInterface>(
278+
const_cast<webrtc::I010BufferInterface*>(result->GetI010())));
279+
}
280+
220281
NV12Buffer::NV12Buffer(rtc::scoped_refptr<webrtc::NV12BufferInterface> buffer)
221282
: BiplanarYuv8Buffer(buffer) {}
222283

284+
webrtc::NV12BufferInterface* NV12Buffer::buffer() const {
285+
return static_cast<webrtc::NV12BufferInterface*>(buffer_.get());
286+
}
287+
288+
std::unique_ptr<NV12Buffer> NV12Buffer::scale(int scaled_width,
289+
int scaled_height) const {
290+
rtc::scoped_refptr<webrtc::VideoFrameBuffer> result =
291+
buffer()->Scale(scaled_width, scaled_height);
292+
return std::make_unique<NV12Buffer>(
293+
rtc::scoped_refptr<webrtc::NV12BufferInterface>(
294+
const_cast<webrtc::NV12BufferInterface*>(result->GetNV12())));
295+
}
296+
223297
std::unique_ptr<I420Buffer> copy_i420_buffer(
224298
const std::unique_ptr<I420Buffer>& i420) {
225299
return std::make_unique<I420Buffer>(webrtc::I420Buffer::Copy(*i420->get()));

webrtc-sys/src/video_frame_buffer.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,22 @@ pub mod ffi {
8787
fn stride_a(self: &I420ABuffer) -> u32;
8888
fn data_a(self: &I420ABuffer) -> *const u8;
8989

90+
fn scale(self: &I420Buffer, scaled_width: i32, scaled_height: i32)
91+
-> UniquePtr<I420Buffer>;
92+
fn scale(
93+
self: &I420ABuffer,
94+
scaled_width: i32,
95+
scaled_height: i32,
96+
) -> UniquePtr<I420ABuffer>;
97+
fn scale(self: &I422Buffer, scaled_width: i32, scaled_height: i32)
98+
-> UniquePtr<I422Buffer>;
99+
fn scale(self: &I444Buffer, scaled_width: i32, scaled_height: i32)
100+
-> UniquePtr<I444Buffer>;
101+
fn scale(self: &I010Buffer, scaled_width: i32, scaled_height: i32)
102+
-> UniquePtr<I010Buffer>;
103+
fn scale(self: &NV12Buffer, scaled_width: i32, scaled_height: i32)
104+
-> UniquePtr<NV12Buffer>;
105+
90106
fn copy_i420_buffer(i420: &UniquePtr<I420Buffer>) -> UniquePtr<I420Buffer>;
91107
fn new_i420_buffer(
92108
width: i32,

0 commit comments

Comments
 (0)