[libbluray-devel] updated xine plugin: added support for PG overlay plane
hpi1
git at videolan.org
Tue Jun 21 01:39:59 CEST 2011
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Mon Jun 20 14:10:49 2011 +0300| [f899a1af5b4e4b8d59685d333435633d61921272] | committer: hpi1
updated xine plugin: added support for PG overlay plane
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=f899a1af5b4e4b8d59685d333435633d61921272
---
player_wrappers/xine/input_bluray.c | 67 +++++++++++++++++++++++++----------
1 files changed, 48 insertions(+), 19 deletions(-)
diff --git a/player_wrappers/xine/input_bluray.c b/player_wrappers/xine/input_bluray.c
index 307e791..b8af52c 100644
--- a/player_wrappers/xine/input_bluray.c
+++ b/player_wrappers/xine/input_bluray.c
@@ -81,6 +81,8 @@
#define PKT_SIZE 192
#define TICKS_IN_MS 45
+#define MIN_TITLE_LENGTH 180
+
typedef struct {
input_class_t input_class;
@@ -100,7 +102,7 @@ typedef struct {
xine_stream_t *stream;
xine_event_queue_t *event_queue;
- xine_osd_t *osd;
+ xine_osd_t *osd[2];
bluray_input_class_t *class;
@@ -131,11 +133,34 @@ typedef struct {
} bluray_input_plugin_t;
-static void close_overlay(bluray_input_plugin_t *this)
+static void send_num_buttons(bluray_input_plugin_t *this, int n)
+{
+ xine_event_t event;
+ xine_ui_data_t data;
+
+ event.type = XINE_EVENT_UI_NUM_BUTTONS;
+ event.data = &data;
+ event.data_length = sizeof(data);
+ data.num_buttons = n;
+
+ xine_event_send(this->stream, &event);
+}
+
+static void close_overlay(bluray_input_plugin_t *this, int plane)
{
- if (this->osd) {
- xine_osd_free(this->osd);
- this->osd = NULL;
+ if (plane < 0) {
+ close_overlay(this, 0);
+ close_overlay(this, 1);
+ return;
+ }
+
+ if (plane < 2 && this->osd[plane]) {
+ xine_osd_free(this->osd[plane]);
+ this->osd[plane] = NULL;
+ if (plane == 1) {
+ send_num_buttons(this, 0);
+ this->menu_open = 0;
+ }
}
}
@@ -148,20 +173,22 @@ static void overlay_proc(void *this_gen, const BD_OVERLAY * const ov)
return;
}
- if (!ov || ov->plane == 1)
- this->menu_open = 0;
-
if (!ov) {
/* hide OSD */
- close_overlay(this);
+ close_overlay(this, -1);
+ return;
+ }
+
+ if (ov->plane > 1) {
return;
}
/* open xine OSD */
- if (!this->osd) {
- this->osd = xine_osd_new(this->stream, 0, 0, 1920, 1080);
+ if (!this->osd[ov->plane]) {
+ this->osd[ov->plane] = xine_osd_new(this->stream, 0, 0, 1920, 1080);
}
+ xine_osd_t *osd = this->osd[ov->plane];
if (!this->pg_enable) {
_x_select_spu_channel(this->stream, -1);
}
@@ -175,7 +202,7 @@ static void overlay_proc(void *this_gen, const BD_OVERLAY * const ov)
color[i] = (ov->palette[i].Y << 16) | (ov->palette[i].Cr << 8) | ov->palette[i].Cb;
}
- xine_osd_set_palette(this->osd, color, trans);
+ xine_osd_set_palette(osd, color, trans);
}
/* uncompress and draw bitmap */
@@ -188,7 +215,7 @@ static void overlay_proc(void *this_gen, const BD_OVERLAY * const ov)
memset(img + i, rlep->color, rlep->len);
}
- xine_osd_draw_bitmap(this->osd, img, ov->x, ov->y, ov->w, ov->h, NULL);
+ xine_osd_draw_bitmap(osd, img, ov->x, ov->y, ov->w, ov->h, NULL);
free(img);
@@ -196,20 +223,22 @@ static void overlay_proc(void *this_gen, const BD_OVERLAY * const ov)
if (ov->x == 0 && ov->y == 0 && ov->w == 1920 && ov->h == 1080) {
/* Nothing to display, close OSD */
- close_overlay(this);
+ close_overlay(this, ov->plane);
return;
}
/* wipe rect */
- xine_osd_draw_rect(this->osd, ov->x, ov->y, ov->x + ov->w - 1, ov->y + ov->h - 1, 0xff, 1);
+ xine_osd_draw_rect(osd, ov->x, ov->y, ov->x + ov->w - 1, ov->y + ov->h - 1, 0xff, 1);
}
/* display */
- xine_osd_show(this->osd, 0);
+ xine_osd_show(osd, 0);
- if (ov->plane == 1)
+ if (ov->plane == 1) {
this->menu_open = 1;
+ send_num_buttons(this, 1);
+ }
}
static void update_stream_info(bluray_input_plugin_t *this)
@@ -950,7 +979,7 @@ static void bluray_plugin_dispose (input_plugin_t *this_gen)
if (this->bdh)
bd_register_overlay_proc(this->bdh, NULL, NULL);
- close_overlay(this);
+ close_overlay(this, -1);
if (this->event_queue)
xine_event_dispose_queue(this->event_queue);
@@ -1120,7 +1149,7 @@ static int bluray_plugin_open (input_plugin_t *this_gen)
/* load title list */
- this->num_title_idx = bd_get_titles(this->bdh, TITLES_RELEVANT, 180);
+ this->num_title_idx = bd_get_titles(this->bdh, TITLES_RELEVANT, MIN_TITLE_LENGTH);
LOGMSG("%d titles\n", this->num_title_idx);
if (this->num_title_idx < 1)
More information about the libbluray-devel
mailing list