refactoring

This commit is contained in:
Devaev Maxim
2020-12-13 18:31:17 +03:00
parent 89467a0ef9
commit 1837f502a7
6 changed files with 60 additions and 61 deletions

View File

@@ -129,7 +129,7 @@ void rawsink_destroy(rawsink_s *rawsink) {
free(rawsink);
}
void rawsink_server_put(
int rawsink_server_put(
rawsink_s *rawsink,
const uint8_t *data, size_t size,
unsigned format, unsigned width, unsigned height,
@@ -139,13 +139,9 @@ void rawsink_server_put(
assert(rawsink->server);
if (rawsink->server_failed) {
return;
}
if (size > RAWSINK_MAX_DATA) {
LOG_ERROR("RAWSINK: Can't put RAW frame: is too big (%zu > %zu)", size, RAWSINK_MAX_DATA);
return;
return 0; // -2
}
if (_flock_timedwait_monotonic(rawsink->fd, 1) == 0) {
@@ -153,7 +149,7 @@ void rawsink_server_put(
if (sem_trywait(rawsink->sig_sem) < 0 && errno != EAGAIN) {
LOG_PERROR("RAWSINK: Can't wait signal semaphore");
goto error;
return -1;
}
# define COPY(_field) rawsink->mem->_field = _field
@@ -167,11 +163,11 @@ void rawsink_server_put(
if (sem_post(rawsink->sig_sem) < 0) {
LOG_PERROR("RAWSINK: Can't post signal semaphore");
goto error;
return -1;
}
if (flock(rawsink->fd, LOCK_UN) < 0) {
LOG_PERROR("RAWSINK: Can't unlock memory");
goto error;
return -1;
}
LOG_VERBOSE("RAWSINK: Exposed new frame; full exposition time = %Lf", get_now_monotonic() - now);
@@ -180,14 +176,9 @@ void rawsink_server_put(
} else {
LOG_PERROR("RAWSINK: Can't lock memory");
goto error;
return -1;
}
return;
error:
LOG_ERROR("RAW sink completely disabled due error");
rawsink->server_failed = true;
return 0;
}
int rawsink_client_get(

View File

@@ -65,15 +65,13 @@ typedef struct {
int fd;
rawsink_shared_s *mem;
sem_t *sig_sem;
bool server_failed;
} rawsink_s;
rawsink_s *rawsink_init(const char *name, bool server, mode_t mode, bool rm, unsigned timeout);
void rawsink_destroy(rawsink_s *rawsink);
void rawsink_server_put(
int rawsink_server_put(
rawsink_s *rawsink,
const uint8_t *data, size_t size,
unsigned format, unsigned witdh, unsigned height,

View File

@@ -230,6 +230,11 @@ options_s *options_init(int argc, char *argv[]) {
}
void options_destroy(options_s *options) {
# ifdef WITH_RAWSINK
if (options->rawsink) {
rawsink_destroy(options->rawsink);
}
# endif
if (options->blank) {
frame_destroy(options->blank);
}
@@ -312,7 +317,16 @@ int options_parse(options_s *options, device_s *dev, encoder_s *encoder, stream_
int short_index;
int opt_index;
char short_opts[1024] = {0};
char *blank_path = NULL;
# ifdef WITH_RAWSINK
char *rawsink_name = NULL;
mode_t rawsink_mode = 0660;
bool rawsink_rm = false;
unsigned rawsink_timeout = 1;
# endif
# ifdef WITH_SETPROCTITLE
char *process_name_prefix = NULL;
# endif
@@ -402,10 +416,10 @@ int options_parse(options_s *options, device_s *dev, encoder_s *encoder, stream_
case _O_SERVER_TIMEOUT: OPT_NUMBER("--server-timeout", server->timeout, 1, 60, 0);
# ifdef WITH_RAWSINK
case _O_RAWSINK: OPT_SET(stream->rawsink_name, optarg);
case _O_RAWSINK_MODE: OPT_NUMBER("--raw-sink-mode", stream->rawsink_mode, INT_MIN, INT_MAX, 8);
case _O_RAWSINK_RM: OPT_SET(stream->rawsink_rm, true);
case _O_RAWSINK_TIMEOUT: OPT_NUMBER("--raw-sink-timeout", server->timeout, 1, 60, 0);
case _O_RAWSINK: OPT_SET(rawsink_name, optarg);
case _O_RAWSINK_MODE: OPT_NUMBER("--raw-sink-mode", rawsink_mode, INT_MIN, INT_MAX, 8);
case _O_RAWSINK_RM: OPT_SET(rawsink_rm, true);
case _O_RAWSINK_TIMEOUT: OPT_NUMBER("--raw-sink-timeout", rawsink_timeout, 1, 60, 0);
# endif
# ifdef WITH_GPIO
@@ -447,6 +461,19 @@ int options_parse(options_s *options, device_s *dev, encoder_s *encoder, stream_
options->blank = blank_frame_init(blank_path);
stream->blank = options->blank;
# ifdef WITH_RAWSINK
if (rawsink_name && rawsink_name[0] != '\0') {
options->rawsink = rawsink_init(
rawsink_name,
true,
rawsink_mode,
rawsink_rm,
rawsink_timeout
);
}
stream->rawsink = options->rawsink;
# endif
# ifdef WITH_SETPROCTITLE
if (process_name_prefix != NULL) {
process_set_name_prefix(options->argc, options->argv, process_name_prefix);
@@ -671,9 +698,9 @@ static void _help(device_s *dev, encoder_s *encoder, stream_s *stream, server_s
printf("═════════════════\n");
printf(" --raw-sink <name> ──────── Use the shared memory to sink RAW frames before encoding.\n");
printf(" Most likely you will never need it. Default: disabled.\n\n");
printf(" --raw-sink-mode <mode> ─── Set RAW sink permissions (like 777). Default: %o.\n\n", stream->rawsink_mode);
printf(" --raw-sink-mode <mode> ─── Set RAW sink permissions (like 777). Default: 660.\n\n");
printf(" --raw-sink-rm ──────────── Remove shared memory on stop. Default: disabled.\n\n");
printf(" --raw-sink-timeout <sec> ─ Timeout for lock. Default: %u.\n\n", stream->rawsink_timeout);
printf(" --raw-sink-timeout <sec> ─ Timeout for lock. Default: 1.\n\n");
#endif
#ifdef WITH_GPIO
printf("GPIO options:\n");

View File

@@ -36,6 +36,9 @@
#include "../common/config.h"
#include "../common/logging.h"
#include "../common/process.h"
#ifdef WITH_RAWSINK
# include "../rawsink/rawsink.h"
#endif
#include "device.h"
#include "frame.h"
@@ -49,10 +52,13 @@
typedef struct {
int argc;
char **argv;
char **argv_copy;
frame_s *blank;
int argc;
char **argv;
char **argv_copy;
frame_s *blank;
# ifdef WITH_RAWSINK
rawsink_s *rawsink;
# endif
} options_s;

View File

@@ -100,11 +100,6 @@ stream_s *stream_init(device_s *dev, encoder_s *encoder) {
A_CALLOC(stream, 1);
stream->last_as_blank = -1;
stream->error_delay = 1;
# ifdef WITH_RAWSINK
stream->rawsink_name = "";
stream->rawsink_mode = 0660;
stream->rawsink_timeout = 1;
# endif
stream->proc = proc;
stream->video = video;
stream->dev = dev;
@@ -127,19 +122,6 @@ void stream_loop(stream_s *stream) {
LOG_INFO("Using V4L2 device: %s", DEV(path));
LOG_INFO("Using desired FPS: %u", DEV(desired_fps));
# ifdef WITH_RAWSINK
rawsink_s *rawsink = NULL;
if (stream->rawsink_name[0] != '\0') {
rawsink = rawsink_init(
stream->rawsink_name,
true,
stream->rawsink_mode,
stream->rawsink_rm,
stream->rawsink_timeout
);
}
# endif
while ((pool = _stream_init_loop(stream)) != NULL) {
long double grab_after = 0;
unsigned fluency_passed = 0;
@@ -228,8 +210,12 @@ void stream_loop(stream_s *stream) {
# ifdef WITH_RAWSINK
# define HW(_next) DEV(run->hw_buffers[buf_index]._next)
if (rawsink) {
rawsink_server_put(rawsink, HW(data), HW(used), HW(format), HW(width), HW(height), HW(grab_ts));
if (stream->rawsink && rawsink_server_put(
stream->rawsink, HW(data), HW(used), HW(format),
HW(width), HW(height), HW(grab_ts)
) < 0) {
stream->rawsink = NULL;
LOG_ERROR("RAW sink completely disabled due error");
}
# undef HW
# endif
@@ -264,12 +250,6 @@ void stream_loop(stream_s *stream) {
# endif
}
# ifdef WITH_RAWSINK
if (rawsink) {
rawsink_destroy(rawsink);
}
# endif
# undef DEV
}

View File

@@ -65,16 +65,13 @@ typedef struct {
typedef struct {
int last_as_blank;
unsigned error_delay;
# ifdef WITH_RAWSINK
char *rawsink_name;
mode_t rawsink_mode;
bool rawsink_rm;
unsigned rawsink_timeout;
# endif
device_s *dev;
encoder_s *encoder;
frame_s *blank;
# ifdef WITH_RAWSINK
rawsink_s *rawsink;
# endif
process_s *proc;
video_s *video;