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 = "VTCompressionSessionRef")]
#[repr(C)]
pub struct VTCompressionSession {
inner: [u8; 0],
_p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
}
cf_type!(
unsafe impl VTCompressionSession {}
);
#[cfg(feature = "objc2")]
cf_objc2_type!(
unsafe impl RefEncode<"OpaqueVTCompressionSession"> for VTCompressionSession {}
);
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
pub type VTCompressionOutputCallback = Option<
unsafe extern "C-unwind" fn(
*mut c_void,
*mut c_void,
OSStatus,
VTEncodeInfoFlags,
*mut CMSampleBuffer,
),
>;
extern "C" {
pub static kVTVideoEncoderSpecification_EncoderID: &'static CFString;
}
impl VTCompressionSession {
#[doc(alias = "VTCompressionSessionCreate")]
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn create(
allocator: Option<&CFAllocator>,
width: i32,
height: i32,
codec_type: CMVideoCodecType,
encoder_specification: Option<&CFDictionary>,
source_image_buffer_attributes: Option<&CFDictionary>,
compressed_data_allocator: Option<&CFAllocator>,
output_callback: VTCompressionOutputCallback,
output_callback_ref_con: *mut c_void,
compression_session_out: NonNull<*mut VTCompressionSession>,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionCreate(
allocator: Option<&CFAllocator>,
width: i32,
height: i32,
codec_type: CMVideoCodecType,
encoder_specification: Option<&CFDictionary>,
source_image_buffer_attributes: Option<&CFDictionary>,
compressed_data_allocator: Option<&CFAllocator>,
output_callback: VTCompressionOutputCallback,
output_callback_ref_con: *mut c_void,
compression_session_out: NonNull<*mut VTCompressionSession>,
) -> OSStatus;
}
unsafe {
VTCompressionSessionCreate(
allocator,
width,
height,
codec_type,
encoder_specification,
source_image_buffer_attributes,
compressed_data_allocator,
output_callback,
output_callback_ref_con,
compression_session_out,
)
}
}
#[doc(alias = "VTCompressionSessionInvalidate")]
#[inline]
pub unsafe fn invalidate(&self) {
extern "C-unwind" {
fn VTCompressionSessionInvalidate(session: &VTCompressionSession);
}
unsafe { VTCompressionSessionInvalidate(self) }
}
}
unsafe impl ConcreteType for VTCompressionSession {
#[doc(alias = "VTCompressionSessionGetTypeID")]
#[inline]
fn type_id() -> CFTypeID {
extern "C-unwind" {
fn VTCompressionSessionGetTypeID() -> CFTypeID;
}
unsafe { VTCompressionSessionGetTypeID() }
}
}
impl VTCompressionSession {
#[doc(alias = "VTCompressionSessionGetPixelBufferPool")]
#[cfg(feature = "objc2-core-video")]
#[inline]
pub unsafe fn pixel_buffer_pool(&self) -> Option<CFRetained<CVPixelBufferPool>> {
extern "C-unwind" {
fn VTCompressionSessionGetPixelBufferPool(
session: &VTCompressionSession,
) -> Option<NonNull<CVPixelBufferPool>>;
}
let ret = unsafe { VTCompressionSessionGetPixelBufferPool(self) };
ret.map(|ret| unsafe { CFRetained::retain(ret) })
}
#[doc(alias = "VTCompressionSessionPrepareToEncodeFrames")]
#[inline]
pub unsafe fn prepare_to_encode_frames(&self) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionPrepareToEncodeFrames(
session: &VTCompressionSession,
) -> OSStatus;
}
unsafe { VTCompressionSessionPrepareToEncodeFrames(self) }
}
#[doc(alias = "VTCompressionSessionEncodeFrame")]
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn encode_frame(
&self,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionEncodeFrame(
session: &VTCompressionSession,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus;
}
unsafe {
VTCompressionSessionEncodeFrame(
self,
image_buffer,
presentation_time_stamp,
duration,
frame_properties,
source_frame_refcon,
info_flags_out,
)
}
}
}
#[cfg(all(feature = "VTErrors", feature = "block2", feature = "objc2-core-media"))]
pub type VTCompressionOutputHandler =
*mut block2::DynBlock<dyn Fn(OSStatus, VTEncodeInfoFlags, *mut CMSampleBuffer)>;
impl VTCompressionSession {
#[doc(alias = "VTCompressionSessionEncodeFrameWithOutputHandler")]
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[inline]
pub unsafe fn encode_frame_with_output_handler(
&self,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionEncodeFrameWithOutputHandler(
session: &VTCompressionSession,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus;
}
unsafe {
VTCompressionSessionEncodeFrameWithOutputHandler(
self,
image_buffer,
presentation_time_stamp,
duration,
frame_properties,
info_flags_out,
output_handler,
)
}
}
#[doc(alias = "VTCompressionSessionCompleteFrames")]
#[cfg(feature = "objc2-core-media")]
#[inline]
pub unsafe fn complete_frames(
&self,
complete_until_presentation_time_stamp: CMTime,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionCompleteFrames(
session: &VTCompressionSession,
complete_until_presentation_time_stamp: CMTime,
) -> OSStatus;
}
unsafe { VTCompressionSessionCompleteFrames(self, complete_until_presentation_time_stamp) }
}
}
#[inline]
pub unsafe extern "C-unwind" fn VTIsStereoMVHEVCEncodeSupported() -> bool {
extern "C-unwind" {
fn VTIsStereoMVHEVCEncodeSupported() -> Boolean;
}
let ret = unsafe { VTIsStereoMVHEVCEncodeSupported() };
ret != 0
}
impl VTCompressionSession {
#[doc(alias = "VTCompressionSessionEncodeMultiImageFrame")]
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn encode_multi_image_frame(
&self,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionEncodeMultiImageFrame(
session: &VTCompressionSession,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus;
}
unsafe {
VTCompressionSessionEncodeMultiImageFrame(
self,
tagged_buffer_group,
presentation_time_stamp,
duration,
frame_properties,
source_frame_refcon,
info_flags_out,
)
}
}
#[doc(alias = "VTCompressionSessionEncodeMultiImageFrameWithOutputHandler")]
#[cfg(all(feature = "VTErrors", feature = "block2", feature = "objc2-core-media"))]
#[inline]
pub unsafe fn encode_multi_image_frame_with_output_handler(
&self,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionEncodeMultiImageFrameWithOutputHandler(
session: &VTCompressionSession,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus;
}
unsafe {
VTCompressionSessionEncodeMultiImageFrameWithOutputHandler(
self,
tagged_buffer_group,
presentation_time_stamp,
duration,
frame_properties,
info_flags_out,
output_handler,
)
}
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct VTCompressionSessionOptionFlags(pub u32);
bitflags::bitflags! {
impl VTCompressionSessionOptionFlags: u32 {
#[doc(alias = "kVTCompressionSessionBeginFinalPass")]
const BeginFinalPass = 1<<0;
}
}
#[cfg(feature = "objc2")]
unsafe impl Encode for VTCompressionSessionOptionFlags {
const ENCODING: Encoding = u32::ENCODING;
}
#[cfg(feature = "objc2")]
unsafe impl RefEncode for VTCompressionSessionOptionFlags {
const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
impl VTCompressionSession {
#[doc(alias = "VTCompressionSessionBeginPass")]
#[inline]
pub unsafe fn begin_pass(
&self,
begin_pass_flags: VTCompressionSessionOptionFlags,
reserved: *mut u32,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionBeginPass(
session: &VTCompressionSession,
begin_pass_flags: VTCompressionSessionOptionFlags,
reserved: *mut u32,
) -> OSStatus;
}
unsafe { VTCompressionSessionBeginPass(self, begin_pass_flags, reserved) }
}
#[doc(alias = "VTCompressionSessionEndPass")]
#[inline]
pub unsafe fn end_pass(
&self,
further_passes_requested_out: *mut Boolean,
reserved: *mut u32,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionEndPass(
session: &VTCompressionSession,
further_passes_requested_out: *mut Boolean,
reserved: *mut u32,
) -> OSStatus;
}
unsafe { VTCompressionSessionEndPass(self, further_passes_requested_out, reserved) }
}
#[doc(alias = "VTCompressionSessionGetTimeRangesForNextPass")]
#[cfg(feature = "objc2-core-media")]
#[inline]
pub unsafe fn time_ranges_for_next_pass(
&self,
time_range_count_out: NonNull<CMItemCount>,
time_range_array_out: NonNull<*const CMTimeRange>,
) -> OSStatus {
extern "C-unwind" {
fn VTCompressionSessionGetTimeRangesForNextPass(
session: &VTCompressionSession,
time_range_count_out: NonNull<CMItemCount>,
time_range_array_out: NonNull<*const CMTimeRange>,
) -> OSStatus;
}
unsafe {
VTCompressionSessionGetTimeRangesForNextPass(
self,
time_range_count_out,
time_range_array_out,
)
}
}
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTCompressionSession::create`"]
pub fn VTCompressionSessionCreate(
allocator: Option<&CFAllocator>,
width: i32,
height: i32,
codec_type: CMVideoCodecType,
encoder_specification: Option<&CFDictionary>,
source_image_buffer_attributes: Option<&CFDictionary>,
compressed_data_allocator: Option<&CFAllocator>,
output_callback: VTCompressionOutputCallback,
output_callback_ref_con: *mut c_void,
compression_session_out: NonNull<*mut VTCompressionSession>,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTCompressionSession::invalidate`"]
pub fn VTCompressionSessionInvalidate(session: &VTCompressionSession);
}
#[cfg(feature = "objc2-core-video")]
#[deprecated = "renamed to `VTCompressionSession::pixel_buffer_pool`"]
#[inline]
pub unsafe extern "C-unwind" fn VTCompressionSessionGetPixelBufferPool(
session: &VTCompressionSession,
) -> Option<CFRetained<CVPixelBufferPool>> {
extern "C-unwind" {
fn VTCompressionSessionGetPixelBufferPool(
session: &VTCompressionSession,
) -> Option<NonNull<CVPixelBufferPool>>;
}
let ret = unsafe { VTCompressionSessionGetPixelBufferPool(session) };
ret.map(|ret| unsafe { CFRetained::retain(ret) })
}
extern "C-unwind" {
#[deprecated = "renamed to `VTCompressionSession::prepare_to_encode_frames`"]
pub fn VTCompressionSessionPrepareToEncodeFrames(session: &VTCompressionSession) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTCompressionSession::encode_frame`"]
pub fn VTCompressionSessionEncodeFrame(
session: &VTCompressionSession,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(
feature = "VTErrors",
feature = "block2",
feature = "objc2-core-media",
feature = "objc2-core-video"
))]
#[deprecated = "renamed to `VTCompressionSession::encode_frame_with_output_handler`"]
pub fn VTCompressionSessionEncodeFrameWithOutputHandler(
session: &VTCompressionSession,
image_buffer: &CVImageBuffer,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(feature = "objc2-core-media")]
#[deprecated = "renamed to `VTCompressionSession::complete_frames`"]
pub fn VTCompressionSessionCompleteFrames(
session: &VTCompressionSession,
complete_until_presentation_time_stamp: CMTime,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTCompressionSession::encode_multi_image_frame`"]
pub fn VTCompressionSessionEncodeMultiImageFrame(
session: &VTCompressionSession,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
source_frame_refcon: *mut c_void,
info_flags_out: *mut VTEncodeInfoFlags,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(all(feature = "VTErrors", feature = "block2", feature = "objc2-core-media"))]
#[deprecated = "renamed to `VTCompressionSession::encode_multi_image_frame_with_output_handler`"]
pub fn VTCompressionSessionEncodeMultiImageFrameWithOutputHandler(
session: &VTCompressionSession,
tagged_buffer_group: &CMTaggedBufferGroup,
presentation_time_stamp: CMTime,
duration: CMTime,
frame_properties: Option<&CFDictionary>,
info_flags_out: *mut VTEncodeInfoFlags,
output_handler: VTCompressionOutputHandler,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTCompressionSession::begin_pass`"]
pub fn VTCompressionSessionBeginPass(
session: &VTCompressionSession,
begin_pass_flags: VTCompressionSessionOptionFlags,
reserved: *mut u32,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTCompressionSession::end_pass`"]
pub fn VTCompressionSessionEndPass(
session: &VTCompressionSession,
further_passes_requested_out: *mut Boolean,
reserved: *mut u32,
) -> OSStatus;
}
extern "C-unwind" {
#[cfg(feature = "objc2-core-media")]
#[deprecated = "renamed to `VTCompressionSession::time_ranges_for_next_pass`"]
pub fn VTCompressionSessionGetTimeRangesForNextPass(
session: &VTCompressionSession,
time_range_count_out: NonNull<CMItemCount>,
time_range_array_out: NonNull<*const CMTimeRange>,
) -> OSStatus;
}