Commits

Boris Bügling  committed d0b7d82

Initial commit.

  • Participants

Comments (0)

Files changed (20)

+Camerang.xcodeproj/project.xcworkspace/xcuserdata
+Camerang.xcodeproj/xcuserdata
+[submodule "vendor/BOMTalk"]
+	path = vendor/BOMTalk
+	url = https://github.com/neonichu/BOMTalk.git
+[submodule "vendor/NoticeView"]
+	path = vendor/NoticeView
+	url = https://github.com/tciuro/NoticeView.git

File Camerang.xcodeproj/project.pbxproj

+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		866E7F871739876C005B09E9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7F861739876C005B09E9 /* UIKit.framework */; };
+		866E7F891739876C005B09E9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7F881739876C005B09E9 /* Foundation.framework */; };
+		866E7F8B1739876C005B09E9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7F8A1739876C005B09E9 /* CoreGraphics.framework */; };
+		866E7F931739876C005B09E9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7F921739876C005B09E9 /* main.m */; };
+		866E7F971739876C005B09E9 /* BBUAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7F961739876C005B09E9 /* BBUAppDelegate.m */; };
+		866E7F991739876C005B09E9 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 866E7F981739876C005B09E9 /* Default.png */; };
+		866E7F9B1739876C005B09E9 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 866E7F9A1739876C005B09E9 /* Default@2x.png */; };
+		866E7F9D1739876C005B09E9 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 866E7F9C1739876C005B09E9 /* Default-568h@2x.png */; };
+		866E7FAC173988AF005B09E9 /* BOMTalk.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7FA7173988AF005B09E9 /* BOMTalk.m */; };
+		866E7FAD173988AF005B09E9 /* BOMTalkPackage.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7FA9173988AF005B09E9 /* BOMTalkPackage.m */; };
+		866E7FAE173988AF005B09E9 /* BOMTalkPeer.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7FAB173988AF005B09E9 /* BOMTalkPeer.m */; };
+		866E7FB0173989AD005B09E9 /* GameKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7FAF173989AD005B09E9 /* GameKit.framework */; };
+		866E7FB417398B14005B09E9 /* RRCameraCaptureSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7FB217398B14005B09E9 /* RRCameraCaptureSession.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+		866E7FB617398B37005B09E9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7FB517398B37005B09E9 /* AVFoundation.framework */; };
+		866E7FB817398B42005B09E9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7FB717398B42005B09E9 /* CoreMedia.framework */; };
+		866E7FBA17398B4C005B09E9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866E7FB917398B4C005B09E9 /* CoreVideo.framework */; };
+		866E7FBD17398B9F005B09E9 /* BBUCameraViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 866E7FBC17398B9F005B09E9 /* BBUCameraViewController.m */; };
+		86D7D0B01739A71F00E2A2D1 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86D7D0AF1739A71F00E2A2D1 /* AssetsLibrary.framework */; };
+		86D7D0B41739A89D00E2A2D1 /* WBNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D7D0B31739A89D00E2A2D1 /* WBNoticeView.m */; };
+		86D7D0B71739A8B800E2A2D1 /* WBSuccessNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D7D0B61739A8B700E2A2D1 /* WBSuccessNoticeView.m */; };
+		86D7D0BA1739A8CB00E2A2D1 /* WBBlueGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D7D0B91739A8CB00E2A2D1 /* WBBlueGradientView.m */; };
+		86D7D0BC1739A8DA00E2A2D1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86D7D0BB1739A8DA00E2A2D1 /* QuartzCore.framework */; };
+		86D7D0C11739AA3300E2A2D1 /* WBErrorNoticeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D7D0C01739AA3300E2A2D1 /* WBErrorNoticeView.m */; };
+		86D7D0C41739AA4700E2A2D1 /* WBRedGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D7D0C31739AA4700E2A2D1 /* WBRedGradientView.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		866E7F831739876C005B09E9 /* Camerang.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Camerang.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		866E7F861739876C005B09E9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		866E7F881739876C005B09E9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		866E7F8A1739876C005B09E9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		866E7F8E1739876C005B09E9 /* Camerang-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Camerang-Info.plist"; sourceTree = "<group>"; };
+		866E7F921739876C005B09E9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		866E7F941739876C005B09E9 /* Camerang-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Camerang-Prefix.pch"; sourceTree = "<group>"; };
+		866E7F951739876C005B09E9 /* BBUAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BBUAppDelegate.h; sourceTree = "<group>"; };
+		866E7F961739876C005B09E9 /* BBUAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BBUAppDelegate.m; sourceTree = "<group>"; };
+		866E7F981739876C005B09E9 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+		866E7F9A1739876C005B09E9 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+		866E7F9C1739876C005B09E9 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+		866E7FA6173988AF005B09E9 /* BOMTalk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BOMTalk.h; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalk.h; sourceTree = "<group>"; };
+		866E7FA7173988AF005B09E9 /* BOMTalk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BOMTalk.m; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalk.m; sourceTree = "<group>"; };
+		866E7FA8173988AF005B09E9 /* BOMTalkPackage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BOMTalkPackage.h; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalkPackage.h; sourceTree = "<group>"; };
+		866E7FA9173988AF005B09E9 /* BOMTalkPackage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BOMTalkPackage.m; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalkPackage.m; sourceTree = "<group>"; };
+		866E7FAA173988AF005B09E9 /* BOMTalkPeer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BOMTalkPeer.h; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalkPeer.h; sourceTree = "<group>"; };
+		866E7FAB173988AF005B09E9 /* BOMTalkPeer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BOMTalkPeer.m; path = vendor/BOMTalk/BOMTalk/BOMTalk/BOMTalkPeer.m; sourceTree = "<group>"; };
+		866E7FAF173989AD005B09E9 /* GameKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System/Library/Frameworks/GameKit.framework; sourceTree = SDKROOT; };
+		866E7FB217398B14005B09E9 /* RRCameraCaptureSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RRCameraCaptureSession.m; path = vendor/RailRoad/RRCameraCaptureSession.m; sourceTree = "<group>"; };
+		866E7FB317398B14005B09E9 /* RRCameraCaptureSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RRCameraCaptureSession.h; path = vendor/RailRoad/RRCameraCaptureSession.h; sourceTree = "<group>"; };
+		866E7FB517398B37005B09E9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
+		866E7FB717398B42005B09E9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
+		866E7FB917398B4C005B09E9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
+		866E7FBB17398B9F005B09E9 /* BBUCameraViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BBUCameraViewController.h; sourceTree = "<group>"; };
+		866E7FBC17398B9F005B09E9 /* BBUCameraViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BBUCameraViewController.m; sourceTree = "<group>"; };
+		86D7D0AF1739A71F00E2A2D1 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; };
+		86D7D0B21739A89D00E2A2D1 /* WBNoticeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WBNoticeView.h; path = vendor/NoticeView/NoticeView/WBNoticeView/WBNoticeView.h; sourceTree = "<group>"; };
+		86D7D0B31739A89D00E2A2D1 /* WBNoticeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WBNoticeView.m; path = vendor/NoticeView/NoticeView/WBNoticeView/WBNoticeView.m; sourceTree = "<group>"; };
+		86D7D0B51739A8B700E2A2D1 /* WBSuccessNoticeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WBSuccessNoticeView.h; path = vendor/NoticeView/NoticeView/WBNoticeView/WBSuccessNoticeView.h; sourceTree = "<group>"; };
+		86D7D0B61739A8B700E2A2D1 /* WBSuccessNoticeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WBSuccessNoticeView.m; path = vendor/NoticeView/NoticeView/WBNoticeView/WBSuccessNoticeView.m; sourceTree = "<group>"; };
+		86D7D0B81739A8CB00E2A2D1 /* WBBlueGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WBBlueGradientView.h; path = vendor/NoticeView/NoticeView/WBNoticeView/WBBlueGradientView.h; sourceTree = "<group>"; };
+		86D7D0B91739A8CB00E2A2D1 /* WBBlueGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WBBlueGradientView.m; path = vendor/NoticeView/NoticeView/WBNoticeView/WBBlueGradientView.m; sourceTree = "<group>"; };
+		86D7D0BB1739A8DA00E2A2D1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+		86D7D0BF1739AA3300E2A2D1 /* WBErrorNoticeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WBErrorNoticeView.h; path = vendor/NoticeView/NoticeView/WBNoticeView/WBErrorNoticeView.h; sourceTree = "<group>"; };
+		86D7D0C01739AA3300E2A2D1 /* WBErrorNoticeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WBErrorNoticeView.m; path = vendor/NoticeView/NoticeView/WBNoticeView/WBErrorNoticeView.m; sourceTree = "<group>"; };
+		86D7D0C21739AA4700E2A2D1 /* WBRedGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WBRedGradientView.h; path = vendor/NoticeView/NoticeView/WBNoticeView/WBRedGradientView.h; sourceTree = "<group>"; };
+		86D7D0C31739AA4700E2A2D1 /* WBRedGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WBRedGradientView.m; path = vendor/NoticeView/NoticeView/WBNoticeView/WBRedGradientView.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		866E7F801739876B005B09E9 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				86D7D0BC1739A8DA00E2A2D1 /* QuartzCore.framework in Frameworks */,
+				86D7D0B01739A71F00E2A2D1 /* AssetsLibrary.framework in Frameworks */,
+				866E7FBA17398B4C005B09E9 /* CoreVideo.framework in Frameworks */,
+				866E7FB817398B42005B09E9 /* CoreMedia.framework in Frameworks */,
+				866E7FB617398B37005B09E9 /* AVFoundation.framework in Frameworks */,
+				866E7FB0173989AD005B09E9 /* GameKit.framework in Frameworks */,
+				866E7F871739876C005B09E9 /* UIKit.framework in Frameworks */,
+				866E7F891739876C005B09E9 /* Foundation.framework in Frameworks */,
+				866E7F8B1739876C005B09E9 /* CoreGraphics.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		866E7F7A1739876B005B09E9 = {
+			isa = PBXGroup;
+			children = (
+				866E7F8C1739876C005B09E9 /* Classes */,
+				866E7F851739876C005B09E9 /* Frameworks */,
+				866E7F841739876C005B09E9 /* Products */,
+				866E7FA3173987E7005B09E9 /* Resources */,
+				866E7F8D1739876C005B09E9 /* Supporting Files */,
+				866E7FA417398887005B09E9 /* Third Party */,
+			);
+			sourceTree = "<group>";
+		};
+		866E7F841739876C005B09E9 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				866E7F831739876C005B09E9 /* Camerang.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		866E7F851739876C005B09E9 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				86D7D0AF1739A71F00E2A2D1 /* AssetsLibrary.framework */,
+				866E7FB517398B37005B09E9 /* AVFoundation.framework */,
+				866E7F8A1739876C005B09E9 /* CoreGraphics.framework */,
+				866E7FB717398B42005B09E9 /* CoreMedia.framework */,
+				866E7FB917398B4C005B09E9 /* CoreVideo.framework */,
+				866E7F881739876C005B09E9 /* Foundation.framework */,
+				866E7FAF173989AD005B09E9 /* GameKit.framework */,
+				86D7D0BB1739A8DA00E2A2D1 /* QuartzCore.framework */,
+				866E7F861739876C005B09E9 /* UIKit.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		866E7F8C1739876C005B09E9 /* Classes */ = {
+			isa = PBXGroup;
+			children = (
+				866E7F951739876C005B09E9 /* BBUAppDelegate.h */,
+				866E7F961739876C005B09E9 /* BBUAppDelegate.m */,
+				866E7FBB17398B9F005B09E9 /* BBUCameraViewController.h */,
+				866E7FBC17398B9F005B09E9 /* BBUCameraViewController.m */,
+			);
+			path = Classes;
+			sourceTree = "<group>";
+		};
+		866E7F8D1739876C005B09E9 /* Supporting Files */ = {
+			isa = PBXGroup;
+			children = (
+				866E7F8E1739876C005B09E9 /* Camerang-Info.plist */,
+				866E7F941739876C005B09E9 /* Camerang-Prefix.pch */,
+				866E7F921739876C005B09E9 /* main.m */,
+			);
+			path = "Supporting Files";
+			sourceTree = "<group>";
+		};
+		866E7FA3173987E7005B09E9 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				866E7F981739876C005B09E9 /* Default.png */,
+				866E7F9A1739876C005B09E9 /* Default@2x.png */,
+				866E7F9C1739876C005B09E9 /* Default-568h@2x.png */,
+			);
+			path = Resources;
+			sourceTree = "<group>";
+		};
+		866E7FA417398887005B09E9 /* Third Party */ = {
+			isa = PBXGroup;
+			children = (
+				866E7FA517398892005B09E9 /* BOMTalk */,
+				86D7D0B11739A87700E2A2D1 /* NoticeView */,
+				866E7FB117398AFF005B09E9 /* RailRoad */,
+			);
+			name = "Third Party";
+			sourceTree = "<group>";
+		};
+		866E7FA517398892005B09E9 /* BOMTalk */ = {
+			isa = PBXGroup;
+			children = (
+				866E7FA6173988AF005B09E9 /* BOMTalk.h */,
+				866E7FA7173988AF005B09E9 /* BOMTalk.m */,
+				866E7FA8173988AF005B09E9 /* BOMTalkPackage.h */,
+				866E7FA9173988AF005B09E9 /* BOMTalkPackage.m */,
+				866E7FAA173988AF005B09E9 /* BOMTalkPeer.h */,
+				866E7FAB173988AF005B09E9 /* BOMTalkPeer.m */,
+			);
+			name = BOMTalk;
+			sourceTree = "<group>";
+		};
+		866E7FB117398AFF005B09E9 /* RailRoad */ = {
+			isa = PBXGroup;
+			children = (
+				866E7FB317398B14005B09E9 /* RRCameraCaptureSession.h */,
+				866E7FB217398B14005B09E9 /* RRCameraCaptureSession.m */,
+			);
+			name = RailRoad;
+			sourceTree = "<group>";
+		};
+		86D7D0B11739A87700E2A2D1 /* NoticeView */ = {
+			isa = PBXGroup;
+			children = (
+				86D7D0B81739A8CB00E2A2D1 /* WBBlueGradientView.h */,
+				86D7D0B91739A8CB00E2A2D1 /* WBBlueGradientView.m */,
+				86D7D0BF1739AA3300E2A2D1 /* WBErrorNoticeView.h */,
+				86D7D0C01739AA3300E2A2D1 /* WBErrorNoticeView.m */,
+				86D7D0B21739A89D00E2A2D1 /* WBNoticeView.h */,
+				86D7D0B31739A89D00E2A2D1 /* WBNoticeView.m */,
+				86D7D0C21739AA4700E2A2D1 /* WBRedGradientView.h */,
+				86D7D0C31739AA4700E2A2D1 /* WBRedGradientView.m */,
+				86D7D0B51739A8B700E2A2D1 /* WBSuccessNoticeView.h */,
+				86D7D0B61739A8B700E2A2D1 /* WBSuccessNoticeView.m */,
+			);
+			name = NoticeView;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		866E7F821739876B005B09E9 /* Camerang */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 866E7FA01739876C005B09E9 /* Build configuration list for PBXNativeTarget "Camerang" */;
+			buildPhases = (
+				866E7F7F1739876B005B09E9 /* Sources */,
+				866E7F801739876B005B09E9 /* Frameworks */,
+				866E7F811739876B005B09E9 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Camerang;
+			productName = Camerang;
+			productReference = 866E7F831739876C005B09E9 /* Camerang.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		866E7F7B1739876B005B09E9 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				CLASSPREFIX = BBU;
+				LastUpgradeCheck = 0460;
+				ORGANIZATIONNAME = "Boris Bügling";
+			};
+			buildConfigurationList = 866E7F7E1739876B005B09E9 /* Build configuration list for PBXProject "Camerang" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 866E7F7A1739876B005B09E9;
+			productRefGroup = 866E7F841739876C005B09E9 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				866E7F821739876B005B09E9 /* Camerang */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		866E7F811739876B005B09E9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				866E7F991739876C005B09E9 /* Default.png in Resources */,
+				866E7F9B1739876C005B09E9 /* Default@2x.png in Resources */,
+				866E7F9D1739876C005B09E9 /* Default-568h@2x.png in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		866E7F7F1739876B005B09E9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				866E7F931739876C005B09E9 /* main.m in Sources */,
+				866E7F971739876C005B09E9 /* BBUAppDelegate.m in Sources */,
+				866E7FAC173988AF005B09E9 /* BOMTalk.m in Sources */,
+				866E7FAD173988AF005B09E9 /* BOMTalkPackage.m in Sources */,
+				866E7FAE173988AF005B09E9 /* BOMTalkPeer.m in Sources */,
+				866E7FB417398B14005B09E9 /* RRCameraCaptureSession.m in Sources */,
+				866E7FBD17398B9F005B09E9 /* BBUCameraViewController.m in Sources */,
+				86D7D0B41739A89D00E2A2D1 /* WBNoticeView.m in Sources */,
+				86D7D0B71739A8B800E2A2D1 /* WBSuccessNoticeView.m in Sources */,
+				86D7D0BA1739A8CB00E2A2D1 /* WBBlueGradientView.m in Sources */,
+				86D7D0C11739AA3300E2A2D1 /* WBErrorNoticeView.m in Sources */,
+				86D7D0C41739AA4700E2A2D1 /* WBRedGradientView.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		866E7F9E1739876C005B09E9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		866E7F9F1739876C005B09E9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		866E7FA11739876C005B09E9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "Supporting Files/Camerang-Prefix.pch";
+				INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Camerang-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		866E7FA21739876C005B09E9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "Supporting Files/Camerang-Prefix.pch";
+				INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Camerang-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		866E7F7E1739876B005B09E9 /* Build configuration list for PBXProject "Camerang" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				866E7F9E1739876C005B09E9 /* Debug */,
+				866E7F9F1739876C005B09E9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		866E7FA01739876C005B09E9 /* Build configuration list for PBXNativeTarget "Camerang" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				866E7FA11739876C005B09E9 /* Debug */,
+				866E7FA21739876C005B09E9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 866E7F7B1739876B005B09E9 /* Project object */;
+}

File Camerang.xcodeproj/project.xcworkspace/contents.xcworkspacedata

+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:Camerang.xcodeproj">
+   </FileRef>
+</Workspace>

File Classes/BBUAppDelegate.h

+//
+//  BBUAppDelegate.h
+//  Camerang
+//
+//  Created by Boris Bügling on 07.05.13.
+//  Copyright (c) 2013 Boris Bügling. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface BBUAppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end

File Classes/BBUAppDelegate.m

+//
+//  BBUAppDelegate.m
+//  Camerang
+//
+//  Created by Boris Bügling on 07.05.13.
+//  Copyright (c) 2013 Boris Bügling. All rights reserved.
+//
+
+#import "BBUAppDelegate.h"
+#import "BBUCameraViewController.h"
+
+@implementation BBUAppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+    [[UIApplication sharedApplication] setStatusBarHidden:YES];
+    
+    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+    self.window.backgroundColor = [UIColor whiteColor];
+    self.window.rootViewController = [BBUCameraViewController new];
+    [self.window makeKeyAndVisible];
+    
+    return YES;
+}
+
+@end

