summaryrefslogtreecommitdiff
path: root/src/codec/ffmpeg
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/ffmpeg')
-rw-r--r--src/codec/ffmpeg/decoder.c9
-rw-r--r--src/codec/ffmpeg/scaler.c18
2 files changed, 18 insertions, 9 deletions
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;
}