vlc | branch: master | Francois Cartegnie <[email protected]> | Fri May 26 16:39:06 2017 +0200| [a4f462101f9fa4ce33bc04e9a61365439005b544] | committer: Francois Cartegnie
meta: ID3: split string conversion > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a4f462101f9fa4ce33bc04e9a61365439005b544 --- modules/demux/Makefile.am | 1 + modules/meta_engine/ID3Meta.h | 68 +++++++++++--------------------------- modules/meta_engine/ID3Text.h | 76 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 49 deletions(-) diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am index fb57a0e34b..b1c482365e 100644 --- a/modules/demux/Makefile.am +++ b/modules/demux/Makefile.am @@ -165,6 +165,7 @@ demux_LTLIBRARIES += libdirectory_demux_plugin.la libes_plugin_la_SOURCES = demux/mpeg/es.c \ meta_engine/ID3Tag.h \ + meta_engine/ID3Text.h \ packetizer/dts_header.c packetizer/dts_header.h demux_LTLIBRARIES += libes_plugin.la diff --git a/modules/meta_engine/ID3Meta.h b/modules/meta_engine/ID3Meta.h index 5c841cb8d0..d35e370919 100644 --- a/modules/meta_engine/ID3Meta.h +++ b/modules/meta_engine/ID3Meta.h @@ -21,7 +21,7 @@ #define ID3META_H #include <vlc_meta.h> -#include <vlc_charset.h> +#include "ID3Text.h" #define vlc_meta_extra vlc_meta_Title struct @@ -47,58 +47,28 @@ static bool ID3TextTagHandler( const uint8_t *p_buf, size_t i_buf, vlc_meta_type_t type, const char *psz_extra, vlc_meta_t *p_meta, bool *pb_updated ) { - char *p_alloc = NULL; - const char *psz; - if( i_buf > 3 && p_meta && p_buf[0] < 0x04 ) - { - switch( p_buf[0] ) - { - case 0x00: - psz = p_alloc = FromCharset( "ISO_8859-1", &p_buf[1], i_buf - 1 ); - break; - case 0x01: - psz = p_alloc = FromCharset( "UTF-16LE", &p_buf[1], i_buf - 1 ); - break; - case 0x02: - psz = p_alloc = FromCharset( "UTF-16BE", &p_buf[1], i_buf - 1 ); - break; - default: - case 0x03: - if( p_buf[ i_buf - 1 ] != 0x00 ) - { - psz = p_alloc = (char *) malloc( i_buf ); - if( p_alloc ) - { - memcpy( p_alloc, &p_buf[1], i_buf - 1 ); - p_alloc[i_buf - 1] = 0; - } - } - else - { - psz = (const char *) &p_buf[1]; - } - break; - } + if( p_meta == NULL ) + return false; - if( psz && *psz ) + char *p_alloc; + const char *psz = ID3TextConvert( p_buf, i_buf, &p_alloc ); + if( psz && *psz ) + { + const char *psz_old = ( psz_extra ) ? vlc_meta_GetExtra( p_meta, psz_extra ): + vlc_meta_Get( p_meta, type ); + if( !psz_old || strcmp( psz_old, psz ) ) { - const char *psz_old = ( psz_extra ) ? vlc_meta_GetExtra( p_meta, psz_extra ): - vlc_meta_Get( p_meta, type ); - if( !psz_old || strcmp( psz_old, psz ) ) - { - if( pb_updated ) - *pb_updated = true; - if( psz_extra ) - vlc_meta_AddExtra( p_meta, psz_extra, psz ); - else - vlc_meta_Set( p_meta, type, psz ); - } + if( pb_updated ) + *pb_updated = true; + if( psz_extra ) + vlc_meta_AddExtra( p_meta, psz_extra, psz ); + else + vlc_meta_Set( p_meta, type, psz ); } - - free( p_alloc ); - return true; } - return false; + free( p_alloc ); + + return (psz != NULL); } static bool ID3LinkFrameTagHandler( const uint8_t *p_buf, size_t i_buf, diff --git a/modules/meta_engine/ID3Text.h b/modules/meta_engine/ID3Text.h new file mode 100644 index 0000000000..9ca2af052e --- /dev/null +++ b/modules/meta_engine/ID3Text.h @@ -0,0 +1,76 @@ +/***************************************************************************** + * ID3Text.h : ID3v2 Text Helper + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * 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 Lesser General Public License for more details. + * + * 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. + *****************************************************************************/ +#ifndef ID3TEXT_H +#define ID3TEXT_H + +#include <vlc_charset.h> + +static const char * ID3TextConv( const uint8_t *p_buf, size_t i_buf, + uint8_t i_charset, char **ppsz_allocated ) +{ + char *p_alloc = NULL; + const char *psz = p_alloc; + if( i_buf > 0 && i_charset < 0x04 ) + { + switch( i_charset ) + { + case 0x00: + psz = p_alloc = FromCharset( "ISO_8859-1", p_buf, i_buf ); + break; + case 0x01: + psz = p_alloc = FromCharset( "UTF-16LE", p_buf, i_buf ); + break; + case 0x02: + psz = p_alloc = FromCharset( "UTF-16BE", p_buf, i_buf ); + break; + default: + case 0x03: + if( p_buf[ i_buf - 1 ] != 0x00 ) + { + psz = p_alloc = (char *) malloc( i_buf + 1 ); + if( p_alloc ) + { + memcpy( p_alloc, p_buf, i_buf - 1 ); + p_alloc[i_buf] = '\0'; + } + } + else + { + psz = (const char *) p_buf; + } + break; + } + } + *ppsz_allocated = p_alloc; + return psz; +} + +static inline const char * ID3TextConvert( const uint8_t *p_buf, size_t i_buf, + char **ppsz_allocated ) +{ + if( i_buf == 0 ) + { + *ppsz_allocated = NULL; + return NULL; + } + return ID3TextConv( &p_buf[1], i_buf - 1, p_buf[0], ppsz_allocated ); +} + +#endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
