added a config option to disable server side image resizing
authorCalin Crisan <ccrisan@gmail.com>
Sun, 19 Jan 2014 11:21:51 +0000 (13:21 +0200)
committerCalin Crisan <ccrisan@gmail.com>
Sun, 19 Jan 2014 11:21:51 +0000 (13:21 +0200)
src/config.py
src/handlers.py
src/mediafiles.py
static/js/main.js
templates/main.html

index 75f63cfb7fe7bb83fbb7b1163393ca75daceb34f..3f7f968ca9679665c93c9b8c5aa6510a11b375bb 100644 (file)
@@ -442,6 +442,7 @@ def camera_ui_to_dict(ui):
         'webcam_maxrate': int(ui['streaming_framerate']),
         'webcam_quality': max(1, int(ui['streaming_quality'])),
         '@webcam_resolution': max(1, int(ui['streaming_resolution'])),
+        '@webcam_server_resize': ui['streaming_server_resize'],
         'webcam_motion': ui['streaming_motion'],
         
         # still images
@@ -613,6 +614,7 @@ def camera_dict_to_ui(data):
         'streaming_framerate': int(data['webcam_maxrate']),
         'streaming_quality': int(data['webcam_quality']),
         'streaming_resolution': int(data['@webcam_resolution']),
+        'streaming_server_resize': int(data['@webcam_server_resize']),
         'streaming_port': int(data['webcam_port']),
         'streaming_motion': int(data['webcam_motion']),
         
@@ -953,6 +955,7 @@ def _set_default_motion_camera(camera_id, data):
     data.setdefault('webcam_maxrate', 5)
     data.setdefault('webcam_quality', 85)
     data.setdefault('@webcam_resolution', 100)
+    data.setdefault('@webcam_server_resize', True)
     data.setdefault('webcam_motion', False)
     
     data.setdefault('text_left', data['@name'])
index f4622f7d89bed4354d11347ccbfbfd95b7b27fc1..c3cb5319b382c63fc666f7375e8e170773dea680 100644 (file)
@@ -294,7 +294,8 @@ class ConfigHandler(BaseHandler):
         
         if camera_id is not None:
             if camera_id == 0: # multiple camera configs
-                logging.debug('setting multiple configs')
+                if len(ui_config) > 1:
+                    logging.debug('setting multiple configs')
                 
                 so_far = [0]
                 def check_finished(e, r):
index 03538baa85486e5364b8e2b6b25bad201de23cba..af01a8fc2dbc24c806a1ab4af860832b16d36d0c 100644 (file)
@@ -378,7 +378,7 @@ def get_picture_cache(camera_id, sequence, width):
     cache = _current_pictures_cache.setdefault(camera_id, [])
 
     for (seq, w, content) in cache:
-        if (seq >= sequence) and (width >= w):
+        if (seq >= sequence) and ((width is w is None) or (width >= w)):
             return content
         
     return None
index 61e6147a3ef72e391d04803e7085b8f2b2270bca..4b01724ce326a69a31d0a40990b649af5e222015 100644 (file)
@@ -77,6 +77,16 @@ Object.keys = Object.keys || (function () {
     };
 })();
 
