]> 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 08e2f520584b55eaddd64d520445c05a18ea8785..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.25 2002/03/04 01:53:56 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 )
 {
-    if( strncmp( p_input->p_access_module->psz_name, "dvdread", 7 ) )
+    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 );
@@ -145,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
  *****************************************************************************/
@@ -232,23 +200,35 @@ 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 )
 {
-    char *                  psz_parser = p_input->psz_name;
-    char *                  psz_source = p_input->psz_name;
+    input_thread_t *        p_input = (input_thread_t *)p_this;
+    char *                  psz_orig;
+    char *                  psz_parser;
+    char *                  psz_source;
     char *                  psz_next;
     struct stat             stat_info;
     thread_dvd_data_t *     p_dvd;
     dvd_reader_t *          p_dvdread;
     input_area_t *          p_area;
-    boolean_t               b_need_free = 0;
     int                     i_title = 1;
     int                     i_chapter = 1;
     int                     i_angle = 1;
     int                     i;
 
+    psz_orig = psz_parser = psz_source = strdup( p_input->psz_name );
+    if( !psz_orig )
+    {
+        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++;
@@ -278,39 +258,42 @@ static int DvdReadOpen( struct input_thread_s *p_input )
 
     if( !*psz_source )
     {
-        psz_source = config_GetPszVariable( INPUT_DVD_DEVICE_VAR );
-        b_need_free = 1;
+        if( !p_input->psz_access )
+        {
+            free( psz_orig );
+            return -1;
+        }
+        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 );
 
-    if( b_need_free )
-    {
+    /* free allocated strings */
+    if( psz_source != psz_orig )
         free( psz_source );
-    }
+    free( psz_orig );
 
     if( ! p_dvdread )
     {
-        intf_ErrMsg( "dvdread error: libdvdcss can't open source" );
+        msg_Err( p_input, "libdvdcss cannot open source" );
         return -1;
     }
 
@@ -320,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;
     }
 
@@ -328,20 +311,17 @@ static int DvdReadOpen( struct input_thread_s *p_input )
     p_dvd->p_title = NULL;
     p_dvd->p_vts_file = NULL;
 
-    p_dvd->i_title = i_title;
-    p_dvd->i_chapter = i_chapter;
-    p_dvd->i_angle = i_angle;
 
     p_input->p_access_data = (void *)p_dvd;
 
     /* 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 );
@@ -362,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
@@ -384,18 +364,20 @@ static int DvdReadOpen( struct input_thread_s *p_input )
         area[i]->i_part_nb = tt_srpt->title[i-1].nr_of_ptts;
         area[i]->i_part = 1;
 
-        /* Number of angles */
-        area[i]->i_angle_nb = 0;
-        area[i]->i_angle = 1;
-
         area[i]->i_plugin_data = tt_srpt->title[i-1].title_set_nr;
     }
 #undef area
+
+    p_dvd->i_title = i_title <= tt_srpt->nr_of_srpts ? i_title : 1;
 #undef tt_srpt
 
-    p_input->stream.pp_areas[i_title]->i_part = i_chapter;
+    p_area = p_input->stream.pp_areas[p_dvd->i_title];
+    p_dvd->i_chapter = i_chapter;
 
-    p_area = p_input->stream.pp_areas[i_title];
+    p_dvd->i_chapter = i_chapter < p_area->i_part_nb ? i_chapter : 1;
+    p_area->i_part = p_dvd->i_chapter;
+    
+    p_dvd->i_angle = i_angle;
 
     /* set title, chapter, audio and subpic */
     if( DvdReadSetArea( p_input, p_area ) )
@@ -406,17 +388,18 @@ static int DvdReadOpen( struct input_thread_s *p_input )
 
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
+    p_input->psz_demux = "dvdread";
+
     return 0;
 }
 
 /*****************************************************************************
- * 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 );
@@ -435,6 +418,21 @@ static void DvdReadClose( struct input_thread_s *p_input )
 static int DvdReadSetProgram( input_thread_t * p_input,
                               pgrm_descriptor_t * p_program )
 {
+    if( p_input->stream.p_selected_program != p_program )
+    {
+        thread_dvd_data_t *  p_dvd;
+    
+        p_dvd = (thread_dvd_data_t*)(p_input->p_access_data);
+        p_dvd->i_angle = p_program->i_number;
+
+        memcpy( p_program, p_input->stream.p_selected_program,
+                sizeof(pgrm_descriptor_t) );
+        p_program->i_number = p_dvd->i_angle;
+        p_input->stream.p_selected_program = p_program;
+
+        msg_Dbg( p_input, "angle %d selected", p_dvd->i_angle );
+    }
+
     return 0;
 }
 
@@ -487,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 );
 
@@ -495,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;
@@ -515,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
@@ -526,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
@@ -554,14 +552,11 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
          */
         p_dvd->i_angle_nb = p_vmg->tt_srpt->title[p_area->i_id-1].nr_of_angles;
 
