X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fvobsub.c;h=5de351383745e349b9c167bfc03823a53bd88420;hb=9cc6af385502109b03f69c282e935cbde4081756;hp=f8283db8d7854bc2c67f6f6aba3566274bf7b6cd;hpb=a9d0016e1b6a110b4b84006a78c669705459410b;p=vlc diff --git a/modules/demux/vobsub.c b/modules/demux/vobsub.c index f8283db8d7..5de3513837 100644 --- a/modules/demux/vobsub.c +++ b/modules/demux/vobsub.c @@ -1,47 +1,44 @@ /***************************************************************************** - * subtitle.c: Demux vobsub files. + * vobsub.c: Demux vobsub files. ***************************************************************************** - * Copyright (C) 1999-2004 the VideoLAN team + * Copyright (C) 1999-2004 VLC authors and VideoLAN * $Id$ * * Authors: Laurent Aimar * Derk-Jan Hartman * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ + #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include -#include - -#include #include +#include +#include #include #include "ps.h" #include "vobsub.h" -#define MAX_LINE 8192 - /***************************************************************************** * Module descriptor *****************************************************************************/ @@ -69,8 +66,6 @@ typedef struct int i_line; char **line; } text_t; -static int TextLoad( text_t *, stream_t *s ); -static void TextUnload( text_t * ); typedef struct { @@ -80,7 +75,6 @@ typedef struct typedef struct { - es_format_t fmt; es_out_id_t *p_es; int i_track_id; @@ -93,25 +87,28 @@ typedef struct struct demux_sys_t { - int64_t i_next_demux_date; - int64_t i_length; + int64_t i_next_demux_date; + int64_t i_length; - text_t txt; - stream_t *p_vobsub_stream; + text_t txt; + stream_t *p_vobsub_stream; /* all tracks */ int i_tracks; vobsub_track_t *track; - int i_original_frame_width; - int i_original_frame_height; - bool b_palette; - uint32_t palette[16]; + int i_original_frame_width; + int i_original_frame_height; + bool b_palette; + uint32_t palette[16]; }; + static int Demux( demux_t * ); static int Control( demux_t *, int, va_list ); +static int TextLoad( text_t *, stream_t *s ); +static void TextUnload( text_t * ); static int ParseVobSubIDX( demux_t * ); static int DemuxVobSub( demux_t *, block_t *); @@ -138,7 +135,6 @@ static int Open ( vlc_object_t *p_this ) return VLC_EGENERIC; } free( s ); - } else { @@ -146,20 +142,17 @@ static int Open ( vlc_object_t *p_this ) return VLC_EGENERIC; } - p_demux->pf_demux = Demux; - p_demux->pf_control = Control; + /* */ p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); if( unlikely( !p_sys ) ) return VLC_ENOMEM; + p_sys->i_length = 0; p_sys->p_vobsub_stream = NULL; p_sys->i_tracks = 0; p_sys->track = malloc( sizeof( vobsub_track_t ) ); if( unlikely( !p_sys->track ) ) - { - free( p_sys ); - return VLC_ENOMEM; - } + goto error; p_sys->i_original_frame_width = -1; p_sys->i_original_frame_height = -1; p_sys->b_palette = false; @@ -177,8 +170,7 @@ static int Open ( vlc_object_t *p_this ) /* Find the total length of the vobsubs */ if( p_sys->i_tracks > 0 ) { - int i; - for( i = 0; i < p_sys->i_tracks; i++ ) + for( int i = 0; i < p_sys->i_tracks; i++ ) { if( p_sys->track[i].i_subtitles > 1 ) { @@ -188,11 +180,9 @@ static int Open ( vlc_object_t *p_this ) } } - if( asprintf( &psz_vobname, "%s://%s", p_demux->psz_access, p_demux->psz_path ) == -1 ) - { - free( p_sys ); - return VLC_EGENERIC; - } + if( asprintf( &psz_vobname, "%s://%s", p_demux->psz_access, p_demux->psz_location ) == -1 ) + goto error; + i_len = strlen( psz_vobname ); if( i_len >= 4 ) memcpy( psz_vobname + i_len - 4, ".sub", 4 ); @@ -203,12 +193,23 @@ static int Open ( vlc_object_t *p_this ) msg_Err( p_demux, "couldn't open .sub Vobsub file: %s", psz_vobname ); free( psz_vobname ); - free( p_sys ); - return VLC_EGENERIC; + goto error; } free( psz_vobname ); + p_demux->pf_demux = Demux; + p_demux->pf_control = Control; + return VLC_SUCCESS; + +error: + /* Clean all subs from all tracks */ + for( int i = 0; i < p_sys->i_tracks; i++ ) + free( p_sys->track[i].p_subtitles ); + free( p_sys->track ); + free( p_sys ); + + return VLC_EGENERIC; } /***************************************************************************** @@ -216,19 +217,16 @@ static int Open ( vlc_object_t *p_this ) *****************************************************************************/ static void Close( vlc_object_t *p_this ) { - int i; demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; - /* Clean all subs from all tracks */ - for( i = 0; i < p_sys->i_tracks; i++ ) - free( p_sys->track[i].p_subtitles ); - - free( p_sys->track ); - if( p_sys->p_vobsub_stream ) stream_Delete( p_sys->p_vobsub_stream ); + /* Clean all subs from all tracks */ + for( int i = 0; i < p_sys->i_tracks; i++ ) + free( p_sys->track[i].p_subtitles ); + free( p_sys->track ); free( p_sys ); } @@ -328,6 +326,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) p_sys->i_next_demux_date = (int64_t)va_arg( args, int64_t ); return VLC_SUCCESS; + case DEMUX_GET_PTS_DELAY: case DEMUX_GET_FPS: case DEMUX_GET_META: case DEMUX_GET_TITLE_INFO: @@ -349,9 +348,9 @@ static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; int64_t i_maxdate; - int i, i_read; + int i_read; - for( i = 0; i < p_sys->i_tracks; i++ ) + for( int i = 0; i < p_sys->i_tracks; i++ ) { #define tk p_sys->track[i] if( tk.i_current_subtitle >= tk.i_subtitles ) @@ -388,7 +387,7 @@ static int Demux( demux_t *p_demux ) } /* allocate a packet */ - if( ( p_block = block_New( p_demux, i_size ) ) == NULL ) + if( ( p_block = block_Alloc( i_size ) ) == NULL ) { tk.i_current_subtitle++; continue; @@ -433,7 +432,10 @@ static int TextLoad( text_t *txt, stream_t *s ) char **ppsz_new; if( psz == NULL || (n >= INT_MAX/sizeof(char *)) ) + { + free( psz ); break; + } ppsz_new = realloc( lines, (n + 1) * sizeof (char *) ); if( ppsz_new == NULL ) @@ -454,12 +456,10 @@ static int TextLoad( text_t *txt, stream_t *s ) static void TextUnload( text_t *txt ) { - int i; - - for( i = 0; i < txt->i_line_count; i++ ) + for( int i = 0; i < txt->i_line_count; i++ ) free( txt->line[i] ); - free( txt->line ); + txt->i_line = 0; txt->i_line_count = 0; } @@ -517,45 +517,48 @@ static int ParseVobSubIDX( demux_t *p_demux ) } else if( !strncmp( "id:", line, 3 ) ) { - char language[3]; + char language[33]; /* Usually 2 or 3 letters, sometimes more. + Spec (or lack of) doesn't define any limit */ int i_track_id; es_format_t fmt; /* Lets start a new track */ - if( sscanf( line, "id: %2s, index: %d", - language, &i_track_id ) == 2 ) + if( sscanf( line, "id: %32[^ ,], index: %d", + language, &i_track_id ) != 2 ) { - p_sys->i_tracks++; - p_sys->track = xrealloc( p_sys->track, - sizeof( vobsub_track_t ) * (p_sys->i_tracks + 1 ) ); - language[2] = '\0'; - - /* Init the track */ - current_tk = &p_sys->track[p_sys->i_tracks - 1]; - memset( current_tk, 0, sizeof( vobsub_track_t ) ); - current_tk->i_current_subtitle = 0; - current_tk->i_subtitles = 0; - current_tk->p_subtitles = xmalloc( 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_CODEC_SPU ); - 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; - fmt.psz_language = language; - if( p_sys->b_palette ) + if( sscanf( line, "id: , index: %d", &i_track_id ) != 1 ) { - fmt.subs.spu.palette[0] = 0xBeef; - memcpy( &fmt.subs.spu.palette[1], p_sys->palette, 16 * sizeof( uint32_t ) ); + msg_Warn( p_demux, "reading new track failed" ); + continue; } - - current_tk->p_es = es_out_Add( p_demux->out, &fmt ); - msg_Dbg( p_demux, "new vobsub track detected" ); + language[0] = '\0'; } - else + + p_sys->i_tracks++; + p_sys->track = xrealloc( p_sys->track, + sizeof( vobsub_track_t ) * (p_sys->i_tracks + 1 ) ); + + /* Init the track */ + current_tk = &p_sys->track[p_sys->i_tracks - 1]; + memset( current_tk, 0, sizeof( vobsub_track_t ) ); + current_tk->i_current_subtitle = 0; + current_tk->i_subtitles = 0; + current_tk->p_subtitles = xmalloc( 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_CODEC_SPU ); + 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; + fmt.psz_language = language; + if( p_sys->b_palette ) { - msg_Warn( p_demux, "reading new track failed" ); + fmt.subs.spu.palette[0] = 0xBeef; + memcpy( &fmt.subs.spu.palette[1], p_sys->palette, 16 * sizeof( uint32_t ) ); } + + current_tk->p_es = es_out_Add( p_demux->out, &fmt ); + msg_Dbg( p_demux, "new vobsub track detected" ); } else if( !strncmp( line, "timestamp:", 10 ) ) { @@ -674,7 +677,9 @@ static int DemuxVobSub( demux_t *p_demux, block_t *p_bk ) } /* Create a block */ - p_pkt = block_New( p_demux, i_size ); + p_pkt = block_Alloc( i_size ); + if( unlikely(p_pkt == NULL) ) + break; memcpy( p_pkt->p_buffer, p, i_size); p += i_size;