summaryrefslogtreecommitdiff
path: root/src/liana
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-19 10:49:22 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-19 10:49:22 -0500
commit474ccfd0534e03cfcde94fe0f94e3028ed65366a (patch)
tree810dac88717911874f365ae04644d67482bc3a5f /src/liana
parent7dccc2559d0237eda0bf9510d292bb309afded66 (diff)
downloadcamu-474ccfd0534e03cfcde94fe0f94e3028ed65366a.tar.gz
camu-474ccfd0534e03cfcde94fe0f94e3028ed65366a.tar.bz2
camu-474ccfd0534e03cfcde94fe0f94e3028ed65366a.zip
Add DVD boilerplate
- Work on FFmpeg hwframes context support - Raspberry Pi testing - Update color_palette Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana')
-rw-r--r--src/liana/handlers.c14
-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
-rw-r--r--src/liana/meson.build10
-rw-r--r--src/liana/vcr.c2
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);