boiler plate for encoder implementation

This commit is contained in:
Muaz Ahmad 2023-10-12 13:57:11 +05:00
parent 0b910df389
commit 89d9100c7e
5 changed files with 32 additions and 11 deletions

13
src/encode/cmds.rs Normal file
View file

@ -0,0 +1,13 @@
use std::error::Error;
use std::sync::{Arc, mpsc};
use crate::util;
use crate::encode::codecs::Encoder;
pub fn spawn(v_target: util::VideoCodec, a_target: util::AudioCodec) -> Result<(impl Encoder, impl Encoder), Box<dyn Error>> {
todo!();
}
pub fn handle_encoder(encoder: impl Encoder, c_in: mpsc::Receiver<util::RawMedia>, c_out: mpsc::Sender<util::NALUPacket>, metadata: Arc<util::Metadata>, c_err: mpsc::Sender<Box<dyn Error + Send + Sync>>) {
todo!();
}

2
src/encode/codecs/mod.rs Normal file
View file

@ -0,0 +1,2 @@
pub trait Encoder {
}

View file

@ -1,3 +1,6 @@
mod cmds;
mod codecs;
use std::sync::{mpsc, Arc}; use std::sync::{mpsc, Arc};
use std::error::Error; use std::error::Error;
use std::thread; use std::thread;
@ -7,7 +10,9 @@ use crate::util;
pub fn spawn( pub fn spawn(
v: mpsc::Receiver<util::RawMedia>, v: mpsc::Receiver<util::RawMedia>,
a: mpsc::Receiver<util::RawMedia>, a: mpsc::Receiver<util::RawMedia>,
metadata: Arc<util::Metadata> metadata: Arc<util::Metadata>,
v_target: util::VideoCodec,
a_target: util::AudioCodec
) -> Result< ) -> Result<
( (
mpsc::Receiver<util::NALUPacket>, mpsc::Receiver<util::NALUPacket>,
@ -18,16 +23,15 @@ pub fn spawn(
> { > {
let (v_in, v_out) = mpsc::channel(); let (v_in, v_out) = mpsc::channel();
let (a_in, a_out) = mpsc::channel(); let (a_in, a_out) = mpsc::channel();
let (err_in, err_out) = mpsc::channel(); let (err_in_v, err_out) = mpsc::channel();
let metadata_handle = metadata.clone(); let err_in_a = err_in_v.clone();
let (v_encoder, a_encoder) = cmds::spawn(v_target, a_target)?;
let metadata_cp = metadata.clone();
thread::spawn(move || { thread::spawn(move || {
&v; cmds::handle_encoder(v_encoder, v, v_in, metadata_cp, err_in_v);
&a; });
&v_in; thread::spawn(move || {
&a_in; cmds::handle_encoder(a_encoder, a, a_in, metadata, err_in_a);
&err_in;
&metadata_handle;
thread::park();
}); });
return Ok((v_out, a_out, err_out)); return Ok((v_out, a_out, err_out));
} }

View file

@ -12,7 +12,7 @@ use std::time::Duration;
fn init() -> Result<[mpsc::Receiver<Box<dyn std::error::Error + Send + Sync>>; 4], Box<dyn std::error::Error>>{ fn init() -> Result<[mpsc::Receiver<Box<dyn std::error::Error + Send + Sync>>; 4], Box<dyn std::error::Error>>{
let (v_out, a_out, metadata, demux_err_recv) = demux::spawn()?; let (v_out, a_out, metadata, demux_err_recv) = demux::spawn()?;
let (raw_v_out, raw_a_out, decode_err_recv) = decode::spawn(v_out, a_out, metadata.clone())?; let (raw_v_out, raw_a_out, decode_err_recv) = decode::spawn(v_out, a_out, metadata.clone())?;
let (enc_v_out, enc_a_out, encode_err_recv) = encode::spawn(raw_v_out, raw_a_out, metadata.clone())?; let (enc_v_out, enc_a_out, encode_err_recv) = encode::spawn(raw_v_out, raw_a_out, metadata.clone(), util::VideoCodec::VP9, util::AudioCodec::OPUS)?;
let muxer_err_recv = muxer::spawn(enc_v_out, enc_a_out, metadata.clone())?; let muxer_err_recv = muxer::spawn(enc_v_out, enc_a_out, metadata.clone())?;
return Ok([demux_err_recv, decode_err_recv, encode_err_recv, muxer_err_recv]); return Ok([demux_err_recv, decode_err_recv, encode_err_recv, muxer_err_recv]);
} }

View file

@ -15,6 +15,7 @@ pub struct VideoMetadata {
pub enum VideoCodec { pub enum VideoCodec {
H264, H264,
VP9,
} }
#[derive(Default)] #[derive(Default)]
@ -26,6 +27,7 @@ pub struct AudioMetadata {
pub enum AudioCodec { pub enum AudioCodec {
AAC, AAC,
OPUS,
} }
#[derive(Default)] #[derive(Default)]