mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-02-27 12:16:31 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
609fa89d09 | ||
|
|
ce26bd0a65 | ||
|
|
74699b63e7 | ||
|
|
43800a5ed6 | ||
|
|
0318f33479 | ||
|
|
892f87bb17 | ||
|
|
09cda92c9a | ||
|
|
2eb57866c2 | ||
|
|
962a32e877 | ||
|
|
3ddd1f603e | ||
|
|
18368a00f5 |
@@ -1,7 +1,7 @@
|
|||||||
[bumpversion]
|
[bumpversion]
|
||||||
commit = True
|
commit = True
|
||||||
tag = True
|
tag = True
|
||||||
current_version = 0.3
|
current_version = 0.8
|
||||||
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}
|
||||||
|
|||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,3 +1,8 @@
|
|||||||
|
/pkg/
|
||||||
|
/src/ustreamer-*/
|
||||||
|
/src/v*.tar.gz
|
||||||
|
/v*.tar.gz
|
||||||
|
/ustreamer-*.pkg.tar.xz
|
||||||
/vgcore.*
|
/vgcore.*
|
||||||
/ustreamer
|
/ustreamer
|
||||||
*.o
|
*.o
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -56,4 +56,4 @@ push:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f src/*.o src/{jpeg,omx}/*.o vgcore.* $(PROG)
|
rm -f src/*.o src/{jpeg,omx}/*.o vgcore.* $(PROG)
|
||||||
rm -rf src/ustreamer-* src/v*.tar.gz v*.tar.gz
|
rm -rf pkg src/$(PROG)-* src/v*.tar.gz v*.tar.gz $(PROG)-*.pkg.tar.xz
|
||||||
|
|||||||
2
PKGBUILD
2
PKGBUILD
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
|
|
||||||
pkgname=ustreamer
|
pkgname=ustreamer
|
||||||
pkgver=0.3
|
pkgver=0.8
|
||||||
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"
|
||||||
|
|||||||
@@ -21,4 +21,4 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define VERSION "0.3"
|
#define VERSION "0.8"
|
||||||
|
|||||||
@@ -409,9 +409,9 @@ static void _device_open_alloc_picbufs(struct device_t *dev) {
|
|||||||
LOG_DEBUG("Allocating picture buffers ...");
|
LOG_DEBUG("Allocating picture buffers ...");
|
||||||
A_CALLOC(dev->run->pictures, dev->run->n_buffers);
|
A_CALLOC(dev->run->pictures, dev->run->n_buffers);
|
||||||
|
|
||||||
dev->run->max_picture_size = (dev->run->width * dev->run->height) << 1;
|
dev->run->max_picture_size = ((dev->run->width * dev->run->height) << 1) * 2;
|
||||||
for (unsigned index = 0; index < dev->run->n_buffers; ++index) {
|
for (unsigned index = 0; index < dev->run->n_buffers; ++index) {
|
||||||
LOG_DEBUG("Allocating picture buffer %d ...", index);
|
LOG_DEBUG("Allocating picture buffer %d sized %lu bytes... ", index, dev->run->max_picture_size);
|
||||||
A_CALLOC(dev->run->pictures[index].data, dev->run->max_picture_size);
|
A_CALLOC(dev->run->pictures[index].data, dev->run->max_picture_size);
|
||||||
dev->run->pictures[index].allocated = dev->run->max_picture_size;
|
dev->run->pictures[index].allocated = dev->run->max_picture_size;
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/http.c
11
src/http.c
@@ -85,7 +85,7 @@ struct http_server_t *http_server_init(struct stream_t *stream) {
|
|||||||
evhttp_set_allowed_methods(run->http, EVHTTP_REQ_GET|EVHTTP_REQ_HEAD);
|
evhttp_set_allowed_methods(run->http, EVHTTP_REQ_GET|EVHTTP_REQ_HEAD);
|
||||||
|
|
||||||
assert(!evhttp_set_cb(run->http, "/", _http_callback_root, NULL));
|
assert(!evhttp_set_cb(run->http, "/", _http_callback_root, NULL));
|
||||||
assert(!evhttp_set_cb(run->http, "/ping", _http_callback_ping, (void *)exposed));
|
assert(!evhttp_set_cb(run->http, "/ping", _http_callback_ping, (void *)server));
|
||||||
assert(!evhttp_set_cb(run->http, "/snapshot", _http_callback_snapshot, (void *)exposed));
|
assert(!evhttp_set_cb(run->http, "/snapshot", _http_callback_snapshot, (void *)exposed));
|
||||||
assert(!evhttp_set_cb(run->http, "/stream", _http_callback_stream, (void *)server));
|
assert(!evhttp_set_cb(run->http, "/stream", _http_callback_stream, (void *)server));
|
||||||
|
|
||||||
@@ -158,8 +158,8 @@ static void _http_callback_root(struct evhttp_request *request, UNUSED void *arg
|
|||||||
evbuffer_free(buf);
|
evbuffer_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _http_callback_ping(struct evhttp_request *request, void *v_exposed) {
|
static void _http_callback_ping(struct evhttp_request *request, void *v_server) {
|
||||||
struct exposed_t *exposed = (struct exposed_t *)v_exposed;
|
struct http_server_t *server = (struct http_server_t *)v_server;
|
||||||
struct evbuffer *buf;
|
struct evbuffer *buf;
|
||||||
|
|
||||||
PROCESS_HEAD_REQUEST;
|
PROCESS_HEAD_REQUEST;
|
||||||
@@ -169,8 +169,9 @@ static void _http_callback_ping(struct evhttp_request *request, void *v_exposed)
|
|||||||
"{\"stream\": {\"resolution\":"
|
"{\"stream\": {\"resolution\":"
|
||||||
" {\"width\": %u, \"height\": %u},"
|
" {\"width\": %u, \"height\": %u},"
|
||||||
" \"online\": %s}}",
|
" \"online\": %s}}",
|
||||||
exposed->width, exposed->height,
|
(server->fake_width ? server->fake_width : server->run->exposed->width),
|
||||||
(exposed->online ? "true" : "false")
|
(server->fake_height ? server->fake_height : server->run->exposed->height),
|
||||||
|
(server->run->exposed->online ? "true" : "false")
|
||||||
));
|
));
|
||||||
ADD_HEADER("Content-Type", "application/json");
|
ADD_HEADER("Content-Type", "application/json");
|
||||||
evhttp_send_reply(request, HTTP_OK, "OK", buf);
|
evhttp_send_reply(request, HTTP_OK, "OK", buf);
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ struct http_server_runtime_t {
|
|||||||
struct http_server_t {
|
struct http_server_t {
|
||||||
char *host;
|
char *host;
|
||||||
unsigned port;
|
unsigned port;
|
||||||
|
unsigned fake_width;
|
||||||
|
unsigned fake_height;
|
||||||
unsigned timeout;
|
unsigned timeout;
|
||||||
|
|
||||||
struct http_server_runtime_t *run;
|
struct http_server_runtime_t *run;
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ void jpeg_encoder_compress_buffer(struct device_t *dev, int index) {
|
|||||||
jpeg_destroy_compress(&jpeg);
|
jpeg_destroy_compress(&jpeg);
|
||||||
free(line_buffer);
|
free(line_buffer);
|
||||||
assert(dev->run->pictures[index].size > 0);
|
assert(dev->run->pictures[index].size > 0);
|
||||||
|
assert(dev->run->pictures[index].size <= dev->run->max_picture_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _jpeg_set_dest_picture(j_compress_ptr jpeg, unsigned char *picture, unsigned long *written) {
|
static void _jpeg_set_dest_picture(j_compress_ptr jpeg, unsigned char *picture, unsigned long *written) {
|
||||||
|
|||||||
32
src/main.c
32
src/main.c
@@ -59,10 +59,14 @@ static const struct option _long_opts[] = {
|
|||||||
|
|
||||||
{"host", required_argument, NULL, 's'},
|
{"host", required_argument, NULL, 's'},
|
||||||
{"port", required_argument, NULL, 'p'},
|
{"port", required_argument, NULL, 'p'},
|
||||||
{"server-timeout", required_argument, NULL, 2000},
|
{"fake-width", required_argument, NULL, 2000},
|
||||||
|
{"fake-height", required_argument, NULL, 2001},
|
||||||
|
{"server-timeout", required_argument, NULL, 2002},
|
||||||
|
|
||||||
{"debug", no_argument, NULL, 5000},
|
{"perf", no_argument, NULL, 5000},
|
||||||
{"log-level", required_argument, NULL, 5001},
|
{"verbose", no_argument, NULL, 5001},
|
||||||
|
{"debug", no_argument, NULL, 5002},
|
||||||
|
{"log-level", required_argument, NULL, 5010},
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
{NULL, 0, NULL, 0},
|
{NULL, 0, NULL, 0},
|
||||||
};
|
};
|
||||||
@@ -90,7 +94,7 @@ static void _help(struct device_t *dev, struct http_server_t *server) {
|
|||||||
printf(" Each buffer may processed using an intermediate thread.\n");
|
printf(" Each buffer may processed using an intermediate thread.\n");
|
||||||
printf(" Default: %d (number of CPU cores + 1)\n\n", dev->n_buffers);
|
printf(" Default: %d (number of CPU cores + 1)\n\n", dev->n_buffers);
|
||||||
printf(" -w|--workers <N> -- The number of compressing threads. Default: %d (== --buffers).\n\n", dev->n_workers);
|
printf(" -w|--workers <N> -- The number of compressing threads. Default: %d (== --buffers).\n\n", dev->n_workers);
|
||||||
printf(" -q|--jpeg-quality <N> -- Set quality of JPEG encoding from 1 to 100 (best). Default: %d\n\n", dev->jpeg_quality);
|
printf(" -q|--jpeg-quality <N> -- Set quality of JPEG encoding from 1 to 100 (best). Default: %d.\n\n", dev->jpeg_quality);
|
||||||
printf(" --encoder <type> -- Use specified encoder. It may affects to workers number.\n");
|
printf(" --encoder <type> -- Use specified encoder. It may affects to workers number.\n");
|
||||||
printf(" -- Available: %s; default: CPU.\n\n", ENCODER_TYPES_STR);
|
printf(" -- Available: %s; default: CPU.\n\n", ENCODER_TYPES_STR);
|
||||||
printf(" --device-timeout <seconds> -- Timeout for device querying. Default: %d\n\n", dev->timeout);
|
printf(" --device-timeout <seconds> -- Timeout for device querying. Default: %d\n\n", dev->timeout);
|
||||||
@@ -100,15 +104,19 @@ static void _help(struct device_t *dev, struct http_server_t *server) {
|
|||||||
printf("--------------------\n");
|
printf("--------------------\n");
|
||||||
printf(" --host <address> -- Listen on Hostname or IP. Default: %s\n\n", server->host);
|
printf(" --host <address> -- Listen on Hostname or IP. Default: %s\n\n", server->host);
|
||||||
printf(" --port <N> -- Bind to this TCP port. Default: %d\n\n", server->port);
|
printf(" --port <N> -- Bind to this TCP port. Default: %d\n\n", server->port);
|
||||||
|
printf(" --fake-width <N> -- Override image width for /ping. Default: disabled\n\n");
|
||||||
|
printf(" --fake-height <N> -- Override image height for /ping. Default: disabled.\n\n");
|
||||||
printf(" --server-timeout <seconds> -- Timeout for client connections. Default: %d\n\n", server->timeout);
|
printf(" --server-timeout <seconds> -- Timeout for client connections. Default: %d\n\n", server->timeout);
|
||||||
printf("Misc options:\n");
|
printf("Misc options:\n");
|
||||||
printf("-------------\n");
|
printf("-------------\n");
|
||||||
printf(" --debug -- Enabled debug messages (same as --log-level=3). Default: disabled.\n\n");
|
|
||||||
printf(" --log-level <N> -- Verbosity level of messages from 0 (info) to 3 (debug).\n");
|
printf(" --log-level <N> -- Verbosity level of messages from 0 (info) to 3 (debug).\n");
|
||||||
printf(" Enabling debugging messages can slow down the program.\n");
|
printf(" Enabling debugging messages can slow down the program.\n");
|
||||||
printf(" Available levels: 0=info, 1=performance, 2=verbose, 3=debug.\n");
|
printf(" Available levels: 0=info, 1=performance, 2=verbose, 3=debug.\n");
|
||||||
printf(" Default: %d\n\n", log_level);
|
printf(" Default: %d.\n\n", log_level);
|
||||||
printf(" -h|--help -- Print this messages and exit\n\n");
|
printf(" --perf -- Enable performance messages (same as log-level=1). Default: disabled.\n\n");
|
||||||
|
printf(" --verbose -- Enable verbose messages and lower (same as log-level=2). Default: disabled.\n\n");
|
||||||
|
printf(" --debug -- Enable debug messages and lower (same as --log-level=3). Default: disabled.\n\n");
|
||||||
|
printf(" -h|--help -- Print this messages and exit.\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t *encoder, struct http_server_t *server) {
|
static int _parse_options(int argc, char *argv[], struct device_t *dev, struct encoder_t *encoder, struct http_server_t *server) {
|
||||||
@@ -155,10 +163,14 @@ static int _parse_options(int argc, char *argv[], struct device_t *dev, struct e
|
|||||||
|
|
||||||
case 's': server->host = optarg; break;
|
case 's': server->host = optarg; break;
|
||||||
case 'p': OPT_UNSIGNED(server->port, "--port", 1, 65535);
|
case 'p': OPT_UNSIGNED(server->port, "--port", 1, 65535);
|
||||||
case 2000: OPT_UNSIGNED(server->timeout, "--server-timeout", 1, 60);
|
case 2000: OPT_UNSIGNED(server->fake_width, "--fake-width", 0, 1920);
|
||||||
|
case 2001: OPT_UNSIGNED(server->fake_height, "--fake-height", 0, 1200);
|
||||||
|
case 2002: OPT_UNSIGNED(server->timeout, "--server-timeout", 1, 60);
|
||||||
|
|
||||||
case 5000: log_level = LOG_LEVEL_DEBUG; break;
|
case 5000: log_level = LOG_LEVEL_PERF; break;
|
||||||
case 5001: OPT_UNSIGNED(log_level, "--log-level", 0, 3);
|
case 5001: log_level = LOG_LEVEL_VERBOSE; break;
|
||||||
|
case 5002: log_level = LOG_LEVEL_DEBUG; break;
|
||||||
|
case 5010: OPT_UNSIGNED(log_level, "--log-level", 0, 3);
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case 'h': default: _help(dev, server); return -1;
|
case 'h': default: _help(dev, server); return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev,
|
|||||||
omx->output_buffer->pBuffer,
|
omx->output_buffer->pBuffer,
|
||||||
omx->output_buffer->nFilledLen
|
omx->output_buffer->nFilledLen
|
||||||
);
|
);
|
||||||
|
assert(dev->run->pictures[index].size + omx->output_buffer->nFilledLen <= dev->run->max_picture_size);
|
||||||
dev->run->pictures[index].size += omx->output_buffer->nFilledLen;
|
dev->run->pictures[index].size += omx->output_buffer->nFilledLen;
|
||||||
|
|
||||||
if (omx->output_buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) {
|
if (omx->output_buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) {
|
||||||
|
|||||||
Reference in New Issue
Block a user