summaryrefslogtreecommitdiff
path: root/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec')
-rw-r--r--src/codec/codec.h7
-rw-r--r--src/codec/ffmpeg/decoder.c6
-rw-r--r--src/codec/ffmpeg/demuxer.c6
3 files changed, 13 insertions, 6 deletions
diff --git a/src/codec/codec.h b/src/codec/codec.h
index 3440e9f..25ec73e 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -59,7 +59,8 @@ enum {
enum {
CAMU_PIXEL_FORMAT_RGBA = AV_PIX_FMT_RGBA,
- CAMU_PIXEL_FORMAT_RGB = AV_PIX_FMT_RGB8,
+ CAMU_PIXEL_FORMAT_RGB8 = AV_PIX_FMT_RGB8,
+ CAMU_PIXEL_FORMAT_RGB24 = AV_PIX_FMT_RGB24,
CAMU_PIXEL_FORMAT_RGB32 = AV_PIX_FMT_RGB32,
CAMU_PIXEL_FORMAT_GREYA = AV_PIX_FMT_GRAY8A,
CAMU_PIXEL_FORMAT_GREY = AV_PIX_FMT_GRAY8,
@@ -380,7 +381,7 @@ static inline const char *camu_pixel_format_name(s32 format)
#else
switch (format) {
case CAMU_PIXEL_FORMAT_RGBA: return "rgba";
- case CAMU_PIXEL_FORMAT_RGB: return "rgb";
+ case CAMU_PIXEL_FORMAT_RGB24: return "rgb";
case CAMU_PIXEL_FORMAT_GREYA: return "grey + alpha";
case CAMU_PIXEL_FORMAT_GREY: return "grey";
default: return "(unknown)";
@@ -392,7 +393,7 @@ static inline s32 camu_pixel_format_from_channels(s32 channels)
{
switch (channels) {
case 4: return CAMU_PIXEL_FORMAT_RGBA;
- case 3: return CAMU_PIXEL_FORMAT_RGB;
+ case 3: return CAMU_PIXEL_FORMAT_RGB24;
case 2: return CAMU_PIXEL_FORMAT_GREYA;
case 1: return CAMU_PIXEL_FORMAT_GREY;
default: al_assert_and_return(CAMU_PIXEL_FORMAT_GREY);
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index 9693dd9..cfa1dc2 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -268,6 +268,7 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
#ifdef CAMU_FF_DECODER_HWACCEL
if (is_video && av->hw_device_type != AV_HWDEVICE_TYPE_NONE) {
+ //av->codec_context->hwaccel_flags |= AV_HWACCEL_FLAG_IGNORE_LEVEL | AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH;
if (init_hwdevice_context(av, av->codec_context) == 0) {
av->renderer = renderer;
av->codec_context->opaque = av;
@@ -282,7 +283,7 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
#endif
if (is_video) {
- av->thread_count = MIN(6, MAX(1, av_cpu_count() / 2));
+ av->thread_count = MIN(8, MAX(1, av_cpu_count() / 2));
#ifdef CAMU_FF_DECODER_HWACCEL
if (av->hw_device_type == AV_HWDEVICE_TYPE_NONE) {
#endif
@@ -298,6 +299,9 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
#endif
}
+ //av->codec_context->flags |= AV_CODEC_FLAG_BITEXACT;
+ //av->codec_context->flags2 |= AV_CODEC_FLAG2_FAST;
+
if (!open_avcodec_internal(av, codec)) {
goto err;
}
diff --git a/src/codec/ffmpeg/demuxer.c b/src/codec/ffmpeg/demuxer.c
index 6560e0e..f05cfa9 100644
--- a/src/codec/ffmpeg/demuxer.c
+++ b/src/codec/ffmpeg/demuxer.c
@@ -80,7 +80,9 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl
s64 default_duration = (av->format_context->duration < 0) ? 0 : av->format_context->duration;
av->duration = 0;
- // @TODO: Handle no-duration video.
+ // @TODO:
+ // - 1 frame .gif.
+ // - No-duration video. (ex: data/test_resources/no_duration.mkv)
#define GUESS_STREAM_IS_IMAGE(stream) \
((stream->duration >= 0 && stream->nb_frames <= 1 && \
(stream->avg_frame_rate.den == 0 && stream->r_frame_rate.den > 0)) || \
@@ -113,7 +115,7 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl
}
if (stream->start_time == AV_NOPTS_VALUE) stream->start_time = 0;
} else if (type != AVMEDIA_TYPE_ATTACHMENT) {
- continue;
+ type = AVMEDIA_TYPE_UNKNOWN; // Mapped to CAMU_STREAM_UNKNOWN.
}
al_array_push(av->demux.streams, ((struct camu_codec_stream){
.mode = CAMU_FFMPEG_COMPAT,