diff options
Diffstat (limited to 'src/codec')
| -rw-r--r-- | src/codec/codec.h | 7 | ||||
| -rw-r--r-- | src/codec/ffmpeg/decoder.c | 6 | ||||
| -rw-r--r-- | src/codec/ffmpeg/demuxer.c | 6 |
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, |