summaryrefslogtreecommitdiff
path: root/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec')
-rw-r--r--src/codec/codec.h2
-rw-r--r--src/codec/ffmpeg/avio.c10
-rw-r--r--src/codec/ffmpeg/common.c2
-rw-r--r--src/codec/ffmpeg/demuxer.c14
-rw-r--r--src/codec/stb_image/server.c3
5 files changed, 21 insertions, 10 deletions
diff --git a/src/codec/codec.h b/src/codec/codec.h
index 1c7c21f..48f83c7 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -186,7 +186,7 @@ struct camu_demuxer {
bool (*init)(struct camu_demuxer *, struct cch_handle *);
s32 (*get_packet)(struct camu_demuxer *, struct camu_codec_packet *);
u64 (*get_duration)(struct camu_demuxer *);
- bool (*seek)(struct camu_demuxer *, u64);
+ bool (*seek)(struct camu_demuxer *, u64, bool);
void (*free)(struct camu_demuxer **);
array(struct camu_codec_stream) streams;
u32 subscribed;
diff --git a/src/codec/ffmpeg/avio.c b/src/codec/ffmpeg/avio.c
index 855a4de..154152e 100644
--- a/src/codec/ffmpeg/avio.c
+++ b/src/codec/ffmpeg/avio.c
@@ -2,10 +2,16 @@
#include "../../cache/handle.h"
-s32 camu_avio_read(void *data, u8 *buf, s32 size)
+s32 camu_avio_read(void *data, u8 *buf, s32 count)
{
struct cch_handle *handle = (struct cch_handle *)data;
- return cch_handle_read(handle, buf, size);
+ return cch_handle_read(handle, buf, count);
+}
+
+s32 camu_avio_write(void *data, const u8 *buf, s32 count)
+{
+ struct cch_handle *handle = (struct cch_handle *)data;
+ return cch_handle_write(handle, buf, count);
}
s64 camu_avio_seek(void *data, s64 offset, s32 whence)
diff --git a/src/codec/ffmpeg/common.c b/src/codec/ffmpeg/common.c
index d96dc76..259ba90 100644
--- a/src/codec/ffmpeg/common.c
+++ b/src/codec/ffmpeg/common.c
@@ -38,7 +38,7 @@ static void av_log_callback(void *userdata, s32 level, const char *fmt, va_list
log_context.pos += ret;
if ((log_context.pos > 0 && *(offset - 1) == '\n') || log_context.pos >= AV_LOG_MAX_CHUNK) {
- if (level <= AV_LOG_INFO) {
+ if (level < AV_LOG_WARNING) {
log_info(log_context.buf);
} else {
log_debug(log_context.buf);
diff --git a/src/codec/ffmpeg/demuxer.c b/src/codec/ffmpeg/demuxer.c
index d45a970..c5ca20c 100644
--- a/src/codec/ffmpeg/demuxer.c
+++ b/src/codec/ffmpeg/demuxer.c
@@ -95,7 +95,7 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl
if (stream->duration < 0) {
stream->duration = av_rescale_q(default_duration, AV_TIME_BASE_Q, stream->time_base);
al_assert(stream->duration >= 0);
- log_warn("Stream #%u has an invalid duration, defaulting to %.3fs.",
+ log_debug("Stream #%u has an invalid duration, defaulting to %.3fs.",
i, stream->duration * av_q2d(stream->time_base));
}
duration = (u64)av_rescale_q(stream->duration, stream->time_base, AV_TIME_BASE_Q);
@@ -162,19 +162,23 @@ static u64 ff_demuxer_get_duration(struct camu_demuxer *demux)
return av->duration;
}
-static bool ff_demuxer_seek(struct camu_demuxer *demux, u64 pos)
+static bool ff_demuxer_seek(struct camu_demuxer *demux, u64 pos, bool bytes)
{
struct camu_ff_demuxer *av = (struct camu_ff_demuxer *)demux;
- al_assert(pos <= INT64_MAX);
- if (pos > av->duration) pos = av->duration;
if (av->eof) {
// avio_flush() here probably does nothing.
avio_flush(av->io_context);
avformat_flush(av->format_context);
av->eof = false;
}
+ al_assert(pos <= INT64_MAX);
+ al_assert(!(bytes && av->format_context->flags & AVFMT_NO_BYTE_SEEK));
+ if (!bytes && pos > av->duration) pos = av->duration;
s64 ts = (s64)pos;
- if (avformat_seek_file(av->format_context, -1, INT64_MIN, ts, ts, 0) < 0) {
+ s32 flags = bytes ? AVSEEK_FLAG_BYTE : 0;
+ s32 ret = avformat_seek_file(av->format_context, -1, INT64_MIN, ts, ts, flags);
+ if (ret < 0) {
+ log_error("Failed to seek resource (%s).", av_err2str(ret));
return false;
}
return true;
diff --git a/src/codec/stb_image/server.c b/src/codec/stb_image/server.c
index e2d26e8..ba50360 100644
--- a/src/codec/stb_image/server.c
+++ b/src/codec/stb_image/server.c
@@ -58,10 +58,11 @@ static u64 stbi_demuxer_get_duration(struct camu_demuxer *demux)
return 0;
}
-static bool stbi_demuxer_seek(struct camu_demuxer *demux, u64 pos)
+static bool stbi_demuxer_seek(struct camu_demuxer *demux, u64 pos, bool bytes)
{
(void)demux;
(void)pos;
+ (void)bytes;
return true;
}