feat: decoder options

This commit is contained in:
2024-10-24 12:26:52 +01:00
parent 3e74159ade
commit cbaf4069c7
6 changed files with 405 additions and 215 deletions

View File

@ -1,26 +1,11 @@
use ffmpeg_rs_raw::{Decoder, Demuxer};
use ffmpeg_sys_the_third::{av_frame_free, av_packet_free};
use std::collections::HashMap;
use std::env::args;
use std::fs::File;
use std::io::Read;
use std::io::{Cursor, Read};
use std::path::PathBuf;
struct DropTest {
inner: File,
}
impl Read for DropTest {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.inner.read(buf)
}
}
impl Drop for DropTest {
fn drop(&mut self) {
println!("Dropped!");
}
}
fn main() {
let name = args().next().unwrap_or("main".to_string());
let path = if let Some(path) = args().skip(1).next() {
@ -35,11 +20,27 @@ fn main() {
let fd = read_as_file(path.clone());
scan_input(fd);
let mut opt = HashMap::new();
opt.insert("analyzeduration".to_string(), "999".to_string());
let svg = include_bytes!("./cashu.svg");
let mut dx = Demuxer::new_custom_io(svg.as_slice(), Some("cashu.svg".to_string()));
dx.set_opt(opt.clone()).unwrap();
unsafe {
let mut decoder = Decoder::new();
let info = dx.probe_input().expect("probe failed");
for chan in &info.channels {
decoder.setup_decoder(chan, None).expect("setup failed");
}
loop_decoder(dx, decoder);
}
}
fn read_as_custom_io(path: PathBuf) -> Demuxer {
let file = File::open(path).unwrap();
Demuxer::new_custom_io(DropTest { inner: file })
let mut data: Vec<u8> = Vec::new();
File::open(path).unwrap().read_to_end(&mut data).unwrap();
let reader = Cursor::new(data);
Demuxer::new_custom_io(reader, None)
}
fn read_as_file(path_buf: PathBuf) -> Demuxer {
@ -50,20 +51,27 @@ fn scan_input(mut demuxer: Demuxer) {
unsafe {
let info = demuxer.probe_input().expect("demuxer failed");
println!("{}", info);
let mut decoder = Decoder::new();
loop {
let (mut pkt, stream) = demuxer.get_packet().expect("demuxer failed");
if pkt.is_null() {
break; // EOF
}
if let Ok(frames) = decoder.decode_pkt(pkt, stream) {
for (mut frame, _stream) in frames {
// do nothing but decode entire stream
av_frame_free(&mut frame);
}
}
av_packet_free(&mut pkt);
}
decode_input(demuxer);
}
}
unsafe fn decode_input(demuxer: Demuxer) {
let decoder = Decoder::new();
loop_decoder(demuxer, decoder);
}
unsafe fn loop_decoder(mut demuxer: Demuxer, mut decoder: Decoder) {
loop {
let (mut pkt, stream) = demuxer.get_packet().expect("demuxer failed");
if pkt.is_null() {
break; // EOF
}
if let Ok(frames) = decoder.decode_pkt(pkt, stream) {
for (mut frame, _stream) in frames {
// do nothing but decode entire stream
av_frame_free(&mut frame);
}
}
av_packet_free(&mut pkt);
}
}