From 6134465ddc10f8b43bddf74209f0ec8654595041 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 29 Jan 2025 16:45:30 -0500 Subject: Fixes and optimizations around seek and loop Signed-off-by: Andrew Opalach --- src/liana/handlers/codec.h | 4 ++++ src/liana/handlers/codec_server.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'src/liana/handlers') 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); } -- cgit v1.2.3-101-g0448