vlc | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Thu Mar  8 
12:23:32 2012 +0100| [6afa23b2dd9e3f526aa59c5d1ee727d2ce249e78] | committer: 
Jean-Baptiste Kempf

bluray: properly suppport FIRST_TITLE & TOP_MENU titles

Signed-off-by: Jean-Baptiste Kempf <[email protected]>

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

 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:

_______________________________________________
vlc-commits mailing list
[email protected]
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to