From: <dg...@us...> - 2007-03-03 00:58:55
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv9947 Modified Files: demux_aac.c demux_mpgaudio.c id3.c id3.h Log Message: Add a function to parse a generic ID3v2 tag, and make both demux_aac and demux_mpgaudio use it without repeating the same code. Index: demux_aac.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_aac.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- demux_aac.c 3 Mar 2007 00:33:51 -0000 1.15 +++ demux_aac.c 3 Mar 2007 00:58:52 -0000 1.16 @@ -37,9 +37,9 @@ #define LOG_MODULE "demux_aac" #define LOG_VERBOSE - +/* #define LOG - +*/ #include "xine_internal.h" #include "xineutils.h" @@ -88,37 +88,7 @@ this->input->seek(this->input, 4, SEEK_SET); - /* Now parse the tag */ - switch(peak[3]) { - case 2: /* ID3v2.2 */ - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.2 tag\n"); - if ( ! id3v22_parse_tag(this->input, this->stream, peak) ) - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.2 tag parsing error\n"); - return 0; - break; - - case 3: /* ID3v2.3 */ - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.3 tag\n"); - if ( ! id3v23_parse_tag(this->input, this->stream, peak) ) - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.3 tag parsing error\n"); - break; - - case 4: /* ID3v2.4 */ - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.4 tag\n"); - if ( ! id3v24_parse_tag(this->input, this->stream, peak) ) - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.4 tag parsing error\n"); - break; - - default: - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": Unknown ID3v2 version: 0x%02x.\n", peak[3]); - } + id3v2_parse_tag(this->input, this->stream, peak); lprintf("ID3v2 tag encountered, skipping %u bytes.\n", id3size); } Index: demux_mpgaudio.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_mpgaudio.c,v retrieving revision 1.149 retrieving revision 1.150 diff -u -r1.149 -r1.150 --- demux_mpgaudio.c 3 Mar 2007 00:02:30 -0000 1.149 +++ demux_mpgaudio.c 3 Mar 2007 00:58:52 -0000 1.150 @@ -606,39 +606,14 @@ return parse_frame_payload(this, header_buf, decoder_flags); - } else if ((BE_32(header_buf)) == ID3V22_TAG) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.2 tag\n"); - if (!id3v22_parse_tag(this->input, this->stream, header_buf)) { + } else if ( header_buf[0] == 'I' && header_buf[1] == 'D' && header_buf[2] == '3' ) { + if (!id3v2_parse_tag(this->input, this->stream, header_buf)) { xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.2 tag parsing error\n"); + LOG_MODULE ": ID3V2 tag parsing error\n"); bytes = 1; /* resync */ } else { bytes = 4; } - - } else if ((BE_32(header_buf)) == ID3V23_TAG) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.3 tag\n"); - if (!id3v23_parse_tag(this->input, this->stream, header_buf)) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.3 tag parsing error\n"); - bytes = 1; /* resync */ - } else { - bytes = 4; - } - - } else if ((BE_32(header_buf)) == ID3V24_TAG) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.4 tag\n"); - if (!id3v24_parse_tag(this->input, this->stream, header_buf)) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": ID3V2.4 tag parsing error\n"); - bytes = 1; /* resync */ - } else { - bytes = 4; - } - } else { /* skip */ bytes = 1; Index: id3.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/id3.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- id3.c 5 Apr 2006 22:12:18 -0000 1.12 +++ id3.c 3 Mar 2007 00:58:52 -0000 1.13 @@ -878,3 +878,33 @@ return 0; } } + +int id3v2_parse_tag(input_plugin_t *input, + xine_stream_t *stream, + int8_t *mp3_frame_header) { + _x_assert(mp3_frame_header[0] == 'I' && mp3_frame_header[1] == 'D' && mp3_frame_header[2] == '3'); + + int result = 0; + + switch(mp3_frame_header[3]) { + case 2: + xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.2 tag\n"); + result = id3v22_parse_tag(input, stream, mp3_frame_header); + break; + + case 3: + xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.3 tag\n"); + result = id3v23_parse_tag(input, stream, mp3_frame_header); + break; + + case 4: + xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.3 tag\n"); + result = id3v24_parse_tag(input, stream, mp3_frame_header); + break; + + default: + xprintf(stream->xine, XINE_VERBOSITY_LOG, "Unknown ID3v2 version: 0x%02x.\n", mp3_frame_header[3]); + } + + return result; +} Index: id3.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/id3.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- id3.h 15 Sep 2005 18:45:15 -0000 1.4 +++ id3.h 3 Mar 2007 00:58:52 -0000 1.5 @@ -38,6 +38,7 @@ #define ID3V24_TAG FOURCC_TAG('I', 'D', '3', 4) /* id3 v2.4 header tag */ #define ID3V24_FOOTER_TAG FOURCC_TAG('3', 'D', 'I', 0) /* id3 v2.4 footer tag */ + /* * ID3 v2.2 */ @@ -164,4 +165,9 @@ xine_stream_t *stream, int8_t *mp3_frame_header); +/* Generic function that switch between the three above */ +int id3v2_parse_tag(input_plugin_t *input, + xine_stream_t *stream, + int8_t *mp3_frame_header); + #endif /* ID3_H */ |