-/*
- * cap_ios.h
- * For iOS video I/O
+/* For iOS video I/O
* by Eduard Feicho on 29/07/12
* Copyright 2012. All rights reserved.
*
- (void)createVideoPreviewLayer;
- (void)updateOrientation;
+- (void)lockFocus;
+- (void)unlockFocus;
+- (void)lockExposure;
+- (void)unlockExposure;
+- (void)lockBalance;
+- (void)unlockBalance;
@end
BOOL grayscaleMode;
BOOL recordVideo;
+ BOOL rotateVideo;
AVAssetWriterInput* recordAssetWriterInput;
AVAssetWriterInputPixelBufferAdaptor* recordPixelBufferAdaptor;
AVAssetWriter* recordAssetWriter;
@property (nonatomic, assign) BOOL grayscaleMode;
@property (nonatomic, assign) BOOL recordVideo;
+@property (nonatomic, assign) BOOL rotateVideo;
@property (nonatomic, retain) AVAssetWriterInput* recordAssetWriterInput;
@property (nonatomic, retain) AVAssetWriterInputPixelBufferAdaptor* recordPixelBufferAdaptor;
@property (nonatomic, retain) AVAssetWriter* recordAssetWriter;
}
}
+- (void)lockFocus;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isFocusModeSupported:AVCaptureFocusModeLocked]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.focusMode = AVCaptureFocusModeLocked;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for locked focus configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
+- (void) unlockFocus;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.focusMode = AVCaptureFocusModeContinuousAutoFocus;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for autofocus configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
+- (void)lockExposure;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isExposureModeSupported:AVCaptureExposureModeLocked]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.exposureMode = AVCaptureExposureModeLocked;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for locked exposure configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
+- (void) unlockExposure;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.exposureMode = AVCaptureExposureModeContinuousAutoExposure;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for autoexposure configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
+- (void)lockBalance;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.whiteBalanceMode = AVCaptureWhiteBalanceModeLocked;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for locked exposure configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
+- (void) unlockBalance;
+{
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+ if ([device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]) {
+ NSError *error = nil;
+ if ([device lockForConfiguration:&error]) {
+ device.whiteBalanceMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
+ [device unlockForConfiguration];
+ } else {
+ NSLog(@"unable to lock device for autoexposure configuration %@", [error localizedDescription]);
+ }
+ }
+}
+
@end
+
#import "opencv2/highgui/cap_ios.h"
#include "precomp.hpp"
-#pragma mark - Private Interface
+#pragma mark - Private Interface mark - Private Interface
@interface CvPhotoCamera ()
#import "opencv2/highgui/cap_ios.h"
#include "precomp.hpp"
-
#import <AssetsLibrary/AssetsLibrary.h>
@synthesize videoDataOutput;
@synthesize recordVideo;
+@synthesize rotateVideo;
//@synthesize videoFileOutput;
@synthesize recordAssetWriterInput;
@synthesize recordPixelBufferAdaptor;
if (self) {
self.useAVCaptureVideoPreviewLayer = NO;
self.recordVideo = NO;
+ self.rotateVideo = NO;
}
return self;
}
}
-
-
-
#pragma mark - Private Interface
-
-
- (void)createVideoDataOutput;
{
// Make a video data output
[self.parentView.layer addSublayer:self.customPreviewLayer];
}
+- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
+{
+
+ CGSize frameSize = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image));
+ NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO], kCVPixelBufferCGImageCompatibilityKey,
+ [NSNumber numberWithBool:NO], kCVPixelBufferCGBitmapContextCompatibilityKey,
+ nil];
+ CVPixelBufferRef pxbuffer = NULL;
+ CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
+ frameSize.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) CFBridgingRetain(options),
+ &pxbuffer);
+ NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
+
+ CVPixelBufferLockBaseAddress(pxbuffer, 0);
+ void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
+
+
+ CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
+ frameSize.height, 8, 4*frameSize.width, rgbColorSpace,
+ kCGImageAlphaPremultipliedFirst);
+
+ CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
+ CGImageGetHeight(image)), image);
+ CGColorSpaceRelease(rgbColorSpace);
+ CGContextRelease(context);
+
+ CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
+
+ return pxbuffer;
+}
#pragma mark - Protocol AVCaptureVideoDataOutputSampleBufferDelegate
}
if (self.recordAssetWriterInput.readyForMoreMediaData) {
- if (! [self.recordPixelBufferAdaptor appendPixelBuffer:imageBuffer
+ CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:dstImage];
+ if (! [self.recordPixelBufferAdaptor appendPixelBuffer:pixelBuffer
withPresentationTime:lastSampleTime] ) {
NSLog(@"Video Writing Error");
}
- (void)updateOrientation;
{
- NSLog(@"rotate..");
- self.customPreviewLayer.bounds = CGRectMake(0, 0, self.parentView.frame.size.width, self.parentView.frame.size.height);
- [self layoutPreviewLayer];
+ if (self.rotateVideo == YES)
+ {
+ NSLog(@"rotate..");
+ self.customPreviewLayer.bounds = CGRectMake(0, 0, self.parentView.frame.size.width, self.parentView.frame.size.height);
+ [self layoutPreviewLayer];
+ }
}
}
@end
+