+Object.update = function (dest, source) {
+    for (var key in source) {
+        if (!source.hasOwnProperty(key)) {
+            continue;
+        }
+        
+        dest[key] = source[key];
+    }
+};
+
 Array.prototype.indexOf = Array.prototype.indexOf || function (obj) {
     for (var i = 0; i < this.length; i++) {
         if (this[i] === obj) {
@@ -232,6 +242,7 @@ function initUI() {
     $('#videoDeviceSwitch').change(updateConfigUi);
     $('#textOverlaySwitch').change(updateConfigUi);
     $('#videoStreamingSwitch').change(updateConfigUi);
+    $('#streamingServerResizeSwitch').change(updateConfigUi);
     $('#stillImagesSwitch').change(updateConfigUi);
     $('#motionMoviesSwitch').change(updateConfigUi);
     $('#motionNotificationsSwitch').change(updateConfigUi);
@@ -403,6 +414,11 @@ function updateConfigUi() {
         $('#videoStreamingSwitch').parent().next('table.settings').find('tr.settings-item').not('.local-streaming').each(markHide);
     }
     
+    /* streaming server resize switch */
+    if (!$('#streamingServerResizeSwitch').get(0).checked) {
+        $('#streamingResolutionSlider').parents('tr:eq(0)').each(markHide);
+    }
+    
     /* still images switch */
     if (!$('#stillImagesSwitch').get(0).checked) {
         $('#stillImagesSwitch').parent().next('table.settings').find('tr.settings-item').each(markHide);
@@ -552,6 +568,7 @@ function cameraUi2Dict() {
         'streaming_framerate': $('#streamingFramerateSlider').val(),
         'streaming_quality': $('#streamingQualitySlider').val(),
         'streaming_resolution': $('#streamingResolutionSlider').val(),
+        'streaming_server_resize': $('#streamingServerResizeSwitch')[0].checked,
         'streaming_port': $('#streamingPortEntry').val(),
         'streaming_motion': $('#streamingMotion')[0].checked,
         
@@ -683,6 +700,7 @@ function dict2CameraUi(dict) {
     $('#streamingFramerateSlider').val(dict['streaming_framerate']);
     $('#streamingQualitySlider').val(dict['streaming_quality']);
     $('#streamingResolutionSlider').val(dict['streaming_resolution']);
+    $('#streamingServerResizeSwitch')[0].checked = dict['streaming_server_resize'];
     $('#streamingPortEntry').val(dict['streaming_port']);
     $('#streamingMotion')[0].checked = dict['streaming_motion'];
     
@@ -1068,6 +1086,9 @@ function pushCameraConfig() {
     if (!isApplyVisible()) {
         showApply();
     }
+    
+    /* also update the config stored in the camera frame div */
+    Object.update($('div.camera-frame#camera' + cameraId)[0].config, cameraConfig);
 }
 
 function pushPreview(control) {
@@ -1929,7 +1950,7 @@ function doFullScreenCamera(cameraId) {
 }
 
 function refreshCameraFrames() {
-    function refreshCameraFrame(cameraId, img, fast) {
+    function refreshCameraFrame(cameraId, img, fast, serverSideResize) {
         if (refreshDisabled[cameraId]) {
             /* camera refreshing disabled, retry later */
             
@@ -1952,7 +1973,13 @@ function refreshCameraFrames() {
             timestamp /= 500;
         }
         timestamp = Math.round(timestamp);
-        img.src = '/picture/' + cameraId + '/current/?seq=' + timestamp + '&width=' + img.width;
+        
+        var uri = '/picture/' + cameraId + '/current/?seq=' + timestamp;
+        if (serverSideResize) {
+            uri += '&width=' + img.width;
+        }
+        
+        img.src = uri;
         img.loading = 1;
     }
     
@@ -1967,6 +1994,7 @@ function refreshCameraFrames() {
     cameraFrames.each(function () {
         /* limit the refresh rate to 10 fps */
         var count = Math.max(1, 10 / this.framerate);
+        var serverSideResize = this.config['streaming_server_resize'];
         var img = $(this).find('img.camera')[0];
         
         if (img.error) {
@@ -1979,7 +2007,7 @@ function refreshCameraFrames() {
         }
         else {
             var cameraId = this.id.substring(6);
-            refreshCameraFrame(cameraId, img, count <= 2); /* count <= 2 means at least 5 fps */
+            refreshCameraFrame(cameraId, img, count <= 2, serverSideResize); /* count <= 2 means at least 5 fps */
             
             this.refreshDivider = 0;
         }
index b20fed626cf304fbcce309541f0fcf589713345a..89b54efd353d6b571f5918ed32bea5fa55b28959 100644 (file)
                         <td class="settings-item-value"><input type="text" class="range styled streaming" id="streamingQualitySlider"></td>
                         <td><span class="help-mark" title="sets the live streaming quality (higher values produce a better video quality but require more bandwidth)">?</span></td>
                     </tr>
+                    <tr class="settings-item advanced-setting local-streaming">
+                        <td class="settings-item-label"><span class="settings-item-label">Streaming Image Resizing</span></td>
+                        <td class="settings-item-value"><input type="checkbox" class="styled streaming" id="streamingServerResizeSwitch"></td>
+                        <td><span class="help-mark" title="when this is enabled, the images are resized by motionEye before they are sent to the browser (disable when running motionEye on a slow CPU)">?</span></td>
+                    </tr>
                     <tr class="settings-item advanced-setting local-streaming">
                         <td class="settings-item-label"><span class="settings-item-label">Streaming Resolution</span></td>
                         <td class="settings-item-value"><input type="text" class="range styled streaming" id="streamingResolutionSlider"></td>