]> git.sesse.net Git - vlc/blobdiff - plugins/dvdread/input_dvdread.c
* ALL: new module API. Makes a few things a lot simpler, and we gain
[vlc] / plugins / dvdread / input_dvdread.c
index 8e946cd9b4a5c48bd94f6f610eb16bfe673d13fb..deff9b590562ccc9212a25641bd2a1ad9d53adc5 100644 (file)
@@ -6,7 +6,7 @@
  * It depends on: libdvdread for ifo files and block reading.
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: input_dvdread.c,v 1.31 2002/03/06 16:39:37 stef Exp $
+ * $Id: input_dvdread.c,v 1.42 2002/07/31 20:56:51 sam Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -34,7 +34,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include <videolan/vlc.h>
+#include <vlc/vlc.h>
+#include <vlc/input.h>
 
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>
 #   include "input_iovec.h"
 #endif
 
-#include "stream_control.h"
-#include "input_ext-intf.h"
-#include "input_ext-dec.h"
-#include "input_ext-plugins.h"
+#include <dvdread/dvd_reader.h>
+#include <dvdread/ifo_types.h>
+#include <dvdread/ifo_read.h>
+#include <dvdread/nav_read.h>
+#include <dvdread/nav_print.h>
 
 #include "input_dvdread.h"
 
 #include "iso_lang.h"
 
-#include "debug.h"
-
 /* how many blocks DVDRead will read in each loop */
 #define DVD_BLOCK_READ_ONCE 64
 
  * Local prototypes
  *****************************************************************************/
 /* called from outside */
-static int  DvdReadInit     ( struct input_thread_s * );
-static void DvdReadEnd      ( struct input_thread_s * );
-static int  DvdReadDemux    ( struct input_thread_s * );
-static int  DvdReadRewind   ( struct input_thread_s * );
-
-static int  DvdReadOpen     ( struct input_thread_s * );
-static void DvdReadClose    ( struct input_thread_s * );
-static int  DvdReadSetArea  ( struct input_thread_s *, struct input_area_s * );
-static int  DvdReadSetProgram( struct input_thread_s *, pgrm_descriptor_t * );
-static int  DvdReadRead     ( struct input_thread_s *, byte_t *, size_t );
-static void DvdReadSeek     ( struct input_thread_s *, off_t );
+static int  DvdReadDemux    ( input_thread_t * );
+static int  DvdReadRewind   ( input_thread_t * );
+
+static int  DvdReadSetArea    ( input_thread_t *, input_area_t * );
+static int  DvdReadSetProgram ( input_thread_t *, pgrm_descriptor_t * );
+static int  DvdReadRead       ( input_thread_t *, byte_t *, size_t );
+static void DvdReadSeek       ( input_thread_t *, off_t );
 
 /* called only from here */
 static void DvdReadLauchDecoders( input_thread_t * p_input );
 static void DvdReadHandleDSI( thread_dvd_data_t * p_dvd, u8 * p_data );
 static void DvdReadFindCell ( thread_dvd_data_t * p_dvd );
 
-/*****************************************************************************
- * Functions exported as capabilities. They are declared as static so that
- * we don't pollute the namespace too much.
- *****************************************************************************/
-void _M( access_getfunctions )( function_list_t * p_function_list )
-{
-#define access p_function_list->functions.access
-    access.pf_open             = DvdReadOpen;
-    access.pf_close            = DvdReadClose;
-    access.pf_read             = DvdReadRead;
-    access.pf_set_area         = DvdReadSetArea;
-    access.pf_set_program      = DvdReadSetProgram;
-    access.pf_seek             = DvdReadSeek;
-#undef access
-}
-
-void _M( demux_getfunctions )( function_list_t * p_function_list )
-{
-#define demux p_function_list->functions.demux
-    demux.pf_init             = DvdReadInit;
-    demux.pf_end              = DvdReadEnd;
-    demux.pf_demux            = DvdReadDemux;
-    demux.pf_rewind           = DvdReadRewind;
-#undef demux
-}
-
 /*
  * Data demux functions
  */
 
 /*****************************************************************************
- * DvdReadInit: initializes DVD structures
+ * InitDVD: initializes DVD structures
  *****************************************************************************/
