summaryrefslogtreecommitdiff
path: root/src/liana/handlers
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-29 16:45:30 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-29 16:45:30 -0500
commit6134465ddc10f8b43bddf74209f0ec8654595041 (patch)
tree49eb55da3d08abdc7dea9628c3ae9674dfe7afde /src/liana/handlers
parent457a3cc1a04e45e31370d9083186436b0d12ab1d (diff)
downloadcamu-6134465ddc10f8b43bddf74209f0ec8654595041.tar.gz
camu-6134465ddc10f8b43bddf74209f0ec8654595041.tar.bz2
camu-6134465ddc10f8b43bddf74209f0ec8654595041.zip
Fixes and optimizations around seek and loop
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana/handlers')
-rw-r--r--src/liana/handlers/codec.h4
-rw-r--r--src/liana/handlers/codec_server.c22
2 files changed, 26 insertions, 0 deletions
diff --git a/src/liana/handlers/codec.h b/src/liana/handlers/codec.h
index 8c5528f..29d513b 100644
--- a/src/liana/handlers/codec.h
+++ b/src/liana/handlers/codec.h
@@ -2,11 +2,15 @@
#include "../../codec/codec.h"
+#include "../server.h"
#include "../handler.h"
struct lia_codec_server {
struct lia_server_handler handler;
struct camu_demuxer *demux;
+#ifdef LIANA_SERVER_LOOP
+ u64 pts_offset;
+#endif
struct camu_codec_packet packet;
};
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index ff62d47..dcbfe17 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -17,13 +17,20 @@
static bool codec_server_init(struct lia_server_handler *handler, struct cch_handle *handle)
{
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
+
codec->demux = camu_ff_demuxer_create();
//codec->demux = camu_stbi_demuxer_create();
//codec->demux = camu_spng_demuxer_create();
//codec->demux = camu_wuffs_demuxer_create();
+
if (!codec->demux->init(codec->demux, handle)) {
return false;
}
+
+#ifdef LIANA_SERVER_LOOP
+ codec->pts_offset = 0;
+#endif
+
switch (codec->demux->mode) {
case CAMU_NORMAL:
break;
@@ -35,14 +42,17 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han
break;
#endif
}
+
return true;
}
static void codec_server_write_info(struct lia_server_handler *handler, struct nn_packet *packet)
{
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
+
u64 duration = codec->demux->get_duration(codec->demux);
nn_packet_write_u64(packet, duration);
+
nn_packet_write_u32(packet, codec->demux->streams.count);
struct camu_codec_stream *stream;
al_array_foreach_ptr(codec->demux->streams, i, stream) {
@@ -83,6 +93,9 @@ static u64 codec_server_get_duration(struct lia_server_handler *handler)
static bool codec_server_seek(struct lia_server_handler *handler, u64 pos)
{
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
+#ifdef LIANA_SERVER_LOOP
+ codec->pts_offset = 0;
+#endif
return codec->demux->seek(codec->demux, pos);
}
@@ -114,6 +127,11 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct
#ifdef CAMU_HAVE_FFMPEG
case CAMU_FFMPEG_COMPAT: {
AVPacket *pkt = codec->packet.av.pkt;
+#ifdef LIANA_SERVER_LOOP
+ struct camu_codec_stream *stream = &al_array_at(codec->demux->streams, pkt->stream_index);
+ AVRational time_base = stream->av.stream->time_base;
+ pkt->pts += av_rescale_q(codec->pts_offset, AV_TIME_BASE_Q, time_base);
+#endif
nn_packet_write_s32(packet, pkt->stream_index);
nn_packet_write_u8(packet, codec->packet.mode);
#ifdef CAMU_DIRECT_MODE
@@ -128,6 +146,10 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct
}
} else if (codec->handler.status == CAMU_ERR_EOF) {
nn_packet_write_u8(packet, LIANA_PACKET_EOF);
+#ifdef LIANA_SERVER_LOOP
+ codec->pts_offset += codec->demux->get_duration(codec->demux);
+ codec->demux->seek(codec->demux, 0);
+#endif
} else {
nn_packet_write_u8(packet, LIANA_PACKET_ERROR);
}