From 474ccfd0534e03cfcde94fe0f94e3028ed65366a Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sun, 19 Jan 2025 10:49:22 -0500 Subject: Add DVD boilerplate - Work on FFmpeg hwframes context support - Raspberry Pi testing - Update color_palette Signed-off-by: Andrew Opalach --- src/liana/handlers/dvd.h | 5 ++ src/liana/handlers/dvd_client.c | 38 ++++++++++++ src/liana/handlers/dvd_server.c | 133 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 169 insertions(+), 7 deletions(-) create mode 100644 src/liana/handlers/dvd_client.c (limited to 'src/liana/handlers') diff --git a/src/liana/handlers/dvd.h b/src/liana/handlers/dvd.h index 788c30e..4b71ec8 100644 --- a/src/liana/handlers/dvd.h +++ b/src/liana/handlers/dvd.h @@ -1,9 +1,14 @@ #pragma once +#include + #include "../handler.h" struct lia_dvd_server { struct lia_server_handler handler; + struct cch_handle *handle; + dvdnav_t *dvdnav; + struct nn_buffer buffer; }; struct lia_dvd_client { diff --git a/src/liana/handlers/dvd_client.c b/src/liana/handlers/dvd_client.c new file mode 100644 index 0000000..53beac1 --- /dev/null +++ b/src/liana/handlers/dvd_client.c @@ -0,0 +1,38 @@ +#include "dvd.h" + +static bool dvd_client_init(struct lia_client_handler *handler, struct camu_renderer *renderer, + struct camu_codec_stream *stream) +{ + struct lia_dvd_client *dvd = (struct lia_dvd_client *)handler; + (void)renderer; + dvd->handler.stream = stream; + return true; +} + +static bool dvd_client_handle_packet(struct lia_client_handler *handler, struct nn_packet *packet) +{ + struct lia_dvd_client *dvd = (struct lia_dvd_client *)handler; + (void)dvd; + (void)packet; + return true; +} + +static void dvd_client_flush(struct lia_client_handler *handler) +{ + (void)handler; +} + +static void dvd_client_free(struct lia_client_handler **handler) +{ + (void)handler; +} + +struct lia_client_handler *lia_dvd_client_create(void) +{ + struct lia_dvd_client *dvd = al_alloc_object(struct lia_dvd_client); + dvd->handler.init = dvd_client_init; + dvd->handler.handle_packet = dvd_client_handle_packet; + dvd->handler.flush = dvd_client_flush; + dvd->handler.free = dvd_client_free; + return (struct lia_client_handler *)dvd; +} diff --git a/src/liana/handlers/dvd_server.c b/src/liana/handlers/dvd_server.c index a487de4..afb2c07 100644 --- a/src/liana/handlers/dvd_server.c +++ b/src/liana/handlers/dvd_server.c @@ -1,21 +1,140 @@ + #include "dvd.h" +static s32 dvd_stream_read(void *userdata, void *buffer, s32 size) +{ + struct lia_dvd_server *dvd = (struct lia_dvd_server *)userdata; + return cch_handle_read(dvd->handle, buffer, size); +} + +static s32 dvd_stream_seek(void *userdata, u64 pos) +{ + struct lia_dvd_server *dvd = (struct lia_dvd_server *)userdata; + cch_handle_seek(dvd->handle, pos, SEEK_SET); + return 0; +} + +static dvdnav_stream_cb cb = { + .pf_read = dvd_stream_read, + .pf_seek = dvd_stream_seek +}; + +#define DVD_LANGUAGE "en" + static bool dvd_server_init(struct lia_server_handler *handler, struct cch_handle *handle) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)handler; + dvd->handle = handle; + + dvd->dvdnav = NULL; + dvdnav_open_stream2(&dvd->dvdnav, dvd, NULL, &cb); + + //if (dvdnav_set_readahead_flag(dvdnav, DVD_READ_CACHE) != DVDNAV_STATUS_OK) { + // dvdnav_err_to_string(dvdnav)) + //} + + if (dvdnav_menu_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK || + dvdnav_audio_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK || + dvdnav_spu_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK) { + } + + //if (dvdnav_set_PGC_positioning_flag(dvdnav, 1) != DVDNAV_STATUS_OK) { + //} + + nn_buffer_init(&dvd->buffer); + nn_buffer_ensure_space(&dvd->buffer, DVD_VIDEO_LB_LEN); + return true; } +static void dvd_server_write_info(struct lia_server_handler *handler, struct nn_packet *packet) +{ + (void)handler; + (void)packet; +} + +static void dvd_server_subscribe(struct lia_server_handler *handler, s32 mask) +{ + (void)handler; + (void)mask; +} + +static u64 dvd_server_get_duration(struct lia_server_handler *handler) +{ + (void)handler; + return 0; +} + +static bool dvd_server_seek(struct lia_server_handler *handler, u64 pos) +{ + (void)handler; + (void)pos; + return false; +} + +static void dvd_server_step(struct lia_server_handler *handler) +{ + struct lia_dvd_server *dvd = (struct lia_dvd_server *)handler; + s32 event, length; + s32 ret = dvdnav_get_next_block(dvd->dvdnav, nn_buffer_get_ptr(&dvd->buffer, 0), &event, &length); + if (ret == DVDNAV_STATUS_ERR) { + return; + } + switch (event) { + case DVDNAV_BLOCK_OK: + break; + case DVDNAV_NOP: + break; + case DVDNAV_STILL_FRAME: + break; + case DVDNAV_WAIT: + break; + case DVDNAV_SPU_CLUT_CHANGE: + break; + case DVDNAV_SPU_STREAM_CHANGE: + break; + case DVDNAV_AUDIO_STREAM_CHANGE: + break; + case DVDNAV_HIGHLIGHT: + break; + case DVDNAV_VTS_CHANGE: + break; + case DVDNAV_CELL_CHANGE: + break; + case DVDNAV_NAV_PACKET: + break; + case DVDNAV_HOP_CHANNEL: + break; + case DVDNAV_STOP: + break; + default: + break; + } +} + +static void dvd_server_write_packet(struct lia_server_handler *handler, struct nn_packet *packet) +{ + (void)handler; + (void)packet; +} + +static void dvd_server_free(struct lia_server_handler **handler) +{ + struct lia_dvd_server *dvd = (struct lia_dvd_server *)*handler; + al_free(dvd); + *handler = NULL; +} + struct lia_server_handler *lia_dvd_server_create(void) { struct lia_dvd_server *dvd = al_alloc_object(struct lia_dvd_server); dvd->handler.init = dvd_server_init; -// dvd->handler.write_info = dvd_server_write_info; -// dvd->handler.subscribe = dvd_server_subscribe; -// dvd->handler.get_duration = dvd_server_get_duration; -// dvd->handler.seek = dvd_server_seek; -// dvd->handler.step = dvd_server_step; -// dvd->handler.write_packet = dvd_server_write_packet; -// dvd->handler.free = dvd_server_free; + dvd->handler.write_info = dvd_server_write_info; + dvd->handler.subscribe = dvd_server_subscribe; + dvd->handler.get_duration = dvd_server_get_duration; + dvd->handler.seek = dvd_server_seek; + dvd->handler.step = dvd_server_step; + dvd->handler.write_packet = dvd_server_write_packet; + dvd->handler.free = dvd_server_free; return (struct lia_server_handler *)dvd; } -- cgit v1.2.3-101-g0448