You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by mu...@apache.org on 2015/05/13 20:58:44 UTC
cordova-plugin-camera git commit: CB-8879 fix stripe issue with
correct aspect ratio
Repository: cordova-plugin-camera
Updated Branches:
refs/heads/master 706a3aa73 -> a830b3e08
CB-8879 fix stripe issue with correct aspect ratio
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/commit/a830b3e0
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/tree/a830b3e0
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/diff/a830b3e0
Branch: refs/heads/master
Commit: a830b3e08b610388c51aba38db41424e72db3d8b
Parents: 706a3aa
Author: Murat Sutunc <su...@gmail.com>
Authored: Mon May 11 17:09:43 2015 -0700
Committer: Murat Sutunc <su...@gmail.com>
Committed: Wed May 13 11:50:03 2015 -0700
----------------------------------------------------------------------
src/windows/CameraProxy.js | 118 +++++++++++++++++++++++++++++++++-------
1 file changed, 97 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-camera/blob/a830b3e0/src/windows/CameraProxy.js
----------------------------------------------------------------------
diff --git a/src/windows/CameraProxy.js b/src/windows/CameraProxy.js
index dd7afd7..3d6cda3 100644
--- a/src/windows/CameraProxy.js
+++ b/src/windows/CameraProxy.js
@@ -57,6 +57,9 @@ module.exports = {
var windowsVideoContainers = [".avi", ".flv", ".asx", ".asf", ".mov", ".mp4", ".mpg", ".rm", ".srt", ".swf", ".wmv", ".vob"];
var windowsPhoneVideoContainers = [".avi", ".3gp", ".3g2", ".wmv", ".3gp", ".3g2", ".mp4", ".m4v"];
+// Default aspect ratio 1.78 (16:9 hd video standard)
+var DEFAULT_ASPECT_RATIO = '1.8';
+
// Resize method
function resizeImage(successCallback, errorCallback, file, targetWidth, targetHeight, encodingType) {
var tempPhotoFileName = "";
@@ -323,8 +326,7 @@ function takePictureFromCameraWP(successCallback, errorCallback, args) {
// Search for available camera devices
// This is necessary to detect which camera (front or back) we should use
var expectedPanel = cameraDirection === 1 ? Windows.Devices.Enumeration.Panel.front : Windows.Devices.Enumeration.Panel.back;
- Windows.Devices.Enumeration.DeviceInformation.findAllAsync(Windows.Devices.Enumeration.DeviceClass.videoCapture)
- .done(function (devices) {
+ Windows.Devices.Enumeration.DeviceInformation.findAllAsync(Windows.Devices.Enumeration.DeviceClass.videoCapture).then(function (devices) {
if (devices.length <= 0) {
destroyCameraPreview();
errorCallback('Camera not found');
@@ -337,28 +339,47 @@ function takePictureFromCameraWP(successCallback, errorCallback, args) {
}
});
- capture.initializeAsync(captureSettings).done(function () {
- // msdn.microsoft.com/en-us/library/windows/apps/hh452807.aspx
- capturePreview.msZoom = true;
- capturePreview.src = URL.createObjectURL(capture);
- capturePreview.play();
+ captureSettings.photoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.photo;
- // Insert preview frame and controls into page
- document.body.appendChild(capturePreview);
- document.body.appendChild(captureCancelButton);
+ return capture.initializeAsync(captureSettings);
+ }).then(function () {
+ // msdn.microsoft.com/en-us/library/windows/apps/hh452807.aspx
+ capturePreview.msZoom = true;
+ capturePreview.src = URL.createObjectURL(capture);
+ capturePreview.play();
- // Bind events to controls
- window.addEventListener('deviceorientation', cameraPreviewOrientation, false);
- capturePreview.addEventListener('click', captureAction);
- captureCancelButton.addEventListener('click', function () {
- destroyCameraPreview();
- errorCallback('Cancelled');
- }, false);
- }, function (err) {
+ // Insert preview frame and controls into page
+ document.body.appendChild(capturePreview);
+ document.body.appendChild(captureCancelButton);
+
+ // Bind events to controls
+ window.addEventListener('deviceorientation', cameraPreviewOrientation, false);
+ capturePreview.addEventListener('click', captureAction);
+ captureCancelButton.addEventListener('click', function () {
destroyCameraPreview();
- errorCallback('Camera intitialization error ' + err);
- });
- }, errorCallback);
+ errorCallback('Cancelled');
+ }, false);
+
+ // Get available aspect ratios
+ var aspectRatios = getAspectRatios(capture);
+
+ // Couldn't find a good ratio
+ if (aspectRatios.length === 0) {
+ destroyCameraPreview();
+ errorCallback('There\'s not a good aspect ratio available');
+ return;
+ }
+
+ if (aspectRatios.indexOf(DEFAULT_ASPECT_RATIO) > -1) {
+ return setAspectRatio(capture, DEFAULT_ASPECT_RATIO);
+ } else {
+ // Doesn't support 16:9 - pick next best
+ return setAspectRatio(capture, aspectRatios[0]);
+ }
+ }).done(null, function (err) {
+ destroyCameraPreview();
+ errorCallback('Camera intitialization error ' + err);
+ });
};
var destroyCameraPreview = function () {
@@ -438,6 +459,61 @@ function takePictureFromCameraWP(successCallback, errorCallback, args) {
});
};
+ var getAspectRatios = function (capture) {
+ var photoAspectRatios = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.photo).map(function (element) {
+ return (element.width / element.height).toFixed(1);
+ }).filter(function (element, index, array) { return (index === array.indexOf(element)); });
+
+ var videoAspectRatios = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.videoRecord).map(function (element) {
+ return (element.width / element.height).toFixed(1);
+ }).filter(function (element, index, array) { return (index === array.indexOf(element)); });
+
+ var videoPreviewAspectRatios = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.videoPreview).map(function (element) {
+ return (element.width / element.height).toFixed(1);
+ }).filter(function (element, index, array) { return (index === array.indexOf(element)); });
+
+ var allAspectRatios = [].concat(photoAspectRatios, videoAspectRatios, videoPreviewAspectRatios);
+
+ var aspectObj = allAspectRatios.reduce(function (map, item) {
+ if (!map[item]) {
+ map[item] = 0;
+ }
+ map[item]++;
+ return map;
+ }, {});
+
+ return Object.keys(aspectObj).filter(function (k) {
+ return aspectObj[k] === 3;
+ });
+ };
+
+ var setAspectRatio = function (capture, aspect) {
+ // Max photo resolution with desired aspect ratio
+ var photoResolution = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.photo).filter(function (elem) {
+ return ((elem.width / elem.height).toFixed(1) === aspect);
+ }).reduce(function (prop1, prop2) {
+ return (prop1.width * prop1.height) > (prop2.width * prop2.height) ? prop1 : prop2;
+ });
+
+ // Max video resolution with desired aspect ratio
+ var videoRecordResolution = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.videoRecord).filter(function (elem) {
+ return ((elem.width / elem.height).toFixed(1) === aspect);
+ }).reduce(function (prop1, prop2) {
+ return (prop1.width * prop1.height) > (prop2.width * prop2.height) ? prop1 : prop2;
+ });
+
+ // Max video preview resolution with desired aspect ratio
+ var videoPreviewResolution = capture.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.videoPreview).filter(function (elem) {
+ return ((elem.width / elem.height).toFixed(1) === aspect);
+ }).reduce(function (prop1, prop2) {
+ return (prop1.width * prop1.height) > (prop2.width * prop2.height) ? prop1 : prop2;
+ });
+
+ return capture.videoDeviceController.setMediaStreamPropertiesAsync(Windows.Media.Capture.MediaStreamType.photo, photoResolution)
+ .then(function () { return capture.videoDeviceController.setMediaStreamPropertiesAsync(Windows.Media.Capture.MediaStreamType.videoPreview, videoPreviewResolution); })
+ .then(function () { return capture.videoDeviceController.setMediaStreamPropertiesAsync(Windows.Media.Capture.MediaStreamType.videoRecord, videoRecordResolution); });
+ };
+
try {
createCameraUI();
startCameraPreview();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org