diff options
| author | 2024-12-05 13:15:30 -0500 | |
|---|---|---|
| committer | 2024-12-05 13:15:30 -0500 | |
| commit | d4da3d8a644156b9f24b560eba58a87b912c1fef (patch) | |
| tree | ea44234aadddbcf54203c5b6912ba95c2dd65591 /src/codec | |
| parent | 61d2d6fd165ebfc3d3985e89000964e9b11c5157 (diff) | |
| download | camu-d4da3d8a644156b9f24b560eba58a87b912c1fef.tar.gz camu-d4da3d8a644156b9f24b560eba58a87b912c1fef.tar.bz2 camu-d4da3d8a644156b9f24b560eba58a87b912c1fef.zip | |
Improve audio/video_buffer_push() logic
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/codec')
| -rw-r--r-- | src/codec/codec.h | 4 | ||||
| -rw-r--r-- | src/codec/ffmpeg/decoder.c | 9 | ||||
| -rw-r--r-- | src/codec/ffmpeg/scaler.c | 18 |
3 files changed, 20 insertions, 11 deletions
diff --git a/src/codec/codec.h b/src/codec/codec.h index 4b93673..a9b188a 100644 --- a/src/codec/codec.h +++ b/src/codec/codec.h @@ -53,7 +53,7 @@ enum { CAMU_PIXEL_FORMAT_GREYA = AV_PIX_FMT_GRAY8A, CAMU_PIXEL_FORMAT_GREY = AV_PIX_FMT_GRAY8 }; -#define CAMU_NUM_DATA_POINTERS AV_NUM_DATA_POINTERS +#define CAMU_PLANAR_DATA_POINTERS AV_NUM_DATA_POINTERS #else enum { CAMU_OK = 0, @@ -92,7 +92,7 @@ enum { CAMU_PIXEL_FORMAT_GREYA, CAMU_PIXEL_FORMAT_GREY }; -#define CAMU_NUM_DATA_POINTERS 8 +#define CAMU_PLANAR_DATA_POINTERS 8 #endif enum { 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; } |