[libbluray-devel] commit: Added API for user input and graphics overlay output. Hooked graphics controller to HDMV VM. (hpi1 )
git at videolan.org
git at videolan.org
Fri Oct 8 13:04:02 CEST 2010
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Fri Oct 8 13:58:53 2010 +0300| [4e6438636c7ec41487ad98c90a15d36d8307b2c7] | committer: hpi1
Added API for user input and graphics overlay output. Hooked graphics controller to HDMV VM.
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=4e6438636c7ec41487ad98c90a15d36d8307b2c7
---
src/libbluray/bluray.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
src/libbluray/bluray.h | 6 +++++
2 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index caa4d4d..c75bc7e 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -31,6 +31,7 @@
#include "bdnav/navigation.h"
#include "bdnav/index_parse.h"
#include "hdmv/hdmv_vm.h"
+#include "decoders/graphics_controller.h"
#include "file/file.h"
#ifdef DLOPEN_CRYPTO_LIBS
#include "file/dl.h"
@@ -128,6 +129,9 @@ struct bluray {
uint8_t hdmv_suspended;
void *bdjava;
+
+ /* graphics */
+ GRAPHICS_CONTROLLER *graphics_controller;
};
#ifdef DLOPEN_CRYPTO_LIBS
@@ -521,6 +525,7 @@ void bd_close(BLURAY *bd)
hdmv_vm_free(&bd->hdmv_vm);
+ gc_free(&bd->graphics_controller);
indx_free(&bd->index);
bd_registers_free(bd->regs);
@@ -1381,6 +1386,19 @@ int bd_menu_call(BLURAY *bd)
return bd_play_title(bd, TITLE_TOP_MENU);
}
+static void _run_gc(BLURAY *bd, gc_ctrl_e msg, uint32_t param)
+{
+ if (bd && bd->graphics_controller && bd->hdmv_vm) {
+ GC_NAV_CMDS cmds;
+
+ gc_run(bd->graphics_controller, msg, param, &cmds);
+
+ if (cmds.num_nav_cmds > 0) {
+ hdmv_vm_set_object(bd->hdmv_vm, cmds.num_nav_cmds, cmds.nav_cmds);
+ }
+ }
+}
+
static void _process_hdmv_vm_event(BLURAY *bd, HDMV_EVENT *hev)
{
DEBUG(DBG_BLURAY, "HDMV event: %d %d\n", hev->event, hev->param);
@@ -1419,14 +1437,21 @@ static void _process_hdmv_vm_event(BLURAY *bd, HDMV_EVENT *hev)
case HDMV_EVENT_ENABLE_BUTTON:
_queue_event(bd, (BD_EVENT){BD_EVENT_ENABLE_BUTTON, hev->param});
+ _run_gc(bd, GC_CTRL_ENABLE_BUTTON, hev->param);
break;
case HDMV_EVENT_DISABLE_BUTTON:
_queue_event(bd, (BD_EVENT){BD_EVENT_DISABLE_BUTTON, hev->param});
+ _run_gc(bd, GC_CTRL_DISABLE_BUTTON, hev->param);
+ break;
+
+ case HDMV_EVENT_SET_BUTTON_PAGE:
+ _run_gc(bd, GC_CTRL_SET_BUTTON_PAGE, hev->param);
break;
case HDMV_EVENT_POPUP_OFF:
_queue_event(bd, (BD_EVENT){BD_EVENT_POPUP_OFF, 0});
+ _run_gc(bd, GC_CTRL_POPUP, 0);
break;
case HDMV_EVENT_END:
case HDMV_EVENT_NONE:
@@ -1505,3 +1530,29 @@ int bd_get_event(BLURAY *bd, BD_EVENT *event)
return _get_event(bd, event);
}
+
+/*
+ * user interaction
+ */
+
+void bd_user_input(BLURAY *bd, int64_t pts, uint32_t key)
+{
+ if (pts >= 0) {
+ bd_psr_write(bd->regs, PSR_TIME, (uint32_t)(((uint64_t)pts) >> 1));
+ }
+
+ _run_gc(bd, GC_CTRL_VK_KEY, key);
+}
+
+void bd_register_overlay_proc(BLURAY *bd, void *handle, bd_overlay_proc_f func)
+{
+ if (!bd) {
+ return;
+ }
+
+ gc_free(&bd->graphics_controller);
+
+ if (func) {
+ bd->graphics_controller = gc_init(bd->regs, handle, func);
+ }
+}
diff --git a/src/libbluray/bluray.h b/src/libbluray/bluray.h
index f19ae75..4038b80 100644
--- a/src/libbluray/bluray.h
+++ b/src/libbluray/bluray.h
@@ -447,6 +447,9 @@ typedef struct {
uint32_t param;
} BD_EVENT;
+struct bd_overlay_s;
+typedef void (*bd_overlay_proc_f)(void *, const struct bd_overlay_s * const);
+
int bd_play(BLURAY *bd); /* start playing disc in navigation mode */
int bd_read_ext(BLURAY *bd, unsigned char *buf, int len, BD_EVENT *event);
int bd_get_event(BLURAY *bd, BD_EVENT *event);
@@ -454,4 +457,7 @@ int bd_get_event(BLURAY *bd, BD_EVENT *event);
int bd_play_title(BLURAY *bd, unsigned title); /* play title (from disc index) */
int bd_menu_call(BLURAY *bd); /* open disc root menu */
+void bd_register_overlay_proc(BLURAY *bd, void *handle, bd_overlay_proc_f func);
+void bd_user_input(BLURAY *bd, int64_t pts, uint32_t key);
+
#endif /* BLURAY_H_ */
More information about the libbluray-devel
mailing list