summaryrefslogtreecommitdiff
path: root/src/liana/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/liana/handlers')
-rw-r--r--src/liana/handlers/dvd.h5
-rw-r--r--src/liana/handlers/dvd_client.c38
-rw-r--r--src/liana/handlers/dvd_server.c133
3 files changed, 169 insertions, 7 deletions
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;
}