use std::ffi::CStr;
use rsmpeg::avformat::{AVFormatContextInput, AVStreamRef};
use rsmpeg::ffi;
use crate::transcoder::ffmpeg_diagnostics::av_error_to_string;
pub(crate) fn codec_name(codec_id: ffi::AVCodecID) -> String {
unsafe {
CStr::from_ptr(ffi::avcodec_get_name(codec_id))
.to_string_lossy()
.into_owned()
}
}
pub(crate) fn stream_disposition(stream: &AVStreamRef<'_>) -> i32 {
unsafe { (*stream.as_ptr()).disposition }
}
pub(crate) fn stream_raw_bit_rate(stream: &AVStreamRef<'_>) -> i64 {
unsafe { (*(*stream.as_ptr()).codecpar).bit_rate }
}
pub(crate) fn input_duration_us(input: &mut AVFormatContextInput) -> i64 {
unsafe { (*input.as_mut_ptr()).duration }
}
pub(crate) fn input_format_name(input: &AVFormatContextInput) -> String {
input.iformat().name().to_string_lossy().into_owned()
}
pub(crate) fn clear_decoder_hardware_state(ctx: &mut rsmpeg::avcodec::AVCodecContext) {
unsafe {
let ctx_ptr = ctx.as_mut_ptr();
(*ctx_ptr).hw_device_ctx = std::ptr::null_mut();
(*ctx_ptr).hw_frames_ctx = std::ptr::null_mut();
(*ctx_ptr).get_format = None;
}
}
pub(crate) fn unref_buffer_ref(mut buffer: *mut ffi::AVBufferRef) {
unsafe {
ffi::av_buffer_unref(&mut buffer);
}
}
pub(crate) fn copy_payload_into_packet(
packet: &mut rsmpeg::avcodec::AVPacket,
payload: &[u8],
) -> anyhow::Result<()> {
unsafe {
let ret = ffi::av_new_packet(packet.as_mut_ptr(), payload.len() as i32);
if ret < 0 {
anyhow::bail!("Could not allocate packet: {}", av_error_to_string(ret));
}
std::ptr::copy_nonoverlapping(payload.as_ptr(), (*packet.as_mut_ptr()).data, payload.len());
}
Ok(())
}