// Copyright (C) 2018 Sebastian Dröge // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use ffi; use glib; use glib::translate::*; use gst; use gst::MiniObject; use std::ptr; pub unsafe trait CodecTag<'a>: gst::Tag<'a, TagType = &'a str> {} unsafe impl<'a> CodecTag<'a> for gst::tags::ContainerFormat {} unsafe impl<'a> CodecTag<'a> for gst::tags::AudioCodec {} unsafe impl<'a> CodecTag<'a> for gst::tags::VideoCodec {} unsafe impl<'a> CodecTag<'a> for gst::tags::SubtitleCodec {} unsafe impl<'a> CodecTag<'a> for gst::tags::Codec {} pub fn pb_utils_add_codec_description_to_tag_list_for_tag<'a, T: CodecTag<'a>>( taglist: &mut gst::TagListRef, caps: &gst::CapsRef, ) -> Result<(), glib::BoolError> { assert_initialized_main_thread!(); let codec_tag = T::tag_name(); unsafe { glib::BoolError::from_glib( ffi::gst_pb_utils_add_codec_description_to_tag_list( taglist.as_mut_ptr(), codec_tag.to_glib_none().0, caps.as_ptr(), ), "Failed to find codec description", ) } } pub fn pb_utils_add_codec_description_to_tag_list( taglist: &mut gst::TagListRef, caps: &gst::CapsRef, ) -> Result<(), glib::BoolError> { assert_initialized_main_thread!(); unsafe { glib::BoolError::from_glib( ffi::gst_pb_utils_add_codec_description_to_tag_list( taglist.as_mut_ptr(), ptr::null_mut(), caps.as_ptr(), ), "Failed to find codec description", ) } } pub fn pb_utils_get_encoder_description(caps: &gst::CapsRef) -> Option { assert_initialized_main_thread!(); unsafe { from_glib_full(ffi::gst_pb_utils_get_encoder_description(caps.as_ptr())) } } pub fn pb_utils_get_decoder_description(caps: &gst::CapsRef) -> Option { assert_initialized_main_thread!(); unsafe { from_glib_full(ffi::gst_pb_utils_get_decoder_description(caps.as_ptr())) } } pub fn pb_utils_get_codec_description(caps: &gst::CapsRef) -> Option { assert_initialized_main_thread!(); unsafe { from_glib_full(ffi::gst_pb_utils_get_codec_description(caps.as_ptr())) } }