-static int DvdReadInit( input_thread_t * p_input )
+int E_(InitDVD) ( vlc_object_t *p_this )
 {
+    input_thread_t *p_input = (input_thread_t *)p_this;
+
+    if( p_input->stream.i_method != INPUT_METHOD_DVD )
+    {
+        return -1;
+    }
+
+    p_input->pf_demux = DvdReadDemux;
+    p_input->pf_rewind = NULL;
+
     vlc_mutex_lock( &p_input->stream.stream_lock );
     
     DvdReadLauchDecoders( p_input );
@@ -140,13 +120,6 @@ static int DvdReadInit( input_thread_t * p_input )
     return 0;
 }
 
-/*****************************************************************************
- * DvdReadEnd: frees unused data
- *****************************************************************************/
-static void DvdReadEnd( input_thread_t * p_input )
-{
-}
-
 /*****************************************************************************
  * DvdReadDemux
  *****************************************************************************/
@@ -227,10 +200,11 @@ static int DvdReadRewind( input_thread_t * p_input )
  */
 
 /*****************************************************************************
- * DvdReadOpen: open libdvdread
+ * OpenDVD: open libdvdread
  *****************************************************************************/
-static int DvdReadOpen( struct input_thread_s *p_input )
+int E_(OpenDVD) ( vlc_object_t *p_this )
 {
+    input_thread_t *        p_input = (input_thread_t *)p_this;
     char *                  psz_orig;
     char *                  psz_parser;
     char *                  psz_source;
@@ -250,6 +224,11 @@ static int DvdReadOpen( struct input_thread_s *p_input )
         return( -1 );
     }
 
+    p_input->pf_read = DvdReadRead;
+    p_input->pf_seek = DvdReadSeek;
+    p_input->pf_set_area = DvdReadSetArea;
+    p_input->pf_set_program = DvdReadSetProgram;
+
     while( *psz_parser && *psz_parser != '@' )
     {
         psz_parser++;
@@ -284,26 +263,25 @@ static int DvdReadOpen( struct input_thread_s *p_input )
             free( psz_orig );
             return -1;
         }
-        psz_source = config_GetPszVariable( INPUT_DVD_DEVICE_VAR );
+        psz_source = config_GetPsz( p_input, "dvd" );
     }
 
     if( stat( psz_source, &stat_info ) == -1 )
     {
-        intf_ErrMsg( "input error: cannot stat() source `%s' (%s)",
-                     psz_source, strerror(errno));
+        msg_Err( p_input, "cannot stat() source `%s' (%s)",
+                          psz_source, strerror(errno));
         return( -1 );
     }
     if( !S_ISBLK(stat_info.st_mode) &&
         !S_ISCHR(stat_info.st_mode) &&
         !S_ISDIR(stat_info.st_mode) )
     {
-        intf_WarnMsg( 3, "input : DvdRead plugin discarded"
-                         " (not a valid source)" );
+        msg_Warn( p_input, "dvdread module discarded (not a valid source)" );
         return -1;
     }
     
-    intf_WarnMsg( 2, "input: dvdroot=%s title=%d chapter=%d angle=%d",
-                  psz_source, i_title, i_chapter, i_angle );
+    msg_Dbg( p_input, "dvdroot=%s title=%d chapter=%d angle=%d",
+                      psz_source, i_title, i_chapter, i_angle );
     
 
     p_dvdread = DVDOpen( psz_source );
@@ -315,7 +293,7 @@ static int DvdReadOpen( struct input_thread_s *p_input )
 
     if( ! p_dvdread )
     {
-        intf_ErrMsg( "dvdread error: libdvdcss can't open source" );
+        msg_Err( p_input, "libdvdcss cannot open source" );
         return -1;
     }
 
