diff options
| author | 2024-11-08 14:53:40 -0500 | |
|---|---|---|
| committer | 2024-11-08 14:53:40 -0500 | |
| commit | 5e3641e5e692c3f2f644a4bb809c88727cb8bee9 (patch) | |
| tree | fbac2007fdcebda13406350fdcef977910427078 /src/buffer | |
| parent | f56abfafcd4fa722b807278b138f805112cd953e (diff) | |
| download | camu-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.c | 21 | ||||
| -rw-r--r-- | src/buffer/video.c | 3 |
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); |