mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-23 16:03:41 +00:00
Revert "fluency delay based on involved workers counter"
This reverts commit 9f16de13fe.
This commit is contained in:
35
src/stream.c
35
src/stream.c
@@ -75,8 +75,6 @@ struct _worker_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct _workers_pool_t {
|
struct _workers_pool_t {
|
||||||
atomic_bool workers_stop;
|
|
||||||
|
|
||||||
unsigned n_workers;
|
unsigned n_workers;
|
||||||
struct _worker_t *workers;
|
struct _worker_t *workers;
|
||||||
struct _worker_t *oldest_worker;
|
struct _worker_t *oldest_worker;
|
||||||
@@ -86,11 +84,9 @@ struct _workers_pool_t {
|
|||||||
unsigned free_workers;
|
unsigned free_workers;
|
||||||
pthread_cond_t free_workers_cond;
|
pthread_cond_t free_workers_cond;
|
||||||
|
|
||||||
long double desired_frames_interval;
|
atomic_bool workers_stop;
|
||||||
|
|
||||||
unsigned involved_workers;
|
long double desired_frames_interval;
|
||||||
unsigned involved_workers_max_number;
|
|
||||||
long long involved_workers_second;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -361,20 +357,18 @@ static struct _workers_pool_t *_workers_pool_init(struct stream_t *stream) {
|
|||||||
|
|
||||||
A_CALLOC(pool, 1);
|
A_CALLOC(pool, 1);
|
||||||
|
|
||||||
atomic_init(&pool->workers_stop, false);
|
|
||||||
|
|
||||||
pool->n_workers = stream->dev->run->n_workers;
|
pool->n_workers = stream->dev->run->n_workers;
|
||||||
A_CALLOC(pool->workers, pool->n_workers);
|
A_CALLOC(pool->workers, pool->n_workers);
|
||||||
|
|
||||||
A_MUTEX_INIT(&pool->free_workers_mutex);
|
A_MUTEX_INIT(&pool->free_workers_mutex);
|
||||||
A_COND_INIT(&pool->free_workers_cond);
|
A_COND_INIT(&pool->free_workers_cond);
|
||||||
|
|
||||||
|
atomic_init(&pool->workers_stop, false);
|
||||||
|
|
||||||
if (stream->dev->desired_fps > 0) {
|
if (stream->dev->desired_fps > 0) {
|
||||||
pool->desired_frames_interval = (long double)1 / stream->dev->desired_fps;
|
pool->desired_frames_interval = (long double)1 / stream->dev->desired_fps;
|
||||||
}
|
}
|
||||||
|
|
||||||
pool->involved_workers = 1;
|
|
||||||
|
|
||||||
for (unsigned number = 0; number < pool->n_workers; ++number) {
|
for (unsigned number = 0; number < pool->n_workers; ++number) {
|
||||||
# define WORKER(_next) pool->workers[number]._next
|
# define WORKER(_next) pool->workers[number]._next
|
||||||
|
|
||||||
@@ -524,8 +518,6 @@ static struct _worker_t *_workers_pool_wait(struct _workers_pool_t *pool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _workers_pool_assign(struct _workers_pool_t *pool, struct _worker_t *ready_worker, unsigned buf_index) {
|
static void _workers_pool_assign(struct _workers_pool_t *pool, struct _worker_t *ready_worker, unsigned buf_index) {
|
||||||
long long now_second = floor_ms(get_now_monotonic());
|
|
||||||
|
|
||||||
if (pool->oldest_worker == NULL) {
|
if (pool->oldest_worker == NULL) {
|
||||||
pool->oldest_worker = ready_worker;
|
pool->oldest_worker = ready_worker;
|
||||||
pool->latest_worker = pool->oldest_worker;
|
pool->latest_worker = pool->oldest_worker;
|
||||||
@@ -552,21 +544,6 @@ static void _workers_pool_assign(struct _workers_pool_t *pool, struct _worker_t
|
|||||||
pool->free_workers -= 1;
|
pool->free_workers -= 1;
|
||||||
A_MUTEX_UNLOCK(&pool->free_workers_mutex);
|
A_MUTEX_UNLOCK(&pool->free_workers_mutex);
|
||||||
|
|
||||||
// involved_workers - это количество задействованных воркеров. Оно может быть меньше n_workers,
|
|
||||||
// если требуемый fps может быть обеспечен таковым числом. Например, на новом Core i7 с четырьмя
|
|
||||||
// ядрами, это число будет равняться двум, поскольку два воркера вполне успевают обрабатывать
|
|
||||||
// 30fps со встроенной камеры. Это числоиспользуется для рассчета задержки межву воркерами
|
|
||||||
// в функции _workers_pool_get_fluency_delay(). Поскольку алгоритм распределения воркеров работет
|
|
||||||
// так, что всегда ищет самый первый незанятый форвер по номеру, можно считать, что максимальное
|
|
||||||
// количество занятых воркеров равно максимальному задействованному номеру.
|
|
||||||
if (now_second != pool->involved_workers_second) {
|
|
||||||
pool->involved_workers = pool->involved_workers_max_number + 1;
|
|
||||||
pool->involved_workers_max_number = 0;
|
|
||||||
pool->involved_workers_second = now_second;
|
|
||||||
LOG_PERF("Involved workers = %u", pool->involved_workers);
|
|
||||||
}
|
|
||||||
pool->involved_workers_max_number = max_u(pool->involved_workers_max_number, ready_worker->number);
|
|
||||||
|
|
||||||
LOG_DEBUG("Assigned new frame in buffer %u to worker %u", buf_index, ready_worker->number);
|
LOG_DEBUG("Assigned new frame in buffer %u to worker %u", buf_index, ready_worker->number);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,9 +565,9 @@ static long double _workers_pool_get_fluency_delay(struct _workers_pool_t *pool)
|
|||||||
# undef WORKER
|
# undef WORKER
|
||||||
}
|
}
|
||||||
|
|
||||||
avg_comp_time = sum_comp_time / pool->involved_workers; // Среднее время работы воркеров
|
avg_comp_time = sum_comp_time / pool->n_workers; // Среднее время работы воркеров
|
||||||
|
|
||||||
min_delay = avg_comp_time / pool->involved_workers; // Среднее время работы размазывается на N воркеров
|
min_delay = avg_comp_time / pool->n_workers; // Среднее время работы размазывается на N воркеров
|
||||||
|
|
||||||
if (pool->desired_frames_interval > 0 && min_delay > 0) {
|
if (pool->desired_frames_interval > 0 && min_delay > 0) {
|
||||||
// Искусственное время задержки на основе желаемого FPS, если включен --desired-fps
|
// Искусственное время задержки на основе желаемого FPS, если включен --desired-fps
|
||||||
|
|||||||
Reference in New Issue
Block a user