[vlc-devel] [PATCH 01/12] bluray: Adding some event handling basics.

Hugo Beauzée-Luyssen beauze.h at gmail.com
Sun Jan 22 00:30:56 CET 2012


---
 modules/access/bluray.c |   55 ++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index 7bfc3f0..eb2dc4f 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -80,6 +80,9 @@ static int     blurayDemux  (demux_t *);
 static int     blurayInitTitles(demux_t *p_demux );
 static int     bluraySetTitle(demux_t *p_demux, int i_title);
 
+static void     blurayHandleEvent( demux_t *p_demux, const BD_EVENT *e );
+static void     blurayHandleEvents( demux_t *p_demux );
+
 #define FROM_TICKS(a) (a*CLOCK_FREQ / INT64_C(90000))
 #define TO_TICKS(a)   (a*INT64_C(90000)/CLOCK_FREQ)
 #define CUR_LENGTH    p_sys->pp_title[p_demux->info.i_title]->i_length
@@ -169,6 +172,9 @@ static int blurayOpen( vlc_object_t *object )
         goto error;
     }
 
+    //Initialize the event queue, so we can receive then in Read later.
+    bd_get_event( p_sys->bluray, NULL );
+
     /* get title request */
     if ((pos_title = strrchr(bd_path, ':'))) {
         /* found character ':' for title information */
@@ -258,9 +264,17 @@ static int blurayInitTitles(demux_t *p_demux )
         TAB_APPEND( p_sys->i_title, p_sys->pp_title, t );
         bd_free_title_info(title_info);
     }
+
     return VLC_SUCCESS;
 }
 
+static void blurayUpdateTitle( demux_t *p_demux, int i_title )
+{
+    /* read title info and init some values */
+    p_demux->info.i_title = i_title;
+    p_demux->info.i_seekpoint = 0;
+    p_demux->info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT;
+}
 
 /*****************************************************************************
  * bluraySetTitle: select new BD title
@@ -282,11 +296,7 @@ static int bluraySetTitle(demux_t *p_demux, int i_title)
         msg_Err(p_demux, "cannot select bd title '%d'", p_demux->info.i_title);
         return VLC_EGENERIC;
     }
-
-    /* read title info and init some values */
-    p_demux->info.i_title = i_title;
-    p_demux->info.i_seekpoint = 0;
-    p_demux->info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT;
+    blurayUpdateTitle( p_demux, i_title );
 
     return VLC_SUCCESS;
 }
@@ -423,6 +433,40 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
     return VLC_SUCCESS;
 }
 
+static void     blurayHandleEvent( demux_t *p_demux, const BD_EVENT *e )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+
+    switch ( e->event )
+    {
+    case    BD_EVENT_TITLE:
+        blurayUpdateTitle( p_demux, e->param );
+        break ;
+    case  BD_EVENT_PLAYITEM:
+        break ;
+    case BD_EVENT_AUDIO_STREAM:
+        break ;
+    case BD_EVENT_CHAPTER:
+        p_demux->info.i_update |= INPUT_UPDATE_SEEKPOINT;
+        p_demux->info.i_seekpoint = 0;
+        break ;
+    case BD_EVENT_ANGLE:
+    case BD_EVENT_IG_STREAM:
+    default:
+        msg_Warn( p_demux, "event: %d param: %d", e->event, e->param );
+        break ;
+    }
+}
+
+static void    blurayHandleEvents( demux_t *p_demux )
+{
+    BD_EVENT    e;
+
+    while ( bd_get_event( p_demux->p_sys->bluray, &e ) )
+    {
+        blurayHandleEvent( p_demux, &e );
+    }
+}
 
 #define BD_TS_PACKET_SIZE (192)
 #define NB_TS_PACKETS (200)
@@ -436,6 +480,7 @@ static int blurayDemux(demux_t *p_demux)
         return -1;
     }
 
+    blurayHandleEvents( p_demux );
     int nread = bd_read(p_sys->bluray, p_block->p_buffer,
                         NB_TS_PACKETS * BD_TS_PACKET_SIZE);
     if (nread < 0) {
-- 
1.7.8.4




More information about the vlc-devel mailing list