File Classes/BBUCameraViewController.h

+//
+//  BBUCameraViewController.h
+//  Camerang
+//
+//  Created by Boris Bügling on 07.05.13.
+//  Copyright (c) 2013 Boris Bügling. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface BBUCameraViewController : UIViewController
+
+@end

File Classes/BBUCameraViewController.m

+//
+//  BBUCameraViewController.m
+//  Camerang
+//
+//  Created by Boris Bügling on 07.05.13.
+//  Copyright (c) 2013 Boris Bügling. All rights reserved.
+//
+
+#import <AssetsLibrary/AssetsLibrary.h>
+
+#import "BBUCameraViewController.h"
+#import "BOMTalk.h"
+#import "RRCameraCaptureSession.h"
+#import "WBErrorNoticeView.h"
+#import "WBSuccessNoticeView.h"
+
+static const NSUInteger kSendImage = 101;
+
+@interface BBUCameraViewController () <RRCameraCaptureSessionDelegate>
+
+@property (nonatomic, strong) RRCameraCaptureSession* captureSession;
+@property (nonatomic, strong) UIImageView* imageView;
+@property (nonatomic, strong) NSDate* lastTime;
+@property (nonatomic, readonly) BOMTalk* talker;
+
+@end
+
+#pragma mark -
+
+@implementation BBUCameraViewController
+
+-(void)cameraCaptureSession:(RRCameraCaptureSession *)session capturedImage:(UIImage *)image {
+    self.imageView.image = image;
+    
+    if ([[NSDate new] timeIntervalSinceDate:self.lastTime] > 0.2) {
+        self.lastTime = [NSDate new];
+        
+        for (BOMTalkPeer* peer in self.talker.peerList) {
+            [self.talker connectToPeer:peer success:^(BOMTalkPeer *peer){
+                [self.talker sendMessage:kSendImage toPeer:peer withData:UIImageJPEGRepresentation(image, 0.6)];
+            }];
+        }
+    }
+}
+
+-(id)init {
+    self = [super init];
+    if (self) {
+        self.lastTime = [NSDate new];
+        
+        [self performBlock:^{
+            if (self.talker.peerList.count <= 0) {
+                self.captureSession = [RRCameraCaptureSession new];
+                self.captureSession.delegate = self;
+                [self.captureSession start];
+            } else {
+                [self.talker answerToMessage:kSendImage block:^(BOMTalkPeer *sender, id data) {
+                    self.imageView.image = [UIImage imageWithData:data];
+                }];
+            }
+        } afterDelay:1.0];
+        
+        [self.talker startInMode:GKSessionModePeer];
+    }
+    return self;
+}
+
+-(void)performBlock:(void(^)(void))block afterDelay:(NSTimeInterval)delay {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_main_queue(), block);
+}
+
+-(BOMTalk *)talker {
+    return [BOMTalk sharedTalk];
+}
+
+-(void)tapped {
+    ALAssetsLibrary* assetLibrary = [ALAssetsLibrary new];
+    [assetLibrary writeImageToSavedPhotosAlbum:self.imageView.image.CGImage
+                                      metadata:nil
+                               completionBlock:^(NSURL *assetURL, NSError *error) {
+                                   if (assetURL) {
+                                       WBSuccessNoticeView* notice = [WBSuccessNoticeView
+                                                                      successNoticeInView:self.view
+                                                                      title:NSLocalizedString(@"Picture saved to Camera Roll.",
+                                                                                              nil)];
+                                       [notice show];
+                                   } else {
+                                       WBErrorNoticeView* notice = [WBErrorNoticeView
+                                                                    errorNoticeInView:self.view
+                                                                    title:NSLocalizedString(@"Error", nil)
+                                                                    message:error.localizedDescription];
+                                       [notice show];
+                                   }
+                               }];
+}
+
+-(void)viewDidLoad {
+    self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
+    self.imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+    self.imageView.userInteractionEnabled = YES;
+    [self.view addSubview:self.imageView];
+    
+    UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];
+    [self.imageView addGestureRecognizer:tapRecognizer];
+}
+
+@end
+# Camerang
+
+See and snap pictures of the camera of one device from another one.
+No setup required thanks to GameKit. Launch the app on the device
+you want to use as a camera first, any additional instance of the
+app will instantly show its camera view in real time. Tap to snap
+a picture. Tap to switch between front and back camera on the host
+device. Works on iPhone, iPad and Mac.
+

