pub use crate::{
audio::{AudioChannelLayout, AudioFormat},
colour::*,
graph::{AudioInputId, AudioOutputId, VideoInputId, VideoOutputId},
video::{InterlaceMode, VideoFormat},
AudioFrameWithId, VideoFrameWithId,
};
use abi_stable::{
sabi_trait,
std_types::{RHashMap, ROption, RResult, RSlice, RStr, RString, RVec},
StableAbi,
};
#[sabi_trait]
pub trait PhaneronPlugin: Send + Sync {
fn get_available_node_types(&self) -> RVec<PluginNodeDescription>;
fn create_node(
&self,
description: CreateNodeDescription,
) -> RResult<crate::types::NodeHandle, RString>;
fn destroy_node(&self, node_id: RString) -> RResult<(), RString>;
}
#[repr(C)]
#[derive(StableAbi)]
pub struct PluginNodeDescription {
pub id: RString,
pub name: RString,
}
#[repr(C)]
#[derive(StableAbi)]
pub struct CreateNodeDescription {
pub node_id: RString,
pub node_type: RString,
}
#[sabi_trait]
pub trait NodeHandle: Send + Sync {
fn initialize(
&self,
context: crate::types::NodeContext,
configuration: ROption<RString>,
) -> crate::types::Node;
}
#[sabi_trait]
pub trait Node: Send + Sync {
fn apply_state(&self, state: RString) -> bool;
fn process_frame(
&self,
frame_context: crate::types::ProcessFrameContext,
video_frames: RHashMap<VideoInputId, VideoFrameWithId>,
audio_frames: RHashMap<AudioInputId, AudioFrameWithId>,
black_frame: VideoFrameWithId,
silence_frame: AudioFrameWithId,
);
}
#[sabi_trait]
pub trait NodeContext: Send + Sync {
fn add_audio_input(&self) -> AudioInputId;
fn add_video_input(&self) -> VideoInputId;
fn add_audio_output(&self) -> crate::types::AudioOutput;
fn add_video_output(&self) -> crate::types::VideoOutput;
fn create_to_rgba(
&self,
video_format: &VideoFormat,
colour_space: &ColourSpec,
width: usize,
height: usize,
) -> crate::types::ToRGBA;
fn create_from_rgba(
&self,
video_format: &VideoFormat,
colour_space: &ColourSpec,
width: usize,
height: usize,
interlace: InterlaceMode,
) -> crate::types::FromRGBA;
fn create_to_audio_f32(
&self,
audio_format: AudioFormat,
channel_layout: AudioChannelLayout,
) -> crate::types::ToAudioF32;
fn create_from_audio_f32(
&self,
audio_format: AudioFormat,
channel_layout: AudioChannelLayout,
) -> crate::types::FromAudioF32;
fn create_process_shader(
&self,
kernel: RStr<'_>,
program_name: RStr<'_>,
) -> crate::types::ProcessShader;
}
#[sabi_trait]
pub trait ProcessFrameContext {
fn submit(&self) -> RResult<crate::types::FrameContext, RString>;
}
#[sabi_trait]
pub trait FrameContext {}
#[sabi_trait]
pub trait ProcessShader: Send + Sync {
fn run(
&self,
params: crate::ShaderParams,
global_work_size: &[usize; 2],
) -> RVec<crate::types::VideoFrame>;
}
#[sabi_trait]
pub trait VideoFrame: Send + Sync {
fn buffer_index(&self) -> usize;
fn width(&self) -> usize;
fn height(&self) -> usize;
}
#[sabi_trait]
pub trait AudioFrame: Send + Sync {
fn buffers(&self) -> &RVec<RVec<f32>>;
}
#[sabi_trait]
pub trait VideoOutput: Send + Sync {
fn push_frame(&self, context: &crate::types::FrameContext, frame: crate::types::VideoFrame);
}
#[sabi_trait]
pub trait AudioOutput: Send + Sync {
fn push_frame(&self, context: &crate::types::FrameContext, frame: crate::types::AudioFrame);
}
#[sabi_trait]
pub trait ToRGBA: Send + Sync {
fn get_num_bytes(&self) -> RVec<usize>;
fn get_num_bytes_rgba(&self) -> usize;
fn get_total_bytes(&self) -> usize;
fn load_frame(&self, inputs: &RSlice<RSlice<u8>>) -> crate::types::LoadedVideoFrame;
fn process_frame(&self, sources: crate::types::LoadedVideoFrame) -> crate::types::VideoFrame;
}
#[sabi_trait]
pub trait LoadedVideoFrame {}
#[sabi_trait]
pub trait FromRGBA: Send + Sync {
fn get_num_bytes(&self) -> RVec<usize>;
fn get_num_bytes_rgba(&self) -> usize;
fn get_total_bytes(&self) -> usize;
fn process_frame(
&self,
context: &crate::types::ProcessFrameContext,
frame: crate::types::VideoFrame,
) -> crate::types::ConsumedVideoFrame;
fn copy_frame(
&self,
context: &crate::types::FrameContext, frame: crate::types::ConsumedVideoFrame,
) -> RVec<RVec<u8>>;
}
#[sabi_trait]
pub trait ConsumedVideoFrame {}
#[sabi_trait]
pub trait ToAudioF32: Send + Sync {
fn load_frame(&self, input: &RSlice<u8>) -> crate::types::LoadedAudioFrame;
fn process_frame(&self, source: crate::types::LoadedAudioFrame) -> crate::types::AudioFrame;
}
#[sabi_trait]
pub trait LoadedAudioFrame {}
#[sabi_trait]
pub trait FromAudioF32: Send + Sync {
fn process_frame(
&self,
context: &crate::types::ProcessFrameContext,
frame: crate::types::AudioFrame,
) -> crate::types::ConsumedAudioFrame;
fn copy_frame(
&self,
context: &crate::types::FrameContext,
frame: crate::types::ConsumedAudioFrame,
) -> RVec<u8>;
}
#[sabi_trait]
pub trait ConsumedAudioFrame {}