From 7e796649557bfeae6eccba751d4a1ffae75de45c Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Tue, 12 Aug 2025 17:47:45 -0400 Subject: Runtime codec selection, Vulkan deconstruction Signed-off-by: Andrew Opalach --- src/cache/entry.c | 9 +++++++-- src/cache/entry.h | 5 +++-- src/cache/handler.h | 3 ++- src/cache/handlers/cdio.c | 4 ++-- src/cache/handlers/file.c | 22 +++++++++++++++++++--- src/cache/handlers/file.h | 2 +- src/cache/handlers/http.c | 4 ++-- 7 files changed, 36 insertions(+), 13 deletions(-) (limited to 'src/cache') diff --git a/src/cache/entry.c b/src/cache/entry.c index 183278a..0f50462 100644 --- a/src/cache/entry.c +++ b/src/cache/entry.c @@ -12,9 +12,14 @@ bool cch_entry_get_handle(struct cch_entry *entry, struct cch_handle *handle) return true; } -str *cch_entry_get_liana(struct cch_entry *entry) +str *cch_entry_get_handler(struct cch_entry *entry) { - return &entry->handler->liana; + return &entry->handler->handler; +} + +s32 cch_entry_guess_format(struct cch_entry *entry) +{ + return entry->handler->guess_format(entry->handler); } void cch_entry_return_handle(struct cch_entry *entry, struct cch_handle *handle) diff --git a/src/cache/entry.h b/src/cache/entry.h index d6eb86a..693e68b 100644 --- a/src/cache/entry.h +++ b/src/cache/entry.h @@ -80,7 +80,7 @@ [ ] On creation, the handler can create multiple backings and chapters. [ ] Chapters include index into array of backings. [ ] Method of requesting a unique file backing. - */ +*/ struct cch_chapter { off_t start; @@ -95,6 +95,7 @@ struct cch_entry { }; bool cch_entry_get_handle(struct cch_entry *entry, struct cch_handle *handle); -str *cch_entry_get_liana(struct cch_entry *entry); +str *cch_entry_get_handler(struct cch_entry *entry); +s32 cch_entry_guess_format(struct cch_entry *entry); void cch_entry_return_handle(struct cch_entry *entry, struct cch_handle *handle); void cch_entry_free(struct cch_entry **entry); diff --git a/src/cache/handler.h b/src/cache/handler.h index 4051449..fec7f0a 100644 --- a/src/cache/handler.h +++ b/src/cache/handler.h @@ -9,7 +9,8 @@ struct cch_handler { bool (*can_seek)(struct cch_handler *); void (*maybe_spawn_worker)(struct cch_handler *, size_t); bool (*wait_for_range)(struct cch_handler *, struct cch_wait *); + s32 (*guess_format)(struct cch_handler *); void (*free)(struct cch_handler **); struct cch_entry *entry; - str liana; + str handler; }; diff --git a/src/cache/handlers/cdio.c b/src/cache/handlers/cdio.c index 7c83523..abebeb0 100644 --- a/src/cache/handlers/cdio.c +++ b/src/cache/handlers/cdio.c @@ -119,7 +119,7 @@ static void handler_cdio_free(struct cch_handler **handler) cdio_cddap_close(cdio->drive); } cch_threaded_waits_close(&cdio->waits); - al_str_free(&cdio->handler.liana); + al_str_free(&cdio->handler.handler); al_free(cdio); *handler = NULL; } @@ -198,7 +198,7 @@ struct cch_entry *cch_handler_cdio_create(void) entry->handler->wait_for_range = handler_cdio_wait_for_range; entry->handler->free = handler_cdio_free; entry->handler->entry = entry; - al_str_from(&entry->handler->liana, "cdio"); + al_str_from(&entry->handler->handler, "cdio"); if (!open_cd_drive(cdio)) { return NULL; } diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c index 345cdca..dba5649 100644 --- a/src/cache/handlers/file.c +++ b/src/cache/handlers/file.c @@ -1,3 +1,5 @@ +#include "../../codec/codec.h" + #include "../backings/file.h" #include "file.h" @@ -22,15 +24,28 @@ static bool handler_file_wait_for_range(struct cch_handler *handler, struct cch_ return true; } +static s32 handler_file_guess_format(struct cch_handler *handler) +{ + struct cch_handler_file *file = (struct cch_handler_file *)handler; + struct cch_backing_file *backing = (struct cch_backing_file *)file->backing; + str *path = &backing->file.path; + u32 dot = al_str_rfind(path, '.'); + if (dot != AL_STR_NPOS) { + str ext = al_str_substr(path, dot, path->length); + return camu_guess_format(NULL, &ext, NULL); + } + return -1; +} + static void handler_file_free(struct cch_handler **handler) { struct cch_handler_file *file = (struct cch_handler_file *)*handler; - al_str_free(&file->handler.liana); + al_str_free(&file->handler.handler); al_free(file); *handler = NULL; } -struct cch_entry *cch_handler_file_create(str *path, str *liana) +struct cch_entry *cch_handler_file_create(str *path, str *handler) { struct cch_backing *backing = cch_backing_file_create(path, 0); if (!backing) return NULL; @@ -42,8 +57,9 @@ struct cch_entry *cch_handler_file_create(str *path, str *liana) entry->handler->can_seek = handler_file_can_seek; entry->handler->maybe_spawn_worker = handler_file_maybe_spawn_worker; entry->handler->wait_for_range = handler_file_wait_for_range; + entry->handler->guess_format = handler_file_guess_format; entry->handler->free = handler_file_free; entry->handler->entry = entry; - al_str_clone(&entry->handler->liana, liana); + al_str_clone(&entry->handler->handler, handler); return entry; } diff --git a/src/cache/handlers/file.h b/src/cache/handlers/file.h index 4704387..f883498 100644 --- a/src/cache/handlers/file.h +++ b/src/cache/handlers/file.h @@ -10,4 +10,4 @@ struct cch_handler_file { struct cch_backing *backing; }; -struct cch_entry *cch_handler_file_create(str *path, str *liana); +struct cch_entry *cch_handler_file_create(str *path, str *handler); diff --git a/src/cache/handlers/http.c b/src/cache/handlers/http.c index e48490b..1691ea9 100644 --- a/src/cache/handlers/http.c +++ b/src/cache/handlers/http.c @@ -102,7 +102,7 @@ static void handler_http_free(struct cch_handler **handler) cch_threaded_waits_close(&http->waits); al_array_free(http->requests); al_str_free(&http->url); - al_str_free(&http->handler.liana); + al_str_free(&http->handler.handler); al_free(http); *handler = NULL; } @@ -121,7 +121,7 @@ struct cch_entry *cch_handler_http_create(str *url, struct nn_event_loop *loop) entry->handler->wait_for_range = handler_http_wait_for_range; entry->handler->free = handler_http_free; entry->handler->entry = entry; - al_str_from(&entry->handler->liana, "codec"); + al_str_from(&entry->handler->handler, "codec"); http->loop = loop; al_str_clone(&http->url, url); http->pointer = 0; -- cgit v1.2.3-101-g0448