mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-02-28 04:36:33 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ef5a7e440 | ||
|
|
462735147d | ||
|
|
51ca0e4474 | ||
|
|
4ee3b18533 | ||
|
|
cdc9ed54c9 | ||
|
|
d9e7c07851 | ||
|
|
f2debc5d16 | ||
|
|
b3dbaf40cf | ||
|
|
abfc7b917b | ||
|
|
a0e488b0a5 | ||
|
|
6b99df2792 | ||
|
|
6f8434a5c2 | ||
|
|
b15888dbd4 | ||
|
|
2e96d74ac0 |
@@ -1,7 +1,7 @@
|
|||||||
[bumpversion]
|
[bumpversion]
|
||||||
commit = True
|
commit = True
|
||||||
tag = True
|
tag = True
|
||||||
current_version = 0.63
|
current_version = 0.67
|
||||||
parse = (?P<major>\d+)\.(?P<minor>\d+)(\.(?P<patch>\d+)(\-(?P<release>[a-z]+))?)?
|
parse = (?P<major>\d+)\.(?P<minor>\d+)(\.(?P<patch>\d+)(\-(?P<release>[a-z]+))?)?
|
||||||
serialize =
|
serialize =
|
||||||
{major}.{minor}
|
{major}.{minor}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
| Multithreaded JPEG encoding |  Yes |  No |
|
| Multithreaded JPEG encoding |  Yes |  No |
|
||||||
| [OpenMAX IL](https://www.khronos.org/openmaxil) hardware acceleration<br>on Raspberry Pi |  Yes |  No |
|
| [OpenMAX IL](https://www.khronos.org/openmaxil) hardware acceleration<br>on Raspberry Pi |  Yes |  No |
|
||||||
| Behavior when the device<br>is disconnected while streaming |  Shows a black screen<br>with ```NO SIGNAL``` on it<br>until reconnected |  Stops the broadcast <sup>1</sup> |
|
| Behavior when the device<br>is disconnected while streaming |  Shows a black screen<br>with ```NO SIGNAL``` on it<br>until reconnected |  Stops the broadcast <sup>1</sup> |
|
||||||
| [DV-timings](https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/dv-timings.html) support -<br>the ability to change resolution<br>on the fly by source signal |  Yes |  Partially yes <sup>2</sup> |
|
| [DV-timings](https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/dv-timings.html) support -<br>the ability to change resolution<br>on the fly by source signal |  Yes |  Partially yes <sup>1</sup> |
|
||||||
| Option to skip frames when streaming<br>static images by HTTP to save traffic |  Yes <sup>2</sup> |  No |
|
| Option to skip frames when streaming<br>static images by HTTP to save traffic |  Yes <sup>2</sup> |  No |
|
||||||
| Streaming via UNIX domain socket |  Yes |  No |
|
| Streaming via UNIX domain socket |  Yes |  No |
|
||||||
| Debug logs without recompiling,<br>performance statistics log,<br>access to HTTP broadcast parameters |  Yes |  No |
|
| Debug logs without recompiling,<br>performance statistics log,<br>access to HTTP broadcast parameters |  Yes |  No |
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
|----------|---------------|-------------------|
|
|----------|---------------|-------------------|
|
||||||
| Многопоточное кодирование JPEG |  Есть |  Нет |
|
| Многопоточное кодирование JPEG |  Есть |  Нет |
|
||||||
| Аппаратное кодирование с помощью [OpenMAX IL](https://www.khronos.org/openmaxil) на Raspberry Pi |  Есть |  Нет |
|
| Аппаратное кодирование с помощью [OpenMAX IL](https://www.khronos.org/openmaxil) на Raspberry Pi |  Есть |  Нет |
|
||||||
| Поведение при физическом отключении устройства<br>от сервера во время работы |  Транслирует черный экран<br>с надписью ```NO SIGNAL```,<br>пока устройство не будет подключено снова |  Прерывает трансляцию <sup>1</sup> |
|
| Поведение при физическом отключении<br>устройства от сервера во время работы |  Транслирует черный экран<br>с надписью ```NO SIGNAL```,<br>пока устройство не будет подключено снова |  Прерывает трансляцию <sup>1</sup> |
|
||||||
| Поддержка [DV-таймингов](https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/dv-timings.html) - возможности изменения <br>параметров разрешения трансляции на лету<br>по сигналу источника (устройства видеозахвата) |  Есть |  Условно есть <sup>2</sup> |
|
| Поддержка [DV-таймингов](https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/dv-timings.html) - возможности<br>изменения параметров разрешения<br>трансляции на лету по сигналу<br>источника (устройства видеозахвата) |  Есть |  Условно есть <sup>1</sup> |
|
||||||
| Возможность пропуска фреймов при передаче<br>статического изображения по HTTP<br>для экономии трафика |  Есть <sup>2</sup> |  Нет |
|
| Возможность пропуска фреймов при передаче<br>статического изображения по HTTP<br>для экономии трафика |  Есть <sup>2</sup> |  Нет |
|
||||||
| Стрим через UNIX domain socket |  Есть |  Нет |
|
| Стрим через UNIX domain socket |  Есть |  Нет |
|
||||||
| Дебаг-логи без перекомпиляции,<br>логгирование статистики производительности,<br>возможность получения параметров<br>трансляции по HTTP |  Есть |  Нет |
|
| Дебаг-логи без перекомпиляции,<br>логгирование статистики производительности,<br>возможность получения параметров<br>трансляции по HTTP |  Есть |  Нет |
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
|
|
||||||
pkgname=ustreamer
|
pkgname=ustreamer
|
||||||
pkgver=0.63
|
pkgver=0.67
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Lightweight and fast MJPG-HTTP streamer"
|
pkgdesc="Lightweight and fast MJPG-HTTP streamer"
|
||||||
url="https://github.com/pi-kvm/ustreamer"
|
url="https://github.com/pi-kvm/ustreamer"
|
||||||
|
|||||||
@@ -22,4 +22,4 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define VERSION "0.63"
|
#define VERSION "0.67"
|
||||||
|
|||||||
51
src/device.c
51
src/device.c
@@ -27,6 +27,7 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@@ -65,6 +66,7 @@ static int _device_open_check_cap(struct device_t *dev);
|
|||||||
static int _device_open_dv_timings(struct device_t *dev);
|
static int _device_open_dv_timings(struct device_t *dev);
|
||||||
static int _device_apply_dv_timings(struct device_t *dev);
|
static int _device_apply_dv_timings(struct device_t *dev);
|
||||||
static int _device_open_format(struct device_t *dev);
|
static int _device_open_format(struct device_t *dev);
|
||||||
|
static void _device_open_hw_fps(struct device_t *dev);
|
||||||
static int _device_open_mmap(struct device_t *dev);
|
static int _device_open_mmap(struct device_t *dev);
|
||||||
static int _device_open_queue_buffers(struct device_t *dev);
|
static int _device_open_queue_buffers(struct device_t *dev);
|
||||||
static void _device_open_alloc_picbufs(struct device_t *dev);
|
static void _device_open_alloc_picbufs(struct device_t *dev);
|
||||||
@@ -144,6 +146,7 @@ int device_open(struct device_t *dev) {
|
|||||||
if (_device_open_format(dev) < 0) {
|
if (_device_open_format(dev) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
_device_open_hw_fps(dev);
|
||||||
if (_device_open_mmap(dev) < 0) {
|
if (_device_open_mmap(dev) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -257,7 +260,7 @@ int device_consume_event(struct device_t *dev) {
|
|||||||
struct v4l2_event event;
|
struct v4l2_event event;
|
||||||
|
|
||||||
LOG_DEBUG("Calling ioctl(VIDIOC_DQEVENT) ...");
|
LOG_DEBUG("Calling ioctl(VIDIOC_DQEVENT) ...");
|
||||||
if (!xioctl(dev->run->fd, VIDIOC_DQEVENT, &event)) {
|
if (xioctl(dev->run->fd, VIDIOC_DQEVENT, &event) == 0) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case V4L2_EVENT_SOURCE_CHANGE:
|
case V4L2_EVENT_SOURCE_CHANGE:
|
||||||
LOG_INFO("Got V4L2_EVENT_SOURCE_CHANGE: source changed");
|
LOG_INFO("Got V4L2_EVENT_SOURCE_CHANGE: source changed");
|
||||||
@@ -285,7 +288,7 @@ static int _device_open_check_cap(struct device_t *dev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
|
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
|
||||||
LOG_ERROR("Video capture not supported by our device");
|
LOG_ERROR("Video capture not supported by the device");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,6 +425,48 @@ static int _device_open_format(struct device_t *dev) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _device_open_hw_fps(struct device_t *dev) {
|
||||||
|
struct v4l2_streamparm setfps;
|
||||||
|
|
||||||
|
MEMSET_ZERO(setfps);
|
||||||
|
setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||||
|
|
||||||
|
LOG_DEBUG("Calling ioctl(VIDIOC_G_PARM) ...");
|
||||||
|
if (xioctl(dev->run->fd, VIDIOC_G_PARM, &setfps) < 0) {
|
||||||
|
if (errno == ENOTTY) { // Quiet message for Auvidea B101
|
||||||
|
LOG_INFO("Quierying HW FPS changing is not supported");
|
||||||
|
} else {
|
||||||
|
LOG_PERROR("Unable to query HW FPS changing");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(setfps.parm.capture.capability & V4L2_CAP_TIMEPERFRAME)) {
|
||||||
|
LOG_INFO("Changing HW FPS is not supported");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# define SETFPS_TPF(_next) setfps.parm.capture.timeperframe._next
|
||||||
|
|
||||||
|
MEMSET_ZERO(setfps);
|
||||||
|
setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||||
|
SETFPS_TPF(numerator) = 1;
|
||||||
|
SETFPS_TPF(denominator) = (dev->desired_fps == 0 ? 255 : dev->desired_fps);
|
||||||
|
|
||||||
|
if (xioctl(dev->run->fd, VIDIOC_S_PARM, &setfps) < 0) {
|
||||||
|
LOG_PERROR("Unable to set HW FPS");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->desired_fps != SETFPS_TPF(denominator)) {
|
||||||
|
LOG_INFO("Using HW FPS: %u -> %u (coerced)", dev->desired_fps, SETFPS_TPF(denominator));
|
||||||
|
} else {
|
||||||
|
LOG_INFO("Using HW FPS: %u", dev->desired_fps);
|
||||||
|
}
|
||||||
|
|
||||||
|
# undef SETFPS_TPF
|
||||||
|
}
|
||||||
|
|
||||||
static int _device_open_mmap(struct device_t *dev) {
|
static int _device_open_mmap(struct device_t *dev) {
|
||||||
struct v4l2_requestbuffers req;
|
struct v4l2_requestbuffers req;
|
||||||
|
|
||||||
@@ -431,7 +476,7 @@ static int _device_open_mmap(struct device_t *dev) {
|
|||||||
req.memory = V4L2_MEMORY_MMAP;
|
req.memory = V4L2_MEMORY_MMAP;
|
||||||
|
|
||||||
LOG_DEBUG("Calling ioctl(VIDIOC_REQBUFS) ...");
|
LOG_DEBUG("Calling ioctl(VIDIOC_REQBUFS) ...");
|
||||||
if (xioctl(dev->run->fd, VIDIOC_REQBUFS, &req)) {
|
if (xioctl(dev->run->fd, VIDIOC_REQBUFS, &req) < 0) {
|
||||||
LOG_PERROR("Device '%s' doesn't support memory mapping", dev->path);
|
LOG_PERROR("Device '%s' doesn't support memory mapping", dev->path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ static void _help(struct device_t *dev, struct encoder_t *encoder, struct http_s
|
|||||||
printf(" the CPU loading. Don't use this option with analog signal sources\n");
|
printf(" the CPU loading. Don't use this option with analog signal sources\n");
|
||||||
printf(" or webcams, it's useless. Default: disabled.\n\n");
|
printf(" or webcams, it's useless. Default: disabled.\n\n");
|
||||||
printf(" -l|--slowdown ────────────── Slowdown capturing to 1 FPS or less when no stream clients connected.\n");
|
printf(" -l|--slowdown ────────────── Slowdown capturing to 1 FPS or less when no stream clients connected.\n");
|
||||||
printf(" Useful to reduce CPU cosumption. Default: disabled.\n\n");
|
printf(" Useful to reduce CPU consumption. Default: disabled.\n\n");
|
||||||
printf(" --fake-width <N> ─────────── Override image width for /state. Default: disabled.\n\n");
|
printf(" --fake-width <N> ─────────── Override image width for /state. Default: disabled.\n\n");
|
||||||
printf(" --fake-height <N> ────────── Override image height for /state. Default: disabled.\n\n");
|
printf(" --fake-height <N> ────────── Override image height for /state. Default: disabled.\n\n");
|
||||||
printf(" --server-timeout <seconds> ─ Timeout for client connections. Default: %u.\n\n", server->timeout);
|
printf(" --server-timeout <seconds> ─ Timeout for client connections. Default: %u.\n\n", server->timeout);
|
||||||
|
|||||||
@@ -376,12 +376,12 @@ static int _stream_init_loop(struct stream_t *stream, struct workers_pool_t *poo
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int _stream_init(struct stream_t *stream, struct workers_pool_t *pool) {
|
static int _stream_init(struct stream_t *stream, struct workers_pool_t *pool) {
|
||||||
SEP_INFO('=');
|
|
||||||
|
|
||||||
_stream_destroy_workers(stream, pool);
|
_stream_destroy_workers(stream, pool);
|
||||||
device_switch_capturing(stream->dev, false);
|
device_switch_capturing(stream->dev, false);
|
||||||
device_close(stream->dev);
|
device_close(stream->dev);
|
||||||
|
|
||||||
|
SEP_INFO('=');
|
||||||
|
|
||||||
if (device_open(stream->dev) < 0) {
|
if (device_open(stream->dev) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|||||||
53
tools/common.py
Normal file
53
tools/common.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#============================================================================#
|
||||||
|
# #
|
||||||
|
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
||||||
|
# #
|
||||||
|
# Copyright (C) 2018 Maxim Devaev <mdevaev@gmail.com> #
|
||||||
|
# #
|
||||||
|
# This program is free software: you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
# This program is distributed in the hope that it will be useful, #
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||||
|
# GNU General Public License for more details. #
|
||||||
|
# #
|
||||||
|
# You should have received a copy of the GNU General Public License #
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||||
|
# #
|
||||||
|
#============================================================================#
|
||||||
|
|
||||||
|
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
|
||||||
|
# =====
|
||||||
|
def get_prepend() -> str:
|
||||||
|
return textwrap.dedent("""
|
||||||
|
/*****************************************************************************
|
||||||
|
# #
|
||||||
|
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
||||||
|
# #
|
||||||
|
# Copyright (C) 2018 Maxim Devaev <mdevaev@gmail.com> #
|
||||||
|
# #
|
||||||
|
# This program is free software: you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
# This program is distributed in the hope that it will be useful, #
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||||
|
# GNU General Public License for more details. #
|
||||||
|
# #
|
||||||
|
# You should have received a copy of the GNU General Public License #
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||||
|
# #
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
""").strip() + "\n"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env -S python3 -B
|
||||||
#============================================================================#
|
#============================================================================#
|
||||||
# #
|
# #
|
||||||
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
||||||
@@ -22,12 +22,13 @@
|
|||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
|
import common
|
||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
def main():
|
def main() -> None:
|
||||||
assert len(sys.argv) == 4, "%s <file.html> <file.h> <name>" % (sys.argv[0])
|
assert len(sys.argv) == 4, "%s <file.html> <file.h> <name>" % (sys.argv[0])
|
||||||
html_path = sys.argv[1]
|
html_path = sys.argv[1]
|
||||||
header_path = sys.argv[2]
|
header_path = sys.argv[2]
|
||||||
@@ -36,9 +37,6 @@ def main():
|
|||||||
with open(html_path, "r") as html_file:
|
with open(html_path, "r") as html_file:
|
||||||
text = html_file.read()
|
text = html_file.read()
|
||||||
|
|
||||||
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "prepend.h")) as prepend_file:
|
|
||||||
prepend = prepend_file.read()
|
|
||||||
|
|
||||||
text = text.strip()
|
text = text.strip()
|
||||||
text = text.replace("\"", "\\\"")
|
text = text.replace("\"", "\\\"")
|
||||||
text = text.replace("%VERSION%", "\" VERSION \"")
|
text = text.replace("%VERSION%", "\" VERSION \"")
|
||||||
@@ -48,7 +46,7 @@ def main():
|
|||||||
for line in text.split("\n")
|
for line in text.split("\n")
|
||||||
)
|
)
|
||||||
text = "const char HTML_%s_PAGE[] = \" \\\n%s\n\";\n" % (name, text)
|
text = "const char HTML_%s_PAGE[] = \" \\\n%s\n\";\n" % (name, text)
|
||||||
text = prepend + "\n#include \"../../config.h\"\n\n\n" + text
|
text = common.get_prepend() + "\n#include \"../../config.h\"\n\n\n" + text
|
||||||
|
|
||||||
with open(header_path, "w") as header_file:
|
with open(header_path, "w") as header_file:
|
||||||
header_file.write(text)
|
header_file.write(text)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env -S python3 -B
|
||||||
#============================================================================#
|
#============================================================================#
|
||||||
# #
|
# #
|
||||||
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
||||||
@@ -22,13 +22,17 @@
|
|||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
import io
|
import io
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
from typing import Tuple
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
import common
|
||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
def _get_jpeg_size(data):
|
def _get_jpeg_size(data: bytes) -> Tuple[int, int]:
|
||||||
# https://sheep.horse/2013/9/finding_the_dimensions_of_a_jpeg_file_in_python.html
|
# https://sheep.horse/2013/9/finding_the_dimensions_of_a_jpeg_file_in_python.html
|
||||||
|
|
||||||
stream = io.BytesIO(data)
|
stream = io.BytesIO(data)
|
||||||
@@ -55,7 +59,7 @@ def _get_jpeg_size(data):
|
|||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
def main():
|
def main() -> None:
|
||||||
assert len(sys.argv) == 4, "%s <file.jpeg> <file.h> <name>" % (sys.argv[0])
|
assert len(sys.argv) == 4, "%s <file.jpeg> <file.h> <name>" % (sys.argv[0])
|
||||||
jpeg_path = sys.argv[1]
|
jpeg_path = sys.argv[1]
|
||||||
header_path = sys.argv[2]
|
header_path = sys.argv[2]
|
||||||
@@ -66,10 +70,7 @@ def main():
|
|||||||
|
|
||||||
(width, height) = _get_jpeg_size(jpeg_data)
|
(width, height) = _get_jpeg_size(jpeg_data)
|
||||||
|
|
||||||
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "prepend.h")) as prepend_file:
|
rows: List[List[str]] = [[]]
|
||||||
prepend = prepend_file.read()
|
|
||||||
|
|
||||||
rows = [[]]
|
|
||||||
for ch in jpeg_data:
|
for ch in jpeg_data:
|
||||||
if len(rows[-1]) > 20:
|
if len(rows[-1]) > 20:
|
||||||
rows.append([])
|
rows.append([])
|
||||||
@@ -79,7 +80,7 @@ def main():
|
|||||||
text = "const unsigned char %s_JPEG_DATA[] = {\n\t%s\n};\n" % (name, text)
|
text = "const unsigned char %s_JPEG_DATA[] = {\n\t%s\n};\n" % (name, text)
|
||||||
text = "const unsigned %s_JPEG_HEIGHT = %d;\n\n" % (name, height) + text
|
text = "const unsigned %s_JPEG_HEIGHT = %d;\n\n" % (name, height) + text
|
||||||
text = "const unsigned %s_JPEG_WIDTH = %d;\n" % (name, width) + text
|
text = "const unsigned %s_JPEG_WIDTH = %d;\n" % (name, width) + text
|
||||||
text = prepend + "\n\n" + text
|
text = common.get_prepend() + "\n\n" + text
|
||||||
|
|
||||||
with open(header_path, "w") as header_file:
|
with open(header_path, "w") as header_file:
|
||||||
header_file.write(text)
|
header_file.write(text)
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
# #
|
|
||||||
# uStreamer - Lightweight and fast MJPG-HTTP streamer. #
|
|
||||||
# #
|
|
||||||
# Copyright (C) 2018 Maxim Devaev <mdevaev@gmail.com> #
|
|
||||||
# #
|
|
||||||
# This program is free software: you can redistribute it and/or modify #
|
|
||||||
# it under the terms of the GNU General Public License as published by #
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or #
|
|
||||||
# (at your option) any later version. #
|
|
||||||
# #
|
|
||||||
# This program is distributed in the hope that it will be useful, #
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
||||||
# GNU General Public License for more details. #
|
|
||||||
# #
|
|
||||||
# You should have received a copy of the GNU General Public License #
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
||||||
# #
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
Reference in New Issue
Block a user