From 7f089201d2b1e164fbfe4f67e2e04a5c14db839f Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Sat, 2 Jan 2021 17:42:49 +0300 Subject: [PATCH] refactoring --- src/ustreamer/device.c | 22 +++++++++++----------- src/ustreamer/device.h | 4 ++-- src/ustreamer/stream.c | 34 ++++++++++++++-------------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/ustreamer/device.c b/src/ustreamer/device.c index 3235f5a..eae6dc0 100644 --- a/src/ustreamer/device.c +++ b/src/ustreamer/device.c @@ -273,7 +273,9 @@ int device_select(device_s *dev, bool *has_read, bool *has_write, bool *has_erro return retval; } -int device_grab_buffer(device_s *dev) { +int device_grab_buffer(device_s *dev, hw_buffer_s **hw) { + *hw = NULL; + struct v4l2_buffer buf_info; MEMSET_ZERO(buf_info); buf_info.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; @@ -330,24 +332,22 @@ int device_grab_buffer(device_s *dev) { HW(raw.grab_ts) = get_now_monotonic(); # undef HW + *hw = &RUN(hw_buffers[buf_info.index]); return buf_info.index; } -int device_release_buffer(device_s *dev, unsigned index) { -# define HW(_next) RUN(hw_buffers)[index]._next - +int device_release_buffer(device_s *dev, hw_buffer_s *hw) { + const unsigned index = hw->buf_info.index; LOG_DEBUG("Releasing device buffer index=%u ...", index); - A_MUTEX_LOCK(&HW(grabbed_mutex)); - if (xioctl(RUN(fd), VIDIOC_QBUF, &HW(buf_info)) < 0) { + A_MUTEX_LOCK(&hw->grabbed_mutex); + if (xioctl(RUN(fd), VIDIOC_QBUF, &hw->buf_info) < 0) { LOG_PERROR("Unable to release device buffer index=%u", index); - A_MUTEX_UNLOCK(&HW(grabbed_mutex)); + A_MUTEX_UNLOCK(&hw->grabbed_mutex); return -1; } - HW(grabbed) = false; - A_MUTEX_UNLOCK(&HW(grabbed_mutex)); - -# undef HW + hw->grabbed = false; + A_MUTEX_UNLOCK(&hw->grabbed_mutex); return 0; } diff --git a/src/ustreamer/device.h b/src/ustreamer/device.h index 6ec62f0..a8e5497 100644 --- a/src/ustreamer/device.h +++ b/src/ustreamer/device.h @@ -155,6 +155,6 @@ void device_close(device_s *dev); int device_switch_capturing(device_s *dev, bool enable); int device_select(device_s *dev, bool *has_read, bool *has_write, bool *has_error); -int device_grab_buffer(device_s *dev); -int device_release_buffer(device_s *dev, unsigned index); +int device_grab_buffer(device_s *dev, hw_buffer_s **hw); +int device_release_buffer(device_s *dev, hw_buffer_s *hw); int device_consume_event(device_s *dev); diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index 7470450..aa660a1 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -26,7 +26,7 @@ typedef struct { device_s *dev; encoder_s *encoder; - unsigned buf_index; + hw_buffer_s *hw; char *dest_role; frame_s *dest; } _job_s; @@ -73,10 +73,8 @@ void stream_destroy(stream_s *stream) { } void stream_loop(stream_s *stream) { -# define DEV(_next) stream->dev->_next - - LOG_INFO("Using V4L2 device: %s", DEV(path)); - LOG_INFO("Using desired FPS: %u", DEV(desired_fps)); + LOG_INFO("Using V4L2 device: %s", stream->dev->path); + LOG_INFO("Using desired FPS: %u", stream->dev->desired_fps); for (workers_pool_s *pool; (pool = _stream_init_loop(stream)) != NULL;) { long double grab_after = 0; @@ -137,13 +135,15 @@ void stream_loop(stream_s *stream) { const long double now = get_now_monotonic(); const long long now_second = floor_ms(now); - int buf_index = device_grab_buffer(stream->dev); + hw_buffer_s *hw; + int buf_index = device_grab_buffer(stream->dev, &hw); + if (buf_index >= 0) { if (now < grab_after) { fluency_passed += 1; LOG_VERBOSE("Passed %u frames for fluency: now=%.03Lf, grab_after=%.03Lf", fluency_passed, now, grab_after); - if (device_release_buffer(stream->dev, buf_index) < 0) { + if (device_release_buffer(stream->dev, hw) < 0) { break; } } else { @@ -163,14 +163,14 @@ void stream_loop(stream_s *stream) { # ifdef WITH_MEMSINK if (stream->raw_sink) { - if (memsink_server_put(stream->raw_sink, &DEV(run->hw_buffers[buf_index].raw)) < 0) { + if (memsink_server_put(stream->raw_sink, &hw->raw) < 0) { stream->raw_sink = NULL; LOG_ERROR("RAW sink completely disabled due error"); } } # endif - ((_job_s *)ready_wr->job)->buf_index = buf_index; + ((_job_s *)ready_wr->job)->hw = hw; workers_pool_assign(pool, ready_wr); LOG_DEBUG("Assigned new frame in buffer %d to worker %s", buf_index, ready_wr->name); } @@ -201,8 +201,6 @@ void stream_loop(stream_s *stream) { gpio_set_stream_online(false); # endif } - -# undef DEV } void stream_loop_break(stream_s *stream) { @@ -367,22 +365,18 @@ static void _worker_job_destroy(void *v_job) { static bool _worker_run_job(worker_s *wr) { _job_s *job = (_job_s *)wr->job; - LOG_DEBUG("Worker %s compressing JPEG from buffer %u ...", wr->name, job->buf_index); - bool ok = !encoder_compress( - job->encoder, - wr->number, - &job->dev->run->hw_buffers[job->buf_index].raw, - job->dest); + LOG_DEBUG("Worker %s compressing JPEG from buffer %u ...", wr->name, job->hw->buf_info.index); + bool ok = !encoder_compress(job->encoder, wr->number, &job->hw->raw, job->dest); - if (device_release_buffer(job->dev, job->buf_index) == 0) { + if (device_release_buffer(job->dev, job->hw) == 0) { if (ok) { LOG_VERBOSE("Compressed new JPEG: size=%zu, time=%0.3Lf, worker=%s, buffer=%u", job->dest->used, job->dest->encode_end_ts - job->dest->encode_begin_ts, wr->name, - job->buf_index); + job->hw->buf_info.index); } else { - LOG_VERBOSE("Compression failed: worker=%s, buffer=%u", wr->name, job->buf_index); + LOG_VERBOSE("Compression failed: worker=%s, buffer=%u", wr->name, job->hw->buf_info.index); } } else { ok = false;