[libbluray-devel] Store currently enabled button ID in struct (BOG_DATA) instead of array of uint16_t 's.
hpi1
git at videolan.org
Sat May 14 14:27:50 CEST 2011
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Sat May 14 14:33:00 2011 +0300| [8998515886f657de78d9f1e049061d93cd101e2d] | committer: hpi1
Store currently enabled button ID in struct (BOG_DATA) instead of array of uint16_t 's.
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=8998515886f657de78d9f1e049061d93cd101e2d
---
src/libbluray/decoders/graphics_controller.c | 56 +++++++++++++++-----------
1 files changed, 32 insertions(+), 24 deletions(-)
diff --git a/src/libbluray/decoders/graphics_controller.c b/src/libbluray/decoders/graphics_controller.c
index 3a7b81e..4256dd2 100644
--- a/src/libbluray/decoders/graphics_controller.c
+++ b/src/libbluray/decoders/graphics_controller.c
@@ -39,6 +39,10 @@
*
*/
+typedef struct {
+ uint16_t enabled_button; /* enabled button id */
+} BOG_DATA;
+
struct graphics_controller_s {
BD_REGISTERS *regs;
@@ -54,11 +58,11 @@ struct graphics_controller_s {
unsigned pg_drawn;
unsigned popup_visible;
unsigned valid_mouse_position;
+ BOG_DATA *bog_data;
/* data */
PG_DISPLAY_SET *pgs;
PG_DISPLAY_SET *igs;
- uint16_t *enabled_button;
/* */
GRAPHICS_PROCESSOR *pgp;
@@ -171,7 +175,7 @@ static int _is_button_enabled(GRAPHICS_CONTROLLER *gc, BD_IG_PAGE *page, unsigne
{
unsigned ii;
for (ii = 0; ii < page->num_bogs; ii++) {
- if (gc->enabled_button[ii] == button_id) {
+ if (gc->bog_data[ii].enabled_button == button_id) {
return 1;
}
}
@@ -207,11 +211,12 @@ static uint16_t _find_selected_button_id(GRAPHICS_CONTROLLER *gc)
/* 2) fallback to current PSR10 value if it is valid */
for (ii = 0; ii < page->num_bogs; ii++) {
BD_IG_BOG *bog = &page->bog[ii];
+ uint16_t enabled_button = gc->bog_data[ii].enabled_button;
- if (button_id == gc->enabled_button[ii]) {
- if (_find_button_bog(bog, gc->enabled_button[ii])) {
- GC_TRACE("_find_selected_button_id() -> PSR10 #%d\n", gc->enabled_button[ii]);
- return gc->enabled_button[ii];
+ if (button_id == enabled_button) {
+ if (_find_button_bog(bog, enabled_button)) {
+ GC_TRACE("_find_selected_button_id() -> PSR10 #%d\n", enabled_button);
+ return enabled_button;
}
}
}
@@ -219,10 +224,11 @@ static uint16_t _find_selected_button_id(GRAPHICS_CONTROLLER *gc)
/* 3) fallback to find first valid_button_id_ref from page */
for (ii = 0; ii < page->num_bogs; ii++) {
BD_IG_BOG *bog = &page->bog[ii];
+ uint16_t enabled_button = gc->bog_data[ii].enabled_button;
- if (_find_button_bog(bog, gc->enabled_button[ii])) {
- GC_TRACE("_find_selected_button_id() -> first valid #%d\n", gc->enabled_button[ii]);
- return gc->enabled_button[ii];
+ if (_find_button_bog(bog, enabled_button)) {
+ GC_TRACE("_find_selected_button_id() -> first valid #%d\n", enabled_button);
+ return enabled_button;
}
}
@@ -230,7 +236,7 @@ static uint16_t _find_selected_button_id(GRAPHICS_CONTROLLER *gc)
return 0xffff;
}
-static void _reset_enabled_button(GRAPHICS_CONTROLLER *gc)
+static void _reset_page_state(GRAPHICS_CONTROLLER *gc)
{
PG_DISPLAY_SET *s = gc->igs;
BD_IG_PAGE *page = NULL;
@@ -239,16 +245,18 @@ static void _reset_enabled_button(GRAPHICS_CONTROLLER *gc)
page = _find_page(&s->ics->interactive_composition, page_id);
if (!page) {
- GC_ERROR("_reset_enabled_button(): unknown page #%d (have %d pages)\n",
+ GC_ERROR("_reset_page_state(): unknown page #%d (have %d pages)\n",
page_id, s->ics->interactive_composition.num_pages);
return;
}
- gc->enabled_button = realloc(gc->enabled_button,
- page->num_bogs * sizeof(uint16_t));
+ size_t size = page->num_bogs * sizeof(*gc->bog_data);
+ gc->bog_data = realloc(gc->bog_data, size);
+
+ memset(gc->bog_data, 0, size);
for (ii = 0; ii < page->num_bogs; ii++) {
- gc->enabled_button[ii] = page->bog[ii].default_valid_button_id_ref;
+ gc->bog_data[ii].enabled_button = page->bog[ii].default_valid_button_id_ref;
}
}
@@ -281,7 +289,7 @@ static void _select_page(GRAPHICS_CONTROLLER *gc, uint16_t page_id)
{
bd_psr_write(gc->regs, PSR_MENU_PAGE_ID, page_id);
_clear_osd(gc, 1);
- _reset_enabled_button(gc);
+ _reset_page_state(gc);
uint16_t button_id = _find_selected_button_id(gc);
bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, button_id);
@@ -300,7 +308,7 @@ static void _gc_reset(GRAPHICS_CONTROLLER *gc)
pg_display_set_free(&gc->pgs);
pg_display_set_free(&gc->igs);
- X_FREE(gc->enabled_button);
+ X_FREE(gc->bog_data);
}
/*
@@ -458,7 +466,7 @@ static void _render_page(GRAPHICS_CONTROLLER *gc,
for (ii = 0; ii < page->num_bogs; ii++) {
BD_IG_BOG *bog = &page->bog[ii];
- unsigned valid_id = gc->enabled_button[ii];
+ unsigned valid_id = gc->bog_data[ii].enabled_button;
BD_IG_BUTTON *button;
button = _find_button_bog(bog, valid_id);
@@ -533,7 +541,7 @@ static int _user_input(GRAPHICS_CONTROLLER *gc, bd_vk_key_e key, GC_NAV_CMDS *cm
for (ii = 0; ii < page->num_bogs; ii++) {
BD_IG_BOG *bog = &page->bog[ii];
- unsigned valid_id = gc->enabled_button[ii];
+ unsigned valid_id = gc->bog_data[ii].enabled_button;
BD_IG_BUTTON *button = _find_button_bog(bog, valid_id);
if (!button) {
continue;
@@ -668,7 +676,7 @@ static void _set_button_page(GRAPHICS_CONTROLLER *gc, uint32_t param)
}
if (button) {
- gc->enabled_button[bog_idx] = button_id;
+ gc->bog_data[bog_idx].enabled_button = button_id;
bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, button_id);
}
@@ -701,15 +709,15 @@ static void _enable_button(GRAPHICS_CONTROLLER *gc, uint32_t button_id, unsigned
}
if (enable) {
- if (gc->enabled_button[bog_idx] == cur_btn_id) {
+ if (gc->bog_data[bog_idx].enabled_button == cur_btn_id) {
/* selected button goes to disabled state */
bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, 0x10000|button_id);
}
- gc->enabled_button[bog_idx] = button_id;
+ gc->bog_data[bog_idx].enabled_button = button_id;
} else {
- if (gc->enabled_button[bog_idx] == button_id) {
- gc->enabled_button[bog_idx] = 0xffff;
+ if (gc->bog_data[bog_idx].enabled_button == button_id) {
+ gc->bog_data[bog_idx].enabled_button = 0xffff;
}
if (cur_btn_id == button_id) {
@@ -764,7 +772,7 @@ static int _mouse_move(GRAPHICS_CONTROLLER *gc, unsigned x, unsigned y, GC_NAV_C
for (ii = 0; ii < page->num_bogs; ii++) {
BD_IG_BOG *bog = &page->bog[ii];
- unsigned valid_id = gc->enabled_button[ii];
+ unsigned valid_id = gc->bog_data[ii].enabled_button;
BD_IG_BUTTON *button = _find_button_bog(bog, valid_id);
if (!button)
More information about the libbluray-devel
mailing list