895f3ec889
* fix: Fix multi-Thread access on Java * fix: Thread-lock access on iOS as well * whoops add missing header impl * Update Podfile.lock * fix: Don't use `CFGetRetainCount` * fix: Lock access on iOS as well * C++ format * More detailed error * chore: Move getters into `Frame` * Format c++ * Use enum `orientation` again * format * fix: Synchronize `isValid` on Java * Also log pixelformat * feat: Use Java enums in C++ * Format C++
100 lines
2.6 KiB
Objective-C
100 lines
2.6 KiB
Objective-C
//
|
|
// Frame.m
|
|
// VisionCamera
|
|
//
|
|
// Created by Marc Rousavy on 08.06.21.
|
|
// Copyright © 2021 mrousavy. All rights reserved.
|
|
//
|
|
|
|
#import "Frame.h"
|
|
#import <CoreMedia/CMSampleBuffer.h>
|
|
#import <Foundation/Foundation.h>
|
|
|
|
@implementation Frame {
|
|
CMSampleBufferRef _Nonnull buffer;
|
|
UIImageOrientation orientation;
|
|
}
|
|
|
|
- (instancetype)initWithBuffer:(CMSampleBufferRef _Nonnull)buffer orientation:(UIImageOrientation)orientation {
|
|
self = [super init];
|
|
if (self) {
|
|
_buffer = buffer;
|
|
_orientation = orientation;
|
|
CFRetain(buffer);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
CFRelease(_buffer);
|
|
}
|
|
|
|
@synthesize buffer = _buffer;
|
|
@synthesize orientation = _orientation;
|
|
|
|
- (NSString*)pixelFormat {
|
|
CMFormatDescriptionRef format = CMSampleBufferGetFormatDescription(_buffer);
|
|
FourCharCode mediaType = CMFormatDescriptionGetMediaSubType(format);
|
|
switch (mediaType) {
|
|
case kCVPixelFormatType_32BGRA:
|
|
case kCVPixelFormatType_Lossy_32BGRA:
|
|
return @"rgb";
|
|
case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange:
|
|
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
|
|
case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange:
|
|
case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
|
|
case kCVPixelFormatType_Lossy_420YpCbCr8BiPlanarFullRange:
|
|
case kCVPixelFormatType_Lossy_420YpCbCr8BiPlanarVideoRange:
|
|
case kCVPixelFormatType_Lossy_420YpCbCr10PackedBiPlanarVideoRange:
|
|
return @"yuv";
|
|
default:
|
|
return @"unknown";
|
|
}
|
|
}
|
|
|
|
- (BOOL)isMirrored {
|
|
switch (_orientation) {
|
|
case UIImageOrientationUp:
|
|
case UIImageOrientationDown:
|
|
case UIImageOrientationLeft:
|
|
case UIImageOrientationRight:
|
|
return false;
|
|
case UIImageOrientationDownMirrored:
|
|
case UIImageOrientationUpMirrored:
|
|
case UIImageOrientationLeftMirrored:
|
|
case UIImageOrientationRightMirrored:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
- (BOOL)isValid {
|
|
return _buffer != nil && CMSampleBufferIsValid(_buffer);
|
|
}
|
|
|
|
- (size_t)width {
|
|
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_buffer);
|
|
return CVPixelBufferGetWidth(imageBuffer);
|
|
}
|
|
|
|
- (size_t)height {
|
|
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_buffer);
|
|
return CVPixelBufferGetHeight(imageBuffer);
|
|
}
|
|
|
|
- (double)timestamp {
|
|
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(_buffer);
|
|
return CMTimeGetSeconds(timestamp) * 1000.0;
|
|
}
|
|
|
|
- (size_t)bytesPerRow {
|
|
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_buffer);
|
|
return CVPixelBufferGetBytesPerRow(imageBuffer);
|
|
}
|
|
|
|
- (size_t)planesCount {
|
|
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_buffer);
|
|
return CVPixelBufferGetPlaneCount(imageBuffer);
|
|
}
|
|
|
|
@end
|