3d28b11ae3
Replaces react-native-compressor's video path with a local Expo module. Native pipeline: - iOS: AVAssetReader + AVMutableVideoComposition + AVAssetWriter with VideoToolbox encode, BGRA reader for HDR -> SDR conversion, BT.709 color tagging, DataRateLimits hard cap, AAC re-encode. - Android: MediaExtractor -> MediaCodec(decoder) -> GL pipeline -> MediaCodec(encoder) -> MediaMuxer. BITRATE_MODE_CBR for tight target enforcement, GL transform-matrix rotation (no double-rotation), raw AAC passthrough, hardware encoder selection with software fallback, QTI AVC denylist. Codec selection: 'auto' resolves to h264 (HLS pipeline + licensing). HEVC remains opt-in via codec: 'hevc' for future feature-flagged use. compress.ts adds probe-based smart-skip: clips that are already at or below 5 Mbps / 1920px / 100MB bypass re-encoding entirely. react-native-compressor stays as a dep for now since pickVideo and VideoTranscodeBackdrop still use its non-compression helpers; full removal is a follow-up.
22 lines
695 B
Swift
22 lines
695 B
Swift
import VideoToolbox
|
|
|
|
enum CodecCapability {
|
|
static let isHardwareHEVCEncodeAvailable: Bool = {
|
|
var encoderListCF: CFArray?
|
|
let status = VTCopyVideoEncoderList(nil, &encoderListCF)
|
|
guard status == noErr, let encoderList = encoderListCF as? [[String: Any]] else {
|
|
return false
|
|
}
|
|
return encoderList.contains { encoder in
|
|
guard let codecTypeValue = encoder[kVTVideoEncoderList_CodecType as String] as? Int,
|
|
codecTypeValue == Int(kCMVideoCodecType_HEVC) else {
|
|
return false
|
|
}
|
|
if let isHardware = encoder[kVTVideoEncoderList_IsHardwareAccelerated as String] as? Bool {
|
|
return isHardware
|
|
}
|
|
return true
|
|
}
|
|
}()
|
|
}
|