Renamed flipX, flipY to flipH, flipV, made update upon change instant, also made timelapse video reflect flipped webcam
parent
ecfdb37f93
commit
329656837a
|
@ -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"])
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue