refactoring

This commit is contained in:
Devaev Maxim
2020-12-08 15:39:53 +03:00
parent 0d006cffa9
commit eebd8307c5
3 changed files with 36 additions and 31 deletions

View File

@@ -805,14 +805,14 @@ static void _http_exposed_refresh(UNUSED int fd, UNUSED short what, void *v_serv
bool picture_updated = false;
# define UNLOCK_STREAM { \
atomic_store(&STREAM(updated), false); \
A_MUTEX_UNLOCK(&STREAM(mutex)); \
atomic_store(&STREAM(video->updated), false); \
A_MUTEX_UNLOCK(&STREAM(video->mutex)); \
}
if (atomic_load(&STREAM(updated))) {
if (atomic_load(&STREAM(video->updated))) {
LOG_DEBUG("Refreshing HTTP exposed ...");
A_MUTEX_LOCK(&STREAM(mutex));
if (STREAM(online)) {
A_MUTEX_LOCK(&STREAM(video->mutex));
if (STREAM(video->online)) {
picture_updated = _expose_new_picture_unsafe(server);
UNLOCK_STREAM;
} else {
@@ -847,14 +847,14 @@ static void _http_exposed_refresh(UNUSED int fd, UNUSED short what, void *v_serv
}
static bool _expose_new_picture_unsafe(struct http_server_t *server) {
EX(captured_fps) = STREAM(captured_fps);
EX(captured_fps) = STREAM(video->captured_fps);
EX(expose_begin_ts) = get_now_monotonic();
if (server->drop_same_frames) {
if (
EX(online)
&& EX(dropped) < server->drop_same_frames
&& picture_compare(EX(picture), STREAM(picture))
&& picture_compare(EX(picture), STREAM(video->picture))
) {
EX(expose_cmp_ts) = get_now_monotonic();
EX(expose_end_ts) = EX(expose_cmp_ts);
@@ -869,7 +869,7 @@ static bool _expose_new_picture_unsafe(struct http_server_t *server) {
}
}
picture_copy(STREAM(picture), EX(picture));
picture_copy(STREAM(video->picture), EX(picture));
EX(online) = true;
EX(dropped) = 0;

View File

@@ -84,32 +84,35 @@ static long double _workers_pool_get_fluency_delay(struct _workers_pool_t *pool,
struct stream_t *stream_init(struct device_t *dev, struct encoder_t *encoder) {
struct process_t *proc;
struct video_t *video;
struct stream_t *stream;
A_CALLOC(proc, 1);
atomic_init(&proc->stop, false);
atomic_init(&proc->slowdown, false);
A_CALLOC(video, 1);
video->picture = picture_init();
atomic_init(&video->updated, false);
A_MUTEX_INIT(&video->mutex);
A_CALLOC(stream, 1);
// FIXME
stream->error_delay = 1;
# ifdef WITH_RAWSINK
stream->rawsink_name = "";
stream->rawsink_mode = 0660;
# endif
// end-of-fixme
stream->picture = picture_init();
stream->proc = proc;
stream->video = video;
stream->dev = dev;
stream->encoder = encoder;
atomic_init(&stream->updated, false);
A_MUTEX_INIT(&stream->mutex);
stream->proc = proc;
return stream;
}
void stream_destroy(struct stream_t *stream) {
A_MUTEX_DESTROY(&stream->mutex);
picture_destroy(stream->picture);
A_MUTEX_DESTROY(&stream->video->mutex);
picture_destroy(stream->video->picture);
free(stream->video);
free(stream->proc);
free(stream);
}
@@ -138,7 +141,7 @@ void stream_loop(struct stream_t *stream) {
LOG_INFO("Capturing ...");
LOG_DEBUG("Pre-allocating memory for stream picture ...");
picture_realloc_data(stream->picture, picture_get_generous_size(DEV(run->width), DEV(run->height)));
picture_realloc_data(stream->video->picture, picture_get_generous_size(DEV(run->width), DEV(run->height)));
while (!atomic_load(&stream->proc->stop)) {
struct _worker_t *ready_wr;
@@ -252,10 +255,10 @@ void stream_loop(struct stream_t *stream) {
}
}
A_MUTEX_LOCK(&stream->mutex);
stream->online = false;
atomic_store(&stream->updated, true);
A_MUTEX_UNLOCK(&stream->mutex);
A_MUTEX_LOCK(&stream->video->mutex);
stream->video->online = false;
atomic_store(&stream->video->updated, true);
A_MUTEX_UNLOCK(&stream->video->mutex);
_workers_pool_destroy(pool);
device_switch_capturing(stream->dev, false);
@@ -331,15 +334,15 @@ static struct _workers_pool_t *_stream_init_one(struct stream_t *stream) {
}
static void _stream_expose_picture(struct stream_t *stream, struct picture_t *picture, unsigned captured_fps) {
A_MUTEX_LOCK(&stream->mutex);
A_MUTEX_LOCK(&stream->video->mutex);
picture_copy(picture, stream->picture);
picture_copy(picture, stream->video->picture);
stream->online = true;
stream->captured_fps = captured_fps;
atomic_store(&stream->updated, true);
stream->video->online = true;
stream->video->captured_fps = captured_fps;
atomic_store(&stream->video->updated, true);
A_MUTEX_UNLOCK(&stream->mutex);
A_MUTEX_UNLOCK(&stream->video->mutex);
}
static struct _workers_pool_t *_workers_pool_init(struct stream_t *stream) {

View File

@@ -51,25 +51,27 @@ struct process_t {
atomic_bool slowdown;
};
struct stream_t {
struct video_t {
struct picture_t *picture;
bool online;
unsigned captured_fps;
atomic_bool updated;
pthread_mutex_t mutex;
};
// FIXME: Config params, move other to runtime
struct stream_t {
unsigned error_delay;
# ifdef WITH_RAWSINK
char *rawsink_name;
mode_t rawsink_mode;
bool rawsink_rm;
# endif
// end-of-fixme
struct process_t *proc;
struct device_t *dev;
struct encoder_t *encoder;
struct process_t *proc;
struct video_t *video;
};