Renamed flipX, flipY to flipH, flipV, made update upon change instant, also made timelapse video reflect flipped webcam

master
Bryan Mayland 2013-06-20 17:41:10 +02:00 committed by Gina Häußge
parent ecfdb37f93
commit 329656837a
7 changed files with 60 additions and 36 deletions

View File

@ -119,9 +119,7 @@ def index():
enableGCodeVisualizer=settings().get(["feature", "gCodeVisualizer"]), enableGCodeVisualizer=settings().get(["feature", "gCodeVisualizer"]),
enableSystemMenu=settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0, enableSystemMenu=settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0,
enableAccessControl=userManager is not None, enableAccessControl=userManager is not None,
enableSdSupport=settings().get(["feature", "sdSupport"]), enableSdSupport=settings().get(["feature", "sdSupport"])
webcamFlipX=settings().get(["webcam", "flipX"]),
webcamFlipY=settings().get(["webcam", "flipY"])
) )
#~~ Printer control #~~ Printer control
@ -435,8 +433,8 @@ def getSettings():
"ffmpegPath": s.get(["webcam", "ffmpeg"]), "ffmpegPath": s.get(["webcam", "ffmpeg"]),
"bitrate": s.get(["webcam", "bitrate"]), "bitrate": s.get(["webcam", "bitrate"]),
"watermark": s.getBoolean(["webcam", "watermark"]), "watermark": s.getBoolean(["webcam", "watermark"]),
"flipX": s.getBoolean(["webcam", "flipX"]), "flipH": s.getBoolean(["webcam", "flipH"]),
"flipY": s.getBoolean(["webcam", "flipY"]) "flipV": s.getBoolean(["webcam", "flipV"])
}, },
"feature": { "feature": {
"gcodeViewer": s.getBoolean(["feature", "gCodeVisualizer"]), "gcodeViewer": s.getBoolean(["feature", "gCodeVisualizer"]),
@ -483,8 +481,8 @@ def setSettings():
if "ffmpegPath" in data["webcam"].keys(): s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"]) if "ffmpegPath" in data["webcam"].keys(): s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"])
if "bitrate" in data["webcam"].keys(): s.set(["webcam", "bitrate"], data["webcam"]["bitrate"]) if "bitrate" in data["webcam"].keys(): s.set(["webcam", "bitrate"], data["webcam"]["bitrate"])
if "watermark" in data["webcam"].keys(): s.setBoolean(["webcam", "watermark"], data["webcam"]["watermark"]) if "watermark" in data["webcam"].keys(): s.setBoolean(["webcam", "watermark"], data["webcam"]["watermark"])
if "flipX" in data["webcam"].keys(): s.setBoolean(["webcam", "flipX"], data["webcam"]["flipX"]) if "flipH" in data["webcam"].keys(): s.setBoolean(["webcam", "flipH"], data["webcam"]["flipH"])
if "flipY" in data["webcam"].keys(): s.setBoolean(["webcam", "flipY"], data["webcam"]["flipY"]) if "flipV" in data["webcam"].keys(): s.setBoolean(["webcam", "flipV"], data["webcam"]["flipV"])
if "feature" in data.keys(): if "feature" in data.keys():
if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["feature", "gCodeVisualizer"], data["feature"]["gcodeViewer"]) if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["feature", "gCodeVisualizer"], data["feature"]["gcodeViewer"])

View File

@ -36,8 +36,8 @@ default_settings = {
"ffmpeg": None, "ffmpeg": None,
"bitrate": "5000k", "bitrate": "5000k",
"watermark": True, "watermark": True,
"flipX": False, "flipH": False,
"flipY": False "flipV": False
}, },
"feature": { "feature": {
"gCodeVisualizer": True, "gCodeVisualizer": True,

View File

@ -358,18 +358,21 @@ ul.dropdown-menu li a {
#webcam_container { #webcam_container {
width: 100%; width: 100%;
}
#webcam_container.flipX { .flipH {
-webkit-transform: scaleX(-1); -webkit-transform: scaleX(-1);
-moz-transform: scaleX(-1); -moz-transform: scaleX(-1);
} }
#webcam_container.flipY {
-webkit-transform: scaleY(-1); .flipV {
-moz-transform: scaleY(-1); -webkit-transform: scaleY(-1);
} -moz-transform: scaleY(-1);
#webcam_container.flipX.flipY { }
-webkit-transform: scaleX(-1) scaleY(-1);
-moz-transform: scaleX(-1) scaleY(-1); .flipH.flipV {
-webkit-transform: scaleX(-1) scaleY(-1);
-moz-transform: scaleX(-1) scaleY(-1);
}
} }
/** GCODE file manager */ /** GCODE file manager */

