[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// VideoDisplayController.m[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Prototype492[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Created by Christopher Sanders on 3/7/08.[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Copyright 2008 __CIS492__. All rights reserved.[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#643820][FONT=Monaco]#import [/FONT][/COLOR][COLOR=#C41A16][FONT=Monaco]"VideoDisplayController.h"[/FONT][/COLOR][COLOR=#643820][FONT=Monaco][/FONT][/COLOR]
[FONT=Monaco] [/FONT]
[COLOR=#AA0D91][FONT=Monaco]@implementation[/FONT][/COLOR][FONT=Monaco] VideoDisplayController [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco] start the video capture session if it's not running[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]IBAction[/COLOR])startVideoCapture:([COLOR=#AA0D91]id[/COLOR])sender[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR](![[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]isRunning[/COLOR]])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]startRunning[/COLOR]];[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco] stop the video capture session if it's running[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]IBAction[/COLOR])stopVideoCapture:([COLOR=#AA0D91]id[/COLOR])sender[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR]([[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]isRunning[/COLOR]])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]stopRunning[/COLOR]];[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]initialization of UI elements[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]void[/COLOR])awakeFromNib[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]NSLog[/COLOR]([COLOR=#C41A16]@"initializing video controller"[/COLOR]);[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR](![COLOR=#3F6E74]captureSession[/COLOR]) {[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//creating capture session[/COLOR][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#3F6E74]captureSession[/COLOR] = [[[COLOR=#5C2699]QTCaptureSession[/COLOR] [COLOR=#2E0D6E]alloc[/COLOR]] [COLOR=#2E0D6E]init[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//flags for connecting inputs and outputs[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#AA0D91]BOOL[/COLOR] successConnect = [COLOR=#AA0D91]NO[/COLOR];[/FONT]
[FONT=Monaco] [COLOR=#5C2699]NSError[/COLOR] *error = [COLOR=#AA0D91]nil[/COLOR];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//finding and creating the input device and adding it to the capture session[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#007400]//if unsuccessful, send a message to error log[/COLOR][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//note: using QTMediaTypeMuxed for DV camera... otherwise use QTMediaTypeVideo[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#3F6E74]videoCaptureDevice[/COLOR] = [[COLOR=#5C2699]QTCaptureDevice[/COLOR] [COLOR=#2E0D6E]defaultInputDeviceWithMediaType[/COLOR]:[COLOR=#5C2699]QTMediaTypeMuxed[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//if the video capture device is found, attempt to open it and add it to the capture session[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR]([COLOR=#3F6E74]videoCaptureDevice[/COLOR])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] successConnect = [[COLOR=#3F6E74]videoCaptureDevice[/COLOR] [COLOR=#2E0D6E]open[/COLOR]:&error];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR](!successConnect)[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]NSLog[/COLOR]([COLOR=#C41A16]@"error opening video capture device"[/COLOR]);[/FONT]
[FONT=Monaco] [COLOR=#3F6E74]videoCaptureDevice[/COLOR] = [COLOR=#AA0D91]nil[/COLOR];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//other error handling code goes here[/COLOR][/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#3F6E74]captureVideoDeviceInput[/COLOR] = [[[COLOR=#5C2699]QTCaptureDeviceInput[/COLOR] [COLOR=#2E0D6E]alloc[/COLOR]] [COLOR=#2E0D6E]initWithDevice[/COLOR]:[COLOR=#3F6E74]videoCaptureDevice[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//attempt to add capture device input to the capture session[/COLOR][/FONT]
[FONT=Monaco] successConnect = [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]addInput[/COLOR]:[COLOR=#3F6E74]captureVideoDeviceInput[/COLOR] [COLOR=#2E0D6E]error[/COLOR]:&error];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR](!successConnect)[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]NSLog[/COLOR]([COLOR=#C41A16]@"error adding video capture device input to capture session"[/COLOR]);[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//other error handling code goes here[/COLOR][/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//adding decompressed video output to capture session[/COLOR][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#3F6E74]decompressedVideoOutput[/COLOR] = [[[COLOR=#5C2699]QTCaptureDecompressedVideoOutput[/COLOR] [COLOR=#2E0D6E]alloc[/COLOR]] [COLOR=#2E0D6E]init[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//assigning delegate to decompressed video output[/COLOR][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]decompressedVideoOutput[/COLOR] [COLOR=#2E0D6E]setDelegate[/COLOR]: [COLOR=#AA0D91]self[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] successConnect = [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]addOutput[/COLOR]:[COLOR=#3F6E74]decompressedVideoOutput[/COLOR] [COLOR=#2E0D6E]error[/COLOR]:&error];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR](!successConnect)[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]NSLog[/COLOR]([COLOR=#C41A16]@"error adding decompressed video output to capture session"[/COLOR]);[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//other error handling code goes here[/COLOR][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//linking capture session to the capture view[/COLOR][/FONT]
[FONT=Monaco] [captureView [COLOR=#2E0D6E]setCaptureSession[/COLOR]:[COLOR=#3F6E74]captureSession[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//[captureSession startRunning];[/COLOR][/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [COLOR=#AA0D91]else[/COLOR][/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]NSLog[/COLOR]([COLOR=#C41A16]@"couldn't find video capture device"[/COLOR]);[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]delegate method called when decompressedVideoOutput receives a frame[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]it is not called in the main thread, so a synhronized block is used[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]delegates of decompressedVideoOutput receive this message [/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]and then can used the provided video frame for further image processing[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco] [/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]captureOutput - the QTCaptureDecompressedVideoOutput instance that sent the frame (decompressedVideoOutput)[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]videoFrame - Core Video image buffer containing the decompressed frame[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]sampleBuffer sample buffer containing additional info about the frame[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]connection - connnection from which vdieo was received[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]void[/COLOR])captureOutput:([COLOR=#5C2699]QTCaptureOutput[/COLOR] *)captureOutput [/FONT]
[FONT=Monaco] didOutputVideoFrame:([COLOR=#5C2699]CVImageBufferRef[/COLOR])videoFrame[/FONT]
[FONT=Monaco] withSampleBuffer:([COLOR=#5C2699]QTSampleBuffer[/COLOR] *)sampleBuffer [/FONT]
[FONT=Monaco] fromConnection:([COLOR=#5C2699]QTCaptureConnection[/COLOR] *)connection[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [COLOR=#5C2699]CVImageBufferRef[/COLOR] releasedImageBuffer;[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]CVBufferRetain[/COLOR](videoFrame);[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]@synchronized[/COLOR]([COLOR=#AA0D91]self[/COLOR])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [COLOR=#007400]//basically, have frame to be released refer to the current frame[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#007400]//then update the reference to the current frame with the next frame in the "video stream"[/COLOR][/FONT]
[FONT=Monaco] releasedImageBuffer = [COLOR=#3F6E74]currentImageBuffer[/COLOR];[/FONT]
[FONT=Monaco] [COLOR=#3F6E74]currentImageBuffer[/COLOR] = videoFrame;[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#2E0D6E]CVBufferRelease[/COLOR](releasedImageBuffer);[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]event that's fired when window is closed[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]stop the session and close any opened devices[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]void[/COLOR])windowWillClose:([COLOR=#5C2699]NSNotification[/COLOR] *)notification[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR]([[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]isRunning[/COLOR]])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]stopRunning[/COLOR]];[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#AA0D91]if[/COLOR]([[COLOR=#3F6E74]videoCaptureDevice[/COLOR] [COLOR=#2E0D6E]isOpen[/COLOR]])[/FONT]
[FONT=Monaco] {[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]videoCaptureDevice[/COLOR] [COLOR=#2E0D6E]close[/COLOR]];[/FONT]
[FONT=Monaco] }[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]/*[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]event that fires when memory is to be deallocated when object is killed[/FONT][/COLOR]
[COLOR=#007400][FONT=Monaco]*/[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]void[/COLOR])dealloc[/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]captureSession[/COLOR] [COLOR=#2E0D6E]release[/COLOR]];[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]captureVideoDeviceInput[/COLOR] [COLOR=#2E0D6E]release[/COLOR]];[/FONT]
[FONT=Monaco] [[COLOR=#3F6E74]decompressedVideoOutput[/COLOR] [COLOR=#2E0D6E]release[/COLOR]];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [[COLOR=#AA0D91]super[/COLOR] [COLOR=#2E0D6E]dealloc[/COLOR]];[/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#AA0D91][FONT=Monaco]@end[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// VideoDisplayController.h[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Prototype492v1.1[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Updated by Christopher Sanders on 3/8/08.[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]// Copyright 2008 CIS492. All rights reserved.[/FONT][/COLOR][FONT=Monaco][/FONT]
[COLOR=#007400][FONT=Monaco]//[/FONT][/COLOR][FONT=Monaco][/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#643820][FONT=Monaco]#import [/FONT][/COLOR][COLOR=#C41A16][FONT=Monaco]<Cocoa/Cocoa.h>[/FONT][/COLOR][COLOR=#643820][FONT=Monaco][/FONT][/COLOR]
[COLOR=#643820][FONT=Monaco]#import [/FONT][/COLOR][COLOR=#C41A16][FONT=Monaco]<QTKit/QTkit.h>[/FONT][/COLOR][COLOR=#643820][FONT=Monaco][/FONT][/COLOR]
[COLOR=#643820][FONT=Monaco]#import [/FONT][/COLOR][COLOR=#C41A16][FONT=Monaco]"VideoView.h"[/FONT][/COLOR][COLOR=#643820][FONT=Monaco][/FONT][/COLOR]
[FONT=Monaco] [/FONT]
[COLOR=#AA0D91][FONT=Monaco]@interface[/FONT][/COLOR][FONT=Monaco] VideoDisplayController : [COLOR=#5C2699]NSOpenGLView[/COLOR] [/FONT]
[FONT=Monaco]{[/FONT]
[FONT=Monaco] [COLOR=#5C2699]QTCaptureSession[/COLOR] *[COLOR=#3F6E74]captureSession[/COLOR];[/FONT]
[FONT=Monaco] [COLOR=#5C2699]QTCaptureDevice[/COLOR] *[COLOR=#3F6E74]videoCaptureDevice[/COLOR];[/FONT]
[FONT=Monaco] [COLOR=#5C2699]QTCaptureDeviceInput[/COLOR] *[COLOR=#3F6E74]captureVideoDeviceInput[/COLOR];[/FONT]
[FONT=Monaco] [COLOR=#5C2699]QTCaptureDecompressedVideoOutput[/COLOR] *[COLOR=#3F6E74]decompressedVideoOutput[/COLOR];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//stores most recent frame grabbed from a CVImageBufferRef[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#5C2699]CVImageBufferRef[/COLOR] [COLOR=#3F6E74]currentImageBuffer[/COLOR];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [COLOR=#007400]//this is the panel on which the video from the DV camera will be displayed[/COLOR][/FONT]
[FONT=Monaco] [COLOR=#AA0D91]IBOutlet[/COLOR] [COLOR=#5C2699]QTCaptureView[/COLOR] *captureView;[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] //[COLOR=#AA0D91]IBOutlet[/COLOR] [COLOR=#3F6E74]VideoView[/COLOR] *[COLOR=#3F6E74]openGLVideoView[/COLOR];[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]}[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]IBAction[/COLOR])startVideoCapture:([COLOR=#AA0D91]id[/COLOR])sender;[/FONT]
[FONT=Monaco]- ([COLOR=#AA0D91]IBAction[/COLOR])stopVideoCapture:([COLOR=#AA0D91]id[/COLOR])sender;[/FONT]
[FONT=Monaco] [/FONT]
[FONT=Monaco] [/FONT]
[COLOR=#AA0D91][FONT=Monaco]@end[/FONT][/COLOR][FONT=Monaco][/FONT]