Skip to main content

libav_ng/sws/
mod.rs

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}