X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmeta_engine%2Fid3tag.c;h=99a8b185e0f15949e2820bc6d0b1e09194f4946f;hb=6fc4d4a48328fa4a907334dd62cebe0e514736e2;hp=a51cdf9a8aa1acccd00f2fb3ba4b921d24361d19;hpb=1e9f026595c7e3f4aa15a6c6c66eea415643b064;p=vlc diff --git a/modules/meta_engine/id3tag.c b/modules/meta_engine/id3tag.c index a51cdf9a8a..99a8b185e0 100644 --- a/modules/meta_engine/id3tag.c +++ b/modules/meta_engine/id3tag.c @@ -57,7 +57,7 @@ vlc_module_end(); /***************************************************************************** * ParseID3Tag : parse an id3tag into the info structures *****************************************************************************/ -static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) +static void ParseID3Tag( demux_t *p_demux, const uint8_t *p_data, int i_size ) { struct id3_tag *p_id3_tag; struct id3_frame *p_frame; @@ -65,14 +65,13 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) vlc_meta_t *p_meta; int i; - TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); - p_demux_meta->p_meta = NULL; - p_id3_tag = id3_tag_parse( p_data, i_size ); if( !p_id3_tag ) return; - p_demux_meta->p_meta = p_meta = vlc_meta_New(); + if( !p_demux_meta->p_meta ) + p_demux_meta->p_meta = vlc_meta_New(); + p_meta = p_demux_meta->p_meta; #define ID_IS( a ) (!strcmp( p_frame->id, a )) #define DESCR_IS( a) strstr( (char*)p_frame->description, a ) @@ -263,12 +262,13 @@ static int GetAPEvXSize( const uint8_t *p_data, int i_data ) /* it is the footer */ return i_body + ( (flags&(1<<31)) ? APE_TAG_HEADERSIZE : 0 ); } -static void ParseAPEvXTag( demux_t *p_demux, uint8_t *p_data, int i_data ) +static void ParseAPEvXTag( demux_t *p_demux, const uint8_t *p_data, int i_data ) { - vlc_meta_t *p_meta = (vlc_meta_t *)p_demux->p_private; + demux_meta_t *p_demux_meta = (demux_meta_t*)p_demux->p_private; + vlc_meta_t *p_meta; vlc_bool_t b_start; vlc_bool_t b_end; - uint8_t *p_header = NULL; + const uint8_t *p_header = NULL; int i_entry; if( i_data < APE_TAG_HEADERSIZE ) @@ -279,6 +279,10 @@ static void ParseAPEvXTag( demux_t *p_demux, uint8_t *p_data, int i_data ) if( !b_end && !b_start ) return; + if( !p_demux_meta->p_meta ) + p_demux_meta->p_meta = vlc_meta_New(); + p_meta = p_demux_meta->p_meta; + if( b_start ) { p_header = &p_data[0]; @@ -297,9 +301,6 @@ static void ParseAPEvXTag( demux_t *p_demux, uint8_t *p_data, int i_data ) if( i_entry <= 0 ) return; - if( !p_meta ) - p_demux->p_private = p_meta = vlc_meta_New(); - while( i_entry > 0 && i_data >= 10 ) { const int i_size = GetDWLE( &p_data[0] ); @@ -371,8 +372,8 @@ static void CheckFooter( demux_t *p_demux ) { const int64_t i_pos = stream_Size( p_demux->s ); const int i_peek = 128+APE_TAG_HEADERSIZE; - uint8_t *p_peek; - uint8_t *p_peek_id3; + const uint8_t *p_peek; + const uint8_t *p_peek_id3; int64_t i_id3v2_pos = -1; int64_t i_apevx_pos = -1; int i_id3v2_size; @@ -446,7 +447,7 @@ static void CheckFooter( demux_t *p_demux ) } static void CheckHeader( demux_t *p_demux ) { - uint8_t *p_peek; + const uint8_t *p_peek; int i_size; if( stream_Seek( p_demux->s, 0 ) ) @@ -481,18 +482,21 @@ static void CheckHeader( demux_t *p_demux ) ****************************************************************************/ static int ParseTags( vlc_object_t *p_this ) { - demux_t *p_demux = (demux_t *)p_this; - vlc_bool_t b_seekable; - int64_t i_init; + demux_t *p_demux = (demux_t *)p_this; + demux_meta_t *p_demux_meta = (demux_meta_t*)p_demux->p_private; + vlc_bool_t b_seekable; + int64_t i_init; msg_Dbg( p_demux, "checking for ID3v1/2 and APEv1/2 tags" ); - stream_Control( p_demux->s, STREAM_CAN_FASTSEEK, &b_seekable ); if( !b_seekable ) - return VLC_SUCCESS; + return VLC_EGENERIC; i_init = stream_Tell( p_demux->s ); + TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); + p_demux_meta->p_meta = NULL; + /* */ CheckFooter( p_demux ); @@ -504,5 +508,8 @@ static int ParseTags( vlc_object_t *p_this ) * for them */ stream_Seek( p_demux->s, i_init ); + if( !p_demux_meta->p_meta && p_demux_meta->i_attachments <= 0 ) + return VLC_EGENERIC; return VLC_SUCCESS; } +