libbluray | branch: master | hpi1 <[email protected]> | Mon Feb 21 15:35:41 2011 +0200| [ddca63c13ceb4f69ba422bd33977becbdf4b6909] | committer: hpi1
Splitted _find_selected_button_id() from _update_selected_button() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=ddca63c13ceb4f69ba422bd33977becbdf4b6909 --- src/libbluray/decoders/graphics_controller.c | 86 ++++++++++++++++---------- 1 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/libbluray/decoders/graphics_controller.c b/src/libbluray/decoders/graphics_controller.c index 477f4ff..9e8bcc3 100644 --- a/src/libbluray/decoders/graphics_controller.c +++ b/src/libbluray/decoders/graphics_controller.c @@ -178,6 +178,58 @@ static int _is_button_enabled(GRAPHICS_CONTROLLER *gc, BD_IG_PAGE *page, unsigne return 0; } +static int _find_selected_button_id(GRAPHICS_CONTROLLER *gc) +{ + /* executed when playback condition changes (ex. new page, popup-on, ...) */ + PG_DISPLAY_SET *s = gc->igs; + BD_IG_PAGE *page = NULL; + unsigned page_id = bd_psr_read(gc->regs, PSR_MENU_PAGE_ID); + unsigned button_id = bd_psr_read(gc->regs, PSR_SELECTED_BUTTON_ID); + unsigned ii; + + page = _find_page(&s->ics->interactive_composition, page_id); + if (!page) { + TRACE("_find_selected_button_id(): unknown page #%d (have %d pages)\n", + page_id, s->ics->interactive_composition.num_pages); + return 0xffff; + } + + /* run 5.9.8.3 */ + + /* 1) always use page->default_selected_button_id_ref if it is valid */ + if (_find_button_page(page, page->default_selected_button_id_ref, NULL) && + _is_button_enabled(gc, page, page->default_selected_button_id_ref)) { + + TRACE("_find_selected_button_id() -> default #%d\n", page->default_selected_button_id_ref); + return page->default_selected_button_id_ref; + } + + /* 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]; + + if (button_id == gc->enabled_button[ii]) { + if (_find_button_bog(bog, gc->enabled_button[ii])) { + TRACE("_find_selected_button_id() -> PSR10 #%d\n", gc->enabled_button[ii]); + return gc->enabled_button[ii]; + } + } + } + + /* 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]; + + if (_find_button_bog(bog, gc->enabled_button[ii])) { + TRACE("_find_selected_button_id() -> first valid #%d\n", gc->enabled_button[ii]); + return gc->enabled_button[ii]; + } + } + + TRACE("_find_selected_button_id(): not found -> 0xffff\n"); + return 0xffff; +} + static void _reset_enabled_button(GRAPHICS_CONTROLLER *gc) { PG_DISPLAY_SET *s = gc->igs; @@ -678,39 +730,9 @@ static void _update_selected_button(GRAPHICS_CONTROLLER *gc) return; } - if (button_id == 0xffff) { - PG_DISPLAY_SET *s = gc->igs; - BD_IG_PAGE *page = NULL; - unsigned page_id = bd_psr_read(gc->regs, PSR_MENU_PAGE_ID); - - page = _find_page(&s->ics->interactive_composition, page_id); - if (!page) { - TRACE("_update_enabled_button(): unknown page #%d (have %d pages)\n", - page_id, s->ics->interactive_composition.num_pages); - return; - } - - // run 5.9.8.3 - - if (_find_button_page(page, page->default_selected_button_id_ref, NULL) && - _is_button_enabled(gc, page, page->default_selected_button_id_ref)) { - - button_id = page->default_selected_button_id_ref; - - } else { - unsigned ii; - for (ii = 0; ii < page->num_bogs; ii++) { - - BD_IG_BOG *bog = &page->bog[ii]; - if (_find_button_bog(bog, gc->enabled_button[ii])) { - button_id = gc->enabled_button[ii]; - break; - } - } - } - + if (button_id == 0xffff) { + button_id = _find_selected_button_id(gc); bd_psr_write(gc->regs, PSR_SELECTED_BUTTON_ID, button_id); - TRACE("_update_enabled_button() -> #%d\n", button_id); } } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