View File

@ -526,10 +526,11 @@ function TemperatureViewModel(loginStateViewModel, settingsViewModel) {
} }
} }
function ControlViewModel(loginStateViewModel) { function ControlViewModel(loginStateViewModel, settingsViewModel) {
var self = this; var self = this;
self.loginState = loginStateViewModel; self.loginState = loginStateViewModel;
self.settings = settingsViewModel;
self.isErrorOrClosed = ko.observable(undefined); self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined); self.isOperational = ko.observable(undefined);
@ -1328,8 +1329,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
self.webcam_ffmpegPath = ko.observable(undefined); self.webcam_ffmpegPath = ko.observable(undefined);
self.webcam_bitrate = ko.observable(undefined); self.webcam_bitrate = ko.observable(undefined);
self.webcam_watermark = ko.observable(undefined); self.webcam_watermark = ko.observable(undefined);
self.webcam_flipX = ko.observable(undefined); self.webcam_flipH = ko.observable(undefined);
self.webcam_flipY = ko.observable(undefined); self.webcam_flipV = ko.observable(undefined);
self.feature_gcodeViewer = ko.observable(undefined); self.feature_gcodeViewer = ko.observable(undefined);
self.feature_waitForStart = ko.observable(undefined); self.feature_waitForStart = ko.observable(undefined);
@ -1377,8 +1378,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
self.webcam_ffmpegPath(response.webcam.ffmpegPath); self.webcam_ffmpegPath(response.webcam.ffmpegPath);
self.webcam_bitrate(response.webcam.bitrate); self.webcam_bitrate(response.webcam.bitrate);
self.webcam_watermark(response.webcam.watermark); self.webcam_watermark(response.webcam.watermark);
self.webcam_flipX(response.webcam.flipX); self.webcam_flipH(response.webcam.flipH);
self.webcam_flipY(response.webcam.flipY); self.webcam_flipV(response.webcam.flipV);
self.feature_gcodeViewer(response.feature.gcodeViewer); self.feature_gcodeViewer(response.feature.gcodeViewer);
self.feature_waitForStart(response.feature.waitForStart); self.feature_waitForStart(response.feature.waitForStart);
@ -1414,15 +1415,14 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) {
"ffmpegPath": self.webcam_ffmpegPath(), "ffmpegPath": self.webcam_ffmpegPath(),
"bitrate": self.webcam_bitrate(), "bitrate": self.webcam_bitrate(),
"watermark": self.webcam_watermark(), "watermark": self.webcam_watermark(),
"flipX": self.webcam_flipX(), "flipH": self.webcam_flipH(),
"flipY": self.webcam_flipY() "flipV": self.webcam_flipV()
}, },
"feature": { "feature": {
"gcodeViewer": self.feature_gcodeViewer(), "gcodeViewer": self.feature_gcodeViewer(),
"waitForStart": self.feature_waitForStart(), "waitForStart": self.feature_waitForStart(),
"alwaysSendChecksum": self.feature_alwaysSendChecksum(), "alwaysSendChecksum": self.feature_alwaysSendChecksum(),
"resetLineNumbersWithPrefixedN": self.feature_resetLineNumbersWithPrefixedN(), "resetLineNumbersWithPrefixedN": self.feature_resetLineNumbersWithPrefixedN(),
"waitForStart": self.feature_waitForStart(),
"sdSupport": self.feature_sdSupport() "sdSupport": self.feature_sdSupport()
}, },
"folder": { "folder": {
@ -1837,7 +1837,7 @@ $(function() {
var settingsViewModel = new SettingsViewModel(loginStateViewModel, usersViewModel); var settingsViewModel = new SettingsViewModel(loginStateViewModel, usersViewModel);
var appearanceViewModel = new AppearanceViewModel(settingsViewModel); var appearanceViewModel = new AppearanceViewModel(settingsViewModel);
var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel); var temperatureViewModel = new TemperatureViewModel(loginStateViewModel, settingsViewModel);
var controlViewModel = new ControlViewModel(loginStateViewModel); var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel);
var terminalViewModel = new TerminalViewModel(loginStateViewModel); var terminalViewModel = new TerminalViewModel(loginStateViewModel);
var gcodeFilesViewModel = new GcodeFilesViewModel(loginStateViewModel); var gcodeFilesViewModel = new GcodeFilesViewModel(loginStateViewModel);
var timelapseViewModel = new TimelapseViewModel(loginStateViewModel); var timelapseViewModel = new TimelapseViewModel(loginStateViewModel);

View File

@ -310,8 +310,8 @@
</div> </div>
<div class="tab-pane" id="control"> <div class="tab-pane" id="control">
{% if webcamStream %} {% if webcamStream %}
<div id="webcam_container" class="{{ 'flipX' if webcamFlipX else '' }} {{ 'flipY' if webcamFlipY else '' }}"> <div id="webcam_container">
<img id="webcam_image" src="{{ webcamStream }}"> <img id="webcam_image" src="{{ webcamStream }}" data-bind="css: { flipH: settings.webcam_flipH(), flipV: settings.webcam_flipV() }">
</div> </div>
{% endif %} {% endif %}

View File

@ -92,12 +92,12 @@
<div class="control-group"> <div class="control-group">
<div class="controls"> <div class="controls">
<label class="checkbox"> <label class="checkbox">
<input type="checkbox" data-bind="checked: webcam_flipX" id="settings-flipX"> Flip webcam horizontally <input type="checkbox" data-bind="checked: webcam_flipH" id="settings-webcamFlipH"> Flip webcam horizontally
</label> </label>
</div> </div>
<div class="controls"> <div class="controls">
<label class="checkbox"> <label class="checkbox">
<input type="checkbox" data-bind="checked: webcam_flipY" id="settings-flipY"> Flip webcam vertically <input type="checkbox" data-bind="checked: webcam_flipV" id="settings-webcamFlipV"> Flip webcam vertically
</label> </label>
</div> </div>
</div> </div>

View File

@ -106,19 +106,42 @@ class Timelapse(object):
ffmpeg, '-i', input, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', bitrate, ffmpeg, '-i', input, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', bitrate,
'-f', 'vob'] '-f', 'vob']
filters = []
# flip video if configured
if settings().getBoolean(["webcam", "flipX"]):
filters.append('hflip')
if settings().getBoolean(["webcam", "flipY"]):
filters.append('vflip')
# add watermark if configured # add watermark if configured
watermarkFilter = None
if settings().getBoolean(["webcam", "watermark"]): if settings().getBoolean(["webcam", "watermark"]):
watermark = os.path.join(os.path.dirname(__file__), "static", "img", "watermark.png") watermark = os.path.join(os.path.dirname(__file__), "static", "img", "watermark.png")
if sys.platform == "win32": if sys.platform == "win32":
# Because ffmpeg hiccups on windows' drive letters and backslashes we have to give the watermark # Because ffmpeg hiccups on windows' drive letters and backslashes we have to give the watermark
# path a special treatment. Yeah, I couldn't believe it either... # path a special treatment. Yeah, I couldn't believe it either...
watermark = watermark.replace("\\", "/").replace(":", "\\\\:") watermark = watermark.replace("\\", "/").replace(":", "\\\\:")
command.extend(['-vf', 'movie=%s [wm]; [in][wm] overlay=10:main_h-overlay_h-10 [out]' % watermark])
watermarkFilter = "movie=%s [wm]; [%%(inputName)s][wm] overlay=10:main_h-overlay_h-10" % watermark
filterstring = None
if len(filters) > 0:
if watermarkFilter is not None:
filterstring = "[in] %s [postprocessed]; %s [out]" % (",".join(filters), watermarkFilter % {"inputName": "postprocessed"})
else:
filterstring = "[in] %s [out]" % ",".join(filters)
elif watermarkFilter is not None:
filterstring = watermarkFilter % {"inputName": "in"} + " [out]"
if filterstring is not None:
self._logger.debug("Applying videofilter chain: %s" % filterstring)
command.extend(["-vf", filterstring])
# finalize command with output file # finalize command with output file
command.append(output) command.append(output)
subprocess.call(command)
self._logger.debug("Rendering movie to %s" % output) self._logger.debug("Rendering movie to %s" % output)
subprocess.call(command)
def cleanCaptureDir(self): def cleanCaptureDir(self):
if not os.path.isdir(self._captureDir): if not os.path.isdir(self._captureDir):