fix packet timestamps

This commit is contained in:
2024-03-25 19:19:31 +00:00
parent 9a086d80c1
commit 2a82e2c00b
15 changed files with 520 additions and 469 deletions

View File

@ -1,10 +1,6 @@
use std::ops::{Deref, DerefMut};
use async_trait::async_trait;
use ffmpeg_sys_next::{
av_frame_alloc, av_frame_free, av_frame_ref, av_packet_alloc, av_packet_free, av_packet_ref,
AVFrame, AVPacket,
};
use ffmpeg_sys_next::{av_frame_clone, av_frame_copy_props, av_frame_free, av_packet_clone, av_packet_copy_props, av_packet_free, AVFrame, AVPacket};
use serde::{Deserialize, Serialize};
use crate::demux::info::DemuxStreamInfo;
@ -18,19 +14,16 @@ pub enum EgressType {
HLS(HLSEgressConfig),
DASH,
WHEP,
MPEGTS,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct HLSEgressConfig {
pub out_dir: String,
pub variants: Vec<VariantStream>,
/// FFMPEG stream mapping string
///
/// v:0,a:0 v:1,a:0, v:2,a:1 etc..
pub stream_map: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct PipelineConfig {
pub id: uuid::Uuid,
pub recording: Vec<VariantStream>,
@ -44,9 +37,9 @@ pub enum PipelinePayload {
/// Raw bytes from ingress
Bytes(bytes::Bytes),
/// FFMpeg AVPacket
AvPacket(*mut AVPacket),
AvPacket(String, *mut AVPacket),
/// FFMpeg AVFrame
AvFrame(*mut AVFrame),
AvFrame(String, *mut AVFrame),
/// Information about the input stream
SourceInfo(DemuxStreamInfo),
}
@ -60,15 +53,15 @@ impl Clone for PipelinePayload {
match self {
PipelinePayload::Empty => PipelinePayload::Empty,
PipelinePayload::Bytes(b) => PipelinePayload::Bytes(b.clone()),
PipelinePayload::AvPacket(p) => unsafe {
let new_pkt = av_packet_alloc();
av_packet_ref(new_pkt, *p);
PipelinePayload::AvPacket(new_pkt)
PipelinePayload::AvPacket(t, p) => unsafe {
let new_pkt = av_packet_clone(*p);
av_packet_copy_props(new_pkt, *p);
PipelinePayload::AvPacket(t.clone(), new_pkt)
},
PipelinePayload::AvFrame(p) => unsafe {
let new_frame = av_frame_alloc();
av_frame_ref(new_frame, *p);
PipelinePayload::AvFrame(new_frame)
PipelinePayload::AvFrame(t, p) => unsafe {
let new_frame = av_frame_clone(*p);
av_frame_copy_props(new_frame, *p);
PipelinePayload::AvFrame(t.clone(), new_frame)
},
PipelinePayload::SourceInfo(i) => PipelinePayload::SourceInfo(i.clone()),
}
@ -80,19 +73,13 @@ impl Drop for PipelinePayload {
match self {
PipelinePayload::Empty => {}
PipelinePayload::Bytes(_) => {}
PipelinePayload::AvPacket(p) => unsafe {
PipelinePayload::AvPacket(_, p) => unsafe {
av_packet_free(p);
},
PipelinePayload::AvFrame(p) => unsafe {
PipelinePayload::AvFrame(_, p) => unsafe {
av_frame_free(p);
},
PipelinePayload::SourceInfo(_) => {}
}
}
}
#[async_trait]
pub trait PipelineStep {
fn name(&self) -> String;
async fn process(&mut self, pkg: &PipelinePayload) -> Result<PipelinePayload, anyhow::Error>;
}