vlc/vlc-3.0 | branch: master | Francois Cartegnie <[email protected]> | Tue Oct 23 17:26:14 2018 +0200| [d6e8d9e5d20fc262e14118e1b793f15a057ceafd] | committer: Francois Cartegnie
access: bluray: force low delay with timed slideshow clips (cherry picked from commit f7a730db7d8ca25361d45b93db5edb0f59fbf9ef) > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=d6e8d9e5d20fc262e14118e1b793f15a057ceafd --- modules/access/bluray.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/modules/access/bluray.c b/modules/access/bluray.c index 4970c6da51..a4d149bd89 100644 --- a/modules/access/bluray.c +++ b/modules/access/bluray.c @@ -63,6 +63,7 @@ #include <libbluray/keys.h> #include <libbluray/meta_data.h> #include <libbluray/overlay.h> +#include <libbluray/clpi_data.h> /***************************************************************************** * Module descriptor @@ -163,6 +164,16 @@ struct demux_sys_t vlc_mutex_t pl_info_lock; BLURAY_TITLE_INFO *p_pl_info; const BLURAY_CLIP_INFO *p_clip_info; + enum + { + BD_CLIP_APP_TYPE_TS_MAIN_PATH_MOVIE = 1, + BD_CLIP_APP_TYPE_TS_MAIN_PATH_TIMED_SLIDESHOW = 2, + BD_CLIP_APP_TYPE_TS_MAIN_PATH_BROWSABLE_SLIDESHOW = 3, + BD_CLIP_APP_TYPE_TS_SUB_PATH_BROWSABLE_SLIDESHOW = 4, + BD_CLIP_APP_TYPE_TS_SUB_PATH_INTERACTIVE_MENU = 5, + BD_CLIP_APP_TYPE_TS_SUB_PATH_TEXT_SUBTITLE = 6, + BD_CLIP_APP_TYPE_TS_SUB_PATH_ELEMENTARY_STREAM_PATH = 7, + } clip_application_type; /* Attachments */ int i_attachments; @@ -1089,6 +1100,7 @@ typedef struct void *priv; bool b_discontinuity; bool b_disable_output; + bool b_lowdelay; vlc_mutex_t lock; struct { @@ -1105,6 +1117,8 @@ enum BLURAY_ES_OUT_CONTROL_FLAG_DISCONTINUITY, BLURAY_ES_OUT_CONTROL_ENABLE_OUTPUT, BLURAY_ES_OUT_CONTROL_DISABLE_OUTPUT, + BLURAY_ES_OUT_CONTROL_ENABLE_LOW_DELAY, + BLURAY_ES_OUT_CONTROL_DISABLE_LOW_DELAY, }; static es_out_id_t *bluray_esOutAdd(es_out_t *p_out, const es_format_t *p_fmt) @@ -1121,6 +1135,11 @@ static es_out_id_t *bluray_esOutAdd(es_out_t *p_out, const es_format_t *p_fmt) switch (fmt.i_cat) { case VIDEO_ES: + if(esout_sys->b_lowdelay) + { + fmt.video.i_frame_rate = 1; fmt.video.i_frame_rate_base = 1; + fmt.b_packetized = true; + } if (esout_sys->selected.i_video_pid != -1 && esout_sys->selected.i_video_pid != p_fmt->i_id) fmt.i_priority = ES_PRIORITY_NOT_SELECTABLE; break ; @@ -1274,6 +1293,13 @@ static int bluray_esOutControl(es_out_t *p_out, int i_query, va_list args) i_ret = VLC_SUCCESS; } break; + case BLURAY_ES_OUT_CONTROL_ENABLE_LOW_DELAY: + case BLURAY_ES_OUT_CONTROL_DISABLE_LOW_DELAY: + { + esout_sys->b_lowdelay = (i_query == BLURAY_ES_OUT_CONTROL_ENABLE_LOW_DELAY); + i_ret = VLC_SUCCESS; + } break; + case ES_OUT_SET_ES_DEFAULT: case ES_OUT_SET_ES: case ES_OUT_SET_ES_STATE: @@ -1331,6 +1357,7 @@ static es_out_t *esOutNew(vlc_object_t *p_obj, es_out_t *p_dst_out, void *priv) esout_sys->priv = priv; esout_sys->b_discontinuity = false; esout_sys->b_disable_output = false; + esout_sys->b_lowdelay = false; esout_sys->selected.i_audio_pid = -1; esout_sys->selected.i_video_pid = -1; esout_sys->selected.i_spu_pid = -1; @@ -2483,7 +2510,7 @@ static void blurayUpdatePlaylist(demux_t *p_demux, unsigned i_playlist) blurayResetStillImage(p_demux); } -static void blurayUpdateCurrentClip(demux_t *p_demux, uint32_t clip) +static void blurayOnClipUpdate(demux_t *p_demux, uint32_t clip) { demux_sys_t *p_sys = p_demux->p_sys; @@ -2501,6 +2528,20 @@ static void blurayUpdateCurrentClip(demux_t *p_demux, uint32_t clip) assert(p_sys->p_clip_info->video_stream_count >= 1); } + CLPI_CL *clpi = bd_get_clpi(p_sys->bluray, clip); + if(clpi && clpi->clip.application_type != p_sys->clip_application_type) + { + if(p_sys->clip_application_type == BD_CLIP_APP_TYPE_TS_MAIN_PATH_TIMED_SLIDESHOW || + clpi->clip.application_type == BD_CLIP_APP_TYPE_TS_MAIN_PATH_TIMED_SLIDESHOW) + blurayRestartParser(p_demux, false); + + if(clpi->clip.application_type == BD_CLIP_APP_TYPE_TS_MAIN_PATH_TIMED_SLIDESHOW) + es_out_Control(p_sys->p_out, BLURAY_ES_OUT_CONTROL_ENABLE_LOW_DELAY); + else + es_out_Control(p_sys->p_out, BLURAY_ES_OUT_CONTROL_DISABLE_LOW_DELAY); + bd_free_clpi(clpi); + } + vlc_mutex_unlock(&p_sys->pl_info_lock); blurayResetStillImage(p_demux); @@ -2534,7 +2575,7 @@ static void blurayHandleEvent(demux_t *p_demux, const BD_EVENT *e) break; case BD_EVENT_PLAYITEM: notifyDiscontinuityToParser(p_sys); - blurayUpdateCurrentClip(p_demux, e->param); + blurayOnClipUpdate(p_demux, e->param); break; case BD_EVENT_CHAPTER: if (e->param && e->param < 0xffff) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
