You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.8 KiB
Rust
103 lines
2.8 KiB
Rust
use crate::av::{verify_response, Rational};
|
|
use ffmpeg_sys_next::{
|
|
av_malloc, avcodec_parameters_copy, AVCodecID, AVCodecParameters, AVPixelFormat, AVRational,
|
|
};
|
|
use std::mem;
|
|
|
|
pub struct CodecParameters(pub *mut AVCodecParameters);
|
|
|
|
impl CodecParameters {
|
|
#[inline]
|
|
pub fn as_ptr(&self) -> *const AVCodecParameters {
|
|
self.0
|
|
}
|
|
|
|
#[inline]
|
|
pub fn as_mut_ptr(&self) -> *mut AVCodecParameters {
|
|
self.0
|
|
}
|
|
|
|
pub fn codec(&self) -> AVCodecID {
|
|
unsafe { (*self.as_ptr()).codec_id }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn width(&self) -> i32 {
|
|
unsafe { (*self.as_ptr()).width }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_width(&self, width: i32) {
|
|
unsafe { (*self.as_mut_ptr()).width = width }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn height(&self) -> i32 {
|
|
unsafe { (*self.as_ptr()).height }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_height(&self, height: i32) {
|
|
unsafe { (*self.as_mut_ptr()).height = height }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn pixel_format(&self) -> AVPixelFormat {
|
|
unsafe { mem::transmute((*self.as_ptr()).format) }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_pixel_format(&self, pixel_format: AVPixelFormat) {
|
|
unsafe { (*self.as_mut_ptr()).format = mem::transmute(pixel_format) }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn extra_data(&self) -> Vec<u8> {
|
|
unsafe {
|
|
let extra_data_size = (*self.as_ptr()).extradata_size as usize;
|
|
let mut extra_data = vec![0u8; extra_data_size];
|
|
(*self.as_ptr())
|
|
.extradata
|
|
.copy_to(extra_data.as_mut_ptr(), extra_data_size);
|
|
|
|
extra_data
|
|
}
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_extra_data(&self, extra_data: &Vec<u8>) {
|
|
unsafe {
|
|
(*self.as_mut_ptr()).extradata_size = 0;
|
|
let new_extra_data: *mut u8 = av_malloc(extra_data.len() + 64).cast();
|
|
new_extra_data.copy_from(extra_data.as_ptr(), extra_data.len());
|
|
(*self.as_mut_ptr()).extradata = new_extra_data;
|
|
(*self.as_mut_ptr()).extradata_size = extra_data.len() as i32;
|
|
}
|
|
}
|
|
|
|
#[inline]
|
|
pub fn sample_aspect_ratio(&self) -> AVRational {
|
|
unsafe { (*self.as_ptr()).sample_aspect_ratio }
|
|
}
|
|
|
|
#[inline]
|
|
pub fn set_sample_aspect_ratio(&self, sample_aspect_ratio: impl Rational) {
|
|
unsafe { (*self.as_mut_ptr()).sample_aspect_ratio = sample_aspect_ratio.to_av() }
|
|
}
|
|
|
|
pub fn copy_to(&self, to: &CodecParameters) -> Result<(), String> {
|
|
Self::copy(&self, to)
|
|
}
|
|
|
|
pub fn copy_from(&self, from: &CodecParameters) -> Result<(), String> {
|
|
Self::copy(from, &self)
|
|
}
|
|
|
|
pub fn copy(from: &CodecParameters, to: &CodecParameters) -> Result<(), String> {
|
|
verify_response("Failed to copy codec parameters", unsafe {
|
|
avcodec_parameters_copy(to.as_mut_ptr(), from.as_ptr())
|
|
})?;
|
|
Ok(())
|
|
}
|
|
}
|