diff options
Diffstat (limited to 'src/codec/libav')
| -rw-r--r-- | src/codec/libav/demuxer.c | 17 | ||||
| -rw-r--r-- | src/codec/libav/demuxer.h | 4 | ||||
| -rw-r--r-- | src/codec/libav/resampler.c | 2 |
3 files changed, 11 insertions, 12 deletions
diff --git a/src/codec/libav/demuxer.c b/src/codec/libav/demuxer.c index d823d23..18b9020 100644 --- a/src/codec/libav/demuxer.c +++ b/src/codec/libav/demuxer.c @@ -1,8 +1,7 @@ #include <al/log.h> -#include "../common.h" - #include "demuxer.h" +#include "avio.h" #define BUF_SIZE 16384 @@ -63,11 +62,11 @@ static bool lav_demuxer_init(struct camu_demuxer *demux, struct cch_handle *hand goto err; } - av->duration = 0; - #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)) + av->duration = 0; + for (u32 i = 0; i < av->format_context->nb_streams; i++) { AVStream *stream = av->format_context->streams[i]; enum AVMediaType type = stream->codecpar->codec_type; @@ -88,7 +87,8 @@ static bool lav_demuxer_init(struct camu_demuxer *demux, struct cch_handle *hand al_log_warn("lav_demux", "Stream has a negative start_time (%ld).", stream->start_time); } s64 duration = av_rescale_q(stream->duration, stream->time_base, AV_TIME_BASE_Q); - if (duration > av->duration) av->duration = duration; + al_assert(duration >= 0); + if ((u64)duration > av->duration) av->duration = (u64)duration; al_array_push(av->demux.streams, ((struct camu_stream){ .type = CAMU_FFMPEG_COMPAT, .av.stream = stream @@ -140,16 +140,17 @@ static s32 lav_demuxer_get_packet(struct camu_demuxer *demux, struct camu_packet return ret; } -static s64 lav_demuxer_get_duration(struct camu_demuxer *demux) +static u64 lav_demuxer_get_duration(struct camu_demuxer *demux) { struct camu_lav_demuxer *av = (struct camu_lav_demuxer *)demux; return av->duration; } -static bool lav_demuxer_seek(struct camu_demuxer *demux, s64 pos) +static bool lav_demuxer_seek(struct camu_demuxer *demux, u64 pos) { struct camu_lav_demuxer *av = (struct camu_lav_demuxer *)demux; - s64 ts = av_rescale_q(pos, (AVRational){ 1, 1000000 }, AV_TIME_BASE_Q); + if (pos > av->duration) pos = av->duration; + s64 ts = av_rescale_q((s64)pos, (AVRational){ 1, 1000000 }, AV_TIME_BASE_Q); if (av->eof) { avformat_flush(av->format_context); av->eof = false; diff --git a/src/codec/libav/demuxer.h b/src/codec/libav/demuxer.h index a9d8c5c..9b2d093 100644 --- a/src/codec/libav/demuxer.h +++ b/src/codec/libav/demuxer.h @@ -8,13 +8,11 @@ #include "../codec.h" -#include "avio.h" - struct camu_lav_demuxer { struct camu_demuxer demux; AVIOContext *io_context; AVFormatContext *format_context; - s64 duration; + u64 duration; bool eof; }; diff --git a/src/codec/libav/resampler.c b/src/codec/libav/resampler.c index 3dcb6d4..ba700f4 100644 --- a/src/codec/libav/resampler.c +++ b/src/codec/libav/resampler.c @@ -43,7 +43,7 @@ bool camu_lav_resampler_init(struct camu_lav_resampler *resamp, struct camu_lav_ av_opt_set_sample_fmt(ctx, "out_sample_fmt", fmt->req_format, 0); // Slower but more accurate resampler. - av_opt_set_int(ctx, "resampler", SWR_ENGINE_SOXR, 0); + //av_opt_set_int(ctx, "resampler", SWR_ENGINE_SOXR, 0); if (swr_init(ctx) != 0) { swr_free(&ctx); |