use std::mem;
use std::ops::Deref;
use super::Stream;
use crate::ffi::*;
use crate::format::context::common::Context;
use crate::AsPtr;
use crate::{codec, DictionaryMut, Rational};
pub struct StreamMut<'a> {
context: &'a mut Context,
index: usize,
immutable: Stream<'a>,
}
impl<'a> StreamMut<'a> {
pub unsafe fn wrap(context: &mut Context, index: usize) -> StreamMut<'_> {
StreamMut {
context: mem::transmute_copy(&context),
index,
immutable: Stream::wrap(mem::transmute_copy(&context), index),
}
}
pub unsafe fn as_mut_ptr(&mut self) -> *mut AVStream {
*(*self.context.as_mut_ptr()).streams.add(self.index)
}
}
impl<'a> StreamMut<'a> {
pub fn set_time_base<R: Into<Rational>>(&mut self, value: R) {
unsafe {
(*self.as_mut_ptr()).time_base = value.into().into();
}
}
pub fn set_rate<R: Into<Rational>>(&mut self, value: R) {
unsafe {
(*self.as_mut_ptr()).r_frame_rate = value.into().into();
}
}
pub fn set_avg_frame_rate<R: Into<Rational>>(&mut self, value: R) {
unsafe {
(*self.as_mut_ptr()).avg_frame_rate = value.into().into();
}
}
pub fn parameters_mut(&mut self) -> codec::ParametersMut<'_> {
unsafe {
codec::ParametersMut::from_raw((*self.as_mut_ptr()).codecpar)
.expect("codecpar is non-null")
}
}
pub fn set_parameters<P: AsPtr<AVCodecParameters>>(&mut self, parameters: P) {
unsafe {
avcodec_parameters_copy((*self.as_mut_ptr()).codecpar, parameters.as_ptr());
}
}
pub fn copy_parameters_from_context(&mut self, ctx: &codec::Context) {
unsafe {
avcodec_parameters_from_context((*self.as_mut_ptr()).codecpar, ctx.as_ptr());
}
}
pub fn metadata_mut(&mut self) -> DictionaryMut<'_> {
unsafe { DictionaryMut::from_raw(&mut (*self.as_mut_ptr()).metadata) }
}
pub fn set_sample_aspect_ratio(&mut self, sar: Rational) {
unsafe {
(*self.as_mut_ptr()).sample_aspect_ratio = sar.into();
}
}
}
impl<'a> Deref for StreamMut<'a> {
type Target = Stream<'a>;
fn deref(&self) -> &Self::Target {
&self.immutable
}
}