summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
commit5e3641e5e692c3f2f644a4bb809c88727cb8bee9 (patch)
treefbac2007fdcebda13406350fdcef977910427078 /src/buffer
parentf56abfafcd4fa722b807278b138f805112cd953e (diff)
downloadcamu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.gz
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.bz2
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.zip
Command queue for portal and list, work on server
Most of the server stuff can undoubtedly be simplified. I'm still working that out. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/audio.c21
-rw-r--r--src/buffer/video.c3
2 files changed, 15 insertions, 9 deletions
diff --git a/src/buffer/audio.c b/src/buffer/audio.c
index 113ea1d..8d33f79 100644
--- a/src/buffer/audio.c
+++ b/src/buffer/audio.c
@@ -143,7 +143,7 @@ static void push_av_frame_internal(struct camu_audio_buffer *buf, AVFrame *frame
s32 sample_count = frame->nb_samples;
AVStream *stream = buf->stream->av.stream;
f64 pts = frame->best_effort_timestamp * av_q2d(stream->time_base);
- f64 duration = camu_audio_format_samples_to_sec(&buf->fmt.in, frame->nb_samples);
+ f64 duration = camu_audio_format_samples_to_sec(&buf->fmt.in, sample_count);
if (pts + duration >= camu_clock_get_base_pts(buf->clock)) {
if (buf->pts == -1.0) buf->pts = pts;
u8 **data = frame->data;
@@ -163,15 +163,20 @@ void camu_audio_buffer_push(struct camu_audio_buffer *buf, struct camu_codec_fra
al_assert(al_atomic_load(u8)(&buf->flow, AL_ATOMIC_RELAXED) == FLOWING);
switch (frame->mode) {
case CAMU_NORMAL: {
- u8 *store[AV_NUM_DATA_POINTERS] = { 0 };
- store[0] = frame->data;
- u8 **data = store;
s32 sample_count = frame->audio.sample_count;
- if (buf->fmt.resampler_needed) {
- sample_count = buf->resamp->convert(buf->resamp, (const u8 **)store, sample_count);
- data = buf->resamp->get_data(buf->resamp);
+ f64 pts = frame->pts;
+ f64 duration = camu_audio_format_samples_to_sec(&buf->fmt.in, sample_count);
+ if (pts + duration >= camu_clock_get_base_pts(buf->clock)) {
+ if (buf->pts == -1.0) buf->pts = pts;
+ u8 *store[AV_NUM_DATA_POINTERS] = { 0 };
+ store[0] = frame->data;
+ u8 **data = store;
+ if (buf->fmt.resampler_needed) {
+ sample_count = buf->resamp->convert(buf->resamp, (const u8 **)store, sample_count);
+ data = buf->resamp->get_data(buf->resamp);
+ }
+ push_internal(buf, data[0], sample_count);
}
- push_internal(buf, data[0], sample_count);
break;
}
#ifdef CAMU_HAVE_FFMPEG
diff --git a/src/buffer/video.c b/src/buffer/video.c
index 0ffc00d..91c3687 100644
--- a/src/buffer/video.c
+++ b/src/buffer/video.c
@@ -20,7 +20,7 @@ bool camu_video_buffer_init(struct camu_video_buffer *buf, struct camu_clock *cl
buf->clock = clock;
buf->latency = 0.0;
buf->pts = -1.0;
- // Defaulting single_frame to true should simplify non-configured buffers in sink.
+ // Defaulting single_frame to true can simplify non-configured buffers in sink.
buf->single_frame = true;
buf->queue = renderer->create_queue(renderer);
buf->buffered = false;
@@ -61,6 +61,7 @@ bool camu_video_buffer_configure(struct camu_video_buffer *buf, struct camu_code
camu_video_format_copy(&buf->fmt.in, fmt);
buf->single_frame = duration == 0 || frame_rate.den == 0;
+ if (buf->single_frame) frame_rate = (AVRational){ 0, 1 };
buf->avg_frame_duration = buf->single_frame ? 0.0 : av_q2d(av_inv_q(frame_rate));
const char *format_name = av_get_pix_fmt_name(buf->fmt.in.format);