diff options
| author | 2025-08-12 17:47:45 -0400 | |
|---|---|---|
| committer | 2025-08-12 17:47:45 -0400 | |
| commit | 7e796649557bfeae6eccba751d4a1ffae75de45c (patch) | |
| tree | d58251d50b5db4ecf34b5ef99ff3edf8b86735d2 /src/liana/handlers | |
| parent | 2cc385b71e161eae39915bf24de53d5b704e7ea0 (diff) | |
| download | camu-7e796649557bfeae6eccba751d4a1ffae75de45c.tar.gz camu-7e796649557bfeae6eccba751d4a1ffae75de45c.tar.bz2 camu-7e796649557bfeae6eccba751d4a1ffae75de45c.zip | |
Runtime codec selection, Vulkan deconstruction
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana/handlers')
| -rw-r--r-- | src/liana/handlers/cdio.h | 2 | ||||
| -rw-r--r-- | src/liana/handlers/codec.h | 4 | ||||
| -rw-r--r-- | src/liana/handlers/codec_client.c | 11 | ||||
| -rw-r--r-- | src/liana/handlers/codec_server.c | 42 | ||||
| -rw-r--r-- | src/liana/handlers/dvd.h | 2 | ||||
| -rw-r--r-- | src/liana/handlers/handler.h | 34 |
6 files changed, 63 insertions, 32 deletions
diff --git a/src/liana/handlers/cdio.h b/src/liana/handlers/cdio.h index 3b0e991..7fa0caf 100644 --- a/src/liana/handlers/cdio.h +++ b/src/liana/handlers/cdio.h @@ -1,6 +1,6 @@ #pragma once -#include "../handler.h" +#include "handler.h" #ifdef LIANA_SERVER struct lia_cdio_server { diff --git a/src/liana/handlers/codec.h b/src/liana/handlers/codec.h index be43f63..f179190 100644 --- a/src/liana/handlers/codec.h +++ b/src/liana/handlers/codec.h @@ -3,7 +3,8 @@ #include "../../codec/codec.h" #include "../server.h" -#include "../handler.h" + +#include "handler.h" // FFmpeg Independence: // - [ ] CAMU_CODEC_* only for explicitly non-ffmpeg codecs. @@ -14,6 +15,7 @@ #ifdef LIANA_SERVER struct lia_codec_server { struct lia_server_handler handler; + struct camu_codec_info *codec_info; struct camu_demuxer *demux; #ifdef LIANA_SERVER_LOOP u64 pts_offset; diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index 267187f..a3614bf 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -1,12 +1,8 @@ #include "../../codec/codec.h" - +#include "../../codec/codecs.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" #include "../vcr.h" #include "../client.h" @@ -25,10 +21,7 @@ static bool codec_client_init(struct lia_client_handler *handler, struct camu_re struct lia_codec_client *codec = (struct lia_codec_client *)handler; codec->handler.stream = stream; if (stream->type == CAMU_STREAM_AUDIO || stream->type == CAMU_STREAM_VIDEO) { - codec->dec = camu_ff_decoder_create(); - //codec->dec = camu_stbi_decoder_create(); - //codec->dec = camu_spng_decoder_create(); - //codec->dec = camu_wuffs_decoder_create(); + codec->dec = stream->codec_info->create_decoder(); if (!codec->dec->init(codec->dec, renderer, stream, data_callback, codec)) { return false; } diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c index c324481..801a3e1 100644 --- a/src/liana/handlers/codec_server.c +++ b/src/liana/handlers/codec_server.c @@ -1,15 +1,12 @@ -#include "../../codec/codec.h" -#include "../../server/common.h" +#define AL_LOG_SECTION "codec_server" +#include <al/log.h> +#include "../../server/common.h" +#include "../../codec/codec.h" +#include "../../codec/codecs.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" - -#include "../handler.h" #include "codec.h" @@ -17,11 +14,13 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han { 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(); - + codec->demux = NULL; + codec->codec_info = camu_codec_info_by_type(cch_entry_guess_format(handle->entry)); + if (!codec->codec_info) { + return false; + } + log_info("Selected demuxer: %.*s.", al_str_x(&codec->codec_info->name)); + codec->demux = codec->codec_info->create_demuxer(); if (!codec->demux->init(codec->demux, handle)) { return false; } @@ -55,6 +54,7 @@ static void codec_server_write_info(struct lia_server_handler *handler, struct n nn_packet_write_u32(packet, codec->demux->streams.count); struct camu_codec_stream *stream; al_array_foreach_ptr(codec->demux->streams, i, stream) { + nn_packet_write_str(packet, &codec->codec_info->name); nn_packet_write_u8(packet, stream->mode); nn_packet_write_u8(packet, stream->type); nn_packet_write_u64(packet, stream->duration); @@ -159,18 +159,20 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct static void codec_server_free(struct lia_server_handler **handler) { struct lia_codec_server *codec = (struct lia_codec_server *)*handler; - switch (codec->demux->mode) { - case CAMU_NORMAL: - break; + if (codec->demux) { + switch (codec->demux->mode) { + case CAMU_NORMAL: + break; #ifdef CAMU_HAVE_FFMPEG - case CAMU_FFMPEG_COMPAT: + case CAMU_FFMPEG_COMPAT: #ifndef CAMU_DIRECT_MODE - av_packet_free(&codec->packet.av.pkt); + av_packet_free(&codec->packet.av.pkt); #endif - break; + break; #endif + } + codec->demux->free(&codec->demux); } - codec->demux->free(&codec->demux); al_free(codec); *handler = NULL; } diff --git a/src/liana/handlers/dvd.h b/src/liana/handlers/dvd.h index dd5ac0a..c0f0544 100644 --- a/src/liana/handlers/dvd.h +++ b/src/liana/handlers/dvd.h @@ -1,6 +1,6 @@ #pragma once -#include "../handler.h" +#include "handler.h" #ifdef LIANA_SERVER #include <dvdnav/dvdnav.h> diff --git a/src/liana/handlers/handler.h b/src/liana/handlers/handler.h new file mode 100644 index 0000000..48fcef3 --- /dev/null +++ b/src/liana/handlers/handler.h @@ -0,0 +1,34 @@ +#pragma once + +#include <nnwt/packet.h> + +#include "../../cache/handle.h" +#include "../../codec/codec.h" + +enum { + LIANA_PACKET_DATA = 0, + LIANA_PACKET_EOF, + LIANA_PACKET_ERROR +}; + +struct lia_server_handler { + bool (*init)(struct lia_server_handler *, struct cch_handle *); + void (*write_info)(struct lia_server_handler *, struct nn_packet *); + void (*subscribe)(struct lia_server_handler *, u32); + u64 (*get_duration)(struct lia_server_handler *); + bool (*seek)(struct lia_server_handler *, u64); + void (*step)(struct lia_server_handler *); + void (*write_packet)(struct lia_server_handler *, struct nn_packet *); + void (*free)(struct lia_server_handler **); + s32 status; +}; + +struct lia_client_handler { + bool (*init)(struct lia_client_handler *, struct camu_renderer *, struct camu_codec_stream *); + bool (*handle_packet)(struct lia_client_handler *, struct nn_packet *); + void (*flush)(struct lia_client_handler *); + void (*free)(struct lia_client_handler **); + struct camu_codec_stream *stream; + void (*callback)(void *, u8, struct camu_codec_stream *stream, void *); + void *userdata; +}; |