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-video")]
use objc2_core_video::*;
use crate::*;
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct VTMotionEstimationFrameFlags(pub u32);
bitflags::bitflags! {
impl VTMotionEstimationFrameFlags: u32 {
#[doc(alias = "kVTMotionEstimationFrameFlags_CurrentBufferWillBeNextReferenceBuffer")]
const CurrentBufferWillBeNextReferenceBuffer = 1<<0;
}
}
#[cfg(feature = "objc2")]
unsafe impl Encode for VTMotionEstimationFrameFlags {
const ENCODING: Encoding = u32::ENCODING;
}
#[cfg(feature = "objc2")]
unsafe impl RefEncode for VTMotionEstimationFrameFlags {
const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct VTMotionEstimationInfoFlags(pub u32);
bitflags::bitflags! {
impl VTMotionEstimationInfoFlags: u32 {
#[doc(alias = "kVTMotionEstimationInfoFlags_Reserved0")]
const Reserved0 = 1<<0;
}
}
#[cfg(feature = "objc2")]
unsafe impl Encode for VTMotionEstimationInfoFlags {
const ENCODING: Encoding = u32::ENCODING;
}
#[cfg(feature = "objc2")]
unsafe impl RefEncode for VTMotionEstimationInfoFlags {
const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
#[doc(alias = "VTMotionEstimationSessionRef")]
#[repr(C)]
pub struct VTMotionEstimationSession {
inner: [u8; 0],
_p: UnsafeCell<PhantomData<(*const UnsafeCell<()>, PhantomPinned)>>,
}
cf_type!(
unsafe impl VTMotionEstimationSession {}
);
#[cfg(feature = "objc2")]
cf_objc2_type!(
unsafe impl RefEncode<"OpaqueVTMotionEstimationSession"> for VTMotionEstimationSession {}
);
unsafe impl ConcreteType for VTMotionEstimationSession {
#[doc(alias = "VTMotionEstimationSessionGetTypeID")]
#[inline]
fn type_id() -> CFTypeID {
extern "C-unwind" {
fn VTMotionEstimationSessionGetTypeID() -> CFTypeID;
}
unsafe { VTMotionEstimationSessionGetTypeID() }
}
}
impl VTMotionEstimationSession {
#[doc(alias = "VTMotionEstimationSessionCreate")]
#[inline]
pub unsafe fn create(
allocator: Option<&CFAllocator>,
motion_vector_processor_selection_options: Option<&CFDictionary>,
width: u32,
height: u32,
motion_estimation_session_out: NonNull<*mut VTMotionEstimationSession>,
) -> OSStatus {
extern "C-unwind" {
fn VTMotionEstimationSessionCreate(
allocator: Option<&CFAllocator>,
motion_vector_processor_selection_options: Option<&CFDictionary>,
width: u32,
height: u32,
motion_estimation_session_out: NonNull<*mut VTMotionEstimationSession>,
) -> OSStatus;
}
unsafe {
VTMotionEstimationSessionCreate(
allocator,
motion_vector_processor_selection_options,
width,
height,
motion_estimation_session_out,
)
}
}
#[doc(alias = "VTMotionEstimationSessionCopySourcePixelBufferAttributes")]
#[inline]
pub unsafe fn copy_source_pixel_buffer_attributes(
&self,
attributes_out: NonNull<*const CFDictionary>,
) -> OSStatus {
extern "C-unwind" {
fn VTMotionEstimationSessionCopySourcePixelBufferAttributes(
motion_estimation_session: &VTMotionEstimationSession,
attributes_out: NonNull<*const CFDictionary>,
) -> OSStatus;
}
unsafe { VTMotionEstimationSessionCopySourcePixelBufferAttributes(self, attributes_out) }
}
#[doc(alias = "VTMotionEstimationSessionInvalidate")]
#[inline]
pub unsafe fn invalidate(&self) {
extern "C-unwind" {
fn VTMotionEstimationSessionInvalidate(session: &VTMotionEstimationSession);
}
unsafe { VTMotionEstimationSessionInvalidate(self) }
}
}
#[cfg(all(feature = "block2", feature = "objc2-core-video"))]
pub type VTMotionEstimationOutputHandler = *mut block2::DynBlock<
dyn Fn(OSStatus, VTMotionEstimationInfoFlags, *const CFDictionary, *mut CVPixelBuffer),
>;
impl VTMotionEstimationSession {
#[doc(alias = "VTMotionEstimationSessionEstimateMotionVectors")]
#[cfg(all(feature = "block2", feature = "objc2-core-video"))]
#[inline]
pub unsafe fn estimate_motion_vectors(
&self,
reference_image: &CVPixelBuffer,
current_image: &CVPixelBuffer,
motion_estimation_frame_flags: VTMotionEstimationFrameFlags,
additional_frame_options: Option<&CFDictionary>,
output_handler: VTMotionEstimationOutputHandler,
) -> OSStatus {
extern "C-unwind" {
fn VTMotionEstimationSessionEstimateMotionVectors(
session: &VTMotionEstimationSession,
reference_image: &CVPixelBuffer,
current_image: &CVPixelBuffer,
motion_estimation_frame_flags: VTMotionEstimationFrameFlags,
additional_frame_options: Option<&CFDictionary>,
output_handler: VTMotionEstimationOutputHandler,
) -> OSStatus;
}
unsafe {
VTMotionEstimationSessionEstimateMotionVectors(
self,
reference_image,
current_image,
motion_estimation_frame_flags,
additional_frame_options,
output_handler,
)
}
}
#[doc(alias = "VTMotionEstimationSessionCompleteFrames")]
#[inline]
pub unsafe fn complete_frames(&self) -> OSStatus {
extern "C-unwind" {
fn VTMotionEstimationSessionCompleteFrames(
session: &VTMotionEstimationSession,
) -> OSStatus;
}
unsafe { VTMotionEstimationSessionCompleteFrames(self) }
}
}
extern "C-unwind" {
#[deprecated = "renamed to `VTMotionEstimationSession::create`"]
pub fn VTMotionEstimationSessionCreate(
allocator: Option<&CFAllocator>,
motion_vector_processor_selection_options: Option<&CFDictionary>,
width: u32,
height: u32,
motion_estimation_session_out: NonNull<*mut VTMotionEstimationSession>,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTMotionEstimationSession::copy_source_pixel_buffer_attributes`"]
pub fn VTMotionEstimationSessionCopySourcePixelBufferAttributes(
motion_estimation_session: &VTMotionEstimationSession,
attributes_out: NonNull<*const CFDictionary>,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTMotionEstimationSession::invalidate`"]
pub fn VTMotionEstimationSessionInvalidate(session: &VTMotionEstimationSession);
}
extern "C-unwind" {
#[cfg(all(feature = "block2", feature = "objc2-core-video"))]
#[deprecated = "renamed to `VTMotionEstimationSession::estimate_motion_vectors`"]
pub fn VTMotionEstimationSessionEstimateMotionVectors(
session: &VTMotionEstimationSession,
reference_image: &CVPixelBuffer,
current_image: &CVPixelBuffer,
motion_estimation_frame_flags: VTMotionEstimationFrameFlags,
additional_frame_options: Option<&CFDictionary>,
output_handler: VTMotionEstimationOutputHandler,
) -> OSStatus;
}
extern "C-unwind" {
#[deprecated = "renamed to `VTMotionEstimationSession::complete_frames`"]
pub fn VTMotionEstimationSessionCompleteFrames(session: &VTMotionEstimationSession)
-> OSStatus;
}