mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-15 12:03:41 +00:00
show memsink has_client in the /state
This commit is contained in:
@@ -37,6 +37,7 @@ memsink_s *memsink_init(
|
|||||||
sink->timeout = timeout;
|
sink->timeout = timeout;
|
||||||
sink->fd = -1;
|
sink->fd = -1;
|
||||||
sink->mem = MAP_FAILED;
|
sink->mem = MAP_FAILED;
|
||||||
|
atomic_init(&sink->has_clients, false);
|
||||||
|
|
||||||
LOG_INFO("Using %s-sink: %s", name, obj);
|
LOG_INFO("Using %s-sink: %s", name, obj);
|
||||||
|
|
||||||
@@ -92,16 +93,16 @@ bool memsink_server_check(memsink_s *sink, const frame_s *frame) {
|
|||||||
|
|
||||||
if (flock(sink->fd, LOCK_EX | LOCK_NB) < 0) {
|
if (flock(sink->fd, LOCK_EX | LOCK_NB) < 0) {
|
||||||
if (errno == EWOULDBLOCK) {
|
if (errno == EWOULDBLOCK) {
|
||||||
sink->has_clients = true;
|
atomic_store(&sink->has_clients, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
LOG_PERROR("%s-sink: Can't lock memory", sink->name);
|
LOG_PERROR("%s-sink: Can't lock memory", sink->name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic());
|
atomic_store(&sink->has_clients, (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()));
|
||||||
|
|
||||||
bool retval = (sink->has_clients || !FRAME_COMPARE_META_USED_NOTS(sink->mem, frame));
|
bool retval = (atomic_load(&sink->has_clients) || !FRAME_COMPARE_META_USED_NOTS(sink->mem, frame));
|
||||||
|
|
||||||
if (flock(sink->fd, LOCK_UN) < 0) {
|
if (flock(sink->fd, LOCK_UN) < 0) {
|
||||||
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
|
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
|
||||||
@@ -133,7 +134,7 @@ int memsink_server_put(memsink_s *sink, const frame_s *frame) {
|
|||||||
|
|
||||||
sink->mem->magic = MEMSINK_MAGIC;
|
sink->mem->magic = MEMSINK_MAGIC;
|
||||||
sink->mem->version = MEMSINK_VERSION;
|
sink->mem->version = MEMSINK_VERSION;
|
||||||
sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic());
|
atomic_store(&sink->has_clients, (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()));
|
||||||
|
|
||||||
if (flock(sink->fd, LOCK_UN) < 0) {
|
if (flock(sink->fd, LOCK_UN) < 0) {
|
||||||
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
|
LOG_PERROR("%s-sink: Can't unlock memory", sink->name);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -51,7 +52,7 @@ typedef struct {
|
|||||||
int fd;
|
int fd;
|
||||||
memsink_shared_s *mem;
|
memsink_shared_s *mem;
|
||||||
uint64_t last_id;
|
uint64_t last_id;
|
||||||
bool has_clients; // Only for server
|
atomic_bool has_clients; // Only for server
|
||||||
} memsink_s;
|
} memsink_s;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -342,6 +342,7 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server)
|
|||||||
encoder_type_to_string(enc_type),
|
encoder_type_to_string(enc_type),
|
||||||
enc_quality
|
enc_quality
|
||||||
));
|
));
|
||||||
|
|
||||||
# ifdef WITH_OMX
|
# ifdef WITH_OMX
|
||||||
if (STREAM(run->h264)) {
|
if (STREAM(run->h264)) {
|
||||||
assert(evbuffer_add_printf(buf,
|
assert(evbuffer_add_printf(buf,
|
||||||
@@ -352,6 +353,32 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server)
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
if (
|
||||||
|
STREAM(sink)
|
||||||
|
# ifdef WITH_OMX
|
||||||
|
|| STREAM(h264_sink)
|
||||||
|
# endif
|
||||||
|
) {
|
||||||
|
assert(evbuffer_add_printf(buf, " \"sinks\": {"));
|
||||||
|
if (STREAM(sink)) {
|
||||||
|
assert(evbuffer_add_printf(buf,
|
||||||
|
"\"jpeg\": {\"has_clients\": %s}",
|
||||||
|
bool_to_string(atomic_load(&STREAM(sink->has_clients)))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
# ifdef WITH_OMX
|
||||||
|
if (STREAM(h264_sink)) {
|
||||||
|
assert(evbuffer_add_printf(buf,
|
||||||
|
"%s\"h264\": {\"has_clients\": %s}",
|
||||||
|
(STREAM(sink) ? ", " : ""),
|
||||||
|
bool_to_string(atomic_load(&STREAM(h264_sink->has_clients)))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
assert(evbuffer_add_printf(buf, "},"));
|
||||||
|
}
|
||||||
|
|
||||||
assert(evbuffer_add_printf(buf,
|
assert(evbuffer_add_printf(buf,
|
||||||
" \"source\": {\"resolution\": {\"width\": %u, \"height\": %u},"
|
" \"source\": {\"resolution\": {\"width\": %u, \"height\": %u},"
|
||||||
" \"online\": %s, \"desired_fps\": %u, \"captured_fps\": %u},"
|
" \"online\": %s, \"desired_fps\": %u, \"captured_fps\": %u},"
|
||||||
|
|||||||
@@ -136,9 +136,9 @@ void stream_loop(stream_s *stream) {
|
|||||||
&& !atomic_load(&RUN(stop))
|
&& !atomic_load(&RUN(stop))
|
||||||
&& !atomic_load(&RUN(video->has_clients))
|
&& !atomic_load(&RUN(video->has_clients))
|
||||||
// has_clients синков НЕ обновляются в реальном времени
|
// has_clients синков НЕ обновляются в реальном времени
|
||||||
&& (stream->sink == NULL || !stream->sink->has_clients)
|
&& (stream->sink == NULL || !atomic_load(&stream->sink->has_clients))
|
||||||
# ifdef WITH_OMX
|
# ifdef WITH_OMX
|
||||||
&& (RUN(h264) == NULL || /*RUN(h264->sink) == NULL ||*/ !RUN(h264->sink->has_clients))
|
&& (RUN(h264) == NULL || /*RUN(h264->sink) == NULL ||*/ !atomic_load(&RUN(h264->sink->has_clients)))
|
||||||
# endif
|
# endif
|
||||||
) {
|
) {
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
|
|||||||
Reference in New Issue
Block a user