vapoursynth4_rs/frame/
context.rs

1use std::ffi::CStr;
2
3use crate::{
4    api::Api,
5    ffi,
6    frame::Frame,
7    node::{Node, VideoNode},
8};
9
10#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
11pub struct FrameContext {
12    handle: *const ffi::VSFrameContext,
13    api: Api,
14}
15
16impl FrameContext {
17    #[must_use]
18    pub(crate) unsafe fn from_ptr(ptr: *const ffi::VSFrameContext, api: Api) -> FrameContext {
19        FrameContext {
20            handle: ptr.cast_mut(),
21            api,
22        }
23    }
24
25    #[must_use]
26    pub fn as_ptr(&self) -> *mut ffi::VSFrameContext {
27        self.handle.cast_mut()
28    }
29
30    pub fn request_frame_filter(&mut self, n: i32, node: &VideoNode) {
31        unsafe {
32            (self.api.requestFrameFilter)(n, node.as_ptr(), self.as_ptr());
33        }
34    }
35
36    pub fn release_frame_early(&mut self, n: i32, node: &VideoNode) {
37        unsafe {
38            (self.api.releaseFrameEarly)(node.as_ptr(), n, self.as_ptr());
39        }
40    }
41
42    pub fn cache_frame(&mut self, frame: &impl Frame, n: i32) {
43        unsafe {
44            (self.api.cacheFrame)(frame.as_ptr(), n, self.as_ptr());
45        }
46    }
47
48    pub fn set_filter_error(&mut self, msg: &CStr) {
49        unsafe {
50            (self.api.setFilterError)(msg.as_ptr().cast(), self.as_ptr());
51        }
52    }
53}