From d4da3d8a644156b9f24b560eba58a87b912c1fef Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 5 Dec 2024 13:15:30 -0500 Subject: Improve audio/video_buffer_push() logic Signed-off-by: Andrew Opalach --- src/codec/ffmpeg/decoder.c | 9 ++++++--- src/codec/ffmpeg/scaler.c | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'src/codec/ffmpeg') diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c index 0fb60ac..51eca40 100644 --- a/src/codec/ffmpeg/decoder.c +++ b/src/codec/ffmpeg/decoder.c @@ -37,10 +37,13 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend } s32 cpus = av_cpu_count(); - if (cpus >= 8) cpus = 4; - av->codec_context->thread_count = cpus / 2; + if (av->codec_context->codec_type == AVMEDIA_TYPE_VIDEO) { + cpus = MIN(4, MAX(1, cpus / 2)); + } else { + cpus = MIN(2, MAX(1, cpus / 4)); + } + av->codec_context->thread_count = cpus; // FF_THREAD_FRAME or FF_THREAD_SLICE. - //av->codec_context->thread_type = FF_THREAD_SLICE; av->codec_context->thread_type = FF_THREAD_FRAME; al_log_debug("ff_decoder", "Using %i threads for decoder.", cpus); diff --git a/src/codec/ffmpeg/scaler.c b/src/codec/ffmpeg/scaler.c index 0089dd1..bc8d41b 100644 --- a/src/codec/ffmpeg/scaler.c +++ b/src/codec/ffmpeg/scaler.c @@ -49,12 +49,12 @@ static bool ff_scaler_init(struct camu_scaler *scale, struct camu_scaler_format return false; } - AVFrame *frame = alloc_picture(fmt->req.format, fmt->req.width, fmt->req.height); - if (!frame) { + struct camu_codec_frame *frame = &av->frame; + frame->av.frame = alloc_picture(fmt->req.format, fmt->req.width, fmt->req.height); + if (!frame->av.frame) { al_log_error("ff_scaler", "Failed to allocate frame."); return false; } - av->frame.av.frame = frame; return true; } @@ -81,9 +81,15 @@ static struct camu_codec_frame *ff_scaler_get_frame(struct camu_scaler *scale) static void ff_scaler_free(struct camu_scaler **scale) { struct camu_ff_scaler *av = (struct camu_ff_scaler *)*scale; - av_freep(&av->frame.av.frame->data[0]); - av_frame_free(&av->frame.av.frame); - sws_freeContext(av->scaler_context); + struct camu_codec_frame *frame = &av->frame; + if (frame->av.frame) { + av_freep(&frame->av.frame->data[0]); + av_frame_free(&frame->av.frame); + } + if (av->scaler_context) { + sws_freeContext(av->scaler_context); + av->scaler_context = NULL; + } al_free(av); *scale = NULL; } -- cgit v1.2.3-101-g0448