[vlc-commits] bluray: properly suppport FIRST_TITLE & TOP_MENU titles

Hugo Beauzée-Luyssen git at videolan.org
Thu Mar 8 13:27:18 CET 2012


vlc/vlc-2.0 | branch: master | Hugo Beauzée-Luyssen <beauze.h at gmail.com> | Thu Mar  8 12:23:32 2012 +0100| [c73229e1ed2005574e8278f26940c07f068d005a] | committer: Jean-Baptiste Kempf

bluray: properly suppport FIRST_TITLE & TOP_MENU titles

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
(cherry picked from commit 6afa23b2dd9e3f526aa59c5d1ee727d2ce249e78)

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.0.git/?a=commit;h=c73229e1ed2005574e8278f26940c07f068d005a
---

 modules/access/bluray.c |   36 ++++++++++++++++++++++++++++++------
 1 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index 8f1e2fb..b8167d4 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -97,6 +97,8 @@ struct  demux_sys_t
     unsigned int        i_title;
     unsigned int        i_longest_title;
     input_title_t       **pp_title;
+    unsigned int        i_first_play;
+    unsigned int        i_top_menu;
 
     /* Meta informations */
     const META_DL       *p_meta;
@@ -739,6 +741,23 @@ static int blurayInitTitles(demux_t *p_demux )
         TAB_APPEND( p_sys->i_title, p_sys->pp_title, t );
         bd_free_title_info(title_info);
     }
+
+    /* Create titles for BLURAY_TITLE_FIRST_PLAY & BLURAY_TITLE_TOP_MENU */
+    input_title_t *p_first_play = vlc_input_title_New();
+    if (unlikely(!p_first_play))
+        return VLC_SUCCESS;
+
+    p_first_play->psz_name = strdup("First play");
+    p_sys->i_first_play = p_sys->i_title;
+    TAB_APPEND(p_sys->i_title, p_sys->pp_title, p_first_play);
+
+    input_title_t *p_top_menu = vlc_input_title_New();
+    if (unlikely(!p_top_menu))
+        return VLC_SUCCESS;
+
+    p_top_menu->psz_name = strdup("Top menu");
+    p_sys->i_top_menu = p_sys->i_title;
+    TAB_APPEND(p_sys->i_title, p_sys->pp_title, p_top_menu);
     return VLC_SUCCESS;
 }
 
@@ -759,11 +778,17 @@ static void blurayResetParser( demux_t *p_demux )
     }
 }
 
-static void blurayUpdateTitle( demux_t *p_demux, int i_title )
+static void blurayUpdateTitle(demux_t *p_demux, int i_title)
 {
     blurayResetParser(p_demux);
-    if (i_title >= p_demux->p_sys->i_title)
-        return;
+    if (i_title >= p_demux->p_sys->i_title) {
+        if (i_title == BLURAY_TITLE_FIRST_PLAY)
+            i_title = p_demux->p_sys->i_first_play;
+        else if (i_title == BLURAY_TITLE_TOP_MENU)
+            i_title = p_demux->p_sys->i_top_menu;
+        else
+            return;
+    }
 
     /* read title info and init some values */
     p_demux->info.i_title = i_title;
@@ -862,7 +887,7 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
         case DEMUX_GET_LENGTH:
         {
             int64_t *pi_length = (int64_t*)va_arg(args, int64_t *);
-            *pi_length = p_demux->info.i_title < p_sys->i_title ? CUR_LENGTH : 0;
+            *pi_length = CUR_LENGTH;
             return VLC_SUCCESS;
         }
         case DEMUX_SET_TIME:
@@ -881,8 +906,7 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
         case DEMUX_GET_POSITION:
         {
             double *pf_position = (double*)va_arg( args, double * );
-            *pf_position = p_demux->info.i_title < p_sys->i_title ?
-                        (double)FROM_TICKS(bd_tell_time(p_sys->bluray))/CUR_LENGTH : 0.0;
+            *pf_position = (double)FROM_TICKS(bd_tell_time(p_sys->bluray))/CUR_LENGTH;
             return VLC_SUCCESS;
         }
         case DEMUX_SET_POSITION:



More information about the vlc-commits mailing list