feat: specify input format for demuxer
This commit is contained in:
41
src/demux.rs
41
src/demux.rs
@ -38,6 +38,7 @@ pub struct Demuxer {
|
|||||||
ctx: *mut AVFormatContext,
|
ctx: *mut AVFormatContext,
|
||||||
input: DemuxerInput,
|
input: DemuxerInput,
|
||||||
buffer_size: usize,
|
buffer_size: usize,
|
||||||
|
format: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Demuxer {
|
impl Demuxer {
|
||||||
@ -52,6 +53,7 @@ impl Demuxer {
|
|||||||
ctx,
|
ctx,
|
||||||
input: DemuxerInput::Url(input.to_string()),
|
input: DemuxerInput::Url(input.to_string()),
|
||||||
buffer_size: 4096,
|
buffer_size: 4096,
|
||||||
|
format: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,6 +69,17 @@ impl Demuxer {
|
|||||||
self.buffer_size = buffer_size;
|
self.buffer_size = buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configure format hints for demuxer
|
||||||
|
pub fn with_format(mut self, format: &str) -> Self {
|
||||||
|
self.format = Some(format.to_string());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configure format hints for demuxer
|
||||||
|
pub fn set_format(&mut self, format: &str) {
|
||||||
|
self.format = Some(format.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a new [Demuxer] from an object that implements [Read]
|
/// Create a new [Demuxer] from an object that implements [Read]
|
||||||
pub fn new_custom_io<R: Read + 'static>(reader: R, url: Option<String>) -> Result<Self> {
|
pub fn new_custom_io<R: Read + 'static>(reader: R, url: Option<String>) -> Result<Self> {
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -80,6 +93,7 @@ impl Demuxer {
|
|||||||
ctx,
|
ctx,
|
||||||
input: DemuxerInput::Reader(Some(slimbox_unsize!(reader)), url),
|
input: DemuxerInput::Reader(Some(slimbox_unsize!(reader)), url),
|
||||||
buffer_size: 1024 * 16,
|
buffer_size: 1024 * 16,
|
||||||
|
format: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,15 +104,22 @@ impl Demuxer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn open(&mut self) -> Result<()> {
|
unsafe fn open(&mut self) -> Result<()> {
|
||||||
|
let format = if let Some(f) = &self.format {
|
||||||
|
let fmt_str = cstr!(f.as_str());
|
||||||
|
let ret = av_find_input_format(fmt_str);
|
||||||
|
libc::free(fmt_str as *mut libc::c_void);
|
||||||
|
if ret.is_null() {
|
||||||
|
bail!("Input format {} not found", f);
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
} else {
|
||||||
|
ptr::null()
|
||||||
|
};
|
||||||
|
|
||||||
match &mut self.input {
|
match &mut self.input {
|
||||||
DemuxerInput::Url(input) => {
|
DemuxerInput::Url(input) => {
|
||||||
let input_cstr = cstr!(input.as_str());
|
let input_cstr = cstr!(input.as_str());
|
||||||
let ret = avformat_open_input(
|
let ret = avformat_open_input(&mut self.ctx, input_cstr, format, ptr::null_mut());
|
||||||
&mut self.ctx,
|
|
||||||
input_cstr,
|
|
||||||
ptr::null_mut(),
|
|
||||||
ptr::null_mut(),
|
|
||||||
);
|
|
||||||
libc::free(input_cstr as *mut libc::c_void);
|
libc::free(input_cstr as *mut libc::c_void);
|
||||||
bail_ffmpeg!(ret);
|
bail_ffmpeg!(ret);
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -124,12 +145,7 @@ impl Demuxer {
|
|||||||
} else {
|
} else {
|
||||||
ptr::null_mut()
|
ptr::null_mut()
|
||||||
};
|
};
|
||||||
let ret = avformat_open_input(
|
let ret = avformat_open_input(&mut self.ctx, url_cstr, format, ptr::null_mut());
|
||||||
&mut self.ctx,
|
|
||||||
url_cstr,
|
|
||||||
ptr::null_mut(),
|
|
||||||
ptr::null_mut(),
|
|
||||||
);
|
|
||||||
if !url_cstr.is_null() {
|
if !url_cstr.is_null() {
|
||||||
libc::free(url_cstr as *mut libc::c_void);
|
libc::free(url_cstr as *mut libc::c_void);
|
||||||
}
|
}
|
||||||
@ -331,6 +347,7 @@ mod tests {
|
|||||||
let nof_limit = rlimit::Resource::NOFILE.get_hard()?;
|
let nof_limit = rlimit::Resource::NOFILE.get_hard()?;
|
||||||
for n in 0..nof_limit {
|
for n in 0..nof_limit {
|
||||||
let mut demux = Demuxer::new("./test_output/test.png")?;
|
let mut demux = Demuxer::new("./test_output/test.png")?;
|
||||||
|
demux.set_format("image2");
|
||||||
unsafe {
|
unsafe {
|
||||||
if let Err(e) = demux.probe_input() {
|
if let Err(e) = demux.probe_input() {
|
||||||
bail!("Failed on {}: {}", n, e);
|
bail!("Failed on {}: {}", n, e);
|
||||||
|
Reference in New Issue
Block a user