diff options
Diffstat (limited to 'src/buffer')
| -rw-r--r-- | src/buffer/clock.c | 8 | ||||
| -rw-r--r-- | src/buffer/clock.h | 1 | ||||
| -rw-r--r-- | src/buffer/video.c | 8 | ||||
| -rw-r--r-- | src/buffer/video.h | 3 |
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; |