Rework LuCI build system
[project/luci.git] / applications / luci-app-mjpg-streamer / luasrc / model / cbi / mjpg-streamer.lua
diff --git a/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua b/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua
new file mode 100644 (file)
index 0000000..1a627a6
--- /dev/null
@@ -0,0 +1,235 @@
+--[[
+
+LuCI MJPEG Streamer
+
+(c) 2014 Roger D <rogerdammit@gmail.com>
+Based on work by: vargabab and OpenWrt Dreambox
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+]]--
+
+m = Map("mjpg-streamer", "MJPG-streamer", translate("mjpg streamer is a streaming application for Linux-UVC compatible webcams"))
+
+--- General settings ---
+
+section_gen = m:section(TypedSection, "mjpg-streamer", "General")
+    section_gen.addremove=false
+    section_gen.anonymous=true
+
+enabled = section_gen:option(Flag, "enabled", "Enabled", "Enable MJPG-streamer")
+
+input = section_gen:option(ListValue, "input",  "Input plugin")
+   input:depends("enabled", "1")
+   input:value("uvc", "UVC")
+   ---input:value("file", "File")
+   input.optional = false
+
+output = section_gen:option(ListValue, "output",  "Output plugin")
+   output:depends("enabled", "1")
+   output:value("http", "HTTP")
+   output:value("file", "File")
+   output.optional = false
+
+
+--- Plugin settings ---
+
+s = m:section(TypedSection, "mjpg-streamer", "Plugin settings")
+    s.addremove=false
+    s.anonymous=true
+
+    s:tab("output_http", translate("HTTP output"))
+    s:tab("output_file", translate("File output"))
+    s:tab("input_uvc", translate("UVC input"))
+    ---s:tab("input_file", translate("File input"))
+
+
+--- Input UVC settings ---
+
+this_tab = "input_uvc"
+
+device = s:taboption(this_tab, Value, "device", translate("Device"))
+    device.default="/dev/video0"
+    --device.datatype = "device"
+    device:value("/dev/video0", "/dev/video0")
+    device:value("/dev/video1", "/dev/video1")
+    device:value("/dev/video2", "/dev/video2")
+    device.optional = false
+
+resolution = s:taboption(this_tab, Value, "resolution", translate("Resolution"))
+    resolution.default = "640x480"
+    resolution:value("320x240", "320x240")
+    resolution:value("640x480", "640x480")
+    resolution:value("800x600", "800x600")
+    resolution:value("864x480", "864x480")
+    resolution:value("960x544", "960x544")
+    resolution:value("960x720", "960x720")
+    resolution:value("1280x720", "1280x720")
+    resolution:value("1280x960", "1280x960")
+    resolution:value("1920x1080", "1920x1080")
+    resolution.optional = true
+
+fps = s:taboption(this_tab, Value, "fps", translate("Frames per second"))
+    fps.datatype = "and(uinteger, min(1))"
+    fps.placeholder = "5"
+    fps.optional = true
+
+yuv = s:taboption(this_tab, Flag, "yuv", translate("Enable YUYV format"), translate("Automatic disabling of MJPEG mode"))
+
+quality = s:taboption(this_tab, Value, "quality", translate("JPEG compression quality"), translate("Set the quality in percent. This setting activates YUYV format, disables MJPEG"))
+    quality.datatype = "range(0, 100)"
+
+minimum_size = s:taboption(this_tab, Value, "minimum_size", translate("Drop frames smaller then this limit"),translate("Set the minimum size if the webcam produces small-sized garbage frames. May happen under low light conditions"))
+    minimum_size.datatype = "uinteger"
+
+no_dynctrl = s:taboption(this_tab, Flag, "no_dynctrl", translate("Don't initalize dynctrls"), translate("Do not initalize dynctrls of Linux-UVC driver"))
+
+led = s:taboption(this_tab, ListValue, "led", translate("Led control"))
+    led:value("on", translate("On"))
+    led:value("off", translate("Off"))
+    led:value("blink", translate("Blink"))
+    led:value("auto", translate("Auto"))
+    led.optional = true
+
+
+--- Output HTTP settings ---
+
+this_tab = "output_http"
+
+port=s:taboption(this_tab, Value, "port", translate("Port"), translate("TCP port for this HTTP server"))
+    port.datatype = "port"
+    port.placeholder = "8080"
+
+enable_auth = s:taboption(this_tab, Flag, "enable_auth", translate("Authentication required"), translate("Ask for username and password on connect"))
+    enable_auth.default = false
+
+username = s:taboption(this_tab, Value, "username", translate("Username"))
+    username:depends("enable_auth", "1")
+    username.optional = false
+
+password = s:taboption(this_tab, Value, "password", translate("Password"))
+    password:depends("enable_auth", "1")
+    password.password = true
+    password.optional = false
+    password.default = false
+
+www = s:taboption(this_tab, Value, "www", translate("WWW folder"), translate("Folder that contains webpages"))
+    www.datatype = "directory"
+    www.default = "/www/webcam/"
+    www.optional = false
+
+
+--- HTTP preview  ---
+
+html = [[
+<style media="screen" type="text/css">
+    .img-preview {
+        display: inline-block;
+        height: auto;
+        width: 640px;
+        padding: 4px;
+        line-height: 1.428571429;
+        background-color: #fff;
+        border: 1px solid #ddd;
+        border-radius: 4px;
+        -webkit-transition: all .2s ease-in-out;
+        transition: all .2s ease-in-out;
+        margin-bottom: 5px;
+       display: none;
+    }
+</style>
+
+<div id="videodiv">
+       <img id="video_preview" class="img-preview" onerror="on_error()" onload="on_load()"/>
+        <p id="stream_status" style="text-align: center; color: orange; font-weight:bold;">Stream unavailable</p>
+</div>
+
+<script type="text/javascript">
+
+function init_stream() {
+    console.log('init_stream');
+    start_stream()
+}
+
+function _start_stream() {
+       console.log('_start_stream');
+
+        port = document.getElementById('cbid.mjpg-streamer.core.port').value
+
+        if (document.getElementById('cbid.mjpg-streamer.core.enable_auth').checked) {
+            user = document.getElementById('cbid.mjpg-streamer.core.username').value
+            pass = document.getElementById('cbid.mjpg-streamer.core.password').value
+            login = user + ":" + pass + "@"
+        } else {
+            login = ""
+        }
+
+       img = document.getElementById('video_preview');
+       img.src = 'http://' + login + location.hostname + ':' + port + '/?action=snapshot';
+}
+
+function start_stream() {
+       console.log('start_stream');
+
+       setTimeout(function() { _start_stream(); }, 500);
+}
+
+function on_error() {
+    console.log('on_error');
+
+    img = document.getElementById('video_preview');
+    img.style.display = 'none';
+
+    stream_stat = document.getElementById('stream_status');
+    stream_stat.style.display = 'block';
+
+    start_stream();
+}
+
+function on_load() {
+    console.log('on_load');
+
+    img = document.getElementById('video_preview');
+    img.style.display = 'block';
+
+    stream_stat = document.getElementById('stream_status');
+    stream_stat.style.display = 'none';
+}
+
+init_stream()
+
+</script>
+]]
+
+preview = s:taboption(this_tab, DummyValue, "_dummy", html)
+    preview:depends("output", "http")
+
+--- Output file settings ---
+
+this_tab = "output_file"
+
+folder=s:taboption(this_tab, Value, "folder", translate("Folder"), translate("Set folder to save pictures"))
+    folder.placeholder="/tmp/images"
+    folder.datatype = "directory"
+
+--mjpeg=s:taboption(this_tab, Value, "mjpeg", translate("Mjpeg output"), translate("Check to save the stream to an mjpeg file"))
+
+delay=s:taboption(this_tab, Value, "delay", translate("Interval between saving pictures"), translate("Set the inteval in millisecond"))
+    delay.placeholder="5000"
+    delay.datatype = "uinteger"
+
+ringbuffer=s:taboption(this_tab, Value, "ringbuffer", translate("Ring buffer size"), translate("Max. number of pictures to hold"))
+    ringbuffer.placeholder="10"
+    ringbuffer.datatype = "uinteger"
+
+exceed=s:taboption(this_tab, Value, "exceed", translate("Exceed"), translate("Allow ringbuffer to exceed limit by this amount"))
+    exceed.datatype = "uinteger"
+
+command=s:taboption(this_tab, Value, "command", translate("Command to run"), translate("Execute command after saving picture. Mjpg-streamer parse the filename as first parameter to your script."))
+
+
+return m