mod audio;
mod video;
pub use audio::*;
pub use video::*;
use super::config;
use crate::common::Rational32;
#[derive(Debug, Clone)]
pub struct FilterPluginTable {
pub name: String,
pub label: Option<String>,
pub information: String,
pub flags: FilterPluginFlags,
pub config_items: Vec<config::FilterConfigItem>,
}
define_bitflag! {
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct FilterPluginFlags: i32 {
video: aviutl2_sys::filter2::FILTER_PLUGIN_TABLE::FLAG_VIDEO,
audio: aviutl2_sys::filter2::FILTER_PLUGIN_TABLE::FLAG_AUDIO,
input: aviutl2_sys::filter2::FILTER_PLUGIN_TABLE::FLAG_INPUT,
filter: aviutl2_sys::filter2::FILTER_PLUGIN_TABLE::FLAG_FILTER,
}
}
pub trait FilterPlugin: Send + Sync + Sized {
fn new(info: crate::common::AviUtl2Info) -> crate::common::AnyResult<Self>;
fn plugin_info(&self) -> crate::filter::FilterPluginTable;
fn proc_video(
&self,
_config: &[crate::filter::FilterConfigItem],
_video: &mut crate::filter::FilterProcVideo,
) -> crate::common::AnyResult<()> {
anyhow::bail!("proc_video is not implemented");
}
fn proc_audio(
&self,
_config: &[crate::filter::FilterConfigItem],
_audio: &mut crate::filter::FilterProcAudio,
) -> crate::common::AnyResult<()> {
anyhow::bail!("proc_audio is not implemented");
}
fn with_instance<R>(f: impl FnOnce(&Self) -> R) -> R
where
Self: crate::filter::__bridge::FilterSingleton,
{
<Self as crate::filter::__bridge::FilterSingleton>::with_instance(f)
}
fn with_instance_mut<R>(f: impl FnOnce(&mut Self) -> R) -> R
where
Self: crate::filter::__bridge::FilterSingleton,
{
<Self as crate::filter::__bridge::FilterSingleton>::with_instance_mut(f)
}
}
#[derive(Debug, Clone, Copy)]
pub struct SceneInfo {
pub width: u32,
pub height: u32,
pub frame_rate: Rational32,
pub sample_rate: u32,
}
#[derive(Debug, Clone, Copy)]
pub struct ObjectInfo {
pub id: i64,
pub effect_id: i64,
pub layer: u32,
pub frame: u32,
pub frame_total: u32,
pub time: f64,
pub time_total: f64,
pub is_filter_object: bool,
pub frame_s: u32,
pub frame_e: u32,
}
impl ObjectInfo {
pub fn frame_range(&self) -> std::ops::RangeInclusive<u32> {
self.frame_s..=self.frame_e
}
}
#[derive(Debug, thiserror::Error)]
pub enum FilterProcError {
#[error("api call failed")]
ApiCallFailed,
#[error("input string contains null byte")]
InputCwstrContainsNull(#[from] crate::common::NullByteError),
#[error("value is out of range")]
ValueOutOfRange,
}
pub type FilterProcResult<T> = Result<T, FilterProcError>;