oggparsevorbis: use av_realloc consistently
[ffmpeg.git] / libavformat / oggparsevorbis.c
1 /**
2       Copyright (C) 2005  Michael Ahlberg, Måns Rullgård
3
4       Permission is hereby granted, free of charge, to any person
5       obtaining a copy of this software and associated documentation
6       files (the "Software"), to deal in the Software without
7       restriction, including without limitation the rights to use, copy,
8       modify, merge, publish, distribute, sublicense, and/or sell copies
9       of the Software, and to permit persons to whom the Software is
10       furnished to do so, subject to the following conditions:
11
12       The above copyright notice and this permission notice shall be
13       included in all copies or substantial portions of the Software.
14
15       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16       EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17       MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18       NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19       HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20       WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22       DEALINGS IN THE SOFTWARE.
23 **/
24
25 #include <stdlib.h>
26 #include "libavutil/avstring.h"
27 #include "libavutil/bswap.h"
28 #include "libavutil/dict.h"
29 #include "libavcodec/get_bits.h"
30 #include "libavcodec/bytestream.h"
31 #include "libavcodec/vorbis_parser.h"
32 #include "avformat.h"
33 #include "internal.h"
34 #include "oggdec.h"
35 #include "vorbiscomment.h"
36
37 static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val)
38 {
39     int i, cnum, h, m, s, ms, keylen = strlen(key);
40     AVChapter *chapter = NULL;
41
42     if (keylen < 9 || sscanf(key, "CHAPTER%02d", &cnum) != 1)
43         return 0;
44
45     if (keylen == 9) {
46         if (sscanf(val, "%02d:%02d:%02d.%03d", &h, &m, &s, &ms) < 4)
47             return 0;
48
49         avpriv_new_chapter(as, cnum, (AVRational){1,1000},
50                        ms + 1000*(s + 60*(m + 60*h)),
51                        AV_NOPTS_VALUE, NULL);
52         av_free(val);
53     } else if (!strcmp(key+9, "NAME")) {
54         for(i = 0; i < as->nb_chapters; i++)
55             if (as->chapters[i]->id == cnum) {
56                 chapter = as->chapters[i];
57                 break;
58             }
59         if (!chapter)
60             return 0;
61
62         av_dict_set(&chapter->metadata, "title", val,
63                          AV_DICT_DONT_STRDUP_VAL);
64     } else
65         return 0;
66
67     av_free(key);
68     return 1;
69 }
70
71 int
72 ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, int size)
73 {
74     const uint8_t *p = buf;
75     const uint8_t *end = buf + size;
76     unsigned n, j;
77     int s;
78
79     if (size < 8) /* must have vendor_length and user_comment_list_length */
80         return -1;
81
82     s = bytestream_get_le32(&p);
83
84     if (end - p - 4 < s || s < 0)
85         return -1;
86
87     p += s;
88
89     n = bytestream_get_le32(&p);
90
91     while (end - p >= 4 && n > 0) {
92         const char *t, *v;
93         int tl, vl;
94
95         s = bytestream_get_le32(&p);
96
97         if (end - p < s || s < 0)
98             break;
99
100         t = p;
101         p += s;
102         n--;
103
104         v = memchr(t, '=', s);
105         if (!v)
106             continue;
107
108         tl = v - t;
109         vl = s - tl - 1;
110         v++;
111
112         if (tl && vl) {
113             char *tt, *ct;
114
115             tt = av_malloc(tl + 1);
116             ct = av_malloc(vl + 1);
117             if (!tt || !ct) {
118                 av_freep(&tt);
119                 av_freep(&ct);
120                 av_log(as, AV_LOG_WARNING, "out-of-memory error. skipping VorbisComment tag.\n");
121                 continue;
122             }
123
124             for (j = 0; j < tl; j++)
125                 tt[j] = toupper(t[j]);
126             tt[tl] = 0;
127
128             memcpy(ct, v, vl);
129             ct[vl] = 0;
130
131             if (!ogm_chapter(as, tt, ct))
132                 av_dict_set(m, tt, ct,
133                                    AV_DICT_DONT_STRDUP_KEY |
134                                    AV_DICT_DONT_STRDUP_VAL);
135         }
136     }
137
138     if (p != end)
139         av_log(as, AV_LOG_INFO, "%ti bytes of comment header remain\n", end-p);
140     if (n > 0)
141         av_log(as, AV_LOG_INFO,
142                "truncated comment header, %i comments not found\n", n);
143
144     ff_metadata_conv(m, NULL, ff_vorbiscomment_metadata_conv);
145
146     return 0;
147 }
148
149
150 /** Parse the vorbis header
151  * Vorbis Identification header from Vorbis_I_spec.html#vorbis-spec-codec
152  * [vorbis_version] = read 32 bits as unsigned integer | Not used
153  * [audio_channels] = read 8 bit integer as unsigned | Used
154  * [audio_sample_rate] = read 32 bits as unsigned integer | Used
155  * [bitrate_maximum] = read 32 bits as signed integer | Not used yet
156  * [bitrate_nominal] = read 32 bits as signed integer | Not used yet
157  * [bitrate_minimum] = read 32 bits as signed integer | Used as bitrate
158  * [blocksize_0] = read 4 bits as unsigned integer | Not Used
159  * [blocksize_1] = read 4 bits as unsigned integer | Not Used
160  * [framing_flag] = read one bit | Not Used
161  *    */
162
163 struct oggvorbis_private {
164     unsigned int len[3];
165     unsigned char *packet[3];
166     VorbisParseContext vp;
167     int64_t final_pts;
168     int final_duration;
169 };
170
171
172 static unsigned int
173 fixup_vorbis_headers(AVFormatContext * as, struct oggvorbis_private *priv,
174                      uint8_t **buf)
175 {
176     int i,offset, len, buf_len;
177     unsigned char *ptr;
178
179     len = priv->len[0] + priv->len[1] + priv->len[2];
180     buf_len = len + len/255 + 64;
181     ptr = *buf = av_realloc(NULL, buf_len);
182     memset(*buf, '\0', buf_len);
183
184     ptr[0] = 2;
185     offset = 1;
186     offset += av_xiphlacing(&ptr[offset], priv->len[0]);
187     offset += av_xiphlacing(&ptr[offset], priv->len[1]);
188     for (i = 0; i < 3; i++) {
189         memcpy(&ptr[offset], priv->packet[i], priv->len[i]);
190         offset += priv->len[i];
191         av_freep(&priv->packet[i]);
192     }
193     *buf = av_realloc(*buf, offset + FF_INPUT_BUFFER_PADDING_SIZE);
194     return offset;
195 }
196
197 static void vorbis_cleanup(AVFormatContext *s, int idx)
198 {
199     struct ogg *ogg = s->priv_data;
200     struct ogg_stream *os = ogg->streams + idx;
201     struct oggvorbis_private *priv = os->private;
202     int i;
203     if (os->private)
204         for (i = 0; i < 3; i++)
205             av_freep(&priv->packet[i]);
206 }
207
208 static int
209 vorbis_header (AVFormatContext * s, int idx)
210 {
211     struct ogg *ogg = s->priv_data;
212     struct ogg_stream *os = ogg->streams + idx;
213     AVStream *st = s->streams[idx];
214     struct oggvorbis_private *priv;
215     int pkt_type = os->buf[os->pstart];
216
217     if (!(pkt_type & 1))
218         return os->private ? 0 : -1;
219
220     if (!os->private) {
221         os->private = av_mallocz(sizeof(struct oggvorbis_private));
222         if (!os->private)
223             return -1;
224     }
225
226     if (os->psize < 1 || pkt_type > 5)
227         return -1;
228
229     priv = os->private;
230
231     if (priv->packet[pkt_type>>1])
232         return -1;
233     if (pkt_type > 1 && !priv->packet[0] || pkt_type > 3 && !priv->packet[1])
234         return -1;
235
236     priv->len[pkt_type >> 1] = os->psize;
237     priv->packet[pkt_type >> 1] = av_mallocz(os->psize);
238     if (!priv->packet[pkt_type >> 1])
239         return AVERROR(ENOMEM);
240     memcpy(priv->packet[pkt_type >> 1], os->buf + os->pstart, os->psize);
241     if (os->buf[os->pstart] == 1) {
242         const uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */
243         unsigned blocksize, bs0, bs1;
244         int srate;
245         int channels;
246
247         if (os->psize != 30)
248             return -1;
249
250         if (bytestream_get_le32(&p) != 0) /* vorbis_version */
251             return -1;
252
253         channels= bytestream_get_byte(&p);
254         if (st->codec->channels && channels != st->codec->channels) {
255             av_log(s, AV_LOG_ERROR, "Channel change is not supported\n");
256             return AVERROR_PATCHWELCOME;
257         }
258         st->codec->channels = channels;
259         srate = bytestream_get_le32(&p);
260         p += 4; // skip maximum bitrate
261         st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate
262         p += 4; // skip minimum bitrate
263
264         blocksize = bytestream_get_byte(&p);
265         bs0 = blocksize & 15;
266         bs1 = blocksize >> 4;
267
268         if (bs0 > bs1)
269             return -1;
270         if (bs0 < 6 || bs1 > 13)
271             return -1;
272
273         if (bytestream_get_byte(&p) != 1) /* framing_flag */
274             return -1;
275
276         st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
277         st->codec->codec_id = AV_CODEC_ID_VORBIS;
278
279         if (srate > 0) {
280             st->codec->sample_rate = srate;
281             avpriv_set_pts_info(st, 64, 1, srate);
282         }
283     } else if (os->buf[os->pstart] == 3) {
284         if (os->psize > 8 &&
285             ff_vorbis_comment(s, &st->metadata, os->buf + os->pstart + 7, os->psize - 8) >= 0) {
286             // drop all metadata we parsed and which is not required by libvorbis
287             unsigned new_len = 7 + 4 + AV_RL32(priv->packet[1] + 7) + 4 + 1;
288             if (new_len >= 16 && new_len < os->psize) {
289                 AV_WL32(priv->packet[1] + new_len - 5, 0);
290                 priv->packet[1][new_len - 1] = 1;
291                 priv->len[1] = new_len;
292             }
293         }
294     } else {
295         int ret;
296         st->codec->extradata_size =
297             fixup_vorbis_headers(s, priv, &st->codec->extradata);
298         if ((ret = avpriv_vorbis_parse_extradata(st->codec, &priv->vp))) {
299             av_freep(&st->codec->extradata);
300             st->codec->extradata_size = 0;
301             return ret;
302         }
303     }
304
305     return 1;
306 }
307
308 static int vorbis_packet(AVFormatContext *s, int idx)
309 {
310     struct ogg *ogg = s->priv_data;
311     struct ogg_stream *os = ogg->streams + idx;
312     struct oggvorbis_private *priv = os->private;
313     int duration;
314
315     /* first packet handling
316        here we parse the duration of each packet in the first page and compare
317        the total duration to the page granule to find the encoder delay and
318        set the first timestamp */
319     if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS)) {
320         int seg, d;
321         uint8_t *last_pkt = os->buf + os->pstart;
322         uint8_t *next_pkt = last_pkt;
323
324         avpriv_vorbis_parse_reset(&priv->vp);
325         duration = 0;
326         seg = os->segp;
327         d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1);
328         if (d < 0) {
329             os->pflags |= AV_PKT_FLAG_CORRUPT;
330             return 0;
331         }
332         duration += d;
333         last_pkt = next_pkt =  next_pkt + os->psize;
334         for (; seg < os->nsegs; seg++) {
335             if (os->segments[seg] < 255) {
336                 int d = avpriv_vorbis_parse_frame(&priv->vp, last_pkt, 1);
337                 if (d < 0) {
338                     duration = os->granule;
339                     break;
340                 }
341                 duration += d;
342                 last_pkt = next_pkt + os->segments[seg];
343             }
344             next_pkt += os->segments[seg];
345         }
346         os->lastpts = os->lastdts   = os->granule - duration;
347         if(s->streams[idx]->start_time == AV_NOPTS_VALUE) {
348             s->streams[idx]->start_time = FFMAX(os->lastpts, 0);
349             if (s->streams[idx]->duration)
350                 s->streams[idx]->duration -= s->streams[idx]->start_time;
351         }
352         priv->final_pts             = AV_NOPTS_VALUE;
353         avpriv_vorbis_parse_reset(&priv->vp);
354     }
355
356     /* parse packet duration */
357     if (os->psize > 0) {
358         duration = avpriv_vorbis_parse_frame(&priv->vp, os->buf + os->pstart, 1);
359         if (duration < 0) {
360             os->pflags |= AV_PKT_FLAG_CORRUPT;
361             return 0;
362         }
363         os->pduration = duration;
364     }
365
366     /* final packet handling
367        here we save the pts of the first packet in the final page, sum up all
368        packet durations in the final page except for the last one, and compare
369        to the page granule to find the duration of the final packet */
370     if (os->flags & OGG_FLAG_EOS) {
371         if (os->lastpts != AV_NOPTS_VALUE) {
372             priv->final_pts = os->lastpts;
373             priv->final_duration = 0;
374         }
375         if (os->segp == os->nsegs)
376             os->pduration = os->granule - priv->final_pts - priv->final_duration;
377         priv->final_duration += os->pduration;
378     }
379
380     return 0;
381 }
382
383 const struct ogg_codec ff_vorbis_codec = {
384     .magic = "\001vorbis",
385     .magicsize = 7,
386     .header = vorbis_header,
387     .packet = vorbis_packet,
388     .cleanup= vorbis_cleanup,
389     .nb_header = 3,
390 };