mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-17 04:53:42 +00:00
improved memsink logic
This commit is contained in:
@@ -91,25 +91,31 @@ void memsink_destroy(memsink_s *sink) {
|
|||||||
free(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);
|
assert(sink->server);
|
||||||
|
|
||||||
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;
|
sink->has_clients = true;
|
||||||
return 0;
|
return true;
|
||||||
}
|
}
|
||||||
LOG_PERROR("%s-sink: Can't lock memory", sink->name);
|
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());
|
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) {
|
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);
|
||||||
return -1;
|
return false;
|
||||||
}
|
}
|
||||||
return 0;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memsink_server_put(memsink_s *sink, const frame_s *frame) {
|
int memsink_server_put(memsink_s *sink, const frame_s *frame) {
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ memsink_s *memsink_init(
|
|||||||
|
|
||||||
void memsink_destroy(memsink_s *sink);
|
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_server_put(memsink_s *sink, const frame_s *frame);
|
||||||
|
|
||||||
int memsink_client_get(memsink_s *sink, frame_s *frame);
|
int memsink_client_get(memsink_s *sink, frame_s *frame);
|
||||||
|
|||||||
@@ -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) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
LOG_DEBUG("Assigned new frame in buffer %d to worker %s", buf_index, ready_wr->name);
|
||||||
|
|
||||||
if (stream->raw_sink) {
|
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);
|
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))) {
|
while (!atomic_load(&RUN(stop))) {
|
||||||
if (_stream_expose_frame(stream, NULL, 0)) {
|
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
|
# ifdef WITH_OMX
|
||||||
if (RUN(h264)) {
|
if (RUN(h264)) {
|
||||||
h264_stream_process(RUN(h264), stream->blank, -1, false);
|
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));
|
A_MUTEX_UNLOCK(&VID(mutex));
|
||||||
|
|
||||||
if (changed && stream->sink) {
|
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));
|
memsink_server_put(stream->sink, VID(frame));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user