diff --git a/janus/src/memsinkfd.c b/janus/src/memsinkfd.c deleted file mode 100644 index 32ce4ce..0000000 --- a/janus/src/memsinkfd.c +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************************** -# # -# uStreamer - Lightweight and fast MJPEG-HTTP streamer. # -# # -# Copyright (C) 2018-2024 Maxim Devaev # -# # -# This program is free software: you can redistribute it and/or modify # -# it under the terms of the GNU General Public License as published by # -# the Free Software Foundation, either version 3 of the License, or # -# (at your option) any later version. # -# # -# This program is distributed in the hope that it will be useful, # -# but WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # -# GNU General Public License for more details. # -# # -# You should have received a copy of the GNU General Public License # -# along with this program. If not, see . # -# # -*****************************************************************************/ - - -#include "memsinkfd.h" - -#include - -#include - -#include "uslibs/types.h" -#include "uslibs/errors.h" -#include "uslibs/tools.h" -#include "uslibs/logging.h" -#include "uslibs/frame.h" -#include "uslibs/memsinksh.h" - - -int us_memsink_fd_wait_frame(int fd, us_memsink_shared_s *mem, u64 last_id) { - const ldf deadline_ts = us_get_now_monotonic() + 1; // wait_timeout - ldf now_ts; - do { - const int result = us_flock_timedwait_monotonic(fd, 1); // lock_timeout - now_ts = us_get_now_monotonic(); - if (result < 0 && errno != EWOULDBLOCK) { - US_LOG_PERROR("Can't lock memsink"); - return -1; - } else if (result == 0) { - if (mem->magic == US_MEMSINK_MAGIC && mem->version == US_MEMSINK_VERSION && mem->id != last_id) { - return 0; - } - if (flock(fd, LOCK_UN) < 0) { - US_LOG_PERROR("Can't unlock memsink"); - return -1; - } - } - usleep(1000); // lock_polling - } while (now_ts < deadline_ts); - return US_ERROR_NO_DATA; -} - -int us_memsink_fd_get_frame(int fd, us_memsink_shared_s *mem, us_frame_s *frame, u64 *frame_id, bool key_required) { - us_frame_set_data(frame, us_memsink_get_data(mem), mem->used); - US_FRAME_COPY_META(mem, frame); - *frame_id = mem->id; - mem->last_client_ts = us_get_now_monotonic(); - if (key_required) { - mem->key_requested = true; - } - - bool retval = 0; - if (frame->format != V4L2_PIX_FMT_H264) { - US_LOG_ERROR("Got non-H264 frame from memsink"); - retval = -1; - } - if (flock(fd, LOCK_UN) < 0) { - US_LOG_PERROR("Can't unlock memsink"); - retval = -1; - } - return retval; -} diff --git a/janus/src/memsinkfd.h b/janus/src/memsinkfd.h deleted file mode 100644 index 6972314..0000000 --- a/janus/src/memsinkfd.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** -# # -# uStreamer - Lightweight and fast MJPEG-HTTP streamer. # -# # -# Copyright (C) 2018-2024 Maxim Devaev # -# # -# This program is free software: you can redistribute it and/or modify # -# it under the terms of the GNU General Public License as published by # -# the Free Software Foundation, either version 3 of the License, or # -# (at your option) any later version. # -# # -# This program is distributed in the hope that it will be useful, # -# but WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # -# GNU General Public License for more details. # -# # -# You should have received a copy of the GNU General Public License # -# along with this program. If not, see . # -# # -*****************************************************************************/ - - -#pragma once - -#include "uslibs/types.h" -#include "uslibs/frame.h" -#include "uslibs/memsinksh.h" - - -int us_memsink_fd_wait_frame(int fd, us_memsink_shared_s *mem, u64 last_id); -int us_memsink_fd_get_frame(int fd, us_memsink_shared_s *mem, us_frame_s *frame, u64 *frame_id, bool key_required); diff --git a/janus/src/plugin.c b/janus/src/plugin.c index 9b6e957..5cf78fe 100644 --- a/janus/src/plugin.c +++ b/janus/src/plugin.c @@ -45,7 +45,7 @@ #include "uslibs/logging.h" #include "uslibs/list.h" #include "uslibs/ring.h" -#include "uslibs/memsinksh.h" +#include "uslibs/memsink.h" #include "uslibs/tc358743.h" #include "const.h" @@ -56,7 +56,6 @@ #include "rtpv.h" #include "rtpa.h" #include "sdp.h" -#include "memsinkfd.h" #include "config.h" @@ -139,8 +138,7 @@ static void *_video_sink_thread(void *arg) { US_THREAD_SETTLE("us_p_vcap"); atomic_store(&_g_video_sink_tid_created, true); - us_frame_s *drop = us_frame_init(); - u64 frame_id = 0; + us_frame_s *tmp = us_frame_init(); int once = 0; while (!_STOP) { @@ -150,22 +148,8 @@ static void *_video_sink_thread(void *arg) { continue; } - int fd = -1; - us_memsink_shared_s *mem = NULL; - - const uz data_size = us_memsink_calculate_size(_g_config->video_sink_name); - if (data_size == 0) { - US_ONCE({ US_LOG_ERROR("Invalid memsink object suffix"); }); - goto close_memsink; - } - - if ((fd = shm_open(_g_config->video_sink_name, O_RDWR, 0)) <= 0) { - US_ONCE({ US_LOG_PERROR("Can't open memsink"); }); - goto close_memsink; - } - - if ((mem = us_memsink_shared_map(fd, data_size)) == NULL) { - US_ONCE({ US_LOG_PERROR("Can't map memsink"); }); + us_memsink_s *sink = us_memsink_init_opened("vcap", _g_config->video_sink_name, false, 0, false, 0, 1); + if (sink == NULL) { goto close_memsink; } @@ -173,44 +157,31 @@ static void *_video_sink_thread(void *arg) { US_LOG_INFO("Memsink opened; reading frames ..."); while (!_STOP && _HAS_WATCHERS) { - const int waited = us_memsink_fd_wait_frame(fd, mem, frame_id); - if (waited == 0) { + const int got = us_memsink_client_get(sink, tmp, NULL, atomic_load(&_g_key_required)); + if (got == 0) { const int ri = us_ring_producer_acquire(_g_video_ring, 0); - us_frame_s *frame; - if (ri >= 0) { - frame = _g_video_ring->items[ri]; - } else { - US_ONCE({ US_LOG_PERROR("Video ring is full"); }); - frame = drop; - } - - const int got = us_memsink_fd_get_frame(fd, mem, frame, &frame_id, atomic_load(&_g_key_required)); if (ri >= 0) { + us_frame_s *dest = _g_video_ring->items[ri]; + us_frame_copy(tmp, dest); us_ring_producer_release(_g_video_ring, ri); + if (tmp->key) { + atomic_store(&_g_key_required, false); + } + } else { + US_ONCE({ US_LOG_ERROR("Video ring is full"); }); } - if (got < 0) { - goto close_memsink; - } - - if (ri >= 0 && frame->key) { - atomic_store(&_g_key_required, false); - } - } else if (waited != US_ERROR_NO_DATA) { + } else if (got != US_ERROR_NO_DATA) { goto close_memsink; } } close_memsink: - if (mem != NULL) { - us_memsink_shared_unmap(mem, data_size); - mem = NULL; - } - US_CLOSE_FD(fd); + US_DELETE(sink, us_memsink_destroy); US_LOG_INFO("Memsink closed"); sleep(1); // error_delay } - us_frame_destroy(drop); + us_frame_destroy(tmp); return NULL; } diff --git a/janus/src/uslibs/memsink.c b/janus/src/uslibs/memsink.c new file mode 120000 index 0000000..9c5b633 --- /dev/null +++ b/janus/src/uslibs/memsink.c @@ -0,0 +1 @@ +../../../src/libs/memsink.c \ No newline at end of file diff --git a/janus/src/uslibs/memsink.h b/janus/src/uslibs/memsink.h new file mode 120000 index 0000000..1c34ef8 --- /dev/null +++ b/janus/src/uslibs/memsink.h @@ -0,0 +1 @@ +../../../src/libs/memsink.h \ No newline at end of file