Files
utun2/src/stream/stream_playback_clock.h
T

50 lines
2.9 KiB
C

/* Общая адаптация воспроизведения desktop/Android, без сетевых ресурсов и очередей медиа.
* Один поток либо внешняя блокировка. position_us — фактические общие часы исходного материала;
* ready_us — непрерывная готовая граница, включая данные в кольце/кодеке/устройстве.
* Минимумы короткого окна нормализованы по смещению wall-clock относительно media-clock:
* простой увеличивает все прежние запасы, догон уменьшает их без переписывания истории.
* После 200 мс без фактической недостачи избыток погашается плавным ускорением до 1.6.
* guard_us и уже поставленный устройству pending_gain_us защищают остаток при снижении темпа.
* reset нужен при новой эпохе/реальном GAP/смене позиции; временная нехватка историю сохраняет. */
#ifndef STREAM_PLAYBACK_CLOCK_H
#define STREAM_PLAYBACK_CLOCK_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define STREAM_PLAYBACK_HISTORY 4
#define STREAM_PLAYBACK_BUCKET_US 50000
#define STREAM_PLAYBACK_SETTLE_US 200000
#define STREAM_PLAYBACK_MAX_TEMPO 1600
#define STREAM_PLAYBACK_RAMP_US 500000
struct stream_playback_bucket { int64_t period, minimum_us; };
struct stream_playback_clock {
struct stream_playback_bucket history[STREAM_PLAYBACK_HISTORY];
uint64_t id, pauses;
int64_t first_us, last_us, last_position_us, correction_us, last_bad_us, pause_us, report_us;
int64_t ramp_remainder;
int tempo_milli, initialized, waiting;
};
struct stream_playback_state {
int64_t position_us, reserve_us, minimum_us, correction_us, stable_us, removable_us;
int tempo_milli, waiting, history_ready;
};
void stream_playback_clock_reset(struct stream_playback_clock *clock, uint64_t id);
/* Результат не меняется при ошибке. starved отмечает фактическую остановку подготовки/вывода.
* Временное уменьшение фактического position_us запрещено; после перемотки вызывают reset.
* Возврат 0 — успех, отрицательный — неверные аргументы/часы. */
int stream_playback_clock_update(struct stream_playback_clock *clock, int64_t now_us, int64_t position_us,
int64_t ready_us, int64_t guard_us, int64_t pending_gain_us,
int starved, struct stream_playback_state *state);
#ifdef __cplusplus
}
#endif
#endif