File Resources/Default-568h@2x.png

Added
New image

File Resources/Default.png

Added
New image

File Resources/Default@2x.png

Added
New image

File Supporting Files/Camerang-Info.plist

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.vu0.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UIStatusBarHidden</key>
+	<true/>
+	<key>UIStatusBarStyle</key>
+	<string>UIStatusBarStyleBlackOpaque</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+</dict>
+</plist>

File Supporting Files/Camerang-Prefix.pch

+//
+// Prefix header for all source files of the 'Camerang' target in the 'Camerang' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iOS SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+    #import <UIKit/UIKit.h>
+    #import <Foundation/Foundation.h>
+#endif

File Supporting Files/main.m

+//
+//  main.m
+//  Camerang
+//
+//  Created by Boris Bügling on 07.05.13.
+//  Copyright (c) 2013 Boris Bügling. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "BBUAppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+    @autoreleasepool {
+        return UIApplicationMain(argc, argv, nil, NSStringFromClass([BBUAppDelegate class]));
+    }
+}
+* Acknowledgements
+* About screen
+* Tap to switch between front/back on host
+* First launch screen
+* iPad support
+* Mac app
+* App icon
+* Launch images
+

Submodule vendor/BOMTalk

+Subproject commit e1b96a356ef74e65bac5318a08e8b04ffde69782

