summaryrefslogtreecommitdiff
path: root/src/codec/libav
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/libav')
-rw-r--r--src/codec/libav/demuxer.c17
-rw-r--r--src/codec/libav/demuxer.h4
-rw-r--r--src/codec/libav/resampler.c2
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);