diff options
| author | 2024-12-27 11:02:38 -0500 | |
|---|---|---|
| committer | 2024-12-27 11:02:38 -0500 | |
| commit | 4af2d16c06a8a67ab225caa61ccd94df3c572bdc (patch) | |
| tree | 6f5b364ea409c93aa9f0b795f252ac78c7d833f9 /src/buffer | |
| parent | 9026e7f49f11e920eac666bd4159ec459b979623 (diff) | |
| download | camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.tar.gz camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.tar.bz2 camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.zip | |
Fix some configurations, add sink loop mode
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer')
| -rw-r--r-- | src/buffer/audio.c | 4 | ||||
| -rw-r--r-- | src/buffer/clock.c | 11 | ||||
| -rw-r--r-- | src/buffer/frame_queue.h | 4 | ||||
| -rw-r--r-- | src/buffer/peak_buffer.c | 2 | ||||
| -rw-r--r-- | src/buffer/peak_buffer.h | 2 | ||||
| -rw-r--r-- | src/buffer/video.c | 1 |
6 files changed, 16 insertions, 8 deletions
diff --git a/src/buffer/audio.c b/src/buffer/audio.c index 5a956ec..c0556e2 100644 --- a/src/buffer/audio.c +++ b/src/buffer/audio.c @@ -143,7 +143,7 @@ static bool push_internal(struct camu_audio_buffer *buf, f64 pts, u8 **data, s32 } size_t have = camu_audio_format_samples_to_bytes(&buf->fmt.req, (size_t)sample_count); - size_t peak = camu_peak_buffer_size(&buf->peak); + size_t peak = camu_peak_buffer_get_size(&buf->peak); if (space < have + peak) { al_assert(have < buf->mark.min); camu_peak_buffer_push(&buf->peak, data[0], have); @@ -333,7 +333,7 @@ size_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, size_t re if (have < req) { // We don't have enough data to fulfill our request. if (flow == FLUSHED) { // Stream is flushed. // Check peak buffer for any remaining data. - ret = camu_peak_buffer_size(&buf->peak); + ret = camu_peak_buffer_get_size(&buf->peak); if (ret > 0) { // This doesn't break single reader, single writer because // pushing data after a flush is not allowed. diff --git a/src/buffer/clock.c b/src/buffer/clock.c index cbf63d5..33118aa 100644 --- a/src/buffer/clock.c +++ b/src/buffer/clock.c @@ -14,8 +14,11 @@ void camu_clock_init(struct camu_clock *clock, void (*callback)(void *, u8), voi static f64 calc_tick_offset(f64 tick, u64 now, u64 target) { - if (now > target) return tick - (now - target) / 1000000.0; - else return tick + (target - now) / 1000000.0; + if (now > target) { + return tick - (now - target) / 1000000.0; + } else { + return tick + (target - now) / 1000000.0; + } } void camu_clock_set(struct camu_clock *clock, f64 base) @@ -107,12 +110,15 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 offset) { f64 pause = al_atomic_load(f64)(&clock->pause, AL_ATOMIC_ACQUIRE); if (pause == PAUSED) return -1.0; + f64 current = nn_get_tick(); + f64 tick = al_atomic_load(f64)(&clock->tick, AL_ATOMIC_RELAXED); if (tick == -1.0) { tick = al_atomic_compare_and_swap(f64)(&clock->tick, -1.0, current); if (tick == -1.0) tick = current; } + // pause > 0.0 means running or pause armed. if (pause > 0.0 && current > pause) { current = pause; @@ -121,5 +127,6 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 offset) clock->callback(clock->userdata, CAMU_CLOCK_PAUSED); } } + return clock->base + (current - (tick + clock->offset)) + offset; } diff --git a/src/buffer/frame_queue.h b/src/buffer/frame_queue.h index e3044f1..e40971d 100644 --- a/src/buffer/frame_queue.h +++ b/src/buffer/frame_queue.h @@ -16,10 +16,12 @@ enum { struct camu_frame_queue { struct camu_video_buffer *buf; +#ifdef CAMU_HAVE_FFMPEG + bool (*configure_subtitles)(struct camu_frame_queue *, s32, s32, AVCodecParameters *); +#endif void (*push)(struct camu_frame_queue *, struct camu_codec_frame *, f64); #ifdef CAMU_HAVE_FFMPEG void (*push_av_frame)(struct camu_frame_queue *, AVFrame *, f64); - bool (*configure_subtitles)(struct camu_frame_queue *, s32, s32, AVCodecParameters *); void (*push_subtitle)(struct camu_frame_queue *, AVPacket *); #endif void (*flush)(struct camu_frame_queue *); diff --git a/src/buffer/peak_buffer.c b/src/buffer/peak_buffer.c index eec031a..9687a1f 100644 --- a/src/buffer/peak_buffer.c +++ b/src/buffer/peak_buffer.c @@ -13,7 +13,7 @@ void camu_peak_buffer_push(struct camu_peak_buffer *buf, u8 *data, size_t size) nn_buffer_append(&buf->buf, data, size); } -size_t camu_peak_buffer_size(struct camu_peak_buffer *buf) +size_t camu_peak_buffer_get_size(struct camu_peak_buffer *buf) { return nn_buffer_get_size(&buf->buf); } diff --git a/src/buffer/peak_buffer.h b/src/buffer/peak_buffer.h index ebb9939..9bd3316 100644 --- a/src/buffer/peak_buffer.h +++ b/src/buffer/peak_buffer.h @@ -9,6 +9,6 @@ struct camu_peak_buffer { void camu_peak_buffer_init(struct camu_peak_buffer *buf, size_t size); void camu_peak_buffer_push(struct camu_peak_buffer *buf, u8 *data, size_t size); -size_t camu_peak_buffer_size(struct camu_peak_buffer *buf); +size_t camu_peak_buffer_get_size(struct camu_peak_buffer *buf); u8 *camu_peak_buffer_flush(struct camu_peak_buffer *buf); void camu_peak_buffer_free(struct camu_peak_buffer *buf); diff --git a/src/buffer/video.c b/src/buffer/video.c index 94c452d..245f3d2 100644 --- a/src/buffer/video.c +++ b/src/buffer/video.c @@ -47,7 +47,6 @@ bool camu_video_buffer_configure(struct camu_video_buffer *buf, struct camu_code const char *format_name = camu_pixel_format_name(fmt->format); if (!format_name) format_name = "unknown"; al_log_info("video_buffer", "Stream: %s (%dx%d) %s.", format_name, fmt->width, fmt->height, "IMAGE"); - break; } #ifdef CAMU_HAVE_FFMPEG |