Submodule vendor/NoticeView

+Subproject commit dfc2427bd7c6562c85e7c24d4eda7353d057efeb

File vendor/RailRoad/RRCameraCaptureSession.h

+//
+//  RRCameraCaptrueSession.h
+//  RailRoad
+//
+//
+//  ==== LICENCE ====
+//
+// This file is part of RailRoad.
+//
+// RailRoad is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RailRoad is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RailRoad.  If not, see <http://www.gnu.org/licenses/>.
+//
+//  Created by Stuart Lynch on 09/02/2013.
+//  Copyright (c) 2013 UEA. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+@class RRCameraCaptureSession;
+@protocol RRCameraCaptureSessionDelegate;
+
+/**
+ A class to deal with the frames captured from the camera. 
+ @author Stuart Lynch stuart.lynch@uea.ac.uk
+ */
+@interface RRCameraCaptureSession : NSObject
+
+/**
+ The delegate class. This is where the UIImage's of each frame are passed to. 
+ */
+@property(nonatomic, readwrite, assign) id<RRCameraCaptureSessionDelegate> delegate;
+
+/**
+ Start capturing. Will start the calling of the delegate method to provide the image frames. 
+ */
+- (void)start;
+
+/**
+ Stop capturing.
+ */
+- (void)stop;
+
+@end
+
+/**
+ A protocol which contains one method for accessing the captured frames. 
+ @author Stuart Lynch stuart.lynch@uea.ac.uk
+ */
+@protocol RRCameraCaptureSessionDelegate <NSObject>
+
+@optional
+/**
+ A method to provide the captured image at each frame.
+ @param session This camera capture session.
+ @param image A UIImage of the current captured frame. 
+ */
+- (void)cameraCaptureSession:(RRCameraCaptureSession *)session capturedImage:(UIImage *)image;
+@end

