From 01d0ed97dea7b22f7ba9d1e6a779585da708b020 Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Sun, 27 Dec 2020 04:18:53 +0300 Subject: [PATCH] using frame_s for rawsink --- src/rawsink/rawsink.c | 33 ++++++++++----------------------- src/rawsink/rawsink.h | 19 +++++-------------- src/ustreamer/stream.c | 14 ++------------ 3 files changed, 17 insertions(+), 49 deletions(-) diff --git a/src/rawsink/rawsink.c b/src/rawsink/rawsink.c index d9147de..07ae790 100644 --- a/src/rawsink/rawsink.c +++ b/src/rawsink/rawsink.c @@ -129,18 +129,13 @@ void rawsink_destroy(rawsink_s *rawsink) { free(rawsink); } -int rawsink_server_put( - rawsink_s *rawsink, - const uint8_t *data, size_t size, - unsigned format, unsigned width, unsigned height, - long double grab_ts, bool online) { - +int rawsink_server_put(rawsink_s *rawsink, frame_s *raw) { long double now = get_now_monotonic(); assert(rawsink->server); - if (size > RAWSINK_MAX_DATA) { - LOG_ERROR("RAWSINK: Can't put RAW frame: is too big (%zu > %zu)", size, RAWSINK_MAX_DATA); + if (raw->used > RAWSINK_MAX_DATA) { + LOG_ERROR("RAWSINK: Can't put RAW frame: is too big (%zu > %zu)", raw->used, RAWSINK_MAX_DATA); return 0; // -2 } @@ -152,14 +147,13 @@ int rawsink_server_put( return -1; } -# define COPY(_field) rawsink->mem->_field = _field +# define COPY(_field) rawsink->mem->_field = raw->_field + COPY(used); COPY(format); COPY(width); COPY(height); COPY(grab_ts); - COPY(online); - COPY(size); - memcpy(rawsink->mem->data, data, size); + memcpy(rawsink->mem->data, raw->data, raw->used); # undef COPY if (sem_post(rawsink->sig_sem) < 0) { @@ -182,12 +176,7 @@ int rawsink_server_put( return 0; } -int rawsink_client_get( // cppcheck-suppress unusedFunction - rawsink_s *rawsink, - char *data, size_t *size, - unsigned *format, unsigned *width, unsigned *height, - long double *grab_ts, bool *online) { - +int rawsink_client_get(rawsink_s *rawsink, frame_s *raw) { // cppcheck-suppress unusedFunction assert(!rawsink->server); // Client only if (_sem_timedwait_monotonic(rawsink->sig_sem, rawsink->timeout) < 0) { @@ -205,14 +194,12 @@ int rawsink_client_get( // cppcheck-suppress unusedFunction return -1; } -# define COPY(_field) *_field = rawsink->mem->_field - COPY(format); +# define COPY(_field) raw->_field = rawsink->mem->_field COPY(width); COPY(height); + COPY(format); COPY(grab_ts); - COPY(online); - COPY(size); - memcpy(data, rawsink->mem->data, *size); + frame_set_data(raw, rawsink->mem->data, rawsink->mem->used); # undef COPY if (flock(rawsink->fd, LOCK_UN) < 0) { diff --git a/src/rawsink/rawsink.h b/src/rawsink/rawsink.h index 5a9677c..3de34cb 100644 --- a/src/rawsink/rawsink.h +++ b/src/rawsink/rawsink.h @@ -37,6 +37,7 @@ #include "../common/tools.h" #include "../common/logging.h" +#include "../common/frame.h" #ifndef CFG_RAWSINK_MAX_DATA @@ -46,12 +47,11 @@ typedef struct { - unsigned format; + size_t used; unsigned width; unsigned height; + unsigned format; long double grab_ts; - bool online; - size_t size; uint8_t data[RAWSINK_MAX_DATA]; } rawsink_shared_s; @@ -72,14 +72,5 @@ typedef struct { rawsink_s *rawsink_init(const char *name, bool server, mode_t mode, bool rm, unsigned timeout); void rawsink_destroy(rawsink_s *rawsink); -int rawsink_server_put( - rawsink_s *rawsink, - const uint8_t *data, size_t size, - unsigned format, unsigned witdh, unsigned height, - long double grab_ts, bool online); - -int rawsink_client_get( - rawsink_s *rawsink, - char *data, size_t *size, - unsigned *format, unsigned *width, unsigned *height, - long double *grab_ts, bool *online); +int rawsink_server_put(rawsink_s *rawsink, frame_s *raw); +int rawsink_client_get(rawsink_s *rawsink, frame_s *raw); diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index 4be1a84..8c1c2e6 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -209,15 +209,10 @@ void stream_loop(stream_s *stream) { LOG_VERBOSE("Fluency: delay=%.03Lf, grab_after=%.03Lf", fluency_delay, grab_after); # ifdef WITH_RAWSINK -# define RAW(_next) DEV(run->hw_buffers[buf_index].raw._next) - if (stream->rawsink && rawsink_server_put( - stream->rawsink, RAW(data), RAW(used), RAW(format), - RAW(width), RAW(height), RAW(grab_ts), true - ) < 0) { + if (stream->rawsink && rawsink_server_put(stream->rawsink, &DEV(run->hw_buffers[buf_index].raw)) < 0) { stream->rawsink = NULL; LOG_ERROR("RAW sink completely disabled due error"); } -# undef RAW # endif _workers_pool_assign(pool, ready_wr, buf_index); @@ -270,15 +265,10 @@ static _pool_s *_stream_init_loop(stream_s *stream) { while (!atomic_load(&stream->proc->stop)) { if (_stream_expose_frame(stream, NULL, 0)) { # ifdef WITH_RAWSINK -# define BLANK(_next) stream->blank->_next - if (stream->rawsink && rawsink_server_put( - stream->rawsink, BLANK(data), BLANK(used), V4L2_PIX_FMT_JPEG, - BLANK(width), BLANK(height), BLANK(grab_ts), false - ) < 0) { + if (stream->rawsink && rawsink_server_put(stream->rawsink, stream->blank) < 0) { stream->rawsink = NULL; LOG_ERROR("RAW sink completely disabled due error"); } -# undef BLANK # endif }