libbluray | branch: master | hpi1 <[email protected]> | Mon Nov 21 09:27:44 2011 +0200| [ea8f42177a500edca76a8bfb94834568f9f07b6f] | committer: hpi1
Delay decoding of preloaded IG stream > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=ea8f42177a500edca76a8bfb94834568f9f07b6f --- src/libbluray/bluray.c | 27 ++++++++++++++++++++++++--- 1 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 31cba9a..99ecebf 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -1250,7 +1250,7 @@ static int _find_ig_stream(BLURAY *bd, uint16_t *pid, int *sub_path_idx) unsigned ig_stream = bd_psr_read(bd->regs, PSR_IG_STREAM_ID); if (ig_stream > 0 && ig_stream <= pi->stn.num_ig) { - ig_stream--; + ig_stream--; /* stream number to table index */ if (pi->stn.ig[ig_stream].stream_type == 2) { *sub_path_idx = pi->stn.ig[ig_stream].subpath_id; } @@ -1282,11 +1282,10 @@ static int _preload_ig_subpath(BLURAY *bd) bd->st_ig.clip = &bd->title->sub_path[ig_subpath].clip_list.clip[0]; if (!_preload_m2ts(bd, &bd->st_ig)) { + _close_preload(&bd->st_ig); return 0; } - gc_decode_ts(bd->graphics_controller, ig_pid, bd->st_ig.buf, bd->st_ig.clip_size / 6144, -1); - return 1; } @@ -1301,6 +1300,26 @@ static int _preload_subpaths(BLURAY *bd) return _preload_ig_subpath(bd); } +static int _init_ig_stream(BLURAY *bd) +{ + int ig_subpath = -1; + uint16_t ig_pid = 0; + + if (!bd->graphics_controller) { + return 0; + } + + _find_ig_stream(bd, &ig_pid, &ig_subpath); + + /* decode already preloaded IG sub-path */ + if (bd->st_ig.clip) { + gc_decode_ts(bd->graphics_controller, ig_pid, bd->st_ig.buf, bd->st_ig.clip_size / 6144, -1); + return 1; + } + + return 0; +} + /* * select title / angle */ @@ -1718,6 +1737,7 @@ static void _process_psr_restore_event(BLURAY *bd, BD_PSR_EVENT *ev) return; case PSR_TIME: bd_seek_time(bd, ((int64_t)ev->new_val) << 1); + _init_ig_stream(bd); return; case PSR_SELECTED_BUTTON_ID: @@ -2053,6 +2073,7 @@ static void _process_hdmv_vm_event(BLURAY *bd, HDMV_EVENT *hev) case HDMV_EVENT_PLAY_PL: bd_select_playlist(bd, hev->param); /* initialize menus */ + _init_ig_stream(bd); _run_gc(bd, GC_CTRL_INIT_MENU, 0); break; _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
