#include <vlc_codec.h>
#include <assert.h>
#include <vlc_charset.h>
+#include "vorbis.h"
/*****************************************************************************
* Module descriptor
static void ParseComment( demux_t *p_demux, const uint8_t *p_data, int i_data )
{
demux_sys_t *p_sys = p_demux->p_sys;
- int n;
- int i_comment;
-
- if( i_data < 8 )
- return;
-
- RM(4);
-
- n = GetDWLE(p_data); RM(4);
- if( n < 0 || n > i_data )
- return;
-#if 0
- if( n > 0 )
- {
- /* TODO report vendor string ? */
- char *psz_vendor = psz_vendor = strndup( p_data, n );
- msg_Dbg( p_demux, "FLAC: COMMENT vendor length=%d vendor=%s\n", n, psz_vendor );
- free( psz_vendor );
- }
-#endif
- RM(n);
if( i_data < 4 )
return;
- i_comment = GetDWLE(p_data); RM(4);
- if( i_comment <= 0 )
- return;
-
- p_sys->p_meta = vlc_meta_New();
+ vorbis_ParseComment( &p_sys->p_meta, &p_data[4], i_data - 4 );
- for( ; i_comment > 0; i_comment-- )
- {
- char *psz;
- if( i_data < 4 )
- break;
- n = GetDWLE(p_data); RM(4);
- if( n > i_data )
- break;
- if( n <= 0 )
- continue;
-
- psz = strndup( (const char*)p_data, n );
- RM(n);
-
- EnsureUTF8( psz );
-
-#define IF_EXTRACT(txt,var) \
- if( !strncasecmp(psz, txt, strlen(txt)) ) \
- { \
- const char *oldval = vlc_meta_Get( p_sys->p_meta, vlc_meta_ ## var ); \
- if( oldval ) \
- { \
- char * newval; \
- if( asprintf( &newval, "%s,%s", oldval, &psz[strlen(txt)] ) == -1 ) \
- newval = NULL; \
- vlc_meta_Set( p_sys->p_meta, vlc_meta_ ## var, newval ); \
- free( newval ); \
- } \
- else \
- vlc_meta_Set( p_sys->p_meta, vlc_meta_ ## var, &psz[strlen(txt)] ); \
- }
- IF_EXTRACT("TITLE=", Title )
- else IF_EXTRACT("ALBUM=", Album )
- else IF_EXTRACT("TRACKNUMBER=", TrackNumber )
- else IF_EXTRACT("ARTIST=", Artist )
- else IF_EXTRACT("COPYRIGHT=", Copyright )
- else IF_EXTRACT("DESCRIPTION=", Description )
- else IF_EXTRACT("GENRE=", Genre )
- else IF_EXTRACT("DATE=", Date )
- else if( strchr( psz, '=' ) )
- {
- /* generic (PERFORMER/LICENSE/ORGANIZATION/LOCATION/CONTACT/ISRC,
- * undocumented tags and replay gain ) */
- char *p = strchr( psz, '=' );
- *p++ = '\0';
- vlc_meta_AddExtra( p_sys->p_meta, psz, p );
- }
-#undef IF_EXTRACT
- free( psz );
- }
-#undef RM
}
static void ParsePicture( demux_t *p_demux, const uint8_t *p_data, int i_data )