annotate mp3.c @ 4417:de5ccc7a4461 libavformat

Declare ff_interleave_new_audio_packet as static, it is not used outside of audiointerleave.c. Also remove the function declaration from the header as it is now static.
author bcoudurier
date Sun, 08 Feb 2009 21:09:50 +0000
parents 0b688ff86d2f
children 2119994c15ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1358
diff changeset
2 * MP3 muxer and demuxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4221
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
16 *
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1321
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
21
3714
3790cb6c893d strcasecmp() requires #include <strings.h>
aurel
parents: 3561
diff changeset
22 #include <strings.h>
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
23 #include "libavutil/avstring.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
24 #include "libavcodec/mpegaudio.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
25 #include "libavcodec/mpegaudiodecheader.h"
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
26 #include "avformat.h"
4221
55f448c99135 Factorise id3v2 header parsing from mp3.c to be shared
superdump
parents: 4206
diff changeset
27 #include "id3v2.h"
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
28
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
29 #define ID3v1_TAG_SIZE 128
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
30
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
31 #define ID3v1_GENRE_MAX 125
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
32
3761
3a874c41adaf Make the id3v1_genre_str array const, not just the strings it points to.
reimar
parents: 3714
diff changeset
33 static const char * const id3v1_genre_str[ID3v1_GENRE_MAX + 1] = {
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
34 [0] = "Blues",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
35 [1] = "Classic Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
36 [2] = "Country",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
37 [3] = "Dance",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
38 [4] = "Disco",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
39 [5] = "Funk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
40 [6] = "Grunge",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
41 [7] = "Hip-Hop",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
42 [8] = "Jazz",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
43 [9] = "Metal",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
44 [10] = "New Age",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
45 [11] = "Oldies",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
46 [12] = "Other",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
47 [13] = "Pop",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
48 [14] = "R&B",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
49 [15] = "Rap",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
50 [16] = "Reggae",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
51 [17] = "Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
52 [18] = "Techno",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
53 [19] = "Industrial",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
54 [20] = "Alternative",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
55 [21] = "Ska",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
56 [22] = "Death Metal",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
57 [23] = "Pranks",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
58 [24] = "Soundtrack",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
59 [25] = "Euro-Techno",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
60 [26] = "Ambient",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
61 [27] = "Trip-Hop",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
62 [28] = "Vocal",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
63 [29] = "Jazz+Funk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
64 [30] = "Fusion",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
65 [31] = "Trance",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
66 [32] = "Classical",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
67 [33] = "Instrumental",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
68 [34] = "Acid",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
69 [35] = "House",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
70 [36] = "Game",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
71 [37] = "Sound Clip",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
72 [38] = "Gospel",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
73 [39] = "Noise",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
74 [40] = "AlternRock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
75 [41] = "Bass",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
76 [42] = "Soul",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
77 [43] = "Punk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
78 [44] = "Space",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
79 [45] = "Meditative",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
80 [46] = "Instrumental Pop",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
81 [47] = "Instrumental Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
82 [48] = "Ethnic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
83 [49] = "Gothic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
84 [50] = "Darkwave",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
85 [51] = "Techno-Industrial",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
86 [52] = "Electronic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
87 [53] = "Pop-Folk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
88 [54] = "Eurodance",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
89 [55] = "Dream",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
90 [56] = "Southern Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
91 [57] = "Comedy",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
92 [58] = "Cult",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
93 [59] = "Gangsta",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
94 [60] = "Top 40",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
95 [61] = "Christian Rap",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
96 [62] = "Pop/Funk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
97 [63] = "Jungle",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
98 [64] = "Native American",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
99 [65] = "Cabaret",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
100 [66] = "New Wave",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
101 [67] = "Psychadelic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
102 [68] = "Rave",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
103 [69] = "Showtunes",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
104 [70] = "Trailer",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
105 [71] = "Lo-Fi",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
106 [72] = "Tribal",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
107 [73] = "Acid Punk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
108 [74] = "Acid Jazz",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
109 [75] = "Polka",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
110 [76] = "Retro",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
111 [77] = "Musical",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
112 [78] = "Rock & Roll",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
113 [79] = "Hard Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
114 [80] = "Folk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
115 [81] = "Folk-Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
116 [82] = "National Folk",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
117 [83] = "Swing",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
118 [84] = "Fast Fusion",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
119 [85] = "Bebob",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
120 [86] = "Latin",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
121 [87] = "Revival",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
122 [88] = "Celtic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
123 [89] = "Bluegrass",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
124 [90] = "Avantgarde",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
125 [91] = "Gothic Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
126 [92] = "Progressive Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
127 [93] = "Psychedelic Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
128 [94] = "Symphonic Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
129 [95] = "Slow Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
130 [96] = "Big Band",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
131 [97] = "Chorus",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
132 [98] = "Easy Listening",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
133 [99] = "Acoustic",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
134 [100] = "Humour",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
135 [101] = "Speech",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
136 [102] = "Chanson",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
137 [103] = "Opera",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
138 [104] = "Chamber Music",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
139 [105] = "Sonata",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
140 [106] = "Symphony",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
141 [107] = "Booty Bass",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
142 [108] = "Primus",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
143 [109] = "Porn Groove",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
144 [110] = "Satire",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
145 [111] = "Slow Jam",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
146 [112] = "Club",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
147 [113] = "Tango",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
148 [114] = "Samba",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
149 [115] = "Folklore",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
150 [116] = "Ballad",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
151 [117] = "Power Ballad",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
152 [118] = "Rhythmic Soul",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
153 [119] = "Freestyle",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
154 [120] = "Duet",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
155 [121] = "Punk Rock",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
156 [122] = "Drum Solo",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
157 [123] = "A capella",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
158 [124] = "Euro-House",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
159 [125] = "Dance Hall",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
160 };
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
161
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
162 static unsigned int id3v2_get_size(ByteIOContext *s, int len)
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
163 {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
164 int v=0;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
165 while(len--)
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
166 v= (v<<7) + (get_byte(s)&0x7F);
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
167 return v;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
168 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
169
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
170 static void id3v2_read_ttag(AVFormatContext *s, int taglen, const char *key)
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
171 {
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
172 char *q, dst[512];
4357
10e0d8797a43 simplify usage of dstlen as it is not a parameter anymore
aurel
parents: 4356
diff changeset
173 int len, dstlen = sizeof(dst) - 1;
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
174 unsigned genre;
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
175
4358
39f767e66f49 cosmetics: indentation
aurel
parents: 4357
diff changeset
176 dst[0]= 0;
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
177 if(taglen < 1)
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
178 return;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
179
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
180 taglen--; /* account for encoding type byte */
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
181
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
182 switch(get_byte(s->pb)) { /* encoding type */
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
183
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
184 case 0: /* ISO-8859-1 (0 - 255 maps directly into unicode) */
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
185 q = dst;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
186 while(taglen--) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
187 uint8_t tmp;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
188 PUT_UTF8(get_byte(s->pb), tmp, if (q - dst < dstlen - 1) *q++ = tmp;)
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
189 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
190 *q = '\0';
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
191 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
192
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
193 case 3: /* UTF-8 */
3540
3dfb35d2ac51 All mp3 parsers are buggy fix 2 of n (out of array write, i suspect not exploitable)
michael
parents: 3539
diff changeset
194 len = FFMIN(taglen, dstlen-1);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
195 get_buffer(s->pb, dst, len);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
196 dst[len] = 0;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
197 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
198 }
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
199
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
200 if (!strcmp(key, "genre")
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
201 && sscanf(dst, "(%d)", &genre) == 1 && genre <= ID3v1_GENRE_MAX)
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
202 av_strlcpy(dst, id3v1_genre_str[genre], sizeof(dst));
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
203
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
204 if (*dst)
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
205 av_metadata_set(&s->metadata, key, dst);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
206 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
207
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
208 /**
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
209 * ID3v2 parser
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
210 *
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
211 * Handles ID3v2.2, 2.3 and 2.4.
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
212 *
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
213 */
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
214
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
215 static void id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags)
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
216 {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
217 int isv34, tlen;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
218 uint32_t tag;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3871
diff changeset
219 int64_t next;
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
220 int taghdrlen;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
221 const char *reason;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
222
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
223 switch(version) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
224 case 2:
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
225 if(flags & 0x40) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
226 reason = "compression";
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
227 goto error;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
228 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
229 isv34 = 0;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
230 taghdrlen = 6;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
231 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
232
2231
7ad682f38b9a * Getting rid of the use of GCC language extensions
romansh
parents: 2222
diff changeset
233 case 3:
7ad682f38b9a * Getting rid of the use of GCC language extensions
romansh
parents: 2222
diff changeset
234 case 4:
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
235 isv34 = 1;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
236 taghdrlen = 10;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
237 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
238
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
239 default:
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
240 reason = "version";
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
241 goto error;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
242 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
243
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
244 if(flags & 0x80) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
245 reason = "unsynchronization";
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
246 goto error;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
247 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
248
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
249 if(isv34 && flags & 0x40) /* Extended header present, just skip over it */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
250 url_fskip(s->pb, id3v2_get_size(s->pb, 4));
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
251
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
252 while(len >= taghdrlen) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
253 if(isv34) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
254 tag = get_be32(s->pb);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
255 tlen = id3v2_get_size(s->pb, 4);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
256 get_be16(s->pb); /* flags */
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
257 } else {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
258 tag = get_be24(s->pb);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
259 tlen = id3v2_get_size(s->pb, 3);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
260 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
261 len -= taghdrlen + tlen;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
262
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
263 if(len < 0)
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
264 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
265
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
266 next = url_ftell(s->pb) + tlen;
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
267
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
268 switch(tag) {
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
269 case MKBETAG('T', 'I', 'T', '2'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
270 case MKBETAG(0, 'T', 'T', '2'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
271 id3v2_read_ttag(s, tlen, "title");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
272 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
273 case MKBETAG('T', 'P', 'E', '1'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
274 case MKBETAG(0, 'T', 'P', '1'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
275 id3v2_read_ttag(s, tlen, "author");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
276 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
277 case MKBETAG('T', 'A', 'L', 'B'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
278 case MKBETAG(0, 'T', 'A', 'L'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
279 id3v2_read_ttag(s, tlen, "album");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
280 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
281 case MKBETAG('T', 'C', 'O', 'N'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
282 case MKBETAG(0, 'T', 'C', 'O'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
283 id3v2_read_ttag(s, tlen, "genre");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
284 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
285 case MKBETAG('T', 'C', 'O', 'P'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
286 case MKBETAG(0, 'T', 'C', 'R'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
287 id3v2_read_ttag(s, tlen, "copyright");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
288 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
289 case MKBETAG('T', 'R', 'C', 'K'):
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
290 case MKBETAG(0, 'T', 'R', 'K'):
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
291 id3v2_read_ttag(s, tlen, "track");
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
292 break;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
293 case 0:
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
294 /* padding, skip to end */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
295 url_fskip(s->pb, len);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
296 len = 0;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
297 continue;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
298 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
299 /* Skip to end of tag */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
300 url_fseek(s->pb, next, SEEK_SET);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
301 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
302
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
303 if(version == 4 && flags & 0x10) /* Footer preset, always 10 bytes, skip over it */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
304 url_fskip(s->pb, 10);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
305 return;
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
306
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
307 error:
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
308 av_log(s, AV_LOG_INFO, "ID3v2.%d tag skipped, cannot handle %s\n", version, reason);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
309 url_fskip(s->pb, len);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
310 }
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
311
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
312 static void id3v1_get_string(AVFormatContext *s, const char *key,
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
313 const uint8_t *buf, int buf_size)
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
314 {
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
315 int i, c;
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
316 char *q, str[512];
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
317
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
318 q = str;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
319 for(i = 0; i < buf_size; i++) {
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
320 c = buf[i];
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
321 if (c == '\0')
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
322 break;
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
323 if ((q - str) >= sizeof(str) - 1)
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
324 break;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
325 *q++ = c;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
326 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
327 *q = '\0';
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
328
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
329 if (*str)
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
330 av_metadata_set(&s->metadata, key, str);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
331 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
332
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
333 /* 'buf' must be ID3v1_TAG_SIZE byte long */
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
334 static int id3v1_parse_tag(AVFormatContext *s, const uint8_t *buf)
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
335 {
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
336 char str[5];
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
337 int genre;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
338
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
339 if (!(buf[0] == 'T' &&
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
340 buf[1] == 'A' &&
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
341 buf[2] == 'G'))
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
342 return -1;
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
343 id3v1_get_string(s, "title", buf + 3, 30);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
344 id3v1_get_string(s, "author", buf + 33, 30);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
345 id3v1_get_string(s, "album", buf + 63, 30);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
346 id3v1_get_string(s, "year", buf + 93, 4);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
347 id3v1_get_string(s, "comment", buf + 97, 30);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
348 if (buf[125] == 0 && buf[126] != 0) {
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
349 snprintf(str, sizeof(str), "%d", buf[126]);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
350 av_metadata_set(&s->metadata, "track", str);
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
351 }
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
352 genre = buf[127];
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
353 if (genre <= ID3v1_GENRE_MAX)
4354
6111dd03464b use new metadata API in the mp3 demuxer
aurel
parents: 4333
diff changeset
354 av_metadata_set(&s->metadata, "genre", id3v1_genre_str[genre]);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
355 return 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
356 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
357
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
358 /* mp3 read */
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
359
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
360 static int mp3_read_probe(AVProbeData *p)
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
361 {
2234
2bc002540a9b kill uninitialised variable warning in mp3_read_probe()
mru
parents: 2231
diff changeset
362 int max_frames, first_frames = 0;
1433
dababce8f69e dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 1415
diff changeset
363 int fsize, frames, sample_rate;
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
364 uint32_t header;
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
365 uint8_t *buf, *buf0, *buf2, *end;
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
366 AVCodecContext avctx;
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
367
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
368 buf0 = p->buf;
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
369 if(ff_id3v2_match(buf0)) {
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
370 buf0 += ff_id3v2_tag_len(buf0);
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
371 }
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
372
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
373 max_frames = 0;
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
374 buf = buf0;
4258
35c8abd32d93 Fix a read past end of buffer crash in the mp3 probe
alexc
parents: 4254
diff changeset
375 end = p->buf + p->buf_size - sizeof(uint32_t);
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
376
2797
428c1678b21f ensure that the probe code runs in O(n)
michael
parents: 2796
diff changeset
377 for(; buf < end; buf= buf2+1) {
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
378 buf2 = buf;
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
379
1312
24f1d6a50117 10l typo
michael
parents: 1308
diff changeset
380 for(frames = 0; buf2 < end; frames++) {
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2189
diff changeset
381 header = AV_RB32(buf2);
4126
bfc790ab375f Change mpeg audio parser so it only sets frame_size, channels and bit_rate
michael
parents: 3973
diff changeset
382 fsize = ff_mpa_decode_header(&avctx, header, &sample_rate, &sample_rate, &sample_rate, &sample_rate);
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
383 if(fsize < 0)
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
384 break;
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
385 buf2 += fsize;
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
386 }
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
387 max_frames = FFMAX(max_frames, frames);
4254
d05b13327b07 Fix probing of files with ID3v2 tags. Discussed at
alexc
parents: 4251
diff changeset
388 if(buf == buf0)
1321
9eeb01383e30 reduce scores if the mp3 frames dont start from the begin of the file (fixes flv deteted as mp3 issues)
michael
parents: 1312
diff changeset
389 first_frames= frames;
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
390 }
1321
9eeb01383e30 reduce scores if the mp3 frames dont start from the begin of the file (fixes flv deteted as mp3 issues)
michael
parents: 1312
diff changeset
391 if (first_frames>=3) return AVPROBE_SCORE_MAX/2+1;
2798
51e0a502392f return a slightly larger score if we find more than 500 valid mp3 frames in a row
michael
parents: 2797
diff changeset
392 else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
1321
9eeb01383e30 reduce scores if the mp3 frames dont start from the begin of the file (fixes flv deteted as mp3 issues)
michael
parents: 1312
diff changeset
393 else if(max_frames>=3) return AVPROBE_SCORE_MAX/4;
4383
0b688ff86d2f Make the MP3 probe weakly claim all files with ID3v2 tags to fix regressions on
alexc
parents: 4358
diff changeset
394 else if(buf0!=p->buf) return AVPROBE_SCORE_MAX/4-1;
1321
9eeb01383e30 reduce scores if the mp3 frames dont start from the begin of the file (fixes flv deteted as mp3 issues)
michael
parents: 1312
diff changeset
395 else if(max_frames>=1) return 1;
1308
866d43ed0a67 allow ffmpeg to read mp3s beginning with partial frames
gpoirier
parents: 1169
diff changeset
396 else return 0;
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
397 }
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
398
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
399 /**
2667
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
400 * Try to find Xing/Info/VBRI tags and compute duration from info therein
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
401 */
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
402 static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
403 {
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
404 uint32_t v, spf;
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
405 int frames = -1; /* Total number of frames in file */
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3871
diff changeset
406 const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}};
4274
39f62ce83e5a Avoid allocating MPADecodeContext on stack.
andoma
parents: 4258
diff changeset
407 MPADecodeHeader c;
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
408 int vbrtag_size = 0;
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
409
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
410 v = get_be32(s->pb);
2703
2c2da3011d6e make sure the mpeg audio header is valid before passing it to ff_mpegaudio_decode_header()
andoma
parents: 2667
diff changeset
411 if(ff_mpa_check_header(v) < 0)
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
412 return -1;
2703
2c2da3011d6e make sure the mpeg audio header is valid before passing it to ff_mpegaudio_decode_header()
andoma
parents: 2667
diff changeset
413
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
414 if (ff_mpegaudio_decode_header(&c, v) == 0)
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
415 vbrtag_size = c.frame_size;
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
416 if(c.layer != 3)
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
417 return -1;
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
418
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
419 /* Check for Xing / Info tag */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
420 url_fseek(s->pb, xing_offtbl[c.lsf == 1][c.nb_channels == 1], SEEK_CUR);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
421 v = get_be32(s->pb);
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
422 if(v == MKBETAG('X', 'i', 'n', 'g') || v == MKBETAG('I', 'n', 'f', 'o')) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
423 v = get_be32(s->pb);
2664
33122df98824 fix indent
andoma
parents: 2663
diff changeset
424 if(v & 0x1)
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
425 frames = get_be32(s->pb);
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
426 }
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
427
2667
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
428 /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
429 url_fseek(s->pb, base + 4 + 32, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
430 v = get_be32(s->pb);
2667
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
431 if(v == MKBETAG('V', 'B', 'R', 'I')) {
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
432 /* Check tag version */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
433 if(get_be16(s->pb) == 1) {
2667
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
434 /* skip delay, quality and total bytes */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
435 url_fseek(s->pb, 8, SEEK_CUR);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
436 frames = get_be32(s->pb);
2667
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
437 }
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
438 }
e896ac505ec6 add support for reading duration from VBRI-tag in mp3 files
andoma
parents: 2664
diff changeset
439
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
440 if(frames < 0)
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
441 return -1;
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
442
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
443 /* Skip the vbr tag frame */
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
444 url_fseek(s->pb, base + vbrtag_size, SEEK_SET);
2663
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
445
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
446 spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
447 st->duration = av_rescale_q(frames, (AVRational){spf, c.sample_rate},
be889462edfc cosmetical change of mp3_parse_xing() to prepare for upcoming VBRI tag support
andoma
parents: 2662
diff changeset
448 st->time_base);
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
449 return 0;
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
450 }
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
451
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
452 static int mp3_read_header(AVFormatContext *s,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
453 AVFormatParameters *ap)
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
454 {
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
455 AVStream *st;
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
456 uint8_t buf[ID3v1_TAG_SIZE];
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
457 int len, ret, filesize;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3871
diff changeset
458 int64_t off;
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
459
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
460 st = av_new_stream(s, 0);
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
461 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2234
diff changeset
462 return AVERROR(ENOMEM);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
463
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 814
diff changeset
464 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 814
diff changeset
465 st->codec->codec_id = CODEC_ID_MP3;
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2001
diff changeset
466 st->need_parsing = AVSTREAM_PARSE_FULL;
2622
c63b1bd7be16 set start_time to 0 to enable seeking in mp3-files
andoma
parents: 2306
diff changeset
467 st->start_time = 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
468
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
469 /* try to get the TAG */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
470 if (!url_is_streamed(s->pb)) {
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
471 /* XXX: change that */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
472 filesize = url_fsize(s->pb);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
473 if (filesize > 128) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
474 url_fseek(s->pb, filesize - 128, SEEK_SET);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
475 ret = get_buffer(s->pb, buf, ID3v1_TAG_SIZE);
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
476 if (ret == ID3v1_TAG_SIZE) {
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
477 id3v1_parse_tag(s, buf);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
478 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
479 url_fseek(s->pb, 0, SEEK_SET);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
480 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
481 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
482
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
483 /* if ID3v2 header found, skip it */
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
484 ret = get_buffer(s->pb, buf, ID3v2_HEADER_SIZE);
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
485 if (ret != ID3v2_HEADER_SIZE)
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
486 return -1;
4221
55f448c99135 Factorise id3v2 header parsing from mp3.c to be shared
superdump
parents: 4206
diff changeset
487 if (ff_id3v2_match(buf)) {
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
488 /* parse ID3v2 header */
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
489 len = ((buf[6] & 0x7f) << 21) |
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
490 ((buf[7] & 0x7f) << 14) |
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
491 ((buf[8] & 0x7f) << 7) |
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
492 (buf[9] & 0x7f);
2097
cab3fcb34077 id3v2 reader
benoit
parents: 2096
diff changeset
493 id3v2_parse(s, len, buf[3], buf[5]);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
494 } else {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
495 url_fseek(s->pb, 0, SEEK_SET);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
496 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
497
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
498 off = url_ftell(s->pb);
4148
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
499 if (mp3_parse_vbr_tags(s, st, off) < 0)
33f55d10246d If we find a VBR tag at the beginning of the file don't attempt to
michael
parents: 4126
diff changeset
500 url_fseek(s->pb, off, SEEK_SET);
2662
08b1ac852321 add support for reading duration from Xing-tag in mp3 files
andoma
parents: 2622
diff changeset
501
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
502 /* the parameters will be extracted from the compressed bitstream */
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
503 return 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
504 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
505
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
506 #define MP3_PACKET_SIZE 1024
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
507
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
508 static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt)
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
509 {
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
510 int ret, size;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
511 // AVStream *st = s->streams[0];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 858
diff changeset
512
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
513 size= MP3_PACKET_SIZE;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
514
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
515 ret= av_get_packet(s->pb, pkt, size);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
516
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
517 pkt->stream_index = 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
518 if (ret <= 0) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
519 return AVERROR(EIO);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
520 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
521 /* note: we need to modify the packet size here to handle the last
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
522 packet */
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
523 pkt->size = ret;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
524 return ret;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
525 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
526
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4148
diff changeset
527 #if CONFIG_MP2_MUXER || CONFIG_MP3_MUXER
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
528 static int id3v1_set_string(AVFormatContext *s, const char *key,
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
529 uint8_t *buf, int buf_size)
3561
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
530 {
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
531 AVMetadataTag *tag;
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
532 if ((tag = av_metadata_get(s->metadata, key, NULL, 0)))
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
533 strncpy(buf, tag->value, buf_size);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
534 return !!tag;
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
535 }
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
536
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
537 static int id3v1_create_tag(AVFormatContext *s, uint8_t *buf)
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
538 {
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
539 AVMetadataTag *tag;
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
540 int i, count = 0;
3561
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
541
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
542 memset(buf, 0, ID3v1_TAG_SIZE); /* fail safe */
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
543 buf[0] = 'T';
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
544 buf[1] = 'A';
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
545 buf[2] = 'G';
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
546 count += id3v1_set_string(s, "title", buf + 3, 30);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
547 count += id3v1_set_string(s, "author", buf + 33, 30);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
548 count += id3v1_set_string(s, "album", buf + 63, 30);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
549 count += id3v1_set_string(s, "year", buf + 93, 4);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
550 count += id3v1_set_string(s, "comment", buf + 97, 30);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
551 if ((tag = av_metadata_get(s->metadata, "track", NULL, 0))) {
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
552 buf[125] = 0;
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
553 buf[126] = atoi(tag->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
554 count++;
3561
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
555 }
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
556 if ((tag = av_metadata_get(s->metadata, "genre", NULL, 0))) {
4356
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
557 for(i = 0; i <= ID3v1_GENRE_MAX; i++) {
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
558 if (!strcasecmp(tag->value, id3v1_genre_str[i])) {
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
559 buf[127] = i;
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
560 count++;
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
561 break;
459c0242194e cosmetics: indentation
aurel
parents: 4355
diff changeset
562 }
3561
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
563 }
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
564 }
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
565 return count;
3561
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
566 }
bc473761b9e7 Move one function that is only used for muxing below #ifdef CONFIG_MUXERS.
diego
parents: 3540
diff changeset
567
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
568 /* simple formats */
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
569
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
570 static void id3v2_put_size(AVFormatContext *s, int size)
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
571 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
572 put_byte(s->pb, size >> 21 & 0x7f);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
573 put_byte(s->pb, size >> 14 & 0x7f);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
574 put_byte(s->pb, size >> 7 & 0x7f);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
575 put_byte(s->pb, size & 0x7f);
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
576 }
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
577
3008
6eaceb561ae9 Another const found by -Wwrite-strings.
michael
parents: 2798
diff changeset
578 static void id3v2_put_ttag(AVFormatContext *s, const char *string, uint32_t tag)
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
579 {
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
580 int len = strlen(string);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
581 put_be32(s->pb, tag);
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
582 id3v2_put_size(s, len + 1);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
583 put_be16(s->pb, 0);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
584 put_byte(s->pb, 3); /* UTF-8 */
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
585 put_buffer(s->pb, string, len);
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
586 }
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
587
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
588
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
589 /**
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
590 * Write an ID3v2.4 header at beginning of stream
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
591 */
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
592
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
593 static int mp3_write_header(struct AVFormatContext *s)
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
594 {
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
595 AVMetadataTag *title, *author, *album, *genre, *copyright, *track, *year;
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
596 int totlen = 0;
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
597
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
598 title = av_metadata_get(s->metadata, "title", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
599 author = av_metadata_get(s->metadata, "author", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
600 album = av_metadata_get(s->metadata, "album", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
601 genre = av_metadata_get(s->metadata, "genre", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
602 copyright = av_metadata_get(s->metadata, "copyright", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
603 track = av_metadata_get(s->metadata, "track", NULL, 0);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
604 year = av_metadata_get(s->metadata, "year", NULL, 0);
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
605
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
606 if(title) totlen += 11 + strlen(title->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
607 if(author) totlen += 11 + strlen(author->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
608 if(album) totlen += 11 + strlen(album->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
609 if(genre) totlen += 11 + strlen(genre->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
610 if(copyright) totlen += 11 + strlen(copyright->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
611 if(track) totlen += 11 + strlen(track->value);
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
612 if(year) totlen += 11 + strlen(year->value);
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
613 if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
614 totlen += strlen(LIBAVFORMAT_IDENT) + 11;
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
615
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
616 if(totlen == 0)
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
617 return 0;
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
618
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
619 put_be32(s->pb, MKBETAG('I', 'D', '3', 0x04)); /* ID3v2.4 */
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
620 put_byte(s->pb, 0);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
621 put_byte(s->pb, 0); /* flags */
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
622
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
623 id3v2_put_size(s, totlen);
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
624
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
625 if(title) id3v2_put_ttag(s, title->value, MKBETAG('T', 'I', 'T', '2'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
626 if(author) id3v2_put_ttag(s, author->value, MKBETAG('T', 'P', 'E', '1'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
627 if(album) id3v2_put_ttag(s, album->value, MKBETAG('T', 'A', 'L', 'B'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
628 if(genre) id3v2_put_ttag(s, genre->value, MKBETAG('T', 'C', 'O', 'N'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
629 if(copyright) id3v2_put_ttag(s, copyright->value, MKBETAG('T', 'C', 'O', 'P'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
630 if(track) id3v2_put_ttag(s, track->value, MKBETAG('T', 'R', 'C', 'K'));
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
631 if(year) id3v2_put_ttag(s, year->value, MKBETAG('T', 'Y', 'E', 'R'));
2098
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
632 if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
b51b57909b5f id3v2 writer
benoit
parents: 2097
diff changeset
633 id3v2_put_ttag(s, LIBAVFORMAT_IDENT, MKBETAG('T', 'E', 'N', 'C'));
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
634 return 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
635 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
636
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 307
diff changeset
637 static int mp3_write_packet(struct AVFormatContext *s, AVPacket *pkt)
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
638 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
639 put_buffer(s->pb, pkt->data, pkt->size);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
640 put_flush_packet(s->pb);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
641 return 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
642 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
643
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
644 static int mp3_write_trailer(struct AVFormatContext *s)
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
645 {
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
646 uint8_t buf[ID3v1_TAG_SIZE];
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
647
2096
85e48ffccf91 cosmetic v1/v2 renaming
benoit
parents: 2090
diff changeset
648 /* write the id3v1 tag */
4355
d8a6a01679be use new metadata API in the mp3 muxer
aurel
parents: 4354
diff changeset
649 if (id3v1_create_tag(s, buf) > 0) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
650 put_buffer(s->pb, buf, ID3v1_TAG_SIZE);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2746
diff changeset
651 put_flush_packet(s->pb);
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
652 }
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
653 return 0;
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
654 }
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4148
diff changeset
655 #endif /* CONFIG_MP2_MUXER || CONFIG_MP3_MUXER */
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
656
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4148
diff changeset
657 #if CONFIG_MP3_DEMUXER
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1107
diff changeset
658 AVInputFormat mp3_demuxer = {
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
659 "mp3",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3289
diff changeset
660 NULL_IF_CONFIG_SMALL("MPEG audio"),
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
661 0,
1107
921c8af78310 probe for mpeg audio
mru
parents: 896
diff changeset
662 mp3_read_probe,
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
663 mp3_read_header,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
664 mp3_read_packet,
1756
5d72afc6c8aa better generic index building and seeking code
michael
parents: 1622
diff changeset
665 .flags= AVFMT_GENERIC_INDEX,
814
731af78f150d .m1v and .m2a (feature req #1178960)
michael
parents: 775
diff changeset
666 .extensions = "mp2,mp3,m2a", /* XXX: use probe */
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
667 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
668 #endif
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4148
diff changeset
669 #if CONFIG_MP2_MUXER
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1107
diff changeset
670 AVOutputFormat mp2_muxer = {
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
671 "mp2",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3289
diff changeset
672 NULL_IF_CONFIG_SMALL("MPEG audio layer 2"),
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
673 "audio/x-mpeg",
814
731af78f150d .m1v and .m2a (feature req #1178960)
michael
parents: 775
diff changeset
674 "mp2,m2a",
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
675 0,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
676 CODEC_ID_MP2,
3289
811c78fac294 Replace some occurrences of 0 with CODEC_ID_NONE.
cehoyos
parents: 3286
diff changeset
677 CODEC_ID_NONE,
2306
d045cbcf37a3 do not write id3v2 header when writing .mp2 files
bcoudurier
parents: 2274
diff changeset
678 NULL,
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
679 mp3_write_packet,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
680 mp3_write_trailer,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
681 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
682 #endif
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4148
diff changeset
683 #if CONFIG_MP3_MUXER
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1107
diff changeset
684 AVOutputFormat mp3_muxer = {
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
685 "mp3",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3289
diff changeset
686 NULL_IF_CONFIG_SMALL("MPEG audio layer 3"),
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
687 "audio/x-mpeg",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
688 "mp3",
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
689 0,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
690 CODEC_ID_MP3,
3289
811c78fac294 Replace some occurrences of 0 with CODEC_ID_NONE.
cehoyos
parents: 3286
diff changeset
691 CODEC_ID_NONE,
234
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
692 mp3_write_header,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
693 mp3_write_packet,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
694 mp3_write_trailer,
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
695 };
b99548e3ab84 ID3 parsing and generation in MP3 format
bellard
parents:
diff changeset
696 #endif