[libbluray-devel] updated xine plugin (BD-J / ARGB overlay support)
hpi1
git at videolan.org
Thu Jan 24 13:20:49 CET 2013
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Thu Jan 24 14:19:38 2013 +0200| [1178aedf927d770392e21243dee8b46e1bb95611] | committer: hpi1
updated xine plugin (BD-J / ARGB overlay support)
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=1178aedf927d770392e21243dee8b46e1bb95611
---
player_wrappers/xine/HOWTO | 6 +-
player_wrappers/xine/input_bluray.c | 111 ++++++++++++++++++++++++++++++++++-
2 files changed, 113 insertions(+), 4 deletions(-)
diff --git a/player_wrappers/xine/HOWTO b/player_wrappers/xine/HOWTO
index f4418e3..5607da4 100644
--- a/player_wrappers/xine/HOWTO
+++ b/player_wrappers/xine/HOWTO
@@ -3,7 +3,7 @@ Tested with xine-lib 1.2.2
1. Build xine plugin
make
-
+
2. Install xine plugin
sudo make install
@@ -15,3 +15,7 @@ Tested with xine-lib 1.2.2
or using BluRay disc menus:
xine bd:/mnt/BLURAY_DISC
+
+
+BD-J menus require ARGB overlay capability.
+Supported video output plugins are opengl2, vdpau and vaapi.
\ No newline at end of file
diff --git a/player_wrappers/xine/input_bluray.c b/player_wrappers/xine/input_bluray.c
index 8a1303c..bda29a2 100644
--- a/player_wrappers/xine/input_bluray.c
+++ b/player_wrappers/xine/input_bluray.c
@@ -95,11 +95,45 @@ typedef struct {
} bluray_input_class_t;
typedef struct {
+ BD_ARGB_BUFFER buf;
+ pthread_mutex_t buf_lock;
+} XINE_BD_ARGB_BUFFER;
+
+static void osd_buf_lock(BD_ARGB_BUFFER *buf_gen)
+{
+ XINE_BD_ARGB_BUFFER *buf = (XINE_BD_ARGB_BUFFER*)buf_gen;
+ pthread_mutex_lock(&buf->buf_lock);
+}
+
+static void osd_buf_unlock(BD_ARGB_BUFFER *buf_gen)
+{
+ XINE_BD_ARGB_BUFFER *buf = (XINE_BD_ARGB_BUFFER*)buf_gen;
+ pthread_mutex_unlock(&buf->buf_lock);
+}
+
+static void osd_buf_init(XINE_BD_ARGB_BUFFER *buf)
+{
+ buf->buf.lock = osd_buf_lock;
+ buf->buf.unlock = osd_buf_unlock;
+ pthread_mutex_init(&buf->buf_lock, NULL);
+}
+
+static void osd_buf_destroy(XINE_BD_ARGB_BUFFER *buf)
+{
+ if (buf->buf.lock) {
+ buf->buf.lock = NULL;
+ buf->buf.unlock = NULL;
+ pthread_mutex_destroy(&buf->buf_lock);
+ }
+}
+
+typedef struct {
input_plugin_t input_plugin;
xine_stream_t *stream;
xine_event_queue_t *event_queue;
xine_osd_t *osd[2];
+ XINE_BD_ARGB_BUFFER osd_buf;
bluray_input_class_t *class;
@@ -174,6 +208,8 @@ static void close_overlay(bluray_input_plugin_t *this, int plane)
if (plane < 2 && this->osd[plane]) {
xine_osd_free(this->osd[plane]);
this->osd[plane] = NULL;
+ free(this->osd_buf.buf.buf[plane]);
+ this->osd_buf.buf.buf[plane] = NULL;
}
}
@@ -184,6 +220,14 @@ static void open_overlay(bluray_input_plugin_t *this, int plane, uint16_t x, uin
}
this->osd[plane] = xine_osd_new(this->stream, x, y, w, h);
+
+ if (xine_osd_get_capabilities(this->osd[plane]) & XINE_OSD_CAP_ARGB_LAYER) {
+ this->osd_buf.buf.width = w;
+ this->osd_buf.buf.height = h;
+ this->osd_buf.buf.buf[plane] = calloc(sizeof(uint32_t), w * h);
+ }
+
+ clear_overlay(this->osd[plane]);
}
static xine_osd_t *get_overlay(bluray_input_plugin_t *this, int plane)
@@ -296,6 +340,55 @@ static void overlay_proc(void *this_gen, const BD_OVERLAY * const ov)
}
}
+static void argb_overlay_proc(void *this_gen, const BD_ARGB_OVERLAY * const ov)
+{
+ bluray_input_plugin_t *this = (bluray_input_plugin_t *) this_gen;
+ xine_osd_t *osd;
+ int64_t vpts;
+
+ if (!this) {
+ return;
+ }
+
+ if (!ov) {
+ /* hide OSD */
+ close_overlay(this, -1);
+ return;
+ }
+
+ vpts = 0;
+ if (ov->pts > 0) {
+ vpts = this->stream->metronom->got_spu_packet (this->stream->metronom, ov->pts);
+ }
+
+ switch (ov->cmd) {
+ case BD_ARGB_OVERLAY_INIT:
+ open_overlay(this, ov->plane, 0, 0, ov->w, ov->h);
+ return;
+ case BD_ARGB_OVERLAY_CLOSE:
+ close_overlay(this, ov->plane);
+ return;
+ case BD_ARGB_OVERLAY_DRAW:
+ /* nothing to do */
+ return;
+
+ case BD_ARGB_OVERLAY_FLUSH:
+ osd = get_overlay(this, ov->plane);
+ xine_osd_set_argb_buffer(osd, this->osd_buf.buf.buf[ov->plane],
+ this->osd_buf.buf.dirty[ov->plane].x0,
+ this->osd_buf.buf.dirty[ov->plane].y0,
+ this->osd_buf.buf.dirty[ov->plane].x1 - this->osd_buf.buf.dirty[ov->plane].x0 + 1,
+ this->osd_buf.buf.dirty[ov->plane].y1 - this->osd_buf.buf.dirty[ov->plane].y0 + 1);
+
+ xine_osd_show(osd, vpts);
+ return;
+
+ default:
+ lprintf("unknown ARGB overlay command %d\n", ov->cmd);
+ return;
+ }
+}
+
/*
* stream info
*/
@@ -1152,8 +1245,10 @@ static void bluray_plugin_dispose (input_plugin_t *this_gen)
{
bluray_input_plugin_t *this = (bluray_input_plugin_t *) this_gen;
- if (this->bdh)
+ if (this->bdh) {
+ bd_register_argb_overlay_proc(this->bdh, NULL, NULL, NULL);
bd_register_overlay_proc(this->bdh, NULL, NULL);
+ }
close_overlay(this, -1);
@@ -1171,6 +1266,8 @@ static void bluray_plugin_dispose (input_plugin_t *this_gen)
if (this->bdh)
bd_close(this->bdh);
+ osd_buf_destroy(&this->osd_buf);
+
free (this->mrl);
free (this->disc_root);
free (this->disc_name);
@@ -1274,9 +1371,10 @@ static int get_disc_info(bluray_input_plugin_t *this)
return -1;
}
+#if 0
if (this->nav_mode && !disc_info->first_play_supported) {
_x_message (this->stream, XINE_MSG_GENERAL_WARNING,
- "Can't play disc in HDMV navigation mode",
+ "Can't play disc using menus",
"First Play title not supported", NULL);
this->nav_mode = 0;
}
@@ -1286,7 +1384,7 @@ static int get_disc_info(bluray_input_plugin_t *this)
"Unsupported titles found",
"Some titles can't be played in navigation mode", NULL);
}
-
+#endif
this->num_titles = disc_info->num_hdmv_titles + disc_info->num_bdj_titles;
this->disc_info = disc_info;
@@ -1382,6 +1480,13 @@ static int bluray_plugin_open (input_plugin_t *this_gen)
/* register overlay (graphics) handler */
+ if (this->stream->video_out->get_capabilities(this->stream->video_out) & VO_CAP_ARGB_LAYER_OVERLAY) {
+fprintf(stderr, "argb overlays\n");
+ osd_buf_init(&this->osd_buf);
+ bd_register_argb_overlay_proc(this->bdh, this, argb_overlay_proc, &this->osd_buf.buf);
+ } else {
+ fprintf(stderr, "no argb overlay support. NO BD-J.\n");
+ }
bd_register_overlay_proc(this->bdh, this, overlay_proc);
/* open */
More information about the libbluray-devel
mailing list