mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-01 21:26:33 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3c56d5774 | ||
|
|
9a86793923 | ||
|
|
93c6248fdb | ||
|
|
ec738b18dc |
@@ -1,7 +1,7 @@
|
|||||||
[bumpversion]
|
[bumpversion]
|
||||||
commit = True
|
commit = True
|
||||||
tag = True
|
tag = True
|
||||||
current_version = 0.17
|
current_version = 0.18
|
||||||
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}
|
||||||
|
|||||||
2
PKGBUILD
2
PKGBUILD
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
|
|
||||||
pkgname=ustreamer
|
pkgname=ustreamer
|
||||||
pkgver=0.17
|
pkgver=0.18
|
||||||
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.17"
|
#define VERSION "0.18"
|
||||||
|
|||||||
24
src/http.c
24
src/http.c
@@ -174,12 +174,12 @@ static void _http_callback_ping(struct evhttp_request *request, void *v_server)
|
|||||||
assert(evbuffer_add_printf(buf,
|
assert(evbuffer_add_printf(buf,
|
||||||
"{\"stream\": {\"resolution\":"
|
"{\"stream\": {\"resolution\":"
|
||||||
" {\"width\": %u, \"height\": %u},"
|
" {\"width\": %u, \"height\": %u},"
|
||||||
" \"fps\": %u, \"eps\": %u,"
|
" \"cps\": %u, \"eps\": %u,"
|
||||||
" \"online\": %s, \"clients\": %u}}",
|
" \"online\": %s, \"clients\": %u}}",
|
||||||
(server->fake_width ? server->fake_width : server->run->exposed->width),
|
(server->fake_width ? server->fake_width : server->run->exposed->width),
|
||||||
(server->fake_height ? server->fake_height : server->run->exposed->height),
|
(server->fake_height ? server->fake_height : server->run->exposed->height),
|
||||||
server->run->exposed->fps, // frame per second (capturing)
|
server->run->exposed->cps, // Captured per second
|
||||||
server->run->exposed->eps, // expose per second (server)
|
server->run->exposed->eps, // Exposed per second (server)
|
||||||
(server->run->exposed->online ? "true" : "false"),
|
(server->run->exposed->online ? "true" : "false"),
|
||||||
server->run->stream_clients_count
|
server->run->stream_clients_count
|
||||||
));
|
));
|
||||||
@@ -441,6 +441,20 @@ static void _http_exposed_refresh(UNUSED int fd, UNUSED short what, void *v_serv
|
|||||||
}
|
}
|
||||||
eps += 1;
|
eps += 1;
|
||||||
|
|
||||||
|
if (server->drop_same_frames) {
|
||||||
|
// Хром всегда показывает не новый пришедший фрейм, а предыдущий.
|
||||||
|
// При updated == false нужно еще один раз послать предыдущий фрейм
|
||||||
|
// https://bugs.chromium.org/p/chromium/issues/detail?id=527446
|
||||||
|
|
||||||
|
static bool updated_prev = false;
|
||||||
|
bool updated_orig = updated;
|
||||||
|
|
||||||
|
if (updated_prev && !updated_orig) {
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
updated_prev = updated_orig;
|
||||||
|
}
|
||||||
|
|
||||||
_http_queue_send_stream(server, updated);
|
_http_queue_send_stream(server, updated);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +467,7 @@ static bool _expose_new_picture(struct http_server_t *server) {
|
|||||||
# define EXPOSED(_next) server->run->exposed->_next
|
# define EXPOSED(_next) server->run->exposed->_next
|
||||||
|
|
||||||
assert(STREAM(picture.size) > 0);
|
assert(STREAM(picture.size) > 0);
|
||||||
EXPOSED(fps) = STREAM(fps);
|
EXPOSED(cps) = STREAM(cps);
|
||||||
EXPOSED(expose_begin_time) = get_now_monotonic();
|
EXPOSED(expose_begin_time) = get_now_monotonic();
|
||||||
|
|
||||||
# define MEM_STREAM_TO_EXPOSED \
|
# define MEM_STREAM_TO_EXPOSED \
|
||||||
@@ -536,7 +550,7 @@ static bool _expose_blank_picture(struct http_server_t *server) {
|
|||||||
|
|
||||||
EXPOSED(width) = BLANK_JPG_WIDTH;
|
EXPOSED(width) = BLANK_JPG_WIDTH;
|
||||||
EXPOSED(height) = BLANK_JPG_HEIGHT;
|
EXPOSED(height) = BLANK_JPG_HEIGHT;
|
||||||
EXPOSED(fps) = 0;
|
EXPOSED(cps) = 0;
|
||||||
EXPOSED(online) = false;
|
EXPOSED(online) = false;
|
||||||
goto updated;
|
goto updated;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,10 +42,10 @@ struct exposed_t {
|
|||||||
struct picture_t picture;
|
struct picture_t picture;
|
||||||
unsigned width;
|
unsigned width;
|
||||||
unsigned height;
|
unsigned height;
|
||||||
unsigned fps;
|
unsigned cps; // Captured per second
|
||||||
|
unsigned eps; // Exposed per second
|
||||||
bool online;
|
bool online;
|
||||||
unsigned dropped;
|
unsigned dropped;
|
||||||
unsigned eps;
|
|
||||||
long double expose_begin_time;
|
long double expose_begin_time;
|
||||||
long double expose_cmp_time;
|
long double expose_cmp_time;
|
||||||
long double expose_end_time;
|
long double expose_end_time;
|
||||||
|
|||||||
20
src/stream.c
20
src/stream.c
@@ -85,8 +85,8 @@ void stream_loop(struct stream_t *stream) {
|
|||||||
unsigned frames_count = 0;
|
unsigned frames_count = 0;
|
||||||
long double grab_after = 0;
|
long double grab_after = 0;
|
||||||
unsigned fluency_passed = 0;
|
unsigned fluency_passed = 0;
|
||||||
unsigned fps = 0;
|
unsigned cps = 0; // Captured per second
|
||||||
long long fps_second = 0;
|
long long cps_second = 0;
|
||||||
|
|
||||||
LOG_DEBUG("Allocation memory for stream picture ...");
|
LOG_DEBUG("Allocation memory for stream picture ...");
|
||||||
A_CALLOC(stream->picture.data, stream->dev->run->max_picture_size);
|
A_CALLOC(stream->picture.data, stream->dev->run->max_picture_size);
|
||||||
@@ -111,7 +111,7 @@ void stream_loop(struct stream_t *stream) {
|
|||||||
free_worker_number = oldest_worker->ctx.number;
|
free_worker_number = oldest_worker->ctx.number;
|
||||||
oldest_worker = oldest_worker->order_next;
|
oldest_worker = oldest_worker->order_next;
|
||||||
|
|
||||||
LOG_PERF("##### ACCEPT : %u", free_worker_number);
|
LOG_PERF("##### Raw frame accepted; worker = %u", free_worker_number);
|
||||||
} else {
|
} else {
|
||||||
for (unsigned number = 0; number < stream->dev->run->n_workers; ++number) {
|
for (unsigned number = 0; number < stream->dev->run->n_workers; ++number) {
|
||||||
if (!pool.workers[number].has_job && (free_worker_number == -1
|
if (!pool.workers[number].has_job && (free_worker_number == -1
|
||||||
@@ -125,7 +125,7 @@ void stream_loop(struct stream_t *stream) {
|
|||||||
assert(free_worker_number >= 0);
|
assert(free_worker_number >= 0);
|
||||||
assert(!pool.workers[free_worker_number].has_job);
|
assert(!pool.workers[free_worker_number].has_job);
|
||||||
|
|
||||||
LOG_PERF("----- DROP : %u", free_worker_number);
|
LOG_PERF("----- Raw frame dropped; worker = %u", free_worker_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream->dev->stop) {
|
if (stream->dev->stop) {
|
||||||
@@ -197,13 +197,13 @@ void stream_loop(struct stream_t *stream) {
|
|||||||
}
|
}
|
||||||
fluency_passed = 0;
|
fluency_passed = 0;
|
||||||
|
|
||||||
if (now_second != fps_second) {
|
if (now_second != cps_second) {
|
||||||
LOG_PERF("Oldest worker complete, encoding FPS = %u", fps);
|
LOG_PERF("Oldest worker complete, CPS = %u", cps);
|
||||||
stream->fps = fps;
|
stream->cps = cps;
|
||||||
fps = 0;
|
cps = 0;
|
||||||
fps_second = now_second;
|
cps_second = now_second;
|
||||||
}
|
}
|
||||||
fps += 1;
|
cps += 1;
|
||||||
|
|
||||||
long double fluency_delay = _stream_get_fluency_delay(stream->dev, &pool);
|
long double fluency_delay = _stream_get_fluency_delay(stream->dev, &pool);
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ struct stream_t {
|
|||||||
struct picture_t picture;
|
struct picture_t picture;
|
||||||
unsigned width;
|
unsigned width;
|
||||||
unsigned height;
|
unsigned height;
|
||||||
unsigned fps;
|
unsigned cps; // Captured per second
|
||||||
bool updated;
|
bool updated;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
struct device_t *dev;
|
struct device_t *dev;
|
||||||
|
|||||||
Reference in New Issue
Block a user