playa_ffmpeg/util/dictionary/
mutable.rs1use std::{ffi::CString, fmt, marker::PhantomData, ops::Deref};
2
3use super::immutable;
4use crate::ffi::*;
5
6pub struct Ref<'a> {
7 ptr: *mut AVDictionary,
8 imm: immutable::Ref<'a>,
9
10 _marker: PhantomData<&'a ()>,
11}
12
13impl<'a> Ref<'a> {
14 pub unsafe fn wrap(ptr: *mut AVDictionary) -> Self {
15 Ref { ptr, imm: unsafe { immutable::Ref::wrap(ptr) }, _marker: PhantomData }
16 }
17
18 pub unsafe fn as_mut_ptr(&self) -> *mut AVDictionary {
19 self.ptr
20 }
21}
22
23impl<'a> Ref<'a> {
24 pub fn set(&mut self, key: &str, value: &str) {
25 unsafe {
26 let key = CString::new(key).unwrap();
27 let value = CString::new(value).unwrap();
28 let mut ptr = self.as_mut_ptr();
29
30 if av_dict_set(&mut ptr, key.as_ptr(), value.as_ptr(), 0) < 0 {
31 panic!("out of memory");
32 }
33
34 self.ptr = ptr;
35 self.imm = immutable::Ref::wrap(ptr);
36 }
37 }
38}
39
40impl<'a> Deref for Ref<'a> {
41 type Target = immutable::Ref<'a>;
42
43 fn deref(&self) -> &Self::Target {
44 &self.imm
45 }
46}
47
48impl<'a> fmt::Debug for Ref<'a> {
49 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
50 self.imm.fmt(fmt)
51 }
52}