mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-05-26 23:36:16 +00:00
refactoring
This commit is contained in:
@@ -55,19 +55,19 @@ extern pthread_mutex_t us_log_mutex;
|
||||
#define US_LOGGING_INIT { \
|
||||
us_log_level = US_LOG_LEVEL_INFO; \
|
||||
us_log_colored = isatty(2); \
|
||||
US_MUTEX_INIT(&us_log_mutex); \
|
||||
US_MUTEX_INIT(us_log_mutex); \
|
||||
}
|
||||
|
||||
#define US_LOGGING_DESTROY US_MUTEX_DESTROY(&us_log_mutex)
|
||||
#define US_LOGGING_DESTROY US_MUTEX_DESTROY(us_log_mutex)
|
||||
|
||||
#define US_LOGGING_LOCK US_MUTEX_LOCK(&us_log_mutex)
|
||||
#define US_LOGGING_UNLOCK US_MUTEX_UNLOCK(&us_log_mutex)
|
||||
#define US_LOGGING_LOCK US_MUTEX_LOCK(us_log_mutex)
|
||||
#define US_LOGGING_UNLOCK US_MUTEX_UNLOCK(us_log_mutex)
|
||||
|
||||
|
||||
#define US_COLOR_GRAY "\x1b[30;1m"
|
||||
#define US_COLOR_RED "\x1b[31;1m"
|
||||
#define US_COLOR_GREEN "\x1b[32;1m"
|
||||
#define US_COLOR_YELLOW "\x1b[33;1m"
|
||||
#define US_COLOR_YELLOW "\x1b[33;1m"
|
||||
#define US_COLOR_BLUE "\x1b[34;1m"
|
||||
#define US_COLOR_CYAN "\x1b[36;1m"
|
||||
#define US_COLOR_RESET "\x1b[0m"
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
# define US_MAX_THREAD_NAME ((size_t)16)
|
||||
#endif
|
||||
|
||||
#define US_THREAD_CREATE(x_tid, x_func, x_arg) assert(!pthread_create((x_tid), NULL, (x_func), (x_arg)))
|
||||
#define US_THREAD_CREATE(x_tid, x_func, x_arg) assert(!pthread_create(&(x_tid), NULL, (x_func), (x_arg)))
|
||||
#define US_THREAD_JOIN(x_tid) assert(!pthread_join((x_tid), NULL))
|
||||
|
||||
#ifdef WITH_PTHREAD_NP
|
||||
@@ -59,15 +59,15 @@
|
||||
# define US_THREAD_RENAME(_fmt, ...)
|
||||
#endif
|
||||
|
||||
#define US_MUTEX_INIT(x_mutex) assert(!pthread_mutex_init((x_mutex), NULL))
|
||||
#define US_MUTEX_DESTROY(x_mutex) assert(!pthread_mutex_destroy(x_mutex))
|
||||
#define US_MUTEX_LOCK(x_mutex) assert(!pthread_mutex_lock(x_mutex))
|
||||
#define US_MUTEX_UNLOCK(x_mutex) assert(!pthread_mutex_unlock(x_mutex))
|
||||
#define US_MUTEX_INIT(x_mutex) assert(!pthread_mutex_init(&(x_mutex), NULL))
|
||||
#define US_MUTEX_DESTROY(x_mutex) assert(!pthread_mutex_destroy(&(x_mutex)))
|
||||
#define US_MUTEX_LOCK(x_mutex) assert(!pthread_mutex_lock(&(x_mutex)))
|
||||
#define US_MUTEX_UNLOCK(x_mutex) assert(!pthread_mutex_unlock(&(x_mutex)))
|
||||
|
||||
#define US_COND_INIT(x_cond) assert(!pthread_cond_init((x_cond), NULL))
|
||||
#define US_COND_DESTROY(x_cond) assert(!pthread_cond_destroy(x_cond))
|
||||
#define US_COND_SIGNAL(...) assert(!pthread_cond_signal(__VA_ARGS__))
|
||||
#define US_COND_WAIT_TRUE(x_var, x_cond, x_mutex) { while(!(x_var)) assert(!pthread_cond_wait((x_cond), (x_mutex))); }
|
||||
#define US_COND_INIT(x_cond) assert(!pthread_cond_init(&(x_cond), NULL))
|
||||
#define US_COND_DESTROY(x_cond) assert(!pthread_cond_destroy(&(x_cond)))
|
||||
#define US_COND_SIGNAL(x_cond) assert(!pthread_cond_signal(&(x_cond)))
|
||||
#define US_COND_WAIT_TRUE(x_var, x_cond, x_mutex) { while(!(x_var)) assert(!pthread_cond_wait(&(x_cond), &(x_mutex))); }
|
||||
|
||||
|
||||
#ifdef WITH_PTHREAD_NP
|
||||
|
||||
@@ -51,7 +51,7 @@ us_encoder_s *us_encoder_init(void) {
|
||||
US_CALLOC(run, 1);
|
||||
run->type = US_ENCODER_TYPE_CPU;
|
||||
run->quality = 80;
|
||||
US_MUTEX_INIT(&run->mutex);
|
||||
US_MUTEX_INIT(run->mutex);
|
||||
|
||||
us_encoder_s *enc;
|
||||
US_CALLOC(enc, 1);
|
||||
@@ -68,7 +68,7 @@ void us_encoder_destroy(us_encoder_s *enc) {
|
||||
}
|
||||
free(_ER(m2ms));
|
||||
}
|
||||
US_MUTEX_DESTROY(&_ER(mutex));
|
||||
US_MUTEX_DESTROY(_ER(mutex));
|
||||
free(enc->run);
|
||||
free(enc);
|
||||
}
|
||||
@@ -148,13 +148,13 @@ us_workers_pool_s *us_encoder_workers_pool_init(us_encoder_s *enc, us_device_s *
|
||||
US_LOG_INFO("Using JPEG quality: %u%%", quality);
|
||||
}
|
||||
|
||||
US_MUTEX_LOCK(&_ER(mutex));
|
||||
US_MUTEX_LOCK(_ER(mutex));
|
||||
_ER(type) = type;
|
||||
_ER(quality) = quality;
|
||||
if (cpu_forced) {
|
||||
_ER(cpu_forced) = true;
|
||||
}
|
||||
US_MUTEX_UNLOCK(&_ER(mutex));
|
||||
US_MUTEX_UNLOCK(_ER(mutex));
|
||||
|
||||
const long double desired_interval = (
|
||||
dev->desired_fps > 0 && (dev->desired_fps < dev->run->hw_fps || dev->run->hw_fps == 0)
|
||||
@@ -172,10 +172,10 @@ us_workers_pool_s *us_encoder_workers_pool_init(us_encoder_s *enc, us_device_s *
|
||||
}
|
||||
|
||||
void us_encoder_get_runtime_params(us_encoder_s *enc, us_encoder_type_e *type, unsigned *quality) {
|
||||
US_MUTEX_LOCK(&_ER(mutex));
|
||||
US_MUTEX_LOCK(_ER(mutex));
|
||||
*type = _ER(type);
|
||||
*quality = _ER(quality);
|
||||
US_MUTEX_UNLOCK(&_ER(mutex));
|
||||
US_MUTEX_UNLOCK(_ER(mutex));
|
||||
}
|
||||
|
||||
static void *_worker_job_init(void *v_enc) {
|
||||
@@ -236,8 +236,8 @@ static bool _worker_run_job(us_worker_s *wr) {
|
||||
error:
|
||||
US_LOG_ERROR("Compression failed: worker=%s, buffer=%u", wr->name, job->hw->buf.index);
|
||||
US_LOG_ERROR("Error while compressing buffer, falling back to CPU");
|
||||
US_MUTEX_LOCK(&_ER(mutex));
|
||||
US_MUTEX_LOCK(_ER(mutex));
|
||||
_ER(cpu_forced) = true;
|
||||
US_MUTEX_UNLOCK(&_ER(mutex));
|
||||
US_MUTEX_UNLOCK(_ER(mutex));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ void us_gpio_init(void) {
|
||||
|| us_gpio.stream_online.pin >= 0
|
||||
|| us_gpio.has_http_clients.pin >= 0
|
||||
) {
|
||||
US_MUTEX_INIT(&us_gpio.mutex);
|
||||
US_MUTEX_INIT(us_gpio.mutex);
|
||||
US_LOG_INFO("GPIO: Using chip device: %s", us_gpio.path);
|
||||
if ((us_gpio.chip = gpiod_chip_open(us_gpio.path)) != NULL) {
|
||||
_gpio_output_init(&us_gpio.prog_running);
|
||||
@@ -76,7 +76,7 @@ void us_gpio_destroy(void) {
|
||||
if (us_gpio.chip != NULL) {
|
||||
gpiod_chip_close(us_gpio.chip);
|
||||
us_gpio.chip = NULL;
|
||||
US_MUTEX_DESTROY(&us_gpio.mutex);
|
||||
US_MUTEX_DESTROY(us_gpio.mutex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ int us_gpio_inner_set(us_gpio_output_s *output, bool state) {
|
||||
assert(us_gpio.chip != NULL);
|
||||
assert(output->line != NULL);
|
||||
assert(output->state != state); // Must be checked in macro for the performance
|
||||
US_MUTEX_LOCK(&us_gpio.mutex);
|
||||
US_MUTEX_LOCK(us_gpio.mutex);
|
||||
|
||||
if (gpiod_line_set_value(output->line, (int)state) < 0) { \
|
||||
US_LOG_PERROR("GPIO: Can't write value %d to line %s (will be disabled)", state, output->consumer); \
|
||||
@@ -94,7 +94,7 @@ int us_gpio_inner_set(us_gpio_output_s *output, bool state) {
|
||||
retval = -1;
|
||||
}
|
||||
|
||||
US_MUTEX_UNLOCK(&us_gpio.mutex);
|
||||
US_MUTEX_UNLOCK(us_gpio.mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -856,7 +856,7 @@ static void _http_refresher(UNUSED int fd, UNUSED short what, void *v_server) {
|
||||
static bool _expose_new_frame(us_server_s *server) {
|
||||
bool updated = false;
|
||||
|
||||
US_MUTEX_LOCK(&_VID(mutex));
|
||||
US_MUTEX_LOCK(_VID(mutex));
|
||||
|
||||
US_LOG_DEBUG("HTTP: Updating exposed frame (online=%d) ...", _VID(frame->online));
|
||||
|
||||
@@ -895,7 +895,7 @@ static bool _expose_new_frame(us_server_s *server) {
|
||||
updated = true;
|
||||
not_updated:
|
||||
atomic_store(&_VID(updated), false);
|
||||
US_MUTEX_UNLOCK(&_VID(mutex));
|
||||
US_MUTEX_UNLOCK(_VID(mutex));
|
||||
return updated;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,8 +129,8 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
pthread_t stream_loop_tid;
|
||||
pthread_t server_loop_tid;
|
||||
US_THREAD_CREATE(&stream_loop_tid, _stream_loop_thread, NULL);
|
||||
US_THREAD_CREATE(&server_loop_tid, _server_loop_thread, NULL);
|
||||
US_THREAD_CREATE(stream_loop_tid, _stream_loop_thread, NULL);
|
||||
US_THREAD_CREATE(server_loop_tid, _server_loop_thread, NULL);
|
||||
US_THREAD_JOIN(server_loop_tid);
|
||||
US_THREAD_JOIN(stream_loop_tid);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ us_stream_s *us_stream_init(us_device_s *dev, us_encoder_s *enc) {
|
||||
US_CALLOC(video, 1);
|
||||
video->frame = us_frame_init();
|
||||
atomic_init(&video->updated, false);
|
||||
US_MUTEX_INIT(&video->mutex);
|
||||
US_MUTEX_INIT(video->mutex);
|
||||
atomic_init(&video->has_clients, false);
|
||||
run->video = video;
|
||||
|
||||
@@ -69,7 +69,7 @@ us_stream_s *us_stream_init(us_device_s *dev, us_encoder_s *enc) {
|
||||
}
|
||||
|
||||
void us_stream_destroy(us_stream_s *stream) {
|
||||
US_MUTEX_DESTROY(&_RUN(video->mutex));
|
||||
US_MUTEX_DESTROY(_RUN(video->mutex));
|
||||
us_frame_destroy(_RUN(video->frame));
|
||||
free(_RUN(video));
|
||||
free(stream->run);
|
||||
@@ -295,7 +295,7 @@ static void _stream_expose_frame(us_stream_s *stream, us_frame_s *frame, unsigne
|
||||
|
||||
us_frame_s *new = NULL;
|
||||
|
||||
US_MUTEX_LOCK(&VID(mutex));
|
||||
US_MUTEX_LOCK(VID(mutex));
|
||||
|
||||
if (frame != NULL) {
|
||||
new = frame;
|
||||
@@ -341,7 +341,7 @@ static void _stream_expose_frame(us_stream_s *stream, us_frame_s *frame, unsigne
|
||||
VID(captured_fps) = captured_fps;
|
||||
atomic_store(&VID(updated), true);
|
||||
|
||||
US_MUTEX_UNLOCK(&VID(mutex));
|
||||
US_MUTEX_UNLOCK(VID(mutex));
|
||||
|
||||
new = (frame ? frame : stream->blank);
|
||||
_SINK_PUT(sink, new);
|
||||
|
||||
@@ -46,8 +46,8 @@ us_workers_pool_s *us_workers_pool_init(
|
||||
pool->n_workers = n_workers;
|
||||
US_CALLOC(pool->workers, pool->n_workers);
|
||||
|
||||
US_MUTEX_INIT(&pool->free_workers_mutex);
|
||||
US_COND_INIT(&pool->free_workers_cond);
|
||||
US_MUTEX_INIT(pool->free_workers_mutex);
|
||||
US_COND_INIT(pool->free_workers_cond);
|
||||
|
||||
for (unsigned number = 0; number < pool->n_workers; ++number) {
|
||||
# define WR(x_next) pool->workers[number].x_next
|
||||
@@ -55,14 +55,14 @@ us_workers_pool_s *us_workers_pool_init(
|
||||
WR(number) = number;
|
||||
US_ASPRINTF(WR(name), "%s-%u", wr_prefix, number);
|
||||
|
||||
US_MUTEX_INIT(&WR(has_job_mutex));
|
||||
US_MUTEX_INIT(WR(has_job_mutex));
|
||||
atomic_init(&WR(has_job), false);
|
||||
US_COND_INIT(&WR(has_job_cond));
|
||||
US_COND_INIT(WR(has_job_cond));
|
||||
|
||||
WR(pool) = pool;
|
||||
WR(job) = job_init(job_init_arg);
|
||||
|
||||
US_THREAD_CREATE(&WR(tid), _worker_thread, (void *)&(pool->workers[number]));
|
||||
US_THREAD_CREATE(WR(tid), _worker_thread, (void *)&(pool->workers[number]));
|
||||
pool->free_workers += 1;
|
||||
|
||||
# undef WR
|
||||
@@ -77,14 +77,14 @@ void us_workers_pool_destroy(us_workers_pool_s *pool) {
|
||||
for (unsigned number = 0; number < pool->n_workers; ++number) {
|
||||
# define WR(x_next) pool->workers[number].x_next
|
||||
|
||||
US_MUTEX_LOCK(&WR(has_job_mutex));
|
||||
US_MUTEX_LOCK(WR(has_job_mutex));
|
||||
atomic_store(&WR(has_job), true); // Final job: die
|
||||
US_MUTEX_UNLOCK(&WR(has_job_mutex));
|
||||
US_COND_SIGNAL(&WR(has_job_cond));
|
||||
US_MUTEX_UNLOCK(WR(has_job_mutex));
|
||||
US_COND_SIGNAL(WR(has_job_cond));
|
||||
|
||||
US_THREAD_JOIN(WR(tid));
|
||||
US_MUTEX_DESTROY(&WR(has_job_mutex));
|
||||
US_COND_DESTROY(&WR(has_job_cond));
|
||||
US_MUTEX_DESTROY(WR(has_job_mutex));
|
||||
US_COND_DESTROY(WR(has_job_cond));
|
||||
|
||||
free(WR(name));
|
||||
|
||||
@@ -93,8 +93,8 @@ void us_workers_pool_destroy(us_workers_pool_s *pool) {
|
||||
# undef WR
|
||||
}
|
||||
|
||||
US_MUTEX_DESTROY(&pool->free_workers_mutex);
|
||||
US_COND_DESTROY(&pool->free_workers_cond);
|
||||
US_MUTEX_DESTROY(pool->free_workers_mutex);
|
||||
US_COND_DESTROY(pool->free_workers_cond);
|
||||
|
||||
free(pool->workers);
|
||||
free(pool);
|
||||
@@ -103,9 +103,9 @@ void us_workers_pool_destroy(us_workers_pool_s *pool) {
|
||||
us_worker_s *us_workers_pool_wait(us_workers_pool_s *pool) {
|
||||
us_worker_s *ready_wr = NULL;
|
||||
|
||||
US_MUTEX_LOCK(&pool->free_workers_mutex);
|
||||
US_COND_WAIT_TRUE(pool->free_workers, &pool->free_workers_cond, &pool->free_workers_mutex);
|
||||
US_MUTEX_UNLOCK(&pool->free_workers_mutex);
|
||||
US_MUTEX_LOCK(pool->free_workers_mutex);
|
||||
US_COND_WAIT_TRUE(pool->free_workers, pool->free_workers_cond, pool->free_workers_mutex);
|
||||
US_MUTEX_UNLOCK(pool->free_workers_mutex);
|
||||
|
||||
if (pool->oldest_wr && !atomic_load(&pool->oldest_wr->has_job)) {
|
||||
ready_wr = pool->oldest_wr;
|
||||
@@ -146,15 +146,15 @@ void us_workers_pool_assign(us_workers_pool_s *pool, us_worker_s *ready_wr/*, vo
|
||||
}
|
||||
pool->latest_wr->next_wr = NULL;
|
||||
|
||||
US_MUTEX_LOCK(&ready_wr->has_job_mutex);
|
||||
US_MUTEX_LOCK(ready_wr->has_job_mutex);
|
||||
//ready_wr->job = job;
|
||||
atomic_store(&ready_wr->has_job, true);
|
||||
US_MUTEX_UNLOCK(&ready_wr->has_job_mutex);
|
||||
US_COND_SIGNAL(&ready_wr->has_job_cond);
|
||||
US_MUTEX_UNLOCK(ready_wr->has_job_mutex);
|
||||
US_COND_SIGNAL(ready_wr->has_job_cond);
|
||||
|
||||
US_MUTEX_LOCK(&pool->free_workers_mutex);
|
||||
US_MUTEX_LOCK(pool->free_workers_mutex);
|
||||
pool->free_workers -= 1;
|
||||
US_MUTEX_UNLOCK(&pool->free_workers_mutex);
|
||||
US_MUTEX_UNLOCK(pool->free_workers_mutex);
|
||||
}
|
||||
|
||||
long double us_workers_pool_get_fluency_delay(us_workers_pool_s *pool, us_worker_s *ready_wr) {
|
||||
@@ -184,9 +184,9 @@ static void *_worker_thread(void *v_worker) {
|
||||
while (!atomic_load(&wr->pool->stop)) {
|
||||
US_LOG_DEBUG("Worker %s waiting for a new job ...", wr->name);
|
||||
|
||||
US_MUTEX_LOCK(&wr->has_job_mutex);
|
||||
US_COND_WAIT_TRUE(atomic_load(&wr->has_job), &wr->has_job_cond, &wr->has_job_mutex);
|
||||
US_MUTEX_UNLOCK(&wr->has_job_mutex);
|
||||
US_MUTEX_LOCK(wr->has_job_mutex);
|
||||
US_COND_WAIT_TRUE(atomic_load(&wr->has_job), wr->has_job_cond, wr->has_job_mutex);
|
||||
US_MUTEX_UNLOCK(wr->has_job_mutex);
|
||||
|
||||
if (!atomic_load(&wr->pool->stop)) {
|
||||
const long double job_start_ts = us_get_now_monotonic();
|
||||
@@ -199,10 +199,10 @@ static void *_worker_thread(void *v_worker) {
|
||||
atomic_store(&wr->has_job, false);
|
||||
}
|
||||
|
||||
US_MUTEX_LOCK(&wr->pool->free_workers_mutex);
|
||||
US_MUTEX_LOCK(wr->pool->free_workers_mutex);
|
||||
wr->pool->free_workers += 1;
|
||||
US_MUTEX_UNLOCK(&wr->pool->free_workers_mutex);
|
||||
US_COND_SIGNAL(&wr->pool->free_workers_cond);
|
||||
US_MUTEX_UNLOCK(wr->pool->free_workers_mutex);
|
||||
US_COND_SIGNAL(wr->pool->free_workers_cond);
|
||||
}
|
||||
|
||||
US_LOG_DEBUG("Bye-bye (worker %s)", wr->name);
|
||||
|
||||
Reference in New Issue
Block a user