From 2ea512a6c2ff3404563ad364a3e806a8630cdc84 Mon Sep 17 00:00:00 2001 From: Alex Converse Date: Thu, 15 Jan 2009 12:23:03 +0000 Subject: [PATCH] Factorise id3v2 header parsing from mp3.c to be shared Patch by Alex Converse ( alex converse gmail com ) Originally committed as revision 16615 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/Makefile | 2 +- libavformat/id3v2.c | 35 +++++++++++++++++++++++++++++++++++ libavformat/id3v2.h | 35 +++++++++++++++++++++++++++++++++++ libavformat/mp3.c | 20 +++----------------- 4 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 libavformat/id3v2.c create mode 100644 libavformat/id3v2.h diff --git a/libavformat/Makefile b/libavformat/Makefile index 1db51591ea..dd216d5fa0 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -93,7 +93,7 @@ OBJS-$(CONFIG_MMF_MUXER) += mmf.o riff.o OBJS-$(CONFIG_MOV_DEMUXER) += mov.o riff.o isom.o OBJS-$(CONFIG_MOV_MUXER) += movenc.o riff.o isom.o avc.o OBJS-$(CONFIG_MP2_MUXER) += mp3.o -OBJS-$(CONFIG_MP3_DEMUXER) += mp3.o +OBJS-$(CONFIG_MP3_DEMUXER) += mp3.o id3v2.o OBJS-$(CONFIG_MP3_MUXER) += mp3.o OBJS-$(CONFIG_MP4_MUXER) += movenc.o riff.o isom.o avc.o OBJS-$(CONFIG_MPC_DEMUXER) += mpc.o diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c new file mode 100644 index 0000000000..c27443b3c2 --- /dev/null +++ b/libavformat/id3v2.c @@ -0,0 +1,35 @@ +/* + * ID3v2 header parser + * Copyright (c) 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "id3v2.h" + +int ff_id3v2_match(const uint8_t *buf) +{ + return buf[0] == 'I' && + buf[1] == 'D' && + buf[2] == '3' && + buf[3] != 0xff && + buf[4] != 0xff && + (buf[6] & 0x80) == 0 && + (buf[7] & 0x80) == 0 && + (buf[8] & 0x80) == 0 && + (buf[9] & 0x80) == 0; +} diff --git a/libavformat/id3v2.h b/libavformat/id3v2.h new file mode 100644 index 0000000000..f54e29054b --- /dev/null +++ b/libavformat/id3v2.h @@ -0,0 +1,35 @@ +/* + * ID3v2 header parser + * Copyright (c) 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_ID3V2_H +#define AVFORMAT_ID3V2_H + +#include + +#define ID3v2_HEADER_SIZE 10 + +/** + * Detects ID3v2 Header. + * @buf must be ID3v2_HEADER_SIZE byte long + */ +int ff_id3v2_match(const uint8_t *buf); + +#endif /* AVFORMAT_ID3V2_H */ diff --git a/libavformat/mp3.c b/libavformat/mp3.c index 0b1a167002..99095414a6 100644 --- a/libavformat/mp3.c +++ b/libavformat/mp3.c @@ -24,8 +24,8 @@ #include "libavcodec/mpegaudio.h" #include "libavcodec/mpegaudiodecheader.h" #include "avformat.h" +#include "id3v2.h" -#define ID3v2_HEADER_SIZE 10 #define ID3v1_TAG_SIZE 128 #define ID3v1_GENRE_MAX 125 @@ -159,20 +159,6 @@ static const char * const id3v1_genre_str[ID3v1_GENRE_MAX + 1] = { [125] = "Dance Hall", }; -/* buf must be ID3v2_HEADER_SIZE byte long */ -static int id3v2_match(const uint8_t *buf) -{ - return buf[0] == 'I' && - buf[1] == 'D' && - buf[2] == '3' && - buf[3] != 0xff && - buf[4] != 0xff && - (buf[6] & 0x80) == 0 && - (buf[7] & 0x80) == 0 && - (buf[8] & 0x80) == 0 && - (buf[9] & 0x80) == 0; -} - static unsigned int id3v2_get_size(ByteIOContext *s, int len) { int v=0; @@ -371,7 +357,7 @@ static int mp3_read_probe(AVProbeData *p) uint8_t *buf, *buf2, *end; AVCodecContext avctx; - if(id3v2_match(p->buf)) + if(ff_id3v2_match(p->buf)) return AVPROBE_SCORE_MAX/2+1; // this must be less than mpeg-ps because some retards put id3v2 tags before mpeg-ps files max_frames = 0; @@ -487,7 +473,7 @@ static int mp3_read_header(AVFormatContext *s, ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE); if (ret != ID3v2_HEADER_SIZE) return -1; - if (id3v2_match(buf)) { + if (ff_id3v2_match(buf)) { /* parse ID3v2 header */ len = ((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) |