@@ -325,7 +303,7 @@ static int DvdReadOpen( struct input_thread_s *p_input )
     p_dvd = malloc( sizeof(thread_dvd_data_t) );
     if( p_dvd == NULL )
     {
-        intf_ErrMsg( "dvdread error: out of memory" );
+        msg_Err( p_input, "out of memory" );
         return -1;
     }
 
@@ -339,11 +317,11 @@ static int DvdReadOpen( struct input_thread_s *p_input )
     /* Ifo allocation & initialisation */
     if( ! ( p_dvd->p_vmg_file = ifoOpen( p_dvd->p_dvdread, 0 ) ) )
     {
-        intf_ErrMsg( "dvdread error: can't open VMG info" );
+        msg_Err( p_input, "cannot open VMG info" );
         free( p_dvd );
         return -1;
     }
-    intf_WarnMsg( 2, "dvdread info: VMG opened" );
+    msg_Dbg( p_input, "VMG opened" );
 
     /* Set stream and area data */
     vlc_mutex_lock( &p_input->stream.stream_lock );
@@ -364,7 +342,7 @@ static int DvdReadOpen( struct input_thread_s *p_input )
     p_input->stream.i_method = INPUT_METHOD_DVD;
 
 #define tt_srpt p_dvd->p_vmg_file->tt_srpt
-    intf_WarnMsg( 2, "dvdread info: number of titles: %d", tt_srpt->nr_of_srpts );
+    msg_Dbg( p_input, "number of titles: %d", tt_srpt->nr_of_srpts );
 
 #define area p_input->stream.pp_areas
     /* We start from 1 here since the default area 0
@@ -416,13 +394,12 @@ static int DvdReadOpen( struct input_thread_s *p_input )
 }
 
 /*****************************************************************************
- * DvdReadClose: close libdvdread
+ * CloseDVD: close libdvdread
  *****************************************************************************/
