use core::cell::UnsafeCell;
use core::ffi::*;
use core::marker::{PhantomData, PhantomPinned};
use core::ptr::NonNull;
#[cfg(feature = "objc2")]
use objc2::__framework_prelude::*;
use objc2_core_foundation::*;
#[cfg(feature = "objc2-core-media")]
use objc2_core_media::*;
#[cfg(feature = "objc2-core-video")]
use objc2_core_video::*;
use crate::*;
#[doc(alias = "VTDecompressionSessionRef")]
#[repr(C)]
pub struct VTDecompressionSession {
inner: [u8; 0],
_p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
}
cf_type!(
unsafe impl VTDecompressionSession {}
);
#[cfg(feature = "objc2")]
cf_objc2_type!(
unsafe impl RefEncode<"OpaqueVTDecompressionSession"> for VTDecompressionSession {}
);
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
pub type VTDecompressionOutputCallback = Option<
unsafe extern "C-unwind" fn(
*mut c_void,
*mut c_void,
OSStatus,
VTDecodeInfoFlags,
*mut CVImageBuffer,
CMTime,
CMTime,
),
>;
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[repr(C, packed(4))]
#[allow(unpredictable_function_pointer_comparisons)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct VTDecompressionOutputCallbackRecord {
pub decompressionOutputCallback: VTDecompressionOutputCallback,
pub decompressionOutputRefCon: *mut c_void,
}
#[cfg(all(
feature = "VTErrors",
feature = "objc2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
unsafe impl Encode for VTDecompressionOutputCallbackRecord {
const ENCODING: Encoding = Encoding::Struct(
"VTDecompressionOutputCallbackRecord",
&[
<VTDecompressionOutputCallback>::ENCODING,
<*mut c_void>::ENCODING,
],
);
}
#[cfg(all(
feature = "VTErrors",
feature = "objc2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
unsafe impl RefEncode for VTDecompressionOutputCallbackRecord {
const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
impl VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionCreate")]
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn create(
allocator: Option<&CFAllocator>,
video_format_description: &CMVideoFormatDescription,
video_decoder_specification: Option<&CFDictionary>,
destination_image_buffer_attributes: Option<&CFDictionary>,
output_callback: *const VTDecompressionOutputCallbackRecord,
decompression_session_out: NonNull<*mut VTDecompressionSession>,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionCreate(
allocator: Option<&CFAllocator>,
video_format_description: &CMVideoFormatDescription,
video_decoder_specification: Option<&CFDictionary>,
destination_image_buffer_attributes: Option<&CFDictionary>,
output_callback: *const VTDecompressionOutputCallbackRecord,
decompression_session_out: NonNull<*mut VTDecompressionSession>,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionCreate(
allocator,
video_format_description,
video_decoder_specification,
destination_image_buffer_attributes,
output_callback,
decompression_session_out,
)
}
}
#[doc(alias = "VTDecompressionSessionInvalidate")]
#[inline]
pub unsafe fn invalidate(&self) {
extern "C-unwind" {
fn VTDecompressionSessionInvalidate(session: &VTDecompressionSession);
}
unsafe { VTDecompressionSessionInvalidate(self) }
}
}
unsafe impl ConcreteType for VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionGetTypeID")]
#[inline]
fn type_id() -> CFTypeID {
extern "C-unwind" {
fn VTDecompressionSessionGetTypeID() -> CFTypeID;
}
unsafe { VTDecompressionSessionGetTypeID() }
}
}
impl VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionDecodeFrame")]
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn decode_frame(
&self,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionDecodeFrame(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionDecodeFrame(
self,
sample_buffer,
decode_flags,
source_frame_ref_con,
info_flags_out,
)
}
}
}
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
pub type VTDecompressionOutputHandler =
*mut block2::DynBlock<dyn Fn(OSStatus, VTDecodeInfoFlags, *mut CVImageBuffer, CMTime, CMTime)>;
impl VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionDecodeFrameWithOutputHandler")]
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn decode_frame_with_output_handler(
&self,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionDecodeFrameWithOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionDecodeFrameWithOutputHandler(
self,
sample_buffer,
decode_flags,
info_flags_out,
output_handler,
)
}
}
#[doc(alias = "VTDecompressionSessionFinishDelayedFrames")]
#[inline]
pub unsafe fn finish_delayed_frames(&self) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionFinishDelayedFrames(
session: &VTDecompressionSession,
) -> OSStatus;
}
unsafe { VTDecompressionSessionFinishDelayedFrames(self) }
}
#[doc(alias = "VTDecompressionSessionCanAcceptFormatDescription")]
#[cfg(feature = "objc2-core-media")]
#[inline]
pub unsafe fn can_accept_format_description(
&self,
new_format_desc: &CMFormatDescription,
) -> bool {
extern "C-unwind" {
fn VTDecompressionSessionCanAcceptFormatDescription(
session: &VTDecompressionSession,
new_format_desc: &CMFormatDescription,
) -> Boolean;
}
let ret =
unsafe { VTDecompressionSessionCanAcceptFormatDescription(self, new_format_desc) };
ret != 0
}
#[doc(alias = "VTDecompressionSessionWaitForAsynchronousFrames")]
#[inline]
pub unsafe fn wait_for_asynchronous_frames(&self) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionWaitForAsynchronousFrames(
session: &VTDecompressionSession,
) -> OSStatus;
}
unsafe { VTDecompressionSessionWaitForAsynchronousFrames(self) }
}
#[doc(alias = "VTDecompressionSessionCopyBlackPixelBuffer")]
#[cfg(feature = "objc2-core-video")]
#[inline]
pub unsafe fn copy_black_pixel_buffer(
&self,
pixel_buffer_out: NonNull<*mut CVPixelBuffer>,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionCopyBlackPixelBuffer(
session: &VTDecompressionSession,
pixel_buffer_out: NonNull<*mut CVPixelBuffer>,
) -> OSStatus;
}
unsafe { VTDecompressionSessionCopyBlackPixelBuffer(self, pixel_buffer_out) }
}
}
#[cfg(feature = "objc2-core-media")]
#[inline]
pub unsafe extern "C-unwind" fn VTIsHardwareDecodeSupported(codec_type: CMVideoCodecType) -> bool {
extern "C-unwind" {
fn VTIsHardwareDecodeSupported(codec_type: CMVideoCodecType) -> Boolean;
}
let ret = unsafe { VTIsHardwareDecodeSupported(codec_type) };
ret != 0
}
#[inline]
pub unsafe extern "C-unwind" fn VTIsStereoMVHEVCDecodeSupported() -> bool {
extern "C-unwind" {
fn VTIsStereoMVHEVCDecodeSupported() -> Boolean;
}
let ret = unsafe { VTIsStereoMVHEVCDecodeSupported() };
ret != 0
}
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
pub type VTDecompressionOutputMultiImageCallback = Option<
unsafe extern "C-unwind" fn(
*mut c_void,
*mut c_void,
OSStatus,
VTDecodeInfoFlags,
*mut CMTaggedBufferGroup,
CMTime,
CMTime,
),
>;
impl VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionSetMultiImageCallback")]
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn set_multi_image_callback(
&self,
output_multi_image_callback: VTDecompressionOutputMultiImageCallback,
output_multi_image_refcon: *mut c_void,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionSetMultiImageCallback(
decompression_session: &VTDecompressionSession,
output_multi_image_callback: VTDecompressionOutputMultiImageCallback,
output_multi_image_refcon: *mut c_void,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionSetMultiImageCallback(
self,
output_multi_image_callback,
output_multi_image_refcon,
)
}
}
}
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
pub type VTDecompressionMultiImageCapableOutputHandler = *mut block2::DynBlock<
dyn Fn(
OSStatus,
VTDecodeInfoFlags,
*mut CVImageBuffer,
*mut CMTaggedBufferGroup,
CMTime,
CMTime,
),
>;
impl VTDecompressionSession {
#[doc(alias = "VTDecompressionSessionDecodeFrameWithMultiImageCapableOutputHandler")]
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn decode_frame_with_multi_image_capable_output_handler(
&self,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
multi_image_capable_output_handler: VTDecompressionMultiImageCapableOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionDecodeFrameWithMultiImageCapableOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
multi_image_capable_output_handler: VTDecompressionMultiImageCapableOutputHandler,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionDecodeFrameWithMultiImageCapableOutputHandler(
self,
sample_buffer,
decode_flags,
info_flags_out,
multi_image_capable_output_handler,
)
}
}
#[doc(alias = "VTDecompressionSessionDecodeFrameWithOptions")]
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn decode_frame_with_options(
&self,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionDecodeFrameWithOptions(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionDecodeFrameWithOptions(
self,
sample_buffer,
decode_flags,
frame_options,
source_frame_ref_con,
info_flags_out,
)
}
}
#[doc(alias = "VTDecompressionSessionDecodeFrameWithOptionsAndOutputHandler")]
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn decode_frame_with_options_and_output_handler(
&self,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTDecompressionSessionDecodeFrameWithOptionsAndOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus;
}
unsafe {
VTDecompressionSessionDecodeFrameWithOptionsAndOutputHandler(
self,
sample_buffer,
decode_flags,
frame_options,
info_flags_out,
output_handler,
)
}
}
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTDecompressionSession::create`"]
pub fn VTDecompressionSessionCreate(
allocator: Option<&CFAllocator>,
video_format_description: &CMVideoFormatDescription,
video_decoder_specification: Option<&CFDictionary>,
destination_image_buffer_attributes: Option<&CFDictionary>,
output_callback: *const VTDecompressionOutputCallbackRecord,
decompression_session_out: NonNull<*mut VTDecompressionSession>,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTDecompressionSession::invalidate`"]
pub fn VTDecompressionSessionInvalidate(session: &VTDecompressionSession);
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTDecompressionSession::decode_frame`"]
pub fn VTDecompressionSessionDecodeFrame(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTDecompressionSession::decode_frame_with_output_handler`"]
pub fn VTDecompressionSessionDecodeFrameWithOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTDecompressionSession::finish_delayed_frames`"]
pub fn VTDecompressionSessionFinishDelayedFrames(session: &VTDecompressionSession) -> OSStatus;
}
#[cfg(feature = "objc2-core-media")]
#[deprecated = "renamed to `VTDecompressionSession::can_accept_format_description`"]
#[inline]
pub unsafe extern "C-unwind" fn VTDecompressionSessionCanAcceptFormatDescription(
session: &VTDecompressionSession,
new_format_desc: &CMFormatDescription,
) -> bool {
extern "C-unwind" {
fn VTDecompressionSessionCanAcceptFormatDescription(
session: &VTDecompressionSession,
new_format_desc: &CMFormatDescription,
) -> Boolean;
}
let ret = unsafe { VTDecompressionSessionCanAcceptFormatDescription(session, new_format_desc) };
ret != 0
}
extern "C-unwind" {
#[deprecated = "renamed to `VTDecompressionSession::wait_for_asynchronous_frames`"]
pub fn VTDecompressionSessionWaitForAsynchronousFrames(
session: &VTDecompressionSession,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(feature = "objc2-core-video")]
#[deprecated = "renamed to `VTDecompressionSession::copy_black_pixel_buffer`"]
pub fn VTDecompressionSessionCopyBlackPixelBuffer(
session: &VTDecompressionSession,
pixel_buffer_out: NonNull<*mut CVPixelBuffer>,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTDecompressionSession::set_multi_image_callback`"]
pub fn VTDecompressionSessionSetMultiImageCallback(
decompression_session: &VTDecompressionSession,
output_multi_image_callback: VTDecompressionOutputMultiImageCallback,
output_multi_image_refcon: *mut c_void,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTDecompressionSession::decode_frame_with_multi_image_capable_output_handler`"]
pub fn VTDecompressionSessionDecodeFrameWithMultiImageCapableOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
info_flags_out: *mut VTDecodeInfoFlags,
multi_image_capable_output_handler: VTDecompressionMultiImageCapableOutputHandler,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTDecompressionSession::decode_frame_with_options`"]
pub fn VTDecompressionSessionDecodeFrameWithOptions(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
source_frame_ref_con: *mut c_void,
info_flags_out: *mut VTDecodeInfoFlags,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTDecompressionSession::decode_frame_with_options_and_output_handler`"]
pub fn VTDecompressionSessionDecodeFrameWithOptionsAndOutputHandler(
session: &VTDecompressionSession,
sample_buffer: &CMSampleBuffer,
decode_flags: VTDecodeFrameFlags,
frame_options: Option<&CFDictionary>,
info_flags_out: *mut VTDecodeInfoFlags,
output_handler: VTDecompressionOutputHandler,
) -> OSStatus;
}