Add new (4.0+) API for av_[de]muxer_iterate
(#52)
* Add new MuxerIter/DemuxerIter for 4.0+ * Add Default impls for MuxerIter/DemuxerIter * Add tests for MuxerIter/DemuxerIter * Use mutable reference over addr_of_mut! * Don't dereference long_name if nullptr This happens if FFmpeg is configured with `--enable-small`
This commit is contained in:
parent
be7340c39a
commit
44e101406d
@ -27,7 +27,15 @@ impl Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn description(&self) -> &str {
|
pub fn description(&self) -> &str {
|
||||||
unsafe { from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).long_name).to_bytes()) }
|
unsafe {
|
||||||
|
let long_name = (*self.as_ptr()).long_name;
|
||||||
|
|
||||||
|
if long_name.is_null() {
|
||||||
|
""
|
||||||
|
} else {
|
||||||
|
from_utf8_unchecked(CStr::from_ptr(long_name).to_bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn extensions(&self) -> Vec<&str> {
|
pub fn extensions(&self) -> Vec<&str> {
|
||||||
|
@ -12,6 +12,11 @@ mod iter;
|
|||||||
#[cfg(not(feature = "ffmpeg_5_0"))]
|
#[cfg(not(feature = "ffmpeg_5_0"))]
|
||||||
pub use self::iter::Iter;
|
pub use self::iter::Iter;
|
||||||
|
|
||||||
|
#[cfg(feature = "ffmpeg_4_0")]
|
||||||
|
mod new_iter;
|
||||||
|
#[cfg(feature = "ffmpeg_4_0")]
|
||||||
|
pub use self::new_iter::{DemuxerIter, MuxerIter};
|
||||||
|
|
||||||
pub enum Format {
|
pub enum Format {
|
||||||
Input(Input),
|
Input(Input),
|
||||||
Output(Output),
|
Output(Output),
|
||||||
@ -51,3 +56,13 @@ impl Format {
|
|||||||
pub fn list() -> Iter {
|
pub fn list() -> Iter {
|
||||||
Iter::new()
|
Iter::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ffmpeg_4_0")]
|
||||||
|
pub fn list_demuxers() -> DemuxerIter {
|
||||||
|
DemuxerIter::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ffmpeg_4_0")]
|
||||||
|
pub fn list_muxers() -> MuxerIter {
|
||||||
|
MuxerIter::new()
|
||||||
|
}
|
||||||
|
93
src/format/format/new_iter.rs
Normal file
93
src/format/format/new_iter.rs
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
|
use crate::ffi::*;
|
||||||
|
use crate::format::format::{Input, Output};
|
||||||
|
use crate::format::Format;
|
||||||
|
use libc::c_void;
|
||||||
|
|
||||||
|
pub struct DemuxerIter {
|
||||||
|
ptr: *mut c_void,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DemuxerIter {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { ptr: null_mut() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DemuxerIter {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for DemuxerIter {
|
||||||
|
type Item = Format;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
unsafe {
|
||||||
|
let next = av_demuxer_iterate(&mut self.ptr);
|
||||||
|
if next.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Format::Input(Input::wrap(next as _)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct MuxerIter {
|
||||||
|
ptr: *mut c_void,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MuxerIter {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { ptr: null_mut() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for MuxerIter {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for MuxerIter {
|
||||||
|
type Item = Format;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
unsafe {
|
||||||
|
let next = av_muxer_iterate(&mut self.ptr);
|
||||||
|
if next.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Format::Output(Output::wrap(next as _)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn muxer_iter() {
|
||||||
|
for f in MuxerIter::new() {
|
||||||
|
println!("{}:", f.name());
|
||||||
|
println!("\t{}", f.description());
|
||||||
|
println!("\t{:?}", f.extensions());
|
||||||
|
println!("\t{:?}", f.mime_types());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn demuxer_iter() {
|
||||||
|
for f in DemuxerIter::new() {
|
||||||
|
println!("{}:", f.name());
|
||||||
|
println!("\t{}", f.description());
|
||||||
|
println!("\t{:?}", f.extensions());
|
||||||
|
println!("\t{:?}", f.mime_types());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -32,7 +32,15 @@ impl Output {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn description(&self) -> &str {
|
pub fn description(&self) -> &str {
|
||||||
unsafe { from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).long_name).to_bytes()) }
|
unsafe {
|
||||||
|
let long_name = (*self.as_ptr()).long_name;
|
||||||
|
|
||||||
|
if long_name.is_null() {
|
||||||
|
""
|
||||||
|
} else {
|
||||||
|
from_utf8_unchecked(CStr::from_ptr(long_name).to_bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn extensions(&self) -> Vec<&str> {
|
pub fn extensions(&self) -> Vec<&str> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user