-        if( p_dvd->i_angle > p_area->i_angle_nb )
+        if( p_dvd->i_angle > p_dvd->i_angle_nb )
         {
             p_dvd->i_angle = 1;
         }
 
-        p_area->i_angle = p_dvd->i_angle;
-        p_area->i_angle_nb = p_dvd->i_angle_nb;
-
         /*
          * We've got enough info, time to open the title set data.
          */
@@ -569,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 );
@@ -588,21 +583,35 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
             /* We don't use input_EndStream here since
              * we keep area structures */
 
-            for( i = 0 ; i < p_input->stream.i_selected_es_number ; i++ )
+            while( p_input->stream.i_es_number )
             {
-                input_UnselectES( p_input, p_input->stream.pp_selected_es[i] );
+                input_DelES( p_input, p_input->stream.pp_es[0] );
             }
 
-            free( p_input->stream.pp_selected_es );
-            input_DelProgram( p_input, p_input->stream.p_selected_program );
+            while( p_input->stream.i_pgrm_number )
+            {
+                input_DelProgram( p_input, p_input->stream.pp_programs[0] );
+            }
 
-            p_input->stream.pp_selected_es = NULL;
+            if( p_input->stream.pp_selected_es )
+            {
+                free( p_input->stream.pp_selected_es );
+                p_input->stream.pp_selected_es = NULL;
+            }
             p_input->stream.i_selected_es_number = 0;
         }
 
-        input_AddProgram( p_input, 0, sizeof( stream_ps_data_t ) );
+        input_AddProgram( p_input, 1, sizeof( stream_ps_data_t ) );
         p_input->stream.p_selected_program = p_input->stream.pp_programs[0];
 
+        for( i = 1 ; i < p_dvd->i_angle_nb ; i++ )
+        {
+            input_AddProgram( p_input, i+1, 0 );
+        }
+        
+        DvdReadSetProgram( p_input,
+                           p_input->stream.pp_programs[p_dvd->i_angle-1] ); 
+
         /* No PSM to read in DVD mode, we already have all information */
         p_input->stream.p_selected_program->b_is_ok = 1;
 
@@ -611,9 +620,9 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
         /* ES 0 -> video MPEG2 */
 //        IfoPrintVideo( p_dvd );
 
-        p_es = input_AddES( p_input, p_input->stream.p_selected_program, 0xe0, 0 );
+        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 \
@@ -632,59 +641,53 @@ 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,
-                               p_input->stream.p_selected_program, i_id, 0 );
+                    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;
                 case 0x02:
                 case 0x03:              /* MPEG audio */
                     i_id = 0xc0 + i_position;
-                    p_es = input_AddES( p_input,
-                                    p_input->stream.p_selected_program, i_id, 0 );
+                    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;
                 case 0x04:              /* LPCM */
 
                     i_id = ( ( 0xa0 + i_position ) << 8 ) | 0xbd;
-                    p_es = input_AddES( p_input,
-                                    p_input->stream.p_selected_program, i_id, 0 );
+                    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 );
                 }
             }
         }
@@ -700,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 )
             {
@@ -730,20 +733,19 @@ 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,
-                                    p_input->stream.p_selected_program, i_id, 0 );
+                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 );
         }
@@ -787,12 +789,6 @@ static int DvdReadSetArea( input_thread_t * p_input, input_area_t * p_area )
 #undef p_vts
 #undef p_vmg
 
-    if( p_area->i_angle != p_dvd->i_angle )
-    {
-        p_dvd->i_angle = p_area->i_angle;
-
-        intf_WarnMsg( 3, "dvd info: angle %d selected", p_area->i_angle );
-    }
     /* warn interface that something has changed */
     p_area->i_tell = LB2OFF( p_dvd->i_next_vobu ) - p_area->i_start;
     p_input->stream.b_seekable = 1;
@@ -817,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;
@@ -842,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;
             }
 
@@ -886,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;
         }
 
@@ -898,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 );
@@ -927,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 );
@@ -1002,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],
@@ -1107,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
 }
 
@@ -1178,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] );
@@ -1219,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*/ )