summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-29 16:45:30 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-29 16:45:30 -0500
commit6134465ddc10f8b43bddf74209f0ec8654595041 (patch)
tree49eb55da3d08abdc7dea9628c3ae9674dfe7afde /src/buffer
parent457a3cc1a04e45e31370d9083186436b0d12ab1d (diff)
downloadcamu-6134465ddc10f8b43bddf74209f0ec8654595041.tar.gz
camu-6134465ddc10f8b43bddf74209f0ec8654595041.tar.bz2
camu-6134465ddc10f8b43bddf74209f0ec8654595041.zip
Fixes and optimizations around seek and loop
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/clock.c8
-rw-r--r--src/buffer/clock.h1
-rw-r--r--src/buffer/video.c8
-rw-r--r--src/buffer/video.h3
4 files changed, 13 insertions, 7 deletions
diff --git a/src/buffer/clock.c b/src/buffer/clock.c
index 3f2168c..b0b4ac9 100644
--- a/src/buffer/clock.c
+++ b/src/buffer/clock.c
@@ -49,6 +49,12 @@ void camu_clock_seek(struct camu_clock *clock, f64 base, u64 target)
}
}
+void camu_clock_loop(struct camu_clock *clock, f64 last_pts)
+{
+ clock->offset += last_pts - clock->base;
+ clock->base = 0.0;
+}
+
void camu_clock_offset(struct camu_clock *clock, f64 amount)
{
clock->offset += amount;
@@ -129,5 +135,5 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 offset, bool allow_set)
}
}
- return clock->base + (current - (tick + clock->offset)) + offset;
+ return (clock->base - clock->offset) + (current - tick) + offset;
}
diff --git a/src/buffer/clock.h b/src/buffer/clock.h
index dd3f015..b312a1c 100644
--- a/src/buffer/clock.h
+++ b/src/buffer/clock.h
@@ -40,6 +40,7 @@ struct camu_clock {
void camu_clock_init(struct camu_clock *clock, void (*callback)(void *, u8), void *userdata);
void camu_clock_set(struct camu_clock *clock, f64 base);
void camu_clock_seek(struct camu_clock *clock, f64 base, u64 target);
+void camu_clock_loop(struct camu_clock *clock, f64 last_pts);
void camu_clock_offset(struct camu_clock *clock, f64 amount);
void camu_clock_pause(struct camu_clock *clock, u64 target);
diff --git a/src/buffer/video.c b/src/buffer/video.c
index 7771939..41aa9ed 100644
--- a/src/buffer/video.c
+++ b/src/buffer/video.c
@@ -167,7 +167,6 @@ static bool push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame
f64 duration = frame->duration * av_q2d(stream->time_base);
f64 base = al_atomic_load(f64)(&buf->pts, AL_ATOMIC_ACQUIRE);
if (!buf->single_frame && frame_is_late(buf->clock, base, pts, duration)) {
- av_frame_free(&frame);
return false;
}
if (base == -1.0) al_atomic_store(f64)(&buf->pts, pts, AL_ATOMIC_RELEASE);
@@ -203,9 +202,11 @@ void camu_video_buffer_push(struct camu_video_buffer *buf, struct camu_codec_fra
}
#ifdef CAMU_HAVE_FFMPEG
case CAMU_FFMPEG_COMPAT: {
- bool pushed = push_av_frame_internal(buf, frame->av.frame);
+ if (!push_av_frame_internal(buf, frame->av.frame)) {
+ camu_codec_frame_discard(frame);
+ return;
+ }
al_free(frame);
- if (!pushed) return;
break;
}
#endif
@@ -239,7 +240,6 @@ void camu_video_buffer_reset(struct camu_video_buffer *buf)
{
buf->last_pts = al_atomic_load(f64)(&buf->pts, AL_ATOMIC_ACQUIRE);
al_atomic_store(f64)(&buf->pts, -1.0, AL_ATOMIC_RELEASE);
- // pl_queue_pts_offset for looping?
if (buf->queue) buf->queue->reset(buf->queue);
buf->buffered = false;
al_atomic_store(u8)(&buf->flow, FLOWING, AL_ATOMIC_RELAXED);
diff --git a/src/buffer/video.h b/src/buffer/video.h
index 632a28f..33991a2 100644
--- a/src/buffer/video.h
+++ b/src/buffer/video.h
@@ -29,8 +29,7 @@ struct camu_video_buffer {
struct camu_frame_queue *queue;
bool buffered;
- // Flush the render pipeline on this read and don't allow
- // it to set the clock.
+ // Flush the renderer on this read and don't allow it to set the clock.
bool weighted_read;
atomic(u8) flow;