Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Timelapse FPS option #782

Merged
merged 3 commits into from Feb 24, 2015
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

@@ -30,9 +30,11 @@ def getTimelapseData():
if timelapse is not None and isinstance(timelapse, octoprint.timelapse.ZTimelapse):
config["type"] = "zchange"
config["postRoll"] = timelapse.postRoll()
config["fps"] = timelapse.fps()
elif timelapse is not None and isinstance(timelapse, octoprint.timelapse.TimedTimelapse):
config["type"] = "timed"
config["postRoll"] = timelapse.postRoll()
config["fps"] = timelapse.fps()
config.update({
"interval": timelapse.interval()
})
@@ -70,6 +72,7 @@ def setTimelapseConfig():
config = {
"type": request.values["type"],
"postRoll": 0,
"fps": 25,
"options": {}
}

@@ -80,6 +83,12 @@ def setTimelapseConfig():
except ValueError:
pass

if "fps" in request.values:
try:
config["fps"] = int(request.values["fps"])
except ValueError:
pass

if "interval" in request.values:
interval = 10
try:
@@ -68,7 +68,8 @@ def settings(init=False, configfile=None, basedir=None):
"timelapse": {
"type": "off",
"options": {},
"postRoll": 0
"postRoll": 0,
"fps": 25
}
},
"gcodeViewer": {

Large diffs are not rendered by default.

@@ -7,6 +7,7 @@ $(function() {
self.timelapseType = ko.observable(undefined);
self.timelapseTimedInterval = ko.observable(undefined);
self.timelapsePostRoll = ko.observable(undefined);
self.timelapseFps = ko.observable(undefined);

self.persist = ko.observable(false);
self.isDirty = ko.observable(false);
@@ -42,6 +43,9 @@ $(function() {
self.timelapsePostRoll.subscribe(function(newValue) {
self.isDirty(true);
});
self.timelapseFps.subscribe(function(newValue) {
self.isDirty(true);
});

// initialize list helper
self.listHelper = new ItemListHelper(
@@ -91,17 +95,25 @@ $(function() {
self.listHelper.updateItems(response.files);

if (config.type == "timed") {
if (response.config.interval != undefined && response.config.interval > 0) {
self.timelapseTimedInterval(response.config.interval);
}
if (response.config.postRoll != undefined && response.config.postRoll >= 0) {
self.timelapsePostRoll(response.config.postRoll);
if (config.interval != undefined && config.interval > 0) {
self.timelapseTimedInterval(config.interval);
}
} else {
self.timelapseTimedInterval(undefined);
}

if (config.postRoll != undefined && config.postRoll >= 0) {
self.timelapsePostRoll(config.postRoll);
} else {
self.timelapsePostRoll(undefined);
}

if (config.fps != undefined && config.fps >= 0) {
self.timelapseFps(config.fps);
} else {
self.timelapseFps(undefined);
}

self.persist(false);
self.isDirty(false);
};
@@ -137,6 +149,7 @@ $(function() {
var payload = {
"type": self.timelapseType(),
"postRoll": self.timelapsePostRoll(),
"fps": self.timelapseFps(),
"save": self.persist()
};

@@ -167,4 +180,4 @@ $(function() {
["loginStateViewModel"],
"#timelapse"
]);
});
});
@@ -323,7 +323,7 @@ table {
}

#temp_newTemp, #temp_newBedTemp, #speed_innerWall, #speed_outerWall, #speed_fill, #speed_support,
#webcam_timelapse_interval, #webcam_timelapse_postRoll {
#webcam_timelapse_interval, #webcam_timelapse_postRoll, #webcam_timelapse_fps {
text-align: right;
}

@@ -22,6 +22,12 @@
</div>
</div>

<label for="webcam_timelapse_fps">{{ _('Timelapse fps') }}</label>
<div class="input-append">
<input type="text" class="input-mini" id="webcam_timelapse_fps" data-bind="value: timelapseFps, valueUpdate: 'afterkeydown', enable: isOperational() && !isPrinting() && loginState.isUser() && timelapseTypeSelected()">
<span class="add-on">{{ _('fps') }}</span>
</div>

<div data-bind="visible: loginState.isAdmin">
<label class="checkbox">
<input type="checkbox" data-bind="checked: persist"> {{ _('Save as default') }}
@@ -79,15 +79,19 @@ def configureTimelapse(config=None, persist=False):
if "postRoll" in config:
postRoll = config["postRoll"]

fps = 25
if "fps" in config:
fps = config["fps"]

if type is None or "off" == type:
current = None
elif "zchange" == type:
current = ZTimelapse(postRoll=postRoll)
current = ZTimelapse(postRoll=postRoll, fps=fps)
elif "timed" == type:
interval = 10
if "options" in config and "interval" in config["options"]:
interval = config["options"]["interval"]
current = TimedTimelapse(postRoll=postRoll, interval=interval)
current = TimedTimelapse(postRoll=postRoll, interval=interval, fps=fps)

notifyCallbacks(current)

@@ -97,7 +101,7 @@ def configureTimelapse(config=None, persist=False):


class Timelapse(object):
def __init__(self, postRoll=0):
def __init__(self, postRoll=0, fps=25):
self._logger = logging.getLogger(__name__)
self._imageNumber = None
self._inTimelapse = False
@@ -111,7 +115,7 @@ def __init__(self, postRoll=0):
self._movieDir = settings().getBaseFolder("timelapse")
self._snapshotUrl = settings().get(["webcam", "snapshot"])

self._fps = 25
self._fps = fps

self._renderThread = None
self._captureMutex = threading.Lock()
@@ -127,6 +131,9 @@ def __init__(self, postRoll=0):
def postRoll(self):
return self._postRoll

def fps(self):
return self._fps

def unload(self):
if self._inTimelapse:
self.stopTimelapse(doCreateMovie=False)
@@ -267,7 +274,7 @@ def _createMovie(self, success=True):

# prepare ffmpeg command
command = [
ffmpeg, '-loglevel', 'error', '-i', input, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', str(self._fps), '-y', '-b:v', bitrate,
ffmpeg, '-framerate', str(self._fps), '-loglevel', 'error', '-i', input, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', str(self._fps), '-y', '-b', bitrate,
'-f', 'vob']

filters = []
@@ -335,8 +342,8 @@ def cleanCaptureDir(self):


class ZTimelapse(Timelapse):
def __init__(self, postRoll=0):
Timelapse.__init__(self, postRoll=postRoll)
def __init__(self, postRoll=0, fps=25):
Timelapse.__init__(self, postRoll=postRoll, fps=fps)
self._logger.debug("ZTimelapse initialized")

def eventSubscriptions(self):
@@ -370,8 +377,8 @@ def _onZChange(self, event, payload):


class TimedTimelapse(Timelapse):
def __init__(self, postRoll=0, interval=1):
Timelapse.__init__(self, postRoll=postRoll)
def __init__(self, postRoll=0, interval=1, fps=25):
Timelapse.__init__(self, postRoll=postRoll, fps=fps)
self._interval = interval
if self._interval < 1:
self._interval = 1 # force minimum interval of 1s
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.