Petri Hintukainen pushed to branch master at VideoLAN / libbluray
Commits: 1426804d by hpi1 at 2019-03-04T11:19:58Z Improve HDMV event debugging - - - - - bbab2eff by hpi1 at 2019-03-04T11:31:08Z Cosmetics - - - - - 411bdf4c by hpi1 at 2019-03-04T11:32:32Z Split function - - - - - e143a72f by hpi1 at 2019-03-04T11:33:37Z Initialize defaults for selected streams when opening a playlist without menus - - - - - 3 changed files: - src/libbluray/bluray.c - src/libbluray/hdmv/hdmv_vm.c - src/libbluray/hdmv/hdmv_vm.h Changes: ===================================== src/libbluray/bluray.c ===================================== @@ -315,49 +315,77 @@ static void _update_clip_psrs(BLURAY *bd, NAV_CLIP *clip) { MPLS_STN *stn = &clip->title->pl->play_item[clip->ref].stn; uint32_t audio_lang = 0; + uint32_t psr_val; bd_psr_write(bd->regs, PSR_PLAYITEM, clip->ref); bd_psr_write(bd->regs, PSR_TIME, clip->in_time); - /* Update selected audio and subtitle stream PSRs when not using menus. - * Selection is based on language setting PSRs and clip STN. - */ - /* Validate selected audio, subtitle and IG stream PSRs when using menus */ - { - uint32_t psr_val; + /* Validate selected audio, subtitle and IG stream PSRs */ + if (stn->num_audio) { + bd_psr_lock(bd->regs); + psr_val = bd_psr_read(bd->regs, PSR_PRIMARY_AUDIO_ID); + if (psr_val == 0 || psr_val > stn->num_audio) { + _update_stream_psr_by_lang(bd->regs, + PSR_AUDIO_LANG, PSR_PRIMARY_AUDIO_ID, 0, + stn->audio, stn->num_audio, + &audio_lang, 0); + } else { + audio_lang = str_to_uint32((const char *)stn->audio[psr_val - 1].lang, 3); + } + bd_psr_unlock(bd->regs); + } + if (stn->num_pg) { + bd_psr_lock(bd->regs); + psr_val = bd_psr_read(bd->regs, PSR_PG_STREAM) & 0xfff; + if ((psr_val == 0) || (psr_val > stn->num_pg)) { + _update_stream_psr_by_lang(bd->regs, + PSR_PG_AND_SUB_LANG, PSR_PG_STREAM, 0x80000000, + stn->pg, stn->num_pg, + NULL, audio_lang); + } + bd_psr_unlock(bd->regs); + } + if (stn->num_ig && bd->title_type != title_undef) { + bd_psr_lock(bd->regs); + psr_val = bd_psr_read(bd->regs, PSR_IG_STREAM_ID); + if ((psr_val == 0) || (psr_val > stn->num_ig)) { + bd_psr_write(bd->regs, PSR_IG_STREAM_ID, 1); + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "Selected IG stream 1 (stream %d not available)\n", psr_val); + } + bd_psr_unlock(bd->regs); + } +} + +static void _update_playlist_psrs(BLURAY *bd) +{ + NAV_CLIP *clip = bd->st0.clip; + + bd_psr_write(bd->regs, PSR_PLAYLIST, atoi(bd->title->name)); + bd_psr_write(bd->regs, PSR_ANGLE_NUMBER, bd->title->angle + 1); + bd_psr_write(bd->regs, PSR_CHAPTER, 0xffff); + + if (clip && bd->title_type == title_undef) { + /* Initialize selected audio and subtitle stream PSRs when not using menus. + * Selection is based on language setting PSRs and clip STN. + */ + MPLS_STN *stn = &clip->title->pl->play_item[clip->ref].stn; + uint32_t audio_lang = 0; + + /* make sure clip is up-to-date before STREAM events are triggered */ + bd_psr_write(bd->regs, PSR_PLAYITEM, clip->ref); if (stn->num_audio) { - bd_psr_lock(bd->regs); - psr_val = bd_psr_read(bd->regs, PSR_PRIMARY_AUDIO_ID); - if (psr_val == 0 || psr_val > stn->num_audio) { - _update_stream_psr_by_lang(bd->regs, - PSR_AUDIO_LANG, PSR_PRIMARY_AUDIO_ID, 0, - stn->audio, stn->num_audio, - &audio_lang, 0); - } else { - audio_lang = str_to_uint32((const char *)stn->audio[psr_val - 1].lang, 3); - } - bd_psr_unlock(bd->regs); + _update_stream_psr_by_lang(bd->regs, + PSR_AUDIO_LANG, PSR_PRIMARY_AUDIO_ID, 0, + stn->audio, stn->num_audio, + &audio_lang, 0); } + if (stn->num_pg) { - bd_psr_lock(bd->regs); - psr_val = bd_psr_read(bd->regs, PSR_PG_STREAM) & 0xfff; - if ((psr_val == 0) || (psr_val > stn->num_pg)) { - _update_stream_psr_by_lang(bd->regs, - PSR_PG_AND_SUB_LANG, PSR_PG_STREAM, 0x80000000, - stn->pg, stn->num_pg, - NULL, audio_lang); - } - bd_psr_unlock(bd->regs); - } - if (stn->num_ig && bd->title_type != title_undef) { - bd_psr_lock(bd->regs); - psr_val = bd_psr_read(bd->regs, PSR_IG_STREAM_ID); - if ((psr_val == 0) || (psr_val > stn->num_ig)) { - bd_psr_write(bd->regs, PSR_IG_STREAM_ID, 1); - BD_DEBUG(DBG_BLURAY | DBG_CRIT, "Selected IG stream 1 (stream %d not available)\n", psr_val); - } - bd_psr_unlock(bd->regs); + _update_stream_psr_by_lang(bd->regs, + PSR_PG_AND_SUB_LANG, PSR_PG_STREAM, 0x80000000, + stn->pg, stn->num_pg, + NULL, audio_lang); } } } @@ -2341,12 +2369,11 @@ static int _open_playlist(BLURAY *bd, const char *f_name, unsigned angle) bd->end_of_playlist = 0; bd->st0.ig_pid = 0; - bd_psr_write(bd->regs, PSR_PLAYLIST, atoi(bd->title->name)); - bd_psr_write(bd->regs, PSR_ANGLE_NUMBER, bd->title->angle + 1); - bd_psr_write(bd->regs, PSR_CHAPTER, 0xffff); - // Get the initial clip of the playlist bd->st0.clip = nav_next_clip(bd->title, NULL); + + _update_playlist_psrs(bd); + if (_open_m2ts(bd, &bd->st0)) { BD_DEBUG(DBG_BLURAY, "Title %s selected\n", f_name); @@ -3369,7 +3396,7 @@ int bd_menu_call(BLURAY *bd, int64_t pts) static void _process_hdmv_vm_event(BLURAY *bd, HDMV_EVENT *hev) { - BD_DEBUG(DBG_BLURAY, "HDMV event: %d %d\n", hev->event, hev->param); + BD_DEBUG(DBG_BLURAY, "HDMV event: %s(%d): %d\n", hdmv_event_str(hev->event), hev->event, hev->param); switch (hev->event) { case HDMV_EVENT_TITLE: @@ -3425,7 +3452,7 @@ static void _process_hdmv_vm_event(BLURAY *bd, HDMV_EVENT *hev) case HDMV_EVENT_END: case HDMV_EVENT_NONE: - default: + //default: break; } } ===================================== src/libbluray/hdmv/hdmv_vm.c ===================================== @@ -301,6 +301,28 @@ static void _fetch_operands(HDMV_VM *p, MOBJ_CMD *cmd, uint32_t *dst, uint32_t * * event queue */ +const char *hdmv_event_str(hdmv_event_e event) +{ + switch (event) { +#define EVENT_ENTRY(e) case e : return #e + EVENT_ENTRY(HDMV_EVENT_NONE); + EVENT_ENTRY(HDMV_EVENT_END); + EVENT_ENTRY(HDMV_EVENT_IG_END); + EVENT_ENTRY(HDMV_EVENT_TITLE); + EVENT_ENTRY(HDMV_EVENT_PLAY_PL); + EVENT_ENTRY(HDMV_EVENT_PLAY_PI); + EVENT_ENTRY(HDMV_EVENT_PLAY_PM); + EVENT_ENTRY(HDMV_EVENT_PLAY_STOP); + EVENT_ENTRY(HDMV_EVENT_STILL); + EVENT_ENTRY(HDMV_EVENT_SET_BUTTON_PAGE); + EVENT_ENTRY(HDMV_EVENT_ENABLE_BUTTON); + EVENT_ENTRY(HDMV_EVENT_DISABLE_BUTTON); + EVENT_ENTRY(HDMV_EVENT_POPUP_OFF); +#undef EVENT_ENTRY + } + return "???"; +} + static int _get_event(HDMV_VM *p, HDMV_EVENT *ev) { if (p->event[0].event != HDMV_EVENT_NONE) { @@ -325,7 +347,7 @@ static int _queue_event(HDMV_VM *p, hdmv_event_e event, uint32_t param) } } - BD_DEBUG(DBG_HDMV|DBG_CRIT, "_queue_event(%d, %d): queue overflow !\n", event, param); + BD_DEBUG(DBG_HDMV|DBG_CRIT, "_queue_event(%d:%s, %d): queue overflow !\n", event, hdmv_event_str(event), param); return -1; } ===================================== src/libbluray/hdmv/hdmv_vm.h ===================================== @@ -60,6 +60,8 @@ typedef struct hdmv_vm_event_s { uint32_t param; } HDMV_EVENT; +BD_PRIVATE const char *hdmv_event_str(hdmv_event_e event); + /* * */ View it on GitLab: https://code.videolan.org/videolan/libbluray/compare/6bbbd7dc81be85bb3805a82c9759bff20464d0f1...e143a72f695a95dd8c3906d7f1142ee766a0f6ce -- View it on GitLab: https://code.videolan.org/videolan/libbluray/compare/6bbbd7dc81be85bb3805a82c9759bff20464d0f1...e143a72f695a95dd8c3906d7f1142ee766a0f6ce You're receiving this email because of your account on code.videolan.org.
_______________________________________________ libbluray-devel mailing list libbluray-devel@videolan.org https://mailman.videolan.org/listinfo/libbluray-devel