X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmeta_engine%2Fid3tag.c;h=64c304f393d188cb0759270d3b163524d4a7db0a;hb=20a67d037f191d01053af4753fe855beb4829141;hp=9699a2d64ca58fe567698712ae89aba55a9c85cc;hpb=81c5ac29fa2e80426c1b1dfcc941a1aabe8bc808;p=vlc diff --git a/modules/meta_engine/id3tag.c b/modules/meta_engine/id3tag.c index 9699a2d64c..64c304f393 100644 --- a/modules/meta_engine/id3tag.c +++ b/modules/meta_engine/id3tag.c @@ -26,12 +26,15 @@ *****************************************************************************/ #include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include -#include #include #include @@ -49,28 +52,29 @@ static int ParseTags ( vlc_object_t * ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_description( _("ID3v1/2 and APEv1/2 tags parser" ) ); - set_capability( "meta reader", 70 ); - set_callbacks( ParseTags, NULL ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("ID3v1/2 and APEv1/2 tags parser" ) ) + set_capability( "meta reader", 70 ) + set_callbacks( ParseTags, NULL ) +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_meta_t *p_demux_meta, const uint8_t *p_data, int i_size ) { struct id3_tag *p_id3_tag; struct id3_frame *p_frame; - vlc_meta_t *p_meta = (vlc_meta_t *)p_demux->p_private; + vlc_meta_t *p_meta; int i; p_id3_tag = id3_tag_parse( p_data, i_size ); if( !p_id3_tag ) return; - if( !p_meta ) - p_demux->p_private = 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 ) @@ -86,10 +90,7 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) id3_byte_t const * p_ufid; id3_length_t i_ufidlen; - p_ufid = (id3_byte_t const *) - id3_field_getbinarydata( - &p_frame->fields[1], - &i_ufidlen ); + p_ufid = id3_field_getbinarydata( &p_frame->fields[1], &i_ufidlen ); char *psz_ufid = strndup( p_ufid, i_ufidlen ); vlc_meta_SetTrackID( p_meta, psz_ufid ); @@ -130,7 +131,8 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) while( i_data >= 4 ) { const unsigned int i_peak_size = p_data[3]; - const float f_gain = (float)GetWBE( &p_data[1] ) / 512.0; + const float f_temp = GetWBE( &p_data[1] ); + const float f_gain = f_temp / 512.0; char psz_value[32]; if( i_data < i_peak_size + 4 ) @@ -155,8 +157,8 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) /* T--- Text informations */ for( i = 0; (p_frame = id3_tag_findframe( p_id3_tag, "T", i )) != NULL; i++ ) { - int i_strings; - + unsigned i_strings; + /* Special case TXXX is not the same beast */ if( ID_IS( "TXXX" ) ) continue; @@ -209,7 +211,7 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) } else if( DESCR_IS( "Track number/position in set" ) ) { - vlc_meta_SetTracknum( p_meta, psz_temp ); + vlc_meta_SetTrackNum( p_meta, psz_temp ); } else if( DESCR_IS( "Album/movie/show title" ) ) { @@ -221,7 +223,7 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) } else if( ID_IS ( "APIC" ) ) { - msg_Dbg( p_demux, "** Has APIC **" ); + msg_Dbg( p_demux_meta, "** Has APIC **" ); } else if( p_frame->description ) { @@ -240,10 +242,10 @@ static void ParseID3Tag( demux_t *p_demux, uint8_t *p_data, int i_size ) * APEv1/2 *****************************************************************************/ #define APE_TAG_HEADERSIZE (32) -static int GetAPEvXSize( const uint8_t *p_data, int i_data ) +static size_t GetAPEvXSize( const uint8_t *p_data, int i_data ) { uint32_t flags; - int i_body; + size_t i_body; if( i_data < APE_TAG_HEADERSIZE || ( GetDWLE( &p_data[8] ) != 1000 && GetDWLE( &p_data[8] ) != 2000 ) || /* v1/v2 only */ @@ -261,12 +263,12 @@ 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_meta_t *p_demux_meta, const uint8_t *p_data, int i_data ) { - vlc_meta_t *p_meta = (vlc_meta_t *)p_demux->p_private; - vlc_bool_t b_start; - vlc_bool_t b_end; - uint8_t *p_header = NULL; + vlc_meta_t *p_meta; + bool b_start; + bool b_end; + const uint8_t *p_header = NULL; int i_entry; if( i_data < APE_TAG_HEADERSIZE ) @@ -277,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]; @@ -295,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] ); @@ -337,7 +340,7 @@ static void ParseAPEvXTag( demux_t *p_demux, uint8_t *p_data, int i_data ) char *p = strchr( psz_value, '/' ); if( p ) *p++ = '\0'; - vlc_meta_SetTracknum( p_meta, psz_value ); + vlc_meta_SetTrackNum( p_meta, psz_value ); } else if( IS( "Comment" ) ) vlc_meta_SetDescription( p_meta, psz_value ); @@ -365,17 +368,18 @@ static void ParseAPEvXTag( demux_t *p_demux, uint8_t *p_data, int i_data ) * CheckFooter: check for ID3/APE at the end of the file * CheckHeader: check for ID3/APE at the begining of the file *****************************************************************************/ -static void CheckFooter( demux_t *p_demux ) +static void CheckFooter( demux_meta_t *p_demux_meta ) { + demux_t *p_demux = (demux_t *)p_demux_meta->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 size_t i_peek = 128+APE_TAG_HEADERSIZE; + 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; int i_apevx_size; - int i_id3v1_size; + size_t i_id3v1_size; if( i_pos < i_peek ) return; @@ -391,7 +395,7 @@ static void CheckFooter( demux_t *p_demux ) if( i_id3v1_size == 128 ) { msg_Dbg( p_demux, "found ID3v1 tag" ); - ParseID3Tag( p_demux, p_peek_id3, i_id3v1_size ); + ParseID3Tag( p_demux_meta, p_peek_id3, i_id3v1_size ); } /* Compute ID3v2 position */ @@ -427,7 +431,7 @@ static void CheckFooter( demux_t *p_demux ) stream_Peek( p_demux->s, &p_peek, i_id3v2_size ) == i_id3v2_size ) { msg_Dbg( p_demux, "found ID3v2 tag at end of file" ); - ParseID3Tag( p_demux, p_peek, i_id3v2_size ); + ParseID3Tag( p_demux_meta, p_peek, i_id3v2_size ); } } @@ -438,15 +442,17 @@ static void CheckFooter( demux_t *p_demux ) stream_Peek( p_demux->s, &p_peek, i_apevx_size ) == i_apevx_size ) { msg_Dbg( p_demux, "found APEvx tag at end of file" ); - ParseAPEvXTag( p_demux, p_peek, i_apevx_size ); + ParseAPEvXTag( p_demux_meta, p_peek, i_apevx_size ); } } } -static void CheckHeader( demux_t *p_demux ) +static void CheckHeader( demux_meta_t *p_demux_meta ) { - uint8_t *p_peek; + const uint8_t *p_peek; int i_size; + demux_t *p_demux = (demux_t *)p_demux_meta->p_demux; + if( stream_Seek( p_demux->s, 0 ) ) return; @@ -458,7 +464,7 @@ static void CheckHeader( demux_t *p_demux ) stream_Peek( p_demux->s, &p_peek, i_size ) == i_size ) { msg_Dbg( p_demux, "found ID3v2 tag" ); - ParseID3Tag( p_demux, p_peek, i_size ); + ParseID3Tag( p_demux_meta, p_peek, i_size ); return; } @@ -470,7 +476,7 @@ static void CheckHeader( demux_t *p_demux ) stream_Peek( p_demux->s, &p_peek, i_size ) == i_size ) { msg_Dbg( p_demux, "found APEv1/2 tag" ); - ParseAPEvXTag( p_demux, p_peek, i_size ); + ParseAPEvXTag( p_demux_meta, p_peek, i_size ); } } @@ -479,30 +485,34 @@ 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; - - p_demux->p_private = NULL; - - msg_Dbg( p_demux, "checking for ID3v1/2 and APEv1/2 tags" ); + demux_meta_t *p_demux_meta = (demux_meta_t *)p_this; + demux_t *p_demux = (demux_t *)p_demux_meta->p_demux; + bool b_seekable; + int64_t i_init; + msg_Dbg( p_demux_meta, "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 ); + CheckFooter( p_demux_meta ); /* */ - CheckHeader( p_demux ); + CheckHeader( p_demux_meta ); /* Restore position * Demuxer will not see tags at the start as src/input/demux.c skips it * 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; } +