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 | |
| 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')
| -rw-r--r-- | src/liana/client.c | 18 | ||||
| -rw-r--r-- | src/liana/handlers.h | 2 | ||||
| -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 (renamed from src/liana/handler.h) | 6 | ||||
| -rw-r--r-- | src/liana/server.c | 7 | ||||
| -rw-r--r-- | src/liana/vcr.c | 3 |
10 files changed, 48 insertions, 49 deletions
diff --git a/src/liana/client.c b/src/liana/client.c index 5222d7a..d853acf 100644 --- a/src/liana/client.c +++ b/src/liana/client.c @@ -41,6 +41,10 @@ static void collect_streams(struct lia_client *client, struct nn_packet *packet) for (u32 i = 0; i < count; i++) { // Very important zero-initialization. struct camu_codec_stream stream = { 0 }; + str codec; + nn_packet_read_str(packet, &codec); + // @TODO: NULL unhandled. + stream.codec_info = camu_codec_info_by_name(&codec); u8 mode = nn_packet_read_u8(packet); u8 type = nn_packet_read_u8(packet); u64 duration = nn_packet_read_u64(packet); @@ -125,8 +129,8 @@ static const char *type_to_str[] = { static void parse_info_packet(struct lia_client *client, struct nn_packet *packet) { - str liana; - nn_packet_read_str(packet, &liana); + str handler; + nn_packet_read_str(packet, &handler); client->duration = nn_packet_read_u64(packet); collect_streams(client, packet); struct lia_prefs *prefs = &client->prefs; @@ -146,11 +150,9 @@ static void parse_info_packet(struct lia_client *client, struct nn_packet *packe const AVDictionaryEntry *lang_entry = av_dict_get(metadata, "language", NULL, 0); if (lang_entry && !accept_defaults) { u8 lang = CAMU_LANG_UNKNOWN; - if (strcmp(lang_entry->value, "eng") == 0) { - lang = CAMU_LANG_ENGLISH; - } else if (strcmp(lang_entry->value, "jpn") == 0) { - lang = CAMU_LANG_JAPANESE; - } + str lang_str = al_str_cr(lang_entry->value); + if (al_str_eq(&lang_str, &al_str_c("eng"))) lang = CAMU_LANG_ENGLISH; + else if (al_str_eq(&lang_str, &al_str_c("jpn"))) lang = CAMU_LANG_JAPANESE; switch (stream->type) { case CAMU_STREAM_AUDIO: if (prefs->audio_lang != lang) continue; @@ -173,7 +175,7 @@ static void parse_info_packet(struct lia_client *client, struct nn_packet *packe client->mask |= 1 << stream->index; struct lia_vcr_track *track = al_alloc_object(struct lia_vcr_track); track->stream = stream; - track->client = lia_handler_by_name(&liana)->create_client_handler(); + track->client = lia_handler_by_name(&handler)->create_client_handler(); track->client->callback = client->callback; track->client->userdata = client->userdata; if (!track->client->init(track->client, client->renderer, track->stream)) { diff --git a/src/liana/handlers.h b/src/liana/handlers.h index 223ead5..a72bdb9 100644 --- a/src/liana/handlers.h +++ b/src/liana/handlers.h @@ -1,6 +1,6 @@ #pragma once -#include "handler.h" +#include "handlers/handler.h" struct lia_handler_entry { str name; 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/handler.h b/src/liana/handlers/handler.h index 1fa77a0..48fcef3 100644 --- a/src/liana/handler.h +++ b/src/liana/handlers/handler.h @@ -1,9 +1,9 @@ #pragma once -#include <nnwt/packet_pool.h> +#include <nnwt/packet.h> -#include "../codec/codec.h" -#include "../cache/handle.h" +#include "../../cache/handle.h" +#include "../../codec/codec.h" enum { LIANA_PACKET_DATA = 0, diff --git a/src/liana/server.c b/src/liana/server.c index d07cb8d..db61e20 100644 --- a/src/liana/server.c +++ b/src/liana/server.c @@ -1,5 +1,4 @@ #include "server.h" -#include "handler.h" #include "handlers.h" #include "list.h" @@ -217,7 +216,7 @@ static void handle_connection(struct lia_node_connection *conn, struct nn_packet if (mask == 0) { struct nn_packet *rpacket = nn_packet_create(); nn_packet_write_u32(rpacket, conn->id); - nn_packet_write_str(rpacket, cch_entry_get_liana(conn->node->entry)); + nn_packet_write_str(rpacket, cch_entry_get_handler(conn->node->entry)); conn->handler->write_info(conn->handler, rpacket); stream->packet_callback = subscribe_packet_callback; stream->packet_sent_callback = subscribe_packet_sent_callback; @@ -363,7 +362,7 @@ static void packet_callback(void *userdata, struct nn_packet_stream *stream, str nn_signal_init(&conn->signal, server->loop, signal_callback, conn); nn_signal_start(&conn->signal); cch_entry_get_handle(node->entry, &conn->handle); - conn->handler = lia_handler_by_name(cch_entry_get_liana(node->entry))->create_server_handler(); + conn->handler = lia_handler_by_name(cch_entry_get_handler(node->entry))->create_server_handler(); conn->errored = false; conn->disconnected = false; conn->ref = false; @@ -468,7 +467,7 @@ void lia_node_get_duration(struct lia_node *node) nn_signal_init(&node->signal, node->server->loop, duration_signal_callback, node); nn_signal_start(&node->signal); cch_entry_get_handle(node->entry, &node->handle); - node->handler = lia_handler_by_name(cch_entry_get_liana(node->entry))->create_server_handler(); + node->handler = lia_handler_by_name(cch_entry_get_handler(node->entry))->create_server_handler(); nn_thread_create(&node->thread, init_duration_thread, node); } diff --git a/src/liana/vcr.c b/src/liana/vcr.c index 518311a..d2c6b33 100644 --- a/src/liana/vcr.c +++ b/src/liana/vcr.c @@ -1,8 +1,9 @@ #define AL_LOG_SECTION "vcr" #include <al/log.h> +#include "handlers/handler.h" + #include "vcr.h" -#include "handler.h" #define VCR_BUFFER_BUFFERED MB(2) |