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