diff options
| author | 2025-01-01 16:04:59 -0500 | |
|---|---|---|
| committer | 2025-01-01 16:13:22 -0500 | |
| commit | 24b58a516e6bacfdf59aac422411c2f1fcf4ffb2 (patch) | |
| tree | 834284316a98f829362619eb2174022687df85ea /src/liana/handlers | |
| parent | 20003fd25404ee5fc4cd068fbc4fae1ad6f6ae99 (diff) | |
| download | camu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.tar.gz camu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.tar.bz2 camu-24b58a516e6bacfdf59aac422411c2f1fcf4ffb2.zip | |
Optimizations based on video loop performance
- Support nn_packet_stream direct mode
- Hook up FFmpeg hardware accelerated decoding
- Refactor VCR
- Reduce locking when returning packets to a packet pool
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana/handlers')
| -rw-r--r-- | src/liana/handlers/codec_client.c | 44 | ||||
| -rw-r--r-- | src/liana/handlers/codec_server.c | 18 |
2 files changed, 54 insertions, 8 deletions
diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index 3722197..2492533 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -1,8 +1,11 @@ #include "../../codec/codec.h" +#include "../../server/common.h" + #ifdef CAMU_HAVE_FFMPEG #include "../../codec/ffmpeg/decoder.h" #include "../../codec/ffmpeg/packet_ext.h" #endif + #include "../../codec/stb_image/decoder.h" #include "../../codec/spng/decoder.h" #include "../../codec/wuffs/decoder.h" @@ -37,9 +40,7 @@ static bool codec_client_init(struct lia_client_handler *handler, struct camu_re #ifdef CAMU_HAVE_FFMPEG static bool push_av_packet(struct lia_codec_client *codec, AVPacket *pkt) { - struct camu_codec_packet packet; - packet.av.pkt = pkt; - s32 ret = codec->dec->push(codec->dec, &packet); + s32 ret = codec->dec->push_av_packet(codec->dec, pkt); return ret == CAMU_OK; } #endif @@ -60,7 +61,14 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc if (!packet) { if (codec->dec) { // Flush always returns success. - codec->dec->push(codec->dec, NULL); + switch (codec->dec->mode) { + case CAMU_NORMAL: + codec->dec->push(codec->dec, NULL); + break; + case CAMU_FFMPEG_COMPAT: + codec->dec->push_av_packet(codec->dec, NULL); + break; + } // process() could still error. s32 ret = codec->dec->process(codec->dec); codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL); @@ -71,14 +79,19 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc } // Push packet. + u32 rindex = packet->rindex; bool success; - u8 type = nn_packet_read_u8(packet); - switch (type) { + u8 mode = nn_packet_read_u8(packet); + switch (mode) { case CAMU_NORMAL: { if (codec->dec) { +#ifdef CAMU_DIRECT_MODE + success = push_packet(codec, (struct nn_buffer *)packet->opaque); +#else struct nn_buffer buffer; nn_packet_read_buffer(packet, &buffer); success = push_packet(codec, &buffer); +#endif } else { success = true; } @@ -86,15 +99,27 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc } #ifdef CAMU_HAVE_FFMPEG case CAMU_FFMPEG_COMPAT: { - AVPacket *pkt = nn_packet_read_av_packet(packet); + AVPacket *pkt; + if (packet->opaque) { + pkt = (AVPacket *)packet->opaque; + } else { + pkt = av_packet_alloc(); + nn_packet_read_av_packet(packet, pkt); + packet->opaque = pkt; + } + struct camu_codec_stream *stream = codec->handler.stream; if (codec->dec) { success = push_av_packet(codec, pkt); } else { - codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_SUBTITLE, codec->handler.stream, pkt); + codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_SUBTITLE, stream, pkt); success = true; } +#ifdef VCR_BUFFER_WHOLE_FILE + pkt->pts += av_rescale_q(stream->duration, AV_TIME_BASE_Q, stream->av.stream->time_base); +#else av_packet_unref(pkt); av_packet_free(&pkt); +#endif break; } default: @@ -102,6 +127,9 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc #endif } + // Restore packet rindex in case we resue it. + packet->rindex = rindex; + if (!success) { // Forcing in EOF on an error is not necessary but should exhibit less erratic behavior sink-side. codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL); diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c index 7167f97..24552bb 100644 --- a/src/liana/handlers/codec_server.c +++ b/src/liana/handlers/codec_server.c @@ -1,8 +1,11 @@ #include "../../codec/codec.h" +#include "../../server/common.h" + #ifdef CAMU_HAVE_FFMPEG #include "../../codec/ffmpeg/demuxer.h" #include "../../codec/ffmpeg/packet_ext.h" #endif + #include "../../codec/stb_image/demuxer.h" #include "../../codec/spng/demuxer.h" #include "../../codec/wuffs/demuxer.h" @@ -26,7 +29,9 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han break; #ifdef CAMU_HAVE_FFMPEG case CAMU_FFMPEG_COMPAT: +#ifndef CAMU_DIRECT_MODE codec->packet.av.pkt = av_packet_alloc(); +#endif break; #endif } @@ -84,6 +89,9 @@ static bool codec_server_seek(struct lia_server_handler *handler, u64 pos) static void codec_server_step(struct lia_server_handler *handler) { struct lia_codec_server *codec = (struct lia_codec_server *)handler; +#ifdef CAMU_DIRECT_MODE + codec->packet.av.pkt = av_packet_alloc(); +#endif codec->handler.status = codec->demux->get_packet(codec->demux, &codec->packet); } @@ -96,7 +104,11 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct case CAMU_NORMAL: { nn_packet_write_s32(packet, 0); nn_packet_write_u8(packet, codec->packet.mode); +#ifdef CAMU_DIRECT_MODE + packet->opaque = codec->packet.buffer; +#else nn_packet_write_buffer(packet, codec->packet.buffer); +#endif break; } #ifdef CAMU_HAVE_FFMPEG @@ -104,8 +116,12 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct AVPacket *pkt = codec->packet.av.pkt; nn_packet_write_s32(packet, pkt->stream_index); nn_packet_write_u8(packet, codec->packet.mode); +#ifdef CAMU_DIRECT_MODE + packet->opaque = pkt; +#else nn_packet_write_av_packet(packet, pkt); av_packet_unref(pkt); +#endif break; } #endif @@ -125,7 +141,9 @@ static void codec_server_free(struct lia_server_handler **handler) break; #ifdef CAMU_HAVE_FFMPEG case CAMU_FFMPEG_COMPAT: +#ifndef CAMU_DIRECT_MODE av_packet_free(&codec->packet.av.pkt); +#endif break; #endif } |