diff options
Diffstat (limited to 'src/liana')
| -rw-r--r-- | src/liana/handlers.c | 14 | ||||
| -rw-r--r-- | src/liana/handlers/dvd.h | 5 | ||||
| -rw-r--r-- | src/liana/handlers/dvd_client.c | 38 | ||||
| -rw-r--r-- | src/liana/handlers/dvd_server.c | 133 | ||||
| -rw-r--r-- | src/liana/meson.build | 10 | ||||
| -rw-r--r-- | src/liana/vcr.c | 2 |
6 files changed, 194 insertions, 8 deletions
diff --git a/src/liana/handlers.c b/src/liana/handlers.c index e52d8bb..38e5bfa 100644 --- a/src/liana/handlers.c +++ b/src/liana/handlers.c @@ -4,6 +4,9 @@ #ifdef CACHE_HAVE_CDIO #include "handlers/cdio.h" #endif +#ifdef LIANA_HAVE_DVD +#include "handlers/dvd.h" +#endif struct lia_handler_entry liana_handlers[] = { { @@ -24,6 +27,17 @@ struct lia_handler_entry liana_handlers[] = { #ifdef LIANA_CLIENT .create_client_handler = lia_cdio_client_create #endif + }, +#endif +#ifdef LIANA_HAVE_DVD + { + .name = al_str_c("dvd"), +#ifdef LIANA_SERVER + .create_server_handler = lia_dvd_server_create, +#endif +#ifdef LIANA_CLIENT + .create_client_handler = lia_dvd_client_create, +#endif } #endif }; 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 <dvdnav/dvdnav.h> + #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; } diff --git a/src/liana/meson.build b/src/liana/meson.build index b68ba8b..beb6f68 100644 --- a/src/liana/meson.build +++ b/src/liana/meson.build @@ -18,6 +18,16 @@ if cache_have_cdio liana_client_src += ['handlers/cdio_client.c'] endif +libdvdcss = dependency('libdvdcss') +libdvdread = dependency('dvdread') +libdvdnav = dependency('dvdnav') +if libdvdcss.found() and libdvdread.found() and libdvdnav.found() + liana_server_src += ['handlers/dvd_server.c'] + liana_client_src += ['handlers/dvd_client.c'] + liana_deps += [libdvdcss, libdvdread, libdvdnav] + liana_args += ['-DLIANA_HAVE_DVD'] +endif + liana_server = declare_dependency(sources: liana_server_src, dependencies: liana_deps, compile_args: [liana_args, '-DLIANA_SERVER']) liana_client = declare_dependency(sources: liana_client_src, diff --git a/src/liana/vcr.c b/src/liana/vcr.c index c5b704e..47beed9 100644 --- a/src/liana/vcr.c +++ b/src/liana/vcr.c @@ -241,7 +241,7 @@ static void update_metrics(struct lia_vcr *vcr, u32 size) vcr->metric.current_frame = 0Lu; if (diff > 2500000Lu) { // We are buffering fast enough for it to not matter. - al_log_debug("vcr", "Ignoring %lu bytes in metrics.", frame); + al_log_debug("vcr", "Ignoring %llu bytes in metrics.", frame); return; } f32 kbps = (frame / 125.f) / (diff / 1000000.f); |