Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build
dist
.DS_Store
titanium-coreml.xcodeproj/project.xcworkspace/xcuserdata/*.xcuserdatad
titanium-coreml.xcodeproj/xcuserdata/*.xcuserdatad
/test_coreml
28 changes: 0 additions & 28 deletions Classes/TiCaptureSession.h

This file was deleted.

92 changes: 0 additions & 92 deletions Classes/TiCaptureSession.m

This file was deleted.

90 changes: 90 additions & 0 deletions Classes/TiCaptureSession.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//
// TiCaptureSession.swift
// TiCoreml
//
// Created by Hans Knöchel on 25.02.24.
//

import UIKit
import AVFoundation
import CoreVideo

typealias TiCaptureSessionCompletionHandler = (CVImageBuffer) -> Void

class TiCaptureSession: NSObject {

let queue = DispatchQueue(label: "io.tidev.coreml.camera-queue")
let completionHandler: TiCaptureSessionCompletionHandler
let captureSession = AVCaptureSession()
let videoOutput = AVCaptureVideoDataOutput()

var previewLayer: AVCaptureVideoPreviewLayer!

init(completionHandler: @escaping TiCaptureSessionCompletionHandler) {
self.completionHandler = completionHandler

super.init()

self.setupCaptureSession()
}

private func setupCaptureSession() {
captureSession.beginConfiguration()
captureSession.sessionPreset = .photo

guard let captureDevice = AVCaptureDevice.default(for: .video) else {
return logErrorAndFail("Could not create capture device")
}

guard let videoInput = try? AVCaptureDeviceInput(device: captureDevice) else {
return logErrorAndFail("Could not create video input")
}

guard captureSession.canAddInput(videoInput) else {
return logErrorAndFail("Could not add video input to capture session")
}

captureSession.addInput(videoInput)

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = .resizeAspect

// if #available(iOS 17.0, *) {
// previewLayer.connection?.videoRotationAngle = 90
// } else {
previewLayer.connection?.videoOrientation = .portrait
// }

videoOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]
videoOutput.alwaysDiscardsLateVideoFrames = true
videoOutput.setSampleBufferDelegate(self, queue: queue)

guard captureSession.canAddOutput(videoOutput) else {
return logErrorAndFail("Could not add video output to capture session")
}

captureSession.addOutput(videoOutput)

let _ = videoOutput.connection(with: .video)
captureSession.commitConfiguration()
}

func start() {
captureSession.startRunning()
}

func stop() {
captureSession.stopRunning()
}
}

// MARK: AVCaptureVideoDataOutputSampleBufferDelegate

extension TiCaptureSession: AVCaptureVideoDataOutputSampleBufferDelegate {

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
if let image = CMSampleBufferGetImageBuffer(sampleBuffer) {
completionHandler(image)
}
}
}
16 changes: 16 additions & 0 deletions Classes/TiCoreml.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// TiCoreml.h
// titanium-coreml
//
// Created by Hans Knöchel on 25.02.24.
//

#import <UIKit/UIKit.h>

//! Project version number for TiCoreml.
FOUNDATION_EXPORT double TiCoremlVersionNumber;

//! Project version string for TiCoreml.
FOUNDATION_EXPORT const unsigned char TiCoremlVersionString[];

#import <TiCoreml/TiCoremlModuleAssets.h>
14 changes: 0 additions & 14 deletions Classes/TiCoremlModule.h

This file was deleted.

42 changes: 0 additions & 42 deletions Classes/TiCoremlModule.m

This file was deleted.

41 changes: 41 additions & 0 deletions Classes/TiCoremlModule.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// TiCoremlModule.swift
// titanium-coreml
//
// Created by Your Name
// Copyright (c) 2024 Your Company. All rights reserved.
//

import AVFoundation
import UIKit
import TitaniumKit

func logErrorAndFail(_ message: String) {
NSLog("[ERROR] \(message)")
fatalError(message)
}

@objc(TiCoremlModule)
class TiCoremlModule: TiModule {

func moduleGUID() -> String {
return "eb79624b-04d4-463c-9f43-d212de1b53e3"
}

override func moduleId() -> String! {
return "ti.coreml"
}

@objc(isSupported:)
func isSupported(unused: Any?) -> Bool {
guard let captureDevice = AVCaptureDevice.default(for: .video) else {
return false
}

guard let _ = try? AVCaptureDeviceInput(device: captureDevice) else {
return false
}

return true
}
}
9 changes: 5 additions & 4 deletions Classes/TiCoremlModuleAssets.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
* This is a generated file. Do not edit or your changes will be lost
*/

@interface TiCoremlModuleAssets : NSObject
{
@interface TiCoremlModuleAssets : NSObject {

}
- (NSData*) moduleAsset;
- (NSData*) resolveModuleAsset:(NSString*)path;

- (NSData *)moduleAsset;
- (NSData *)resolveModuleAsset:(NSString*)path;

@end
12 changes: 6 additions & 6 deletions Classes/TiCoremlModuleAssets.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@

@implementation TiCoremlModuleAssets

- (NSData*) moduleAsset
- (NSData *)moduleAsset
{

return nil;
return nil;
}

- (NSData*) resolveModuleAsset:(NSString*)path
- (NSData *)resolveModuleAsset:(NSString *)path
{

return nil;
return nil;
}

@end
13 changes: 0 additions & 13 deletions Classes/TiCoremlRealtimeRecognitionView.h

This file was deleted.

Loading