2 * Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
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:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
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.
27 #include "libavutil/avstring.h"
28 #include "libavutil/base64.h"
29 #include "libavutil/bswap.h"
30 #include "libavutil/dict.h"
31 #include "libavcodec/bytestream.h"
32 #include "libavcodec/get_bits.h"
33 #include "libavcodec/vorbis_parser.h"
35 #include "flac_picture.h"
38 #include "vorbiscomment.h"
40 static int ogm_chapter(AVFormatContext
*as
, uint8_t *key
, uint8_t *val
)
42 int i
, cnum
, h
, m
, s
, ms
, keylen
= strlen(key
);
43 AVChapter
*chapter
= NULL
;
45 if (keylen
< 9 || sscanf(key
, "CHAPTER%03d", &cnum
) != 1)
49 if (sscanf(val
, "%02d:%02d:%02d.%03d", &h
, &m
, &s
, &ms
) < 4)
52 avpriv_new_chapter(as
, cnum
, (AVRational
) { 1, 1000 },
53 ms
+ 1000 * (s
+ 60 * (m
+ 60 * h
)),
54 AV_NOPTS_VALUE
, NULL
);
56 } else if (!strcmp(key
+ keylen
- 4, "NAME")) {
57 for (i
= 0; i
< as
->nb_chapters
; i
++)
58 if (as
->chapters
[i
]->id
== cnum
) {
59 chapter
= as
->chapters
[i
];
65 av_dict_set(&chapter
->metadata
, "title", val
, AV_DICT_DONT_STRDUP_VAL
);
73 int ff_vorbis_comment(AVFormatContext
*as
, AVDictionary
**m
,
74 const uint8_t *buf
, int size
)
76 const uint8_t *p
= buf
;
77 const uint8_t *end
= buf
+ size
;
81 /* must have vendor_length and user_comment_list_length */
83 return AVERROR_INVALIDDATA
;
85 s
= bytestream_get_le32(&p
);
87 if (end
- p
- 4 < s
|| s
< 0)
88 return AVERROR_INVALIDDATA
;
92 n
= bytestream_get_le32(&p
);
94 while (end
- p
>= 4 && n
> 0) {
98 s
= bytestream_get_le32(&p
);
100 if (end
- p
< s
|| s
< 0)
107 v
= memchr(t
, '=', s
);
118 tt
= av_malloc(tl
+ 1);
119 ct
= av_malloc(vl
+ 1);
123 return AVERROR(ENOMEM
);
126 for (j
= 0; j
< tl
; j
++)
127 tt
[j
] = av_toupper(t
[j
]);
133 /* The format in which the pictures are stored is the FLAC format.
134 * Xiph says: "The binary FLAC picture structure is base64 encoded
135 * and placed within a VorbisComment with the tag name
136 * 'METADATA_BLOCK_PICTURE'. This is the preferred and
137 * recommended way of embedding cover art within VorbisComments."
139 if (!strcmp(tt
, "METADATA_BLOCK_PICTURE")) {
141 char *pict
= av_malloc(vl
);
146 return AVERROR(ENOMEM
);
148 if ((ret
= av_base64_decode(pict
, ct
, vl
)) > 0)
149 ret
= ff_flac_parse_picture(as
, pict
, ret
);
154 av_log(as
, AV_LOG_WARNING
, "Failed to parse cover art block.\n");
157 } else if (!ogm_chapter(as
, tt
, ct
))
158 av_dict_set(m
, tt
, ct
,
159 AV_DICT_DONT_STRDUP_KEY
|
160 AV_DICT_DONT_STRDUP_VAL
);
165 av_log(as
, AV_LOG_INFO
,
166 "%ti bytes of comment header remain\n", end
- p
);
168 av_log(as
, AV_LOG_INFO
,
169 "truncated comment header, %i comments not found\n", n
);
171 ff_metadata_conv(m
, NULL
, ff_vorbiscomment_metadata_conv
);
177 * Parse the vorbis header
179 * Vorbis Identification header from Vorbis_I_spec.html#vorbis-spec-codec
180 * [vorbis_version] = read 32 bits as unsigned integer | Not used
181 * [audio_channels] = read 8 bit integer as unsigned | Used
182 * [audio_sample_rate] = read 32 bits as unsigned integer | Used
183 * [bitrate_maximum] = read 32 bits as signed integer | Not used yet
184 * [bitrate_nominal] = read 32 bits as signed integer | Not used yet
185 * [bitrate_minimum] = read 32 bits as signed integer | Used as bitrate
186 * [blocksize_0] = read 4 bits as unsigned integer | Not Used
187 * [blocksize_1] = read 4 bits as unsigned integer | Not Used
188 * [framing_flag] = read one bit | Not Used
191 struct oggvorbis_private
{
193 unsigned char *packet
[3];
194 VorbisParseContext vp
;
199 static int fixup_vorbis_headers(AVFormatContext
*as
,
200 struct oggvorbis_private
*priv
,
203 int i
, offset
, len
, err
;
206 len
= priv
->len
[0] + priv
->len
[1] + priv
->len
[2];
207 ptr
= *buf
= av_mallocz(len
+ len
/ 255 + 64);
209 return AVERROR(ENOMEM
);
213 offset
+= av_xiphlacing(&ptr
[offset
], priv
->len
[0]);
214 offset
+= av_xiphlacing(&ptr
[offset
], priv
->len
[1]);
215 for (i
= 0; i
< 3; i
++) {
216 memcpy(&ptr
[offset
], priv
->packet
[i
], priv
->len
[i
]);
217 offset
+= priv
->len
[i
];
218 av_freep(&priv
->packet
[i
]);
220 if ((err
= av_reallocp(buf
, offset
+ FF_INPUT_BUFFER_PADDING_SIZE
)) < 0)
225 static void vorbis_cleanup(AVFormatContext
*s
, int idx
)
227 struct ogg
*ogg
= s
->priv_data
;
228 struct ogg_stream
*os
= ogg
->streams
+ idx
;
229 struct oggvorbis_private
*priv
= os
->private;
232 for (i
= 0; i
< 3; i
++)
233 av_freep(&priv
->packet
[i
]);
236 static int vorbis_header(AVFormatContext
*s
, int idx
)
238 struct ogg
*ogg
= s
->priv_data
;
239 AVStream
*st
= s
->streams
[idx
];
240 struct ogg_stream
*os
= ogg
->streams
+ idx
;
241 struct oggvorbis_private
*priv
;
242 int pkt_type
= os
->buf
[os
->pstart
];
245 os
->private = av_mallocz(sizeof(struct oggvorbis_private
));
247 return AVERROR(ENOMEM
);
253 if (os
->psize
< 1 || pkt_type
> 5)
254 return AVERROR_INVALIDDATA
;
258 if (priv
->packet
[pkt_type
>> 1])
259 return AVERROR_INVALIDDATA
;
260 if (pkt_type
> 1 && !priv
->packet
[0] || pkt_type
> 3 && !priv
->packet
[1])
261 return AVERROR_INVALIDDATA
;
263 priv
->len
[pkt_type
>> 1] = os
->psize
;
264 priv
->packet
[pkt_type
>> 1] = av_mallocz(os
->psize
);
265 if (!priv
->packet
[pkt_type
>> 1])
266 return AVERROR(ENOMEM
);
267 memcpy(priv
->packet
[pkt_type
>> 1], os
->buf
+ os
->pstart
, os
->psize
);
268 if (os
->buf
[os
->pstart
] == 1) {
269 const uint8_t *p
= os
->buf
+ os
->pstart
+ 7; /* skip "\001vorbis" tag */
270 unsigned blocksize
, bs0
, bs1
;
274 return AVERROR_INVALIDDATA
;
276 if (bytestream_get_le32(&p
) != 0) /* vorbis_version */
277 return AVERROR_INVALIDDATA
;
279 st
->codec
->channels
= bytestream_get_byte(&p
);
280 srate
= bytestream_get_le32(&p
);
281 p
+= 4; // skip maximum bitrate
282 st
->codec
->bit_rate
= bytestream_get_le32(&p
); // nominal bitrate
283 p
+= 4; // skip minimum bitrate
285 blocksize
= bytestream_get_byte(&p
);
286 bs0
= blocksize
& 15;
287 bs1
= blocksize
>> 4;
290 return AVERROR_INVALIDDATA
;
291 if (bs0
< 6 || bs1
> 13)
292 return AVERROR_INVALIDDATA
;
294 if (bytestream_get_byte(&p
) != 1) /* framing_flag */
295 return AVERROR_INVALIDDATA
;
297 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
298 st
->codec
->codec_id
= AV_CODEC_ID_VORBIS
;
301 st
->codec
->sample_rate
= srate
;
302 avpriv_set_pts_info(st
, 64, 1, srate
);
304 } else if (os
->buf
[os
->pstart
] == 3) {
306 ff_vorbis_comment(s
, &st
->metadata
, os
->buf
+ os
->pstart
+ 7,
307 os
->psize
- 8) >= 0) {
308 // drop all metadata we parsed and which is not required by libvorbis
309 unsigned new_len
= 7 + 4 + AV_RL32(priv
->packet
[1] + 7) + 4 + 1;
310 if (new_len
>= 16 && new_len
< os
->psize
) {
311 AV_WL32(priv
->packet
[1] + new_len
- 5, 0);
312 priv
->packet
[1][new_len
- 1] = 1;
313 priv
->len
[1] = new_len
;
317 int ret
= fixup_vorbis_headers(s
, priv
, &st
->codec
->extradata
);
319 st
->codec
->extradata_size
= 0;
322 st
->codec
->extradata_size
= ret
;
323 if ((ret
= avpriv_vorbis_parse_extradata(st
->codec
, &priv
->vp
))) {
324 av_freep(&st
->codec
->extradata
);
325 st
->codec
->extradata_size
= 0;
333 static int vorbis_packet(AVFormatContext
*s
, int idx
)
335 struct ogg
*ogg
= s
->priv_data
;
336 struct ogg_stream
*os
= ogg
->streams
+ idx
;
337 struct oggvorbis_private
*priv
= os
->private;
340 /* first packet handling
341 * here we parse the duration of each packet in the first page and compare
342 * the total duration to the page granule to find the encoder delay and
343 * set the first timestamp */
346 uint8_t *last_pkt
= os
->buf
+ os
->pstart
;
347 uint8_t *next_pkt
= last_pkt
;
348 int first_duration
= 0;
350 avpriv_vorbis_parse_reset(&priv
->vp
);
352 for (seg
= 0; seg
< os
->nsegs
; seg
++) {
353 if (os
->segments
[seg
] < 255) {
354 int d
= avpriv_vorbis_parse_frame(&priv
->vp
, last_pkt
, 1);
356 duration
= os
->granule
;
362 last_pkt
= next_pkt
+ os
->segments
[seg
];
364 next_pkt
+= os
->segments
[seg
];
367 os
->lastdts
= os
->granule
- duration
;
368 s
->streams
[idx
]->start_time
= os
->lastpts
+ first_duration
;
369 if (s
->streams
[idx
]->duration
)
370 s
->streams
[idx
]->duration
-= s
->streams
[idx
]->start_time
;
371 s
->streams
[idx
]->cur_dts
= AV_NOPTS_VALUE
;
372 priv
->final_pts
= AV_NOPTS_VALUE
;
373 avpriv_vorbis_parse_reset(&priv
->vp
);
376 /* parse packet duration */
378 duration
= avpriv_vorbis_parse_frame(&priv
->vp
, os
->buf
+ os
->pstart
, 1);
380 os
->pflags
|= AV_PKT_FLAG_CORRUPT
;
383 os
->pduration
= duration
;
386 /* final packet handling
387 * here we save the pts of the first packet in the final page, sum up all
388 * packet durations in the final page except for the last one, and compare
389 * to the page granule to find the duration of the final packet */
390 if (os
->flags
& OGG_FLAG_EOS
) {
391 if (os
->lastpts
!= AV_NOPTS_VALUE
) {
392 priv
->final_pts
= os
->lastpts
;
393 priv
->final_duration
= 0;
395 if (os
->segp
== os
->nsegs
)
396 os
->pduration
= os
->granule
- priv
->final_pts
- priv
->final_duration
;
397 priv
->final_duration
+= os
->pduration
;
403 const struct ogg_codec ff_vorbis_codec
= {
404 .magic
= "\001vorbis",
406 .header
= vorbis_header
,
407 .packet
= vorbis_packet
,
408 .cleanup
= vorbis_cleanup
,