#include <sys/types.h>
-#ifdef HAVE_DVDREAD_DVD_READER_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>
-#else
- #include <libdvdread/dvd_reader.h>
- #include <libdvdread/ifo_types.h>
- #include <libdvdread/ifo_read.h>
- #include <libdvdread/nav_read.h>
- #include <libdvdread/nav_print.h>
-#endif
+#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 <assert.h>
set_description( N_("DVDRead Input (no menu support)") )
set_category( CAT_INPUT )
set_subcategory( SUBCAT_INPUT_ACCESS )
- add_integer( "dvdread-angle", 1, NULL, ANGLE_TEXT,
+ add_integer( "dvdread-angle", 1, ANGLE_TEXT,
ANGLE_LONGTEXT, false )
- add_integer( "dvdread-caching", DEFAULT_PTS_DELAY / 1000, NULL,
+ add_integer( "dvdread-caching", DEFAULT_PTS_DELAY / 1000,
CACHING_TEXT, CACHING_LONGTEXT, true )
add_obsolete_string( "dvdread-css-method" ) /* obsolete since 1.1.0 */
set_capability( "access_demux", 0 )
- add_shortcut( "dvd" )
- add_shortcut( "dvdread" )
- add_shortcut( "dvdsimple" )
+ add_shortcut( "dvd", "dvdread", "dvdsimple" )
set_callbacks( Open, Close )
vlc_module_end ()
static int Control ( demux_t *, int, va_list );
static int Demux ( demux_t * );
-static int DemuxBlock( demux_t *, uint8_t *, int );
+static int DemuxBlock( demux_t *, const uint8_t *, int );
static void DemuxTitles( demux_t *, int * );
static void ESNew( demux_t *, int, int );
{
demux_t *p_demux = (demux_t*)p_this;
demux_sys_t *p_sys;
- char *psz_name;
- dvd_reader_t *p_dvdread;
+ char *psz_file;
ifo_handle_t *p_vmg_file;
- if( !p_demux->psz_path || !*p_demux->psz_path )
+ if( !p_demux->psz_file || !*p_demux->psz_file )
{
/* Only when selected */
if( !p_demux->psz_access || !*p_demux->psz_access )
return VLC_EGENERIC;
- psz_name = var_CreateGetString( p_this, "dvd" );
- if( !psz_name )
- {
- psz_name = strdup("");
- }
+ psz_file = var_InheritString( p_this, "dvd" );
}
else
- psz_name = ToLocaleDup( p_demux->psz_path );
+ psz_file = strdup( p_demux->psz_file );
-#ifdef WIN32
- if( psz_name[0] && psz_name[1] == ':' &&
- psz_name[2] == '\\' && psz_name[3] == '\0' ) psz_name[2] = '\0';
+#if defined( WIN32 ) || defined( __OS2__ )
+ if( psz_file != NULL )
+ {
+ size_t flen = strlen( psz_file );
+ if( flen > 0 && psz_file[flen - 1] == '\\' )
+ psz_file[flen - 1] = '\0';
+ }
+ else
+ psz_file = strdup("");
#endif
+ if( unlikely(psz_file == NULL) )
+ return VLC_EGENERIC;
/* Open dvdread */
- if( !(p_dvdread = DVDOpen( psz_name )) )
+ const char *psz_path = ToLocale( psz_file );
+ dvd_reader_t *p_dvdread = DVDOpen( psz_path );
+
+ LocaleFree( psz_path );
+ if( p_dvdread == NULL )
{
- msg_Err( p_demux, "DVDRead cannot open source: %s", psz_name );
+ msg_Err( p_demux, "DVDRead cannot open source: %s", psz_file );
dialog_Fatal( p_demux, _("Playback failure"),
- _("DVDRead could not open the disc \"%s\"."), psz_name );
- free( psz_name );
+ _("DVDRead could not open the disc \"%s\"."), psz_file );
+ free( psz_file );
return VLC_EGENERIC;
}
- free( psz_name );
+ free( psz_file );
/* Ifo allocation & initialisation */
if( !( p_vmg_file = ifoOpen( p_dvdread, 0 ) ) )
}
}
+ /* Free the array of titles */
+ for( int i = 0; i < p_sys->i_titles; i++ )
+ vlc_input_title_Delete( p_sys->titles[i] );
+ TAB_CLEAN( p_sys->i_titles, p_sys->titles );
+
/* Close libdvdread */
if( p_sys->p_title ) DVDCloseFile( p_sys->p_title );
if( p_sys->p_vts_file ) ifoClose( p_sys->p_vts_file );
case DEMUX_GET_PTS_DELAY:
pi64 = (int64_t*)va_arg( args, int64_t * );
- *pi64 = (int64_t)var_GetInteger( p_demux, "dvdread-caching" )*1000;
+ *pi64 = var_GetInteger( p_demux, "dvdread-caching" )*1000;
return VLC_SUCCESS;
/* TODO implement others */
/*****************************************************************************
* DemuxBlock: demux a given block
*****************************************************************************/
-static int DemuxBlock( demux_t *p_demux, uint8_t *pkt, int i_pkt )
+static int DemuxBlock( demux_t *p_demux, const uint8_t *p, int len )
{
demux_sys_t *p_sys = p_demux->p_sys;
- uint8_t *p = pkt;
- while( p && p < &pkt[i_pkt] )
+ while( len > 0 )
{
- block_t *p_pkt;
- int i_size = &pkt[i_pkt] - p;
-
- if( i_size < 6 )
- break;
-
- i_size = ps_pkt_size( p, i_size );
- if( i_size <= 0 )
+ int i_size = ps_pkt_size( p, len );
+ if( i_size <= 0 || i_size > len )
{
break;
}
/* Create a block */
- p_pkt = block_New( p_demux, i_size );
+ block_t *p_pkt = block_New( p_demux, i_size );
memcpy( p_pkt->p_buffer, p, i_size);
/* Parse it and send it */
}
p += i_size;
+ len -= i_size;
}
return VLC_SUCCESS;