File vendor/RailRoad/RRCameraCaptureSession.m

+//
+//  RRCameraCaptrueSession.m
+//  RailRoad
+//
+//
+//  ==== LICENCE ====
+//
+// This file is part of RailRoad.
+//
+// RailRoad is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RailRoad is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RailRoad.  If not, see <http://www.gnu.org/licenses/>.
+//
+//  Created by Stuart Lynch on 09/02/2013.
+//  Copyright (c) 2013 UEA. All rights reserved.
+//
+
+#import "RRCameraCaptureSession.h"
+#import <AVFoundation/AVFoundation.h>
+
+@interface RRCameraCaptureSession () <AVCaptureVideoDataOutputSampleBufferDelegate>
+{
+    @private
+    AVCaptureSession    *_captureSession;
+    dispatch_queue_t    _captureQueue;
+    int                 _count;
+}
+@end
+
+@implementation RRCameraCaptureSession
+
+//////////////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark Lifecycle
+//////////////////////////////////////////////////////////////////////////
+
+- (id)init
+{
+    if ( (self = [super init]) != nil)
+    {
+        NSError *error = nil;
+        
+        // Create the session
+        _captureSession = [[AVCaptureSession alloc] init];
+        
+        // Configure the session to produce lower resolution video frames, if your
+        // processing algorithm can cope. We'll specify medium quality for the
+        // chosen device.
+        _captureSession.sessionPreset = AVCaptureSessionPresetMedium;
+        
+        // Find a suitable AVCaptureDevice
+        AVCaptureDevice *device = [AVCaptureDevice
+                                   defaultDeviceWithMediaType:AVMediaTypeVideo];
+        
+        // Create a device input with the device and add it to the session.
+        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
+                                                                            error:&error];
+        if (input == nil)
+        {
+            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
+                                                                message:@"Unable to start camera session. Unavailable input device."
+                                                               delegate:nil
+                                                      cancelButtonTitle:@"OK" otherButtonTitles:nil];
+            [alertView show];
+            [alertView release];
+        }
+        else
+        {
+            [_captureSession addInput:input];
+            
+            // Create a VideoDataOutput and add it to the session
+            AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
+            [_captureSession addOutput:output];
+            
+            // Configure your output.
+            _captureQueue = dispatch_queue_create("captureQueue", NULL);
+            
+            [output setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
+            
+            
+            // Specify the pixel format
+            output.videoSettings =
+            [NSDictionary dictionaryWithObject:
+             [NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
+                                        forKey:(id)kCVPixelBufferPixelFormatTypeKey];
+            
+            
+            // If you wish to cap the frame rate to a known value, such as 15 fps, set
+            // minFrameDuration.
+            //output.minFrameDuratio = CMTimeMake(1, 15);
+            
+            // Start the session running to start the flow of data
+            [_captureSession startRunning];
+        }
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [_captureSession stopRunning];
+    [_captureSession release];
+    dispatch_release(_captureQueue);
+    [super dealloc];
+}
+
+//////////////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate
+//////////////////////////////////////////////////////////////////////////
+
+- (void)captureOutput:(AVCaptureOutput *)captureOutput
+didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
+       fromConnection:(AVCaptureConnection *)connection
+{
+    if([self.delegate respondsToSelector:@selector(cameraCaptureSession:capturedImage:)])
+    {
+        UIImage *image = [self __imageFromSampleBuffer:sampleBuffer];
+        [self.delegate cameraCaptureSession:self capturedImage:image];
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark Private Methods
+//////////////////////////////////////////////////////////////////////////
+
+- (UIImage *)__imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
+{
+    // Get a CMSampleBuffer's Core Video image buffer for the media data
+    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
+    // Lock the base address of the pixel buffer
+    CVPixelBufferLockBaseAddress(imageBuffer, 0);
+    
+    // Get the number of bytes per row for the pixel buffer
+    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
+    
+    // Get the number of bytes per row for the pixel buffer
+    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
+    // Get the pixel buffer width and height
+    size_t width = CVPixelBufferGetWidth(imageBuffer);
+    size_t height = CVPixelBufferGetHeight(imageBuffer);
+    
+    // Create a device-dependent RGB color space
+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+    
+    // Create a bitmap graphics context with the sample buffer data
+    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
+                                                 bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
+    // Create a Quartz image from the pixel data in the bitmap graphics context
+    CGImageRef quartzImage = CGBitmapContextCreateImage(context);
+    // Unlock the pixel buffer
+    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
+    
+    // Free up the context and color space
+    CGContextRelease(context);
+    CGColorSpaceRelease(colorSpace);
+    
+    // Create an image object from the Quartz image
+    UIImage *image = [UIImage imageWithCGImage:quartzImage scale:1.0f orientation:UIImageOrientationRight];
+    
+    // Release the Quartz image
+    CGImageRelease(quartzImage);
+    
+    return (image);
+}
+
+//////////////////////////////////////////////////////////////////////////
+#pragma mark -
+#pragma mark Public Methods
+//////////////////////////////////////////////////////////////////////////
+
+- (void) start
+{
+    [_captureSession startRunning];
+}
+
+- (void) stop
+{
+    [_captureSession stopRunning];
+}
+
+@end