From 3d28dcbaff79b1a93f6a253d8504de41114f3ff4 Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Mon, 18 Jan 2021 11:05:04 +0300 Subject: [PATCH] improved memsink logic --- src/libs/memsink.c | 16 +++++++++++----- src/libs/memsink.h | 3 ++- src/ustreamer/h264/stream.c | 2 +- src/ustreamer/stream.c | 9 +++++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/libs/memsink.c b/src/libs/memsink.c index 33d8af0..f60f38b 100644 --- a/src/libs/memsink.c +++ b/src/libs/memsink.c @@ -91,25 +91,31 @@ void memsink_destroy(memsink_s *sink) { free(sink); } -int memsink_server_check_clients(memsink_s *sink) { +bool memsink_server_check(memsink_s *sink, const frame_s *frame) { + // Возвращает true, если если клиенты ИЛИ изменились метаданные + assert(sink->server); if (flock(sink->fd, LOCK_EX | LOCK_NB) < 0) { if (errno == EWOULDBLOCK) { sink->has_clients = true; - return 0; + return true; } LOG_PERROR("%s-sink: Can't lock memory", sink->name); - return -1; + return false; } sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()); +# define NEQ(_field) (sink->mem->_field != frame->_field) + bool retval = (sink->has_clients || NEQ(width) || NEQ(height) || NEQ(format) || NEQ(stride) || NEQ(online)); +# undef NEQ + if (flock(sink->fd, LOCK_UN) < 0) { LOG_PERROR("%s-sink: Can't unlock memory", sink->name); - return -1; + return false; } - return 0; + return retval; } int memsink_server_put(memsink_s *sink, const frame_s *frame) { diff --git a/src/libs/memsink.h b/src/libs/memsink.h index edc53a1..637206f 100644 --- a/src/libs/memsink.h +++ b/src/libs/memsink.h @@ -81,6 +81,7 @@ memsink_s *memsink_init( void memsink_destroy(memsink_s *sink); -int memsink_server_check_clients(memsink_s *sink); +bool memsink_server_check(memsink_s *sink, const frame_s *frame); int memsink_server_put(memsink_s *sink, const frame_s *frame); + int memsink_client_get(memsink_s *sink, frame_s *frame); diff --git a/src/ustreamer/h264/stream.c b/src/ustreamer/h264/stream.c index 6c0684f..b2ba791 100644 --- a/src/ustreamer/h264/stream.c +++ b/src/ustreamer/h264/stream.c @@ -53,7 +53,7 @@ void h264_stream_destroy(h264_stream_s *h264) { } void h264_stream_process(h264_stream_s *h264, const frame_s *frame, int vcsm_handle, bool force_key) { - if (memsink_server_check_clients(h264->sink) < 0 || !h264->sink->has_clients) { + if (!memsink_server_check(h264->sink, frame)) { return; } diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index 850d9c2..56a1099 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -195,7 +195,7 @@ void stream_loop(stream_s *stream) { LOG_DEBUG("Assigned new frame in buffer %d to worker %s", buf_index, ready_wr->name); if (stream->raw_sink) { - if (memsink_server_check_clients(stream->raw_sink) == 0 && stream->raw_sink->has_clients) { + if (memsink_server_check(stream->raw_sink, &hw->raw)) { memsink_server_put(stream->raw_sink, &hw->raw); } } @@ -254,6 +254,11 @@ static workers_pool_s *_stream_init_loop(stream_s *stream) { while (!atomic_load(&RUN(stop))) { if (_stream_expose_frame(stream, NULL, 0)) { + if (stream->raw_sink) { + if (memsink_server_check(stream->raw_sink, stream->blank)) { + memsink_server_put(stream->raw_sink, stream->blank); + } + } # ifdef WITH_OMX if (RUN(h264)) { h264_stream_process(RUN(h264), stream->blank, -1, false); @@ -357,7 +362,7 @@ static bool _stream_expose_frame(stream_s *stream, frame_s *frame, unsigned capt A_MUTEX_UNLOCK(&VID(mutex)); if (changed && stream->sink) { - if (memsink_server_check_clients(stream->sink) == 0 && stream->sink->has_clients) { + if (memsink_server_check(stream->sink, VID(frame))) { memsink_server_put(stream->sink, VID(frame)); } }