-static void DvdReadClose( struct input_thread_s *p_input )
+void E_(CloseDVD) ( vlc_object_t *p_this )
 {
-    thread_dvd_data_t *     p_dvd;
-
-    p_dvd = (thread_dvd_data_t *)p_input->p_access_data;
+    input_thread_t *    p_input = (input_thread_t *)p_this;
+    thread_dvd_data_t * p_dvd = (thread_dvd_data_t *)p_input->p_access_data;
 
     /* close libdvdread */
     DVDCloseFile( p_dvd->p_title );
@@ -453,7 +430,7 @@ static int DvdReadSetProgram( input_thread_t * p_input,
         p_program->i_number = p_dvd->i_angle;
         p_input->stream.p_selected_program = p_program;
 
-        intf_WarnMsg( 3, "dvd info: angle %d selected", p_dvd->i_angle );
+        msg_Dbg( p_input, "angle %d selected", p_dvd->i_angle );
     }
 
     return 0;
@@ -508,7 +485,7 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
         /* Change the default area */
         p_input->stream.p_selected_area = p_area;
 
-        intf_WarnMsg( 12, "dvdread: open VTS %d, for title %d",
+        msg_Dbg( p_input, "open VTS %d, for title %d",
             p_vmg->tt_srpt->title[ p_area->i_id - 1 ].title_set_nr,
             p_area->i_id );
 
@@ -516,7 +493,7 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
         if( ! ( p_vts = ifoOpen( p_dvd->p_dvdread,
                 p_vmg->tt_srpt->title[ p_area->i_id - 1 ].title_set_nr ) ) )
         {
-            intf_ErrMsg( "dvdread error: fatal error in vts ifo" );
+            msg_Err( p_input, "fatal error in vts ifo" );
             ifoClose( p_vmg );
             DVDClose( p_dvd->p_dvdread );
             return -1;
@@ -536,8 +513,8 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
         p_area->i_start =
             LB2OFF( p_dvd->p_cur_pgc->cell_playback[ i_cell ].first_sector );
 
-        intf_WarnMsg( 3, "dvdread: start %d vts_title %d pgc %d pgn %d",
-                         p_area->i_id, p_dvd->i_ttn, pgc_id, pgn );
+        msg_Dbg( p_input, "start %d vts_title %d pgc %d pgn %d",
+                  p_area->i_id, p_dvd->i_ttn, pgc_id, pgn );
 
         /*
          * Find title end
@@ -547,8 +524,8 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
         p_dvd->i_end_block = p_pgc->cell_playback[ i_cell ].last_sector;
         p_area->i_size = LB2OFF( p_dvd->i_end_block )- p_area->i_start;
 
-        intf_WarnMsg( 12, "dvdread: start %lld size %lld end %d",
-                          p_area->i_start , p_area->i_size, p_dvd->i_end_block );
+        msg_Dbg( p_input, "start %lld size %lld end %d",
+                  p_area->i_start , p_area->i_size, p_dvd->i_end_block );
 
         /*
          * Set properties for current chapter
@@ -587,8 +564,8 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
             p_vmg->tt_srpt->title[ p_area->i_id - 1 ].title_set_nr,
             DVD_READ_TITLE_VOBS ) ) )
         {
-            intf_ErrMsg( "dvdread error: can't open title (VTS_%02d_1.VOB)",
-                         p_vmg->tt_srpt->title[p_area->i_id-1].title_set_nr );
+            msg_Err( p_input, "cannot open title (VTS_%02d_1.VOB)",
+                     p_vmg->tt_srpt->title[p_area->i_id-1].title_set_nr );
             ifoClose( p_vts );
             ifoClose( p_vmg );
             DVDClose( p_dvd->p_dvdread );
@@ -645,7 +622,7 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
 
         p_es = input_AddES( p_input, NULL, 0xe0, 0 );
         p_es->i_stream_id = 0xe0;
-        p_es->i_type = MPEG2_VIDEO_ES;
+        p_es->i_fourcc = VLC_FOURCC('m','p','g','v');
         p_es->i_cat = VIDEO_ES;
 
 #define audio_control \
@@ -664,18 +641,17 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
                 i_audio_nb++;
                 i_position = ( audio_control & 0x7F00 ) >> 8;
 
-            intf_WarnMsg( 12, "dvd audio position  %d", i_position );
+            msg_Dbg( p_input, "audio position  %d", i_position );
                 switch( p_vts->vtsi_mat->vts_audio_attr[i-1].audio_format )
                 {
                 case 0x00:              /* AC3 */
                     i_id = ( ( 0x80 + i_position ) << 8 ) | 0xbd;
                     p_es = input_AddES( p_input, NULL, i_id, 0 );
                     p_es->i_stream_id = 0xbd;
-                    p_es->i_type = AC3_AUDIO_ES;
-                    p_es->b_audio = 1;
+                    p_es->i_fourcc = VLC_FOURCC('a','5','2',' ');
                     p_es->i_cat = AUDIO_ES;
-                    strcpy( p_es->psz_desc, DecodeLanguage( hton16(
-                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ) )
+                    strcpy( p_es->psz_desc, DecodeLanguage(
+                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ); 
                     strcat( p_es->psz_desc, " (ac3)" );
 
                     break;
@@ -684,11 +660,10 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
                     i_id = 0xc0 + i_position;
                     p_es = input_AddES( p_input, NULL, i_id, 0 );
                     p_es->i_stream_id = i_id;
-                    p_es->i_type = MPEG2_AUDIO_ES;
-                    p_es->b_audio = 1;
+                    p_es->i_fourcc = VLC_FOURCC('m','p','g','a');
                     p_es->i_cat = AUDIO_ES;
-                    strcpy( p_es->psz_desc, DecodeLanguage( hton16(
-                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ) )
+                    strcpy( p_es->psz_desc, DecodeLanguage(
+                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ); 
                     strcat( p_es->psz_desc, " (mpeg)" );
 
                     break;
@@ -697,23 +672,22 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
                     i_id = ( ( 0xa0 + i_position ) << 8 ) | 0xbd;
                     p_es = input_AddES( p_input, NULL, i_id, 0 );
                     p_es->i_stream_id = i_id;
-                    p_es->i_type = LPCM_AUDIO_ES;
-                    p_es->b_audio = 1;
+                    p_es->i_fourcc = VLC_FOURCC('l','p','c','m');
                     p_es->i_cat = AUDIO_ES;
-                    strcpy( p_es->psz_desc, DecodeLanguage( hton16(
-                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ) )
+                    strcpy( p_es->psz_desc, DecodeLanguage(
+                        p_vts->vtsi_mat->vts_audio_attr[i-1].lang_code ) ); 
                     strcat( p_es->psz_desc, " (lpcm)" );
 
                     break;
                 case 0x06:              /* DTS */
                     i_id = ( ( 0x88 + i_position ) << 8 ) | 0xbd;
-                    intf_ErrMsg( "dvd warning: DTS audio not handled yet"
-                                 "(0x%x)", i_id );
+                    msg_Err( p_input, "DTS audio not handled yet"
+                                      "(0x%x)", i_id );
                     break;
                 default:
                     i_id = 0;
-                    intf_ErrMsg( "dvd warning: unknown audio type %.2x",
-                             p_vts->vtsi_mat->vts_audio_attr[i-1].audio_format );
+                    msg_Err( p_input, "unknown audio type %.2x",
+                          p_vts->vtsi_mat->vts_audio_attr[i-1].audio_format );
                 }
             }
         }
@@ -729,7 +703,7 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
             u16 i_id;
 
 //            IfoPrintSpu( p_dvd, i );
-            intf_WarnMsg( 12, "dvd spu %d 0x%02x", i, spu_control );
+            msg_Dbg( p_input, "spu %d 0x%02x", i, spu_control );
 
             if( spu_control & 0x80000000 )
             {
@@ -761,17 +735,17 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
                 i_id = ( ( 0x20 + i_position ) << 8 ) | 0xbd;
                 p_es = input_AddES( p_input, NULL, i_id, 0 );
                 p_es->i_stream_id = 0xbd;
-                p_es->i_type = DVD_SPU_ES;
+                p_es->i_fourcc = VLC_FOURCC('s','p','u',' ');
                 p_es->i_cat = SPU_ES;
-                strcpy( p_es->psz_desc, DecodeLanguage( hton16(
-                    p_vts->vtsi_mat->vts_subp_attr[i-1].lang_code ) ) )
+                strcpy( p_es->psz_desc, DecodeLanguage(
+                    p_vts->vtsi_mat->vts_subp_attr[i-1].lang_code ) ); 
             }
         }
 #undef spu_control
 
         /* FIXME: hack to check that the demuxer is ready, and set
          * the decoders */
-        if( p_input->p_demux_module )
+        if( p_input->p_demux )
         {
             DvdReadLauchDecoders( p_input );
         }
@@ -839,7 +813,7 @@ static int DvdReadRead( input_thread_t * p_input,
     int                     i_blocks;
     int                     i_read;
     int                     i_read_total;
-    boolean_t               b_eot = 0;
+    vlc_bool_t              b_eot = 0;
 
     p_dvd = (thread_dvd_data_t *)p_input->p_access_data;
     p_buf = p_buffer;
@@ -864,8 +838,8 @@ static int DvdReadRead( input_thread_t * p_input,
             if( ( i_read = DVDReadBlocks( p_dvd->p_title, p_dvd->i_next_vobu,
                            1, p_buf ) ) != 1 )
             {
-                intf_ErrMsg( "dvdread error: read failed for block %d",
-                             p_dvd->i_next_vobu );
+                msg_Err( p_input, "read failed for block %d",
+                                  p_dvd->i_next_vobu );
                 return -1;
             }
 
@@ -908,8 +882,8 @@ static int DvdReadRead( input_thread_t * p_input,
                                 i_blocks_once, p_buf );
         if( i_read != i_blocks_once )
         {
-            intf_ErrMsg( "dvdread error: read failed for %d/%d blocks at 0x%02x",
-                         i_read, i_blocks_once, p_dvd->i_cur_block );
+            msg_Err( p_input, "read failed for %d/%d blocks at 0x%02x",
+                              i_read, i_blocks_once, p_dvd->i_cur_block );
             return -1;
         }
 
@@ -920,7 +894,7 @@ static int DvdReadRead( input_thread_t * p_input,
 
     }
 /*
-    intf_WarnMsg( 12, "dvdread i_blocks: %d len: %d current: 0x%02x", i_read, p_dvd->i_pack_len, p_dvd->i_cur_block );
+    msg_Dbg( p_input, "i_blocks: %d len: %d current: 0x%02x", i_read, p_dvd->i_pack_len, p_dvd->i_cur_block );
 */
 
     vlc_mutex_lock( &p_input->stream.stream_lock );
@@ -949,7 +923,7 @@ static int DvdReadRead( input_thread_t * p_input,
         }
 
         /* EOT */
-        intf_WarnMsg( 4, "dvd info: new title" );
+        msg_Dbg( p_input, "new title" );
         DvdReadSetArea( p_input, p_input->stream.pp_areas[
                         p_input->stream.p_selected_area->i_id+1] );
         vlc_mutex_unlock( &p_input->stream.stream_lock );
@@ -1024,7 +998,7 @@ static void DvdReadSeek( input_thread_t * p_input, off_t i_off )
     }
 
 /*
-    intf_WarnMsg(12, "cell %d i_sub_cell %d chapter %d vobu %d cell_sector %d vobu_sector %d sub_cell_sector %d",
+    msg_Dbg( p_input, "cell %d i_sub_cell %d chapter %d vobu %d cell_sector %d vobu_sector %d sub_cell_sector %d",
             i_cell, i_sub_cell,i_chapter, i_vobu,
             p_dvd->p_cur_pgc->cell_playback[i_cell].first_sector,
             p_dvd->p_vts_file->vts_vobu_admap->vobu_start_sectors[i_vobu],
@@ -1129,23 +1103,23 @@ static void DvdReadHandleDSI( thread_dvd_data_t * p_dvd, u8 * p_data )
     }
 
 #if 0
-    intf_WarnMsg( 12, "scr %d lbn 0x%02x vobu_ea %d vob_id %d c_id %d",
-            p_dvd->dsi_pack.dsi_gi.nv_pck_scr,
-            p_dvd->dsi_pack.dsi_gi.nv_pck_lbn,
-            p_dvd->dsi_pack.dsi_gi.vobu_ea,
-            p_dvd->dsi_pack.dsi_gi.vobu_vob_idn,
-            p_dvd->dsi_pack.dsi_gi.vobu_c_idn );
-
-    intf_WarnMsg( 12, "cat 0x%02x ilvu_ea %d ilvu_sa %d size %d", 
-            p_dvd->dsi_pack.sml_pbi.category,
-            p_dvd->dsi_pack.sml_pbi.ilvu_ea,
-            p_dvd->dsi_pack.sml_pbi.ilvu_sa,
-            p_dvd->dsi_pack.sml_pbi.size );
-
-    intf_WarnMsg( 12, "next_vobu %d next_ilvu1 %d next_ilvu2 %d",
-            p_dvd->dsi_pack.vobu_sri.next_vobu & 0x7fffffff,
-            p_dvd->dsi_pack.sml_agli.data[ p_dvd->i_angle - 1 ].address,
-            p_dvd->dsi_pack.sml_agli.data[ p_dvd->i_angle ].address);
+    msg_Dbg( p_input, 12, "scr %d lbn 0x%02x vobu_ea %d vob_id %d c_id %d",
+             p_dvd->dsi_pack.dsi_gi.nv_pck_scr,
+             p_dvd->dsi_pack.dsi_gi.nv_pck_lbn,
+             p_dvd->dsi_pack.dsi_gi.vobu_ea,
+             p_dvd->dsi_pack.dsi_gi.vobu_vob_idn,
+             p_dvd->dsi_pack.dsi_gi.vobu_c_idn );
+
+    msg_Dbg( p_input, 12, "cat 0x%02x ilvu_ea %d ilvu_sa %d size %d", 
+             p_dvd->dsi_pack.sml_pbi.category,
+             p_dvd->dsi_pack.sml_pbi.ilvu_ea,
+             p_dvd->dsi_pack.sml_pbi.ilvu_sa,
+             p_dvd->dsi_pack.sml_pbi.size );
+
+    msg_Dbg( p_input, 12, "next_vobu %d next_ilvu1 %d next_ilvu2 %d",
+             p_dvd->dsi_pack.vobu_sri.next_vobu & 0x7fffffff,
+             p_dvd->dsi_pack.sml_agli.data[ p_dvd->i_angle - 1 ].address,
+             p_dvd->dsi_pack.sml_agli.data[ p_dvd->i_angle ].address);
 #endif
 }
 
@@ -1200,34 +1174,34 @@ static void DvdReadLauchDecoders( input_thread_t * p_input )
     
     p_dvd = (thread_dvd_data_t*)(p_input->p_access_data);            
             
-    if( p_main->b_video )
+    if( config_GetInt( p_input, "video" ) )
     {
         input_SelectES( p_input, p_input->stream.pp_es[0] );
     }
 
-    if( p_main->b_audio )
+    if( config_GetInt( p_input, "audio" ) )
     {
         /* For audio: first one if none or a not existing one specified */
-        int i_audio = config_GetIntVariable( INPUT_CHANNEL_VAR );
+        int i_audio = config_GetInt( p_input, "audio-channel" );
         if( i_audio < 0 /*|| i_audio > i_audio_nb*/ )
         {
-            config_PutIntVariable( INPUT_CHANNEL_VAR, 1 );
+            config_PutInt( p_input, "audio-channel", 1 );
             i_audio = 1;
         }
         if( i_audio > 0/* && i_audio_nb > 0*/ )
         {
-            if( config_GetIntVariable( AOUT_SPDIF_VAR ) ||
-                ( config_GetIntVariable( INPUT_AUDIO_VAR ) ==
-                  REQUESTED_AC3 ) )
+            if( config_GetInt( p_input, "audio-type" )
+                 == REQUESTED_AC3 )
             {
                 int     i_ac3 = i_audio;
-                while( ( p_input->stream.pp_es[i_ac3]->i_type !=
-                       AC3_AUDIO_ES ) && ( i_ac3 <=
+                while( ( p_input->stream.pp_es[i_ac3]->i_fourcc !=
+                       VLC_FOURCC('a','5','2',' ') ) && ( i_ac3 <=
                        p_dvd->p_vts_file->vtsi_mat->nr_of_vts_audio_streams ) )
                 {
                     i_ac3++;
                 }
-                if( p_input->stream.pp_es[i_ac3]->i_type == AC3_AUDIO_ES )
+                if( p_input->stream.pp_es[i_ac3]->i_fourcc
+                     == VLC_FOURCC('a','5','2',' ') )
                 {
                     input_SelectES( p_input,
                                     p_input->stream.pp_es[i_ac3] );
@@ -1241,13 +1215,13 @@ static void DvdReadLauchDecoders( input_thread_t * p_input )
         }
     }
 
-    if( p_main->b_video )
+    if( config_GetInt( p_input, "video" ) )
     {
         /* for spu, default is none */
-        int i_spu = config_GetIntVariable( INPUT_SUBTITLE_VAR );
+        int i_spu = config_GetInt( p_input, "spu-channel" );
         if( i_spu < 0 /*|| i_spu > i_spu_nb*/ )
         {
-            config_PutIntVariable( INPUT_SUBTITLE_VAR, 0 );
+            config_PutInt( p_input, "spu-channel", 0 );
             i_spu = 0;
         }
         if( i_spu > 0 /*&& i_spu_nb > 0*/ )