X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fvobsub.c;h=b285c81d7806c372ce34e8af1d6301a31bf94120;hb=bcddfd6382fb71b0021008eb63f1bc4a1b1bae0e;hp=9f4afc36ae14fc178e832f73782a3569499155ce;hpb=921de760d62c9ea94dae0d43528a957148aae17a;p=vlc diff --git a/modules/demux/vobsub.c b/modules/demux/vobsub.c index 9f4afc36ae..b285c81d78 100644 --- a/modules/demux/vobsub.c +++ b/modules/demux/vobsub.c @@ -25,13 +25,17 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + #include #include -#include -#include -#include "vlc_video.h" +#include +#include #include "ps.h" @@ -44,11 +48,11 @@ static int Open ( vlc_object_t *p_this ); static void Close( vlc_object_t *p_this ); vlc_module_begin(); - set_description( _("Vobsub subtitles demux") ); + set_description( _("Vobsub subtitles parser") ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_DEMUX ); set_capability( "demux2", 1 ); - + set_callbacks( Open, Close ); add_shortcut( "vobsub" ); @@ -79,7 +83,7 @@ typedef struct es_format_t fmt; es_out_id_t *p_es; int i_track_id; - + int i_current_subtitle; int i_subtitles; subtitle_t *p_subtitles; @@ -93,12 +97,12 @@ struct demux_sys_t int64_t i_length; text_t txt; - FILE *p_vobsub_file; - + stream_t *p_vobsub_stream; + /* all tracks */ int i_tracks; vobsub_track_t *track; - + int i_original_frame_width; int i_original_frame_height; vlc_bool_t b_palette; @@ -146,7 +150,7 @@ static int Open ( vlc_object_t *p_this ) p_demux->pf_control = Control; p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); p_sys->i_length = 0; - p_sys->p_vobsub_file = NULL; + p_sys->p_vobsub_stream = NULL; p_sys->i_tracks = 0; p_sys->track = (vobsub_track_t *)malloc( sizeof( vobsub_track_t ) ); p_sys->i_original_frame_width = -1; @@ -177,20 +181,21 @@ static int Open ( vlc_object_t *p_this ) } } - psz_vobname = strdup( p_demux->psz_path ); + asprintf( &psz_vobname, "%s://%s", p_demux->psz_access, p_demux->psz_path ); i_len = strlen( psz_vobname ); - memcpy( psz_vobname + i_len - 4, ".sub" ); + if( i_len >= 4 ) memcpy( psz_vobname + i_len - 4, ".sub", 4 ); /* open file */ - p_sys->p_vobsub_file = utf8_fopen( psz_vobname, "rb" ); - free( psz_vobname ); - if( p_sys->p_vobsub_file == NULL ) + p_sys->p_vobsub_stream = stream_UrlNew( p_demux, psz_vobname ); + if( p_sys->p_vobsub_stream == NULL ) { msg_Err( p_demux, "couldn't open .sub Vobsub file: %s", psz_vobname ); + free( psz_vobname ); free( p_sys ); return VLC_EGENERIC; } + free( psz_vobname ); return VLC_SUCCESS; } @@ -206,13 +211,12 @@ static void Close( vlc_object_t *p_this ) /* Clean all subs from all tracks */ for( i = 0; i < p_sys->i_tracks; i++ ) - { - if( p_sys->track[i].p_subtitles ) free( p_sys->track[i].p_subtitles ); - } - if( p_sys->track ) free( p_sys->track ); - - if( p_sys->p_vobsub_file ) - fclose( p_sys->p_vobsub_file ); + free( p_sys->track[i].p_subtitles ); + + free( p_sys->track ); + + if( p_sys->p_vobsub_stream ) + stream_Delete( p_sys->p_vobsub_stream ); free( p_sys ); } @@ -361,10 +365,10 @@ static int Demux( demux_t *p_demux ) if( i_size <= 0 ) i_size = 65535; /* Invalid or EOF */ /* Seek at the right place */ - if( fseek( p_sys->p_vobsub_file, i_pos, SEEK_SET ) ) + if( stream_Seek( p_sys->p_vobsub_stream, i_pos ) ) { msg_Warn( p_demux, - "cannot seek at right vobsub location %d", i_pos ); + "cannot seek in the VobSub to the correct time %d", i_pos ); tk.i_current_subtitle++; continue; } @@ -377,8 +381,7 @@ static int Demux( demux_t *p_demux ) } /* read data */ - p_block->i_buffer = fread( p_block->p_buffer, 1, i_size, - p_sys->p_vobsub_file ); + p_block->i_buffer = stream_Read( p_sys->p_vobsub_stream, p_block->p_buffer, i_size ); if( p_block->i_buffer <= 6 ) { block_Release( p_block ); @@ -431,7 +434,7 @@ static int TextLoad( text_t *txt, stream_t *s ) if( txt->i_line_count <= 0 ) { - if( txt->line ) free( txt->line ); + free( txt->line ); return VLC_EGENERIC; } @@ -442,10 +445,9 @@ static void TextUnload( text_t *txt ) int i; for( i = 0; i < txt->i_line_count; i++ ) - { - if( txt->line[i] ) free( txt->line[i] ); - } - if( txt->line ) free( txt->line ); + free( txt->line[i] ); + + free( txt->line ); txt->i_line = 0; txt->i_line_count = 0; } @@ -471,8 +473,8 @@ static int ParseVobSubIDX( demux_t *p_demux ) { return( VLC_EGENERIC ); } - - if( *line == 0 || *line == '\r' || *line == '\n' || *line == '#' ) + + if( *line == 0 || *line == '\r' || *line == '\n' || *line == '#' ) continue; else if( !strncmp( "size:", line, 5 ) ) { @@ -493,9 +495,9 @@ static int ParseVobSubIDX( demux_t *p_demux ) /* Store the palette of the subs */ if( sscanf( line, "palette: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x", - &p_sys->palette[0], &p_sys->palette[1], &p_sys->palette[2], &p_sys->palette[3], - &p_sys->palette[4], &p_sys->palette[5], &p_sys->palette[6], &p_sys->palette[7], - &p_sys->palette[8], &p_sys->palette[9], &p_sys->palette[10], &p_sys->palette[11], + &p_sys->palette[0], &p_sys->palette[1], &p_sys->palette[2], &p_sys->palette[3], + &p_sys->palette[4], &p_sys->palette[5], &p_sys->palette[6], &p_sys->palette[7], + &p_sys->palette[8], &p_sys->palette[9], &p_sys->palette[10], &p_sys->palette[11], &p_sys->palette[12], &p_sys->palette[13], &p_sys->palette[14], &p_sys->palette[15] ) == 16 ) { for( i = 0; i < 16; i++ ) @@ -545,7 +547,7 @@ static int ParseVobSubIDX( demux_t *p_demux ) current_tk->p_subtitles = (subtitle_t*)malloc( sizeof( subtitle_t ) );; current_tk->i_track_id = i_track_id; current_tk->i_delay = (int64_t)0; - + es_format_Init( &fmt, SPU_ES, VLC_FOURCC( 's','p','u',' ' ) ); fmt.subs.spu.i_original_frame_width = p_sys->i_original_frame_width; fmt.subs.spu.i_original_frame_height = p_sys->i_original_frame_height; @@ -573,7 +575,7 @@ static int ParseVobSubIDX( demux_t *p_demux ) int h, m, s, ms, count, loc = 0; int i_sign = 1; int64_t i_start, i_location = 0; - + vobsub_track_t *current_tk = &p_sys->track[p_sys->i_tracks - 1]; if( sscanf( line, "timestamp: %d%n:%d:%d:%d, filepos: %x", @@ -591,11 +593,11 @@ static int ParseVobSubIDX( demux_t *p_demux ) s * 1000 + ms ) * 1000; i_location = loc; - + current_tk->i_subtitles++; current_tk->p_subtitles = (subtitle_t*)realloc( current_tk->p_subtitles, sizeof( subtitle_t ) * (current_tk->i_subtitles + 1 ) ); current_sub = ¤t_tk->p_subtitles[current_tk->i_subtitles - 1]; - + current_sub->i_start = (int64_t) i_start * i_sign; current_sub->i_start += current_tk->i_delay; current_sub->i_vobsub_location = i_location; @@ -626,7 +628,9 @@ static int ParseVobSubIDX( demux_t *p_demux ) ms ) * 1000; current_tk->i_delay = current_tk->i_delay + (i_gap * i_sign); - msg_Dbg( p_demux, "sign: %+d gap: %+lld global delay: %+lld", i_sign, i_gap, current_tk->i_delay ); + msg_Dbg( p_demux, "sign: %+d gap: %+lld global delay: %+lld", + i_sign, (long long)i_gap, + (long long)current_tk->i_delay ); } } } @@ -684,7 +688,7 @@ static int DemuxVobSub( demux_t *p_demux, block_t *p_bk ) #define tk p_sys->track[i] p_pkt->i_dts = p_pkt->i_pts = p_bk->i_pts; p_pkt->i_length = 0; - + if( tk.p_es && tk.i_track_id == i_spu ) { es_out_Send( p_demux->out, tk.p_es, p_pkt );