/* * ==================================== * Class VideoUtil * Source: packages/web/sharedjs/utils * ==================================== * */ /*globals $, _ */ 'use strict'; var AXIS = AXIS || {}; AXIS.VideoResolutions = function() { }; AXIS.VideoResolutions.RESOLUTIONS = { '16CIF': { 'NTSC': {'default': '1280x960', 'squarePixel': '1280x960' }, 'PAL': {'default': '1536x1152', 'squarePixel': '1536x1152' } }, 'D1': { 'NTSC': {'default': '720x480', 'squarePixel': '640x480' }, 'PAL': {'default': '720x576', 'squarePixel': '768x576' } }, '4CIF': { 'NTSC': {'default': '704x480', 'squarePixel': '640x480' }, 'PAL': {'default': '704x576', 'squarePixel': '768x576' } }, '2CIFEXP': { 'NTSC': {'default': '704x480', 'squarePixel': '640x480' }, 'PAL': {'default': '768x576', 'squarePixel': '768x576' } }, '2CIF': { 'NTSC': {'default': '704x240', 'squarePixel': '640x240' }, 'PAL': {'default': '704x288', 'squarePixel': '768x288' } }, 'CIF': { 'NTSC': {'default': '352x240', 'squarePixel': '320x240' }, 'PAL': {'default': '352x288', 'squarePixel': '384x288' } }, 'QCIF': { 'NTSC': {'default': '176x120', 'squarePixel': '160x120' }, 'PAL': {'default': '176x144', 'squarePixel': '192x144' } }, 'XGA': { 'NTSC': {'default': '1024x768', 'squarePixel': '1024x768' }, 'PAL': {'default': '1024x768', 'squarePixel': '1024x768' } } }; AXIS.VideoResolutions.getRatioFromResolution = function(resolution, detectedType, isSquarePixelEnabled) { var gcd, temp, divisor, numerator, denominator; // Greatest common divisor gcd = function(a, b) { if (b === 0) return a; return gcd(b, a % b); }; var resolutionSet = AXIS.VideoResolutions.RESOLUTIONS[resolution]; if (!_.isUndefined(resolutionSet)) { if (_.isUndefined(resolutionSet[detectedType])) throw new Error('Bad argument: detectedType'); resolution = AXIS.VideoResolutions.getAnalogueResolution(resolution, detectedType, isSquarePixelEnabled); } numerator = parseInt(resolution.split('x')[0], 10); denominator = parseInt(resolution.split('x')[1], 10); // take care of some simple cases if (!AXIS.BaseValidator.isInt(numerator) || !AXIS.BaseValidator.isInt(denominator)) return '?:?'; if (numerator === denominator) return '1:1'; // make sure numerator is always the larger number if (+numerator < +denominator) { temp = numerator; numerator = denominator; denominator = temp; } divisor = gcd(+numerator, +denominator); return 'undefined' === typeof temp ? (numerator / divisor) + ':' + (denominator / divisor) : (denominator / divisor) + ':' + (numerator / divisor); }; AXIS.VideoResolutions.resolutionsToArray = function(resolutions) { if (resolutions instanceof Array) { return resolutions; } var delimiter = ','; if (resolutions.indexOf(delimiter) === -1) { delimiter = ','; } return resolutions.split(delimiter); }; AXIS.VideoResolutions.getResolutionsByRatio = function(resolutions, ratio, detectedType, isSquarePixelEnabled) { var i, filteredList = [], resList = AXIS.VideoResolutions.resolutionsToArray(resolutions), res; for (i = 0; i < resList.length; i++) { res = resList[i]; if (AXIS.VideoResolutions.getRatioFromResolution(res, detectedType, isSquarePixelEnabled).localeCompare(ratio) === 0) { filteredList.push(res); } } return filteredList.join(','); }; AXIS.VideoResolutions.getClosestResolution = function(resolutions, nearTo, detectedType, isSquarePixelEnabled) { var i, resList = AXIS.VideoResolutions.resolutionsToArray(resolutions), res, w, h, nearest, nearestItem; for (i = 0; i < resList.length; i++) { res = resList[i]; if (!_.isUndefined(AXIS.VideoResolutions.RESOLUTIONS[res])) { res = AXIS.VideoResolutions.getAnalogueResolution(res, detectedType, isSquarePixelEnabled); } w = parseInt(res.split('x')[0], 10); if (_.isUndefined(nearest) || Math.abs(w - nearTo) < Math.abs(nearest - nearTo)) { nearest = w; nearestItem = res; } } w = parseInt(nearestItem.split('x')[0], 10); h = parseInt(nearestItem.split('x')[1], 10); return [w, h]; }; AXIS.VideoResolutions.getAnalogueResolution = function(value, detectedType, isSquarePixelEnabled) { var resolutionSet = AXIS.VideoResolutions.RESOLUTIONS[value]; var resolutionType; if (!_.isUndefined(resolutionSet)) { resolutionType = resolutionSet[detectedType]; if (!_.isUndefined(resolutionType)) { if (_.isUndefined(isSquarePixelEnabled) || !isSquarePixelEnabled) { return resolutionSet[detectedType]['default']; } else { return resolutionSet[detectedType]['squarePixel']; } } } return null; };