From 7db037ab7a09383ffbb18241d1189d4ba78ba304 Mon Sep 17 00:00:00 2001 From: Michael Shapiro Date: Fri, 8 Jun 2012 20:44:53 -0400 Subject: [PATCH 1/2] formatting --- jquery.webcam.js | 171 +++++++++++---------- src/jscam.as | 376 +++++++++++++++++++++++------------------------ 2 files changed, 273 insertions(+), 274 deletions(-) diff --git a/jquery.webcam.js b/jquery.webcam.js index ed0c205..00c205c 100644 --- a/jquery.webcam.js +++ b/jquery.webcam.js @@ -1,93 +1,92 @@ /** -* jQuery webcam -* Copyright (c) 2010, Robert Eisele (robert@xarg.org) -* Dual licensed under the MIT or GPL Version 2 licenses. -* Date: 09/12/2010 -* -* @author Robert Eisele -* @version 1.0 -* -* @see http://www.xarg.org/project/jquery-webcam-plugin/ -**/ + * jQuery webcam + * Copyright (c) 2010, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + * Date: 09/12/2010 + * + * @author Robert Eisele + * @version 1.0 + * + * @see http://www.xarg.org/project/jquery-webcam-plugin/ + **/ (function ($) { - var webcam = { - - extern: null, // external select token to support jQuery dialogs - append: true, // append object instead of overwriting - - width: 320, - height: 240, - - mode: "callback", // callback | save | stream - - swffile: "jscam.swf", - quality: 85, - - debug: function () {}, - onCapture: function () {}, - onTick: function () {}, - onSave: function () {}, - onLoad: function () {} - }; - - window.webcam = webcam; - - $.fn.webcam = function(options) { - - if (typeof options === "object") { - for (var ndx in webcam) { - if (options[ndx] !== undefined) { - webcam[ndx] = options[ndx]; - } - } - } - - var source = ''; - - if (null !== webcam.extern) { - $(webcam.extern)[webcam.append ? "append" : "html"](source); - } else { - this[webcam.append ? "append" : "html"](source); - } - - (_register = function(run) { - - var cam = document.getElementById('XwebcamXobjectX'); - - if (cam.capture !== undefined) { - - /* Simple callback methods are not allowed :-/ */ - webcam.capture = function(x) { - try { - return cam.capture(x); - } catch(e) {} - } - webcam.save = function(x) { - try { - return cam.save(x); - } catch(e) {} - } - webcam.setCamera = function(x) { - try { - return cam.setCamera(x); - } catch(e) {} - } - webcam.getCameraList = function() { - try { - return cam.getCameraList(); - } catch(e) {} - } - - webcam.onLoad(); - } else if (0 == run) { - webcam.debug("error", "Flash movie not yet registered!"); - } else { - /* Flash interface not ready yet */ - window.setTimeout(_register, 1000 * (4 - run), run - 1); - } - })(3); + var webcam = { + extern: null, // external select token to support jQuery dialogs + append: true, // append object instead of overwriting + + width: 320, + height: 240, + + mode: "callback", // callback | save | stream + + swffile: "jscam.swf", + quality: 85, + + debug: function () {}, + onCapture: function () {}, + onTick: function () {}, + onSave: function () {}, + onLoad: function () {} + }; + + window.webcam = webcam; + + $.fn.webcam = function(options) { + + if (typeof options === "object") { + for (var ndx in webcam) { + if (options[ndx] !== undefined) { + webcam[ndx] = options[ndx]; + } + } } + var source = ''; + + if (null !== webcam.extern) { + $(webcam.extern)[webcam.append ? "append" : "html"](source); + } else { + this[webcam.append ? "append" : "html"](source); + } + + (_register = function(run) { + + var cam = document.getElementById('XwebcamXobjectX'); + + if (cam.capture !== undefined) { + + /* Simple callback methods are not allowed :-/ */ + webcam.capture = function(x) { + try { + return cam.capture(x); + } catch(e) {} + } + webcam.save = function(x) { + try { + return cam.save(x); + } catch(e) {} + } + webcam.setCamera = function(x) { + try { + return cam.setCamera(x); + } catch(e) {} + } + webcam.getCameraList = function() { + try { + return cam.getCameraList(); + } catch(e) {} + } + + webcam.onLoad(); + } else if (0 == run) { + webcam.debug("error", "Flash movie not yet registered!"); + } else { + /* Flash interface not ready yet */ + window.setTimeout(_register, 1000 * (4 - run), run - 1); + } + })(3); + } + })(jQuery); diff --git a/src/jscam.as b/src/jscam.as index aa70172..fe92cc3 100644 --- a/src/jscam.as +++ b/src/jscam.as @@ -1,14 +1,14 @@ /** -* jQuery webcam -* Copyright (c) 2010, Robert Eisele (robert@xarg.org) -* Dual licensed under the MIT or GPL Version 2 licenses. -* Date: 09/12/2010 -* -* @author Robert Eisele -* @version 1.0 -* -* @see http://www.xarg.org/project/jquery-webcam-plugin/ -**/ + * jQuery webcam + * Copyright (c) 2010, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + * Date: 09/12/2010 + * + * @author Robert Eisele + * @version 1.0 + * + * @see http://www.xarg.org/project/jquery-webcam-plugin/ + **/ import flash.system.Security; import flash.external.ExternalInterface; @@ -17,227 +17,227 @@ import JPGEncoder; class JSCam { - private static var camera:Camera = null; - private static var buffer:BitmapData = null; - private static var quality:Number = 85; - private static var interval = null; - private static var stream = null; - private static var mode = "callback"; - - public static function main():Void { - - System.security.allowDomain("*"); - - if (_root.mode) { - mode = _root.mode; - } else { - ExternalInterface.call('webcam.debug', "error", "No camera mode present, falling back..."); - } - - if (_root.quality) { - quality = _root.quality; - } - - // From: http://www.squidder.com/2009/03/09/trick-auto-select-mac-isight-in-flash/ - var id:Number = -1; - for (var i = 0, l = Camera.names.length; i < l; i++) { - if (Camera.names[i] == "USB Video Class Video") { - id = i; - break; - } - } - if (id > -1) { - camera = Camera.get(id); - } else { - camera = Camera.get(); - } - - if (null != camera) { - - // http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary133.html - camera.onStatus = function(info:Object) { - - switch (info.code) { - case 'Camera.Muted': - ExternalInterface.call('webcam.debug', "notify", "Camera stopped"); - break; - case 'Camera.Unmuted' : - ExternalInterface.call('webcam.debug', "notify", "Camera started"); - break; - } - } + private static var camera:Camera = null; + private static var buffer:BitmapData = null; + private static var quality:Number = 85; + private static var interval = null; + private static var stream = null; + private static var mode = "callback"; + + public static function main():Void { + + System.security.allowDomain("*"); + + if (_root.mode) { + mode = _root.mode; + } else { + ExternalInterface.call('webcam.debug', "error", "No camera mode present, falling back..."); + } + + if (_root.quality) { + quality = _root.quality; + } + + // From: http://www.squidder.com/2009/03/09/trick-auto-select-mac-isight-in-flash/ + var id:Number = -1; + for (var i = 0, l = Camera.names.length; i < l; i++) { + if (Camera.names[i] == "USB Video Class Video") { + id = i; + break; + } + } + if (id > -1) { + camera = Camera.get(id); + } else { + camera = Camera.get(); + } + + if (null != camera) { + + // http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary133.html + camera.onStatus = function(info:Object) { + + switch (info.code) { + case 'Camera.Muted': + ExternalInterface.call('webcam.debug', "notify", "Camera stopped"); + break; + case 'Camera.Unmuted' : + ExternalInterface.call('webcam.debug', "notify", "Camera started"); + break; + } + } - camera.setQuality(0, 100); - camera.setMode(Stage.width, Stage.height, 24, false); + camera.setQuality(0, 100); + camera.setMode(Stage.width, Stage.height, 24, false); - ExternalInterface.addCallback("capture", null, capture); + ExternalInterface.addCallback("capture", null, capture); - ExternalInterface.addCallback("save", null, save); + ExternalInterface.addCallback("save", null, save); - ExternalInterface.addCallback("setCamera", null, setCamera); - ExternalInterface.addCallback("getCameraList", null, getCameraList); + ExternalInterface.addCallback("setCamera", null, setCamera); + ExternalInterface.addCallback("getCameraList", null, getCameraList); - _root.attachMovie("clip", "video", 1); - _root.video.attachVideo(camera); - _root.video._x = 0; - _root.video._y = 0; + _root.attachMovie("clip", "video", 1); + _root.video.attachVideo(camera); + _root.video._x = 0; + _root.video._y = 0; - } else { - ExternalInterface.call('webcam.debug', "error", "No camera was detected."); - } - } + } else { + ExternalInterface.call('webcam.debug', "error", "No camera was detected."); + } + } - public static function capture(time:Number):Boolean { + public static function capture(time:Number):Boolean { - if (null != camera) { + if (null != camera) { - if (null != buffer) { - return false; - } + if (null != buffer) { + return false; + } - buffer = new BitmapData(Stage.width, Stage.height); - ExternalInterface.call('webcam.debug', "notify", "Capturing started."); + buffer = new BitmapData(Stage.width, Stage.height); + ExternalInterface.call('webcam.debug', "notify", "Capturing started."); - if ("stream" == mode) { - _stream(); - return true; - } + if ("stream" == mode) { + _stream(); + return true; + } - if (!time) { - time = -1; - } else if (time > 10) { - time = 10; - } + if (!time) { + time = -1; + } else if (time > 10) { + time = 10; + } - _capture(time + 1); + _capture(time + 1); - return true; - } - return false; - } - - private static function _capture(time:Number):Void { - - if (null != interval) { - clearInterval(interval); - } + return true; + } + return false; + } + + private static function _capture(time:Number):Void { + + if (null != interval) { + clearInterval(interval); + } - if (0 == time) { - buffer.draw(_root.video); - ExternalInterface.call('webcam.onCapture'); - ExternalInterface.call('webcam.debug', "notify", "Capturing finished."); - } else { - ExternalInterface.call('webcam.onTick', time - 1); - interval = setInterval(_capture, 1000, time - 1); - } - } + if (0 == time) { + buffer.draw(_root.video); + ExternalInterface.call('webcam.onCapture'); + ExternalInterface.call('webcam.debug', "notify", "Capturing finished."); + } else { + ExternalInterface.call('webcam.onTick', time - 1); + interval = setInterval(_capture, 1000, time - 1); + } + } - public static function getCameraList():Array { + public static function getCameraList():Array { - var list = new Array(); + var list = new Array(); - for (var i = 0, l = Camera.names.length; i < l; i++) { - list[i] = Camera.names[i]; - } - return list; - } + for (var i = 0, l = Camera.names.length; i < l; i++) { + list[i] = Camera.names[i]; + } + return list; + } - public static function setCamera(id:Number):Boolean { + public static function setCamera(id:Number):Boolean { - if (0 <= id && id < Camera.names.length) { - camera = Camera.get(id); - camera.setQuality(0, 100); - camera.setMode(Stage.width, Stage.height, 24, false); + if (0 <= id && id < Camera.names.length) { + camera = Camera.get(id); + camera.setQuality(0, 100); + camera.setMode(Stage.width, Stage.height, 24, false); - _root.removeMovieClip(); - _root.attachMovie("clip", "video", 1); - _root.video.attachVideo(camera); - _root.video._x = 0; - _root.video._y = 0; + _root.removeMovieClip(); + _root.attachMovie("clip", "video", 1); + _root.video.attachVideo(camera); + _root.video._x = 0; + _root.video._y = 0; - return true; + return true; - } - return false; - } + } + return false; + } - public static function save(file:String):Boolean { + public static function save(file:String):Boolean { - if ("stream" == mode) { + if ("stream" == mode) { - return true; + return true; - } else if (null != buffer) { + } else if (null != buffer) { - if ("callback" == mode) { + if ("callback" == mode) { - for (var i = 0; i < 240; ++i) { + for (var i = 0; i < 240; ++i) { - var row = ""; - for (var j=0; j < 320; ++j) { - row+= buffer.getPixel(j, i); - row+= ";"; - } - ExternalInterface.call("webcam.onSave", row); - } + var row = ""; + for (var j=0; j < 320; ++j) { + row+= buffer.getPixel(j, i); + row+= ";"; + } + ExternalInterface.call("webcam.onSave", row); + } - } else if ("save" == mode) { + } else if ("save" == mode) { - if (file) { + if (file) { - var e = new JPGEncoder(quality); + var e = new JPGEncoder(quality); - var sal = {}; - sal.sendAndLoad = XML.prototype.sendAndLoad; - sal.contentType = "image/jpeg"; - sal.toString = function() { - return e.encode(JSCam.buffer); - } + var sal = {}; + sal.sendAndLoad = XML.prototype.sendAndLoad; + sal.contentType = "image/jpeg"; + sal.toString = function() { + return e.encode(JSCam.buffer); + } - var doc = new XML(); - doc.onLoad = function(success) { - ExternalInterface.call("webcam.onSave", "done", this.toString()); - } + var doc = new XML(); + doc.onLoad = function(success) { + ExternalInterface.call("webcam.onSave", "done", this.toString()); + } - sal.sendAndLoad(file, doc); -/* - ExternalInterface.call('webcam.debug', "error", "No save mode compiled in."); - return false; -*/ - } else { - ExternalInterface.call('webcam.debug', "error", "No file name specified."); - return false; - } + sal.sendAndLoad(file, doc); + /* + ExternalInterface.call('webcam.debug', "error", "No save mode compiled in."); + return false; + */ + } else { + ExternalInterface.call('webcam.debug', "error", "No file name specified."); + return false; + } - } else { - ExternalInterface.call('webcam.debug', "error", "Unsupported storage mode."); - } + } else { + ExternalInterface.call('webcam.debug', "error", "Unsupported storage mode."); + } - buffer = null; - return true; - } - return false; - } + buffer = null; + return true; + } + return false; + } - private static function _stream():Void { + private static function _stream():Void { - buffer.draw(_root.video); + buffer.draw(_root.video); - if (null != stream) { - clearInterval(stream); - } + if (null != stream) { + clearInterval(stream); + } - for (var i = 0; i < 240; ++i) { + for (var i = 0; i < 240; ++i) { - var row = ""; - for (var j=0; j < 320; ++j) { - row+= buffer.getPixel(j, i); - row+= ";"; - } - ExternalInterface.call("webcam.onSave", row); - } + var row = ""; + for (var j=0; j < 320; ++j) { + row+= buffer.getPixel(j, i); + row+= ";"; + } + ExternalInterface.call("webcam.onSave", row); + } - stream = setInterval(_stream, 10); - } + stream = setInterval(_stream, 10); + } } From 4e9a374dcdafb3d09aaf4657ec2308025796d6f1 Mon Sep 17 00:00:00 2001 From: Michael Shapiro Date: Sun, 10 Jun 2012 13:54:15 -0400 Subject: [PATCH 2/2] Fixes, speedups (canvas only) --- jquery.webcam.js | 14 +--- jscam.swf | Bin 5230 -> 1096 bytes src/jscam.as | 193 ++++++++--------------------------------------- src/jscam.xml | 13 ++-- 4 files changed, 43 insertions(+), 177 deletions(-) diff --git a/jquery.webcam.js b/jquery.webcam.js index 00c205c..535a501 100644 --- a/jquery.webcam.js +++ b/jquery.webcam.js @@ -19,22 +19,17 @@ width: 320, height: 240, - mode: "callback", // callback | save | stream - swffile: "jscam.swf", quality: 85, debug: function () {}, onCapture: function () {}, - onTick: function () {}, - onSave: function () {}, onLoad: function () {} }; window.webcam = webcam; $.fn.webcam = function(options) { - if (typeof options === "object") { for (var ndx in webcam) { if (options[ndx] !== undefined) { @@ -63,16 +58,13 @@ return cam.capture(x); } catch(e) {} } - webcam.save = function(x) { - try { - return cam.save(x); - } catch(e) {} - } + webcam.setCamera = function(x) { try { return cam.setCamera(x); } catch(e) {} } + webcam.getCameraList = function() { try { return cam.getCameraList(); @@ -80,7 +72,7 @@ } webcam.onLoad(); - } else if (0 == run) { + } else if (run == 0) { webcam.debug("error", "Flash movie not yet registered!"); } else { /* Flash interface not ready yet */ diff --git a/jscam.swf b/jscam.swf index 7cbd2ef081b95e35ab9799f63e5aad5fdaae5058..ef144ad6261816c2ea0a4280ebbda0973d498547 100644 GIT binary patch literal 1096 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 diff --git a/src/jscam.as b/src/jscam.as index fe92cc3..ab03f37 100644 --- a/src/jscam.as +++ b/src/jscam.as @@ -13,50 +13,38 @@ import flash.system.Security; import flash.external.ExternalInterface; import flash.display.BitmapData; -import JPGEncoder; class JSCam { private static var camera:Camera = null; + private static var display:MovieClip = null; private static var buffer:BitmapData = null; private static var quality:Number = 85; - private static var interval = null; - private static var stream = null; - private static var mode = "callback"; public static function main():Void { System.security.allowDomain("*"); - if (_root.mode) { - mode = _root.mode; - } else { - ExternalInterface.call('webcam.debug', "error", "No camera mode present, falling back..."); - } - - if (_root.quality) { + if (_root.quality) quality = _root.quality; - } + // From: http://www.squidder.com/2009/03/09/trick-auto-select-mac-isight-in-flash/ - var id:Number = -1; - for (var i = 0, l = Camera.names.length; i < l; i++) { + var cameraId:Number = -1; + for (var i = 0, l = Camera.names.length; i < l; i++) if (Camera.names[i] == "USB Video Class Video") { - id = i; + cameraId = i; break; } - } - if (id > -1) { - camera = Camera.get(id); - } else { - camera = Camera.get(); - } - if (null != camera) { + if (cameraId > -1) + camera = Camera.get(cameraId); + else + camera = Camera.get(); + if (camera) { // http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary133.html camera.onStatus = function(info:Object) { - switch (info.code) { case 'Camera.Muted': ExternalInterface.call('webcam.debug', "notify", "Camera stopped"); @@ -71,173 +59,58 @@ class JSCam { camera.setMode(Stage.width, Stage.height, 24, false); ExternalInterface.addCallback("capture", null, capture); - - ExternalInterface.addCallback("save", null, save); - ExternalInterface.addCallback("setCamera", null, setCamera); ExternalInterface.addCallback("getCameraList", null, getCameraList); - _root.attachMovie("clip", "video", 1); - _root.video.attachVideo(camera); - _root.video._x = 0; - _root.video._y = 0; + display = _root.attachMovie("clip", "video", 1); + display.video.attachVideo(camera); + display.video._x = 0; + display.video._y = 0; } else { ExternalInterface.call('webcam.debug', "error", "No camera was detected."); } } - public static function capture(time:Number):Boolean { - - if (null != camera) { - - if (null != buffer) { - return false; - } - - buffer = new BitmapData(Stage.width, Stage.height); - ExternalInterface.call('webcam.debug', "notify", "Capturing started."); - - if ("stream" == mode) { - _stream(); - return true; - } - - if (!time) { - time = -1; - } else if (time > 10) { - time = 10; - } - - _capture(time + 1); - - return true; - } - return false; - } - - private static function _capture(time:Number):Void { - - if (null != interval) { - clearInterval(interval); - } - - if (0 == time) { - buffer.draw(_root.video); - ExternalInterface.call('webcam.onCapture'); - ExternalInterface.call('webcam.debug', "notify", "Capturing finished."); - } else { - ExternalInterface.call('webcam.onTick', time - 1); - interval = setInterval(_capture, 1000, time - 1); - } - } public static function getCameraList():Array { - var list = new Array(); - for (var i = 0, l = Camera.names.length; i < l; i++) { + for (var i=0, l = Camera.names.length; i < l; i++) list[i] = Camera.names[i]; - } + return list; } - public static function setCamera(id:Number):Boolean { - if (0 <= id && id < Camera.names.length) { - camera = Camera.get(id); + public static function setCamera(cameraId:Number):Boolean { + if (0 <= cameraId && cameraId < Camera.names.length) { + camera = Camera.get(cameraId); camera.setQuality(0, 100); camera.setMode(Stage.width, Stage.height, 24, false); - - _root.removeMovieClip(); - _root.attachMovie("clip", "video", 1); - _root.video.attachVideo(camera); - _root.video._x = 0; - _root.video._y = 0; - return true; - } return false; } - public static function save(file:String):Boolean { - if ("stream" == mode) { - - return true; + public static function capture():Boolean { + if (!camera) + return false; - } else if (null != buffer) { + ExternalInterface.call('webcam.debug', "notify", "Capturing started."); - if ("callback" == mode) { + buffer = new BitmapData(Stage.width, Stage.height); + buffer.draw(display.video); - for (var i = 0; i < 240; ++i) { + var pixels = []; + for (var i=0; i < 240; ++i) + for (var j=0; j < 320; ++j) + pixels.push(buffer.getPixel(j, i).valueOf()) - var row = ""; - for (var j=0; j < 320; ++j) { - row+= buffer.getPixel(j, i); - row+= ";"; - } - ExternalInterface.call("webcam.onSave", row); - } - - } else if ("save" == mode) { - - if (file) { - - var e = new JPGEncoder(quality); - - var sal = {}; - sal.sendAndLoad = XML.prototype.sendAndLoad; - sal.contentType = "image/jpeg"; - sal.toString = function() { - return e.encode(JSCam.buffer); - } - - var doc = new XML(); - doc.onLoad = function(success) { - ExternalInterface.call("webcam.onSave", "done", this.toString()); - } - - sal.sendAndLoad(file, doc); - /* - ExternalInterface.call('webcam.debug', "error", "No save mode compiled in."); - return false; - */ - } else { - ExternalInterface.call('webcam.debug', "error", "No file name specified."); - return false; - } - - } else { - ExternalInterface.call('webcam.debug', "error", "Unsupported storage mode."); - } - - buffer = null; - return true; - } - return false; - } - - private static function _stream():Void { - - buffer.draw(_root.video); - - if (null != stream) { - clearInterval(stream); - } - - - for (var i = 0; i < 240; ++i) { - - var row = ""; - for (var j=0; j < 320; ++j) { - row+= buffer.getPixel(j, i); - row+= ";"; - } - ExternalInterface.call("webcam.onSave", row); - } + ExternalInterface.call("webcam.onCapture", pixels); + ExternalInterface.call('webcam.debug', "notify", "Capturing finished."); - stream = setInterval(_stream, 10); + return true; } } diff --git a/src/jscam.xml b/src/jscam.xml index a0734a0..b76dc45 100644 --- a/src/jscam.xml +++ b/src/jscam.xml @@ -1,11 +1,12 @@ - - - - + - + + + -