use crate::{
avcodec::AVCodecContext,
avutil::{AVChannelLayoutRef, AVMediaType},
ffi,
shared::*,
};
use std::{fmt, ops::Deref, ptr::NonNull};
wrap_ref_mut!(AVCodecParameters: ffi::AVCodecParameters);
impl AVCodecParameters {
pub fn new() -> Self {
let ptr = unsafe { ffi::avcodec_parameters_alloc() }
.upgrade()
.unwrap();
unsafe { Self::from_raw(ptr) }
}
pub fn from_context(&mut self, context: &AVCodecContext) {
unsafe { ffi::avcodec_parameters_from_context(self.as_mut_ptr(), context.as_ptr()) }
.upgrade()
.unwrap();
}
pub fn copy(&mut self, from: &Self) {
unsafe { ffi::avcodec_parameters_copy(self.as_mut_ptr(), from.as_ptr()) }
.upgrade()
.unwrap();
}
pub fn codec_type(&self) -> AVMediaType {
AVMediaType(self.codec_type)
}
pub fn ch_layout(&self) -> AVChannelLayoutRef<'_> {
let inner = NonNull::new(&self.ch_layout as *const _ as *mut _).unwrap();
unsafe { AVChannelLayoutRef::from_raw(inner) }
}
}
impl fmt::Debug for AVCodecParameters {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.deref().fmt(f)
}
}
impl Default for AVCodecParameters {
fn default() -> Self {
Self::new()
}
}
impl Clone for AVCodecParameters {
fn clone(&self) -> Self {
let mut parameters = AVCodecParameters::new();
parameters.copy(self);
parameters
}
}
impl Drop for AVCodecParameters {
fn drop(&mut self) {
let mut ptr = self.as_mut_ptr();
unsafe { ffi::avcodec_parameters_free(&mut ptr) }
}
}