773f278df8
* fix: Use property accessors on `Frame` * Format * Use `_Nonnull` * fix: Assume nonnull * Use `NS_ASSUME_NONNULL_BEGIN` more * Format C++
105 lines
2.6 KiB
Objective-C
105 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)buffer orientation:(UIImageOrientation)orientation {
|
|
self = [super init];
|
|
if (self) {
|
|
_buffer = buffer;
|
|
_orientation = orientation;
|
|
CFRetain(buffer);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
CFRelease(_buffer);
|
|
}
|
|
|
|
- (CMSampleBufferRef)buffer {
|
|
return _buffer;
|
|
}
|
|
|
|
- (UIImageOrientation)orientation {
|
|
return _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
|