1use libav_sys_ng::{sws_freeContext, sws_getContext, sws_scale, SwsContext};
2
3use crate::avframe::Frame;
4
5pub struct Sws {
6 inner: *mut SwsContext,
7 src_width: i32,
8 src_height: i32,
9 src_format: i32,
10 dst_width: i32,
11 dst_height: i32,
12 dst_format: i32,
13 flags: i32,
14}
15
16impl Sws {
17 pub fn new(
18 src_width: i32,
19 src_height: i32,
20 src_format: i32,
21 dst_width: i32,
22 dst_height: i32,
23 dst_format: i32,
24 flags: i32,
25 ) -> Self {
26 Sws {
27 inner: unsafe {
28 sws_getContext(
29 src_width,
30 src_height,
31 src_format,
32 dst_width,
33 dst_height,
34 dst_format,
35 flags,
36 core::ptr::null_mut(),
37 core::ptr::null_mut(),
38 core::ptr::null(),
39 )
40 },
41 src_width,
42 src_height,
43 src_format,
44 dst_width,
45 dst_height,
46 dst_format,
47 flags,
48 }
49 }
50
51 pub fn scale(&self, in_frame: &Frame, out_frame: &mut Frame) -> i32 {
52 let src_slice = (unsafe { in_frame.raw() }).data.as_ptr().cast();
53 let src_stride = in_frame.linesize();
54
55 let dst_slice = unsafe { out_frame.raw_mut().data.as_ptr() };
56 let dst_stride = out_frame.linesize();
57
58 unsafe {
59 sws_scale(
60 self.inner,
61 src_slice,
62 src_stride.as_ptr(),
63 0,
64 self.src_height,
65 dst_slice,
66 dst_stride.as_ptr(),
67 )
68 }
69 }
70}
71
72impl Drop for Sws {
73 fn drop(&mut self) {
74 unsafe { sws_freeContext(self.inner) };
75 }
76}