summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/audio.c4
-rw-r--r--src/buffer/clock.c11
-rw-r--r--src/buffer/frame_queue.h4
-rw-r--r--src/buffer/peak_buffer.c2
-rw-r--r--src/buffer/peak_buffer.h2
-rw-r--r--src/buffer/video.c1
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