X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fdvdread.c;h=f34ad43e2b243ecdb40fe70515340d8d1a8eacc9;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=4347d7bf9fca9a1a6c22b783cbce34c810a16bed;hpb=2cb472dba008f7d877ffe6bae9c5575253365282;p=vlc diff --git a/modules/access/dvdread.c b/modules/access/dvdread.c index 4347d7bf9f..f34ad43e2b 100644 --- a/modules/access/dvdread.c +++ b/modules/access/dvdread.c @@ -1,10 +1,10 @@ /***************************************************************************** * dvdread.c : DvdRead input module for vlc ***************************************************************************** - * Copyright (C) 2001-2004 the VideoLAN team + * Copyright (C) 2001-2006 the VideoLAN team * $Id$ * - * Authors: St�hane Borel + * Authors: Stéphane Borel * Gildas Bazin * * This program is free software; you can redistribute it and/or modify @@ -25,12 +25,12 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include /* malloc(), free() */ -#include /* strdup() */ #include -#include +#include +#include + +#include #include "iso_lang.h" @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -56,12 +55,12 @@ *****************************************************************************/ #define ANGLE_TEXT N_("DVD angle") #define ANGLE_LONGTEXT N_( \ - "Allows you to select the default DVD angle." ) + "Default DVD angle." ) #define CACHING_TEXT N_("Caching value in ms") #define CACHING_LONGTEXT N_( \ - "Allows you to modify the default caching value for DVDread streams. " \ - "This value should be set in millisecond units." ) + "Caching value for DVDs. " \ + "This value should be set in milliseconds." ) #define CSSMETHOD_TEXT N_("Method used by libdvdcss for decryption") #define CSSMETHOD_LONGTEXT N_( \ @@ -80,8 +79,8 @@ "libcss.\n" \ "The default method is: key.") -static char *psz_css_list[] = { "title", "disc", "key" }; -static char *psz_css_list_text[] = { N_("title"), N_("Disc"), N_("Key") }; +static const char *psz_css_list[] = { "title", "disc", "key" }; +static const char *psz_css_list_text[] = { N_("title"), N_("Disc"), N_("Key") }; static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); @@ -232,6 +231,8 @@ static int Open( vlc_object_t *p_this ) if( !(p_dvdread = DVDOpen( psz_name )) ) { msg_Err( p_demux, "DVDRead cannot open source: %s", psz_name ); + intf_UserFatal( p_demux, VLC_FALSE, _("Playback failure"), + _("DVDRead could not open disk \"%s\"."), psz_name ); free( psz_name ); return VLC_EGENERIC; } @@ -246,10 +247,7 @@ static int Open( vlc_object_t *p_this ) msg_Dbg( p_demux, "VMG opened" ); /* Fill p_demux field */ - p_demux->pf_demux = Demux; - p_demux->pf_control = Control; - p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); - memset( p_sys, 0, sizeof( demux_sys_t ) ); + STANDARD_DEMUX_INIT; p_sys = p_demux->p_sys; ps_track_init( p_sys->tk ); p_sys->i_aspect = -1; @@ -327,7 +325,7 @@ static int64_t dvdtime_to_time( dvd_time_t *dtime, uint8_t still_time ) i_micro_second += (int64_t)(BCD2D(dtime->minute)) * 60 * 1000000; i_micro_second += (int64_t)(BCD2D(dtime->second)) * 1000000; - switch((dtime->frame_u & 0xc0) >> 6) + switch((dtime->frame_u & 0xc0) >> 6) { case 1: f_fps = 25.0; @@ -387,10 +385,10 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) } case DEMUX_GET_TIME: pi64 = (int64_t*)va_arg( args, int64_t * ); - if( p_sys->i_mux_rate > 0 ) + if( p_demux->info.i_title >= 0 && p_demux->info.i_title < p_sys->i_titles ) { - *pi64 = (int64_t)1000000 * DVD_VIDEO_LB_LEN * - p_sys->i_title_offset / 50 / p_sys->i_mux_rate; + *pi64 = (int64_t) dvdtime_to_time( &p_sys->p_cur_pgc->playback_time, 0 ) / + p_sys->i_title_blocks * p_sys->i_title_offset; return VLC_SUCCESS; } *pi64 = 0; @@ -398,10 +396,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_LENGTH: pi64 = (int64_t*)va_arg( args, int64_t * ); - if( p_sys->i_mux_rate > 0 ) + if( p_demux->info.i_title >= 0 && p_demux->info.i_title < p_sys->i_titles ) { - *pi64 = (int64_t)1000000 * DVD_VIDEO_LB_LEN * - p_sys->i_title_blocks / 50 / p_sys->i_mux_rate; + *pi64 = (int64_t)dvdtime_to_time( &p_sys->p_cur_pgc->playback_time, 0 ); return VLC_SUCCESS; } *pi64 = 0; @@ -493,6 +490,9 @@ static int Demux( demux_t *p_demux ) 1, p_buffer ) != 1 ) { msg_Err( p_demux, "read failed for block %d", p_sys->i_next_vobu ); + intf_UserWarn( p_demux, _("Playback failure"), + _("DVDRead could not read block %d."), + p_sys->i_next_vobu ); return -1; } @@ -552,6 +552,9 @@ static int Demux( demux_t *p_demux ) { msg_Err( p_demux, "read failed for %d/%d blocks at 0x%02x", i_read, i_blocks_once, p_sys->i_cur_block ); + intf_UserFatal( p_demux, VLC_FALSE, _("Playback failure"), + _("DVDRead could not read %d/%d blocks at 0x%02x."), + i_read, i_blocks_once, p_sys->i_cur_block ); return -1; } @@ -1219,7 +1222,7 @@ static void DvdReadHandleDSI( demux_t *p_demux, uint8_t *p_data ) p_sys->dsi_pack.dsi_gi.vobu_c_idn, dvdtime_to_time( &p_sys->dsi_pack.dsi_gi.c_eltm, 0 ) ); - msg_Dbg( p_demux, "cell duration: %lld", + msg_Dbg( p_demux, "cell duration: %lld", (mtime_t)dvdtime_to_time( &p_sys->p_cur_pgc->cell_playback[p_sys->i_cur_cell].playback_time, 0 ) ); msg_Dbg( p_demux, "cat 0x%02x ilvu_ea %d ilvu_sa %d size %d",