use crate::core::context::output::VSyncMethod;
use crate::core::context::pre_mux_queue::PreMuxQueueSender;
use crate::core::context::{FrameBox, PacketBox, Stream};
use crate::core::scheduler::sync_queue::SyncQueue;
use crossbeam_channel::{Receiver, Sender};
use ffmpeg_sys_next::{AVCodec, AVMediaType, AVStream};
use std::sync::atomic::AtomicBool;
use std::sync::{Arc, Condvar, Mutex};
#[derive(Clone)]
pub(crate) struct EncSyncHandle {
pub(crate) queue: Arc<(Mutex<SyncQueue<FrameBox>>, Condvar)>,
pub(crate) sq_idx: usize,
pub(crate) sq_finished: Arc<[AtomicBool]>,
pub(crate) source_finished: Option<Arc<AtomicBool>>,
}
#[derive(Clone)]
pub(crate) struct EncoderStream {
pub(crate) stream_index: usize,
pub(crate) stream: Stream,
pub(crate) codec_type: AVMediaType,
pub(crate) encoder: *const AVCodec,
pub(crate) vsync_method: Option<VSyncMethod>,
pub(crate) qscale: Option<i32>,
pub(crate) forced_kf_pts: Vec<i64>,
src: Option<Receiver<FrameBox>>,
dst: Option<Sender<PacketBox>>,
dst_pre: Option<PreMuxQueueSender>,
mux_start_gate: Option<Arc<crate::core::context::MuxStartGate>>,
sync_queue: Option<EncSyncHandle>,
}
impl EncoderStream {
pub(crate) fn new(
stream_index: usize,
stream: *mut AVStream,
codec_type: AVMediaType,
encoder: *const AVCodec,
vsync_method: Option<VSyncMethod>,
qscale: Option<i32>,
forced_kf_pts: Vec<i64>,
src: Receiver<FrameBox>,
dst: Sender<PacketBox>,
dst_pre: PreMuxQueueSender,
mux_start_gate: Arc<crate::core::context::MuxStartGate>,
) -> Self {
Self {
stream_index,
stream: Stream { inner: stream },
codec_type,
encoder,
vsync_method,
qscale,
forced_kf_pts,
src: Some(src),
dst: Some(dst),
dst_pre: Some(dst_pre),
mux_start_gate: Some(mux_start_gate),
sync_queue: None,
}
}
pub(crate) fn set_sync_queue(&mut self, handle: EncSyncHandle) {
self.sync_queue = Some(handle);
}
pub(crate) fn take_sync_queue(&mut self) -> Option<EncSyncHandle> {
self.sync_queue.take()
}
pub(crate) fn take_src(&mut self) -> Receiver<FrameBox> {
self.src.take().unwrap()
}
pub(crate) fn take_dst(&mut self) -> Sender<PacketBox> {
self.dst.take().unwrap()
}
pub(crate) fn take_dst_pre(&mut self) -> PreMuxQueueSender {
self.dst_pre.take().unwrap()
}
pub(crate) fn take_mux_start_gate(&mut self) -> Arc<crate::core::context::MuxStartGate> {
self.mux_start_gate.take().unwrap()
}
pub fn replace_src(&mut self, new_src: Receiver<FrameBox>) -> Receiver<FrameBox> {
let old_src = self.src.take().unwrap();
self.src = Some(new_src);
old_src
}
}