diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index 48f5f8183e..da35ff2511 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -1,34 +1,35 @@ -/** - Copyright (C) 2005 Michael Ahlberg, Måns Rullgård - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -**/ +/* + * Copyright (C) 2005 Michael Ahlberg, Måns Rullgård + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ #include + #include "libavutil/avstring.h" #include "libavutil/base64.h" #include "libavutil/bswap.h" #include "libavutil/dict.h" -#include "libavcodec/get_bits.h" #include "libavcodec/bytestream.h" +#include "libavcodec/get_bits.h" #include "libavcodec/vorbis_parser.h" #include "avformat.h" #include "flacdec.h" @@ -48,12 +49,12 @@ static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) if (sscanf(val, "%02d:%02d:%02d.%03d", &h, &m, &s, &ms) < 4) return 0; - avpriv_new_chapter(as, cnum, (AVRational){1,1000}, - ms + 1000*(s + 60*(m + 60*h)), - AV_NOPTS_VALUE, NULL); + avpriv_new_chapter(as, cnum, (AVRational) { 1, 1000 }, + ms + 1000 * (s + 60 * (m + 60 * h)), + AV_NOPTS_VALUE, NULL); av_free(val); - } else if (!strcmp(key+(keylen-4), "NAME")) { - for(i = 0; i < as->nb_chapters; i++) + } else if (!strcmp(key + (keylen - 4), "NAME")) { + for (i = 0; i < as->nb_chapters; i++) if (as->chapters[i]->id == cnum) { chapter = as->chapters[i]; break; @@ -61,8 +62,7 @@ static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) if (!chapter) return 0; - av_dict_set(&chapter->metadata, "title", val, - AV_DICT_DONT_STRDUP_VAL); + av_dict_set(&chapter->metadata, "title", val, AV_DICT_DONT_STRDUP_VAL); } else return 0; @@ -70,15 +70,16 @@ static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) return 1; } -int -ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, int size) +int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m, + const uint8_t *buf, int size) { - const uint8_t *p = buf; + const uint8_t *p = buf; const uint8_t *end = buf + size; unsigned n, j; int s; - if (size < 8) /* must have vendor_length and user_comment_list_length */ + /* must have vendor_length and user_comment_list_length */ + if (size < 8) return -1; s = bytestream_get_le32(&p); @@ -99,7 +100,7 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in if (end - p < s || s < 0) break; - t = p; + t = p; p += s; n--; @@ -119,7 +120,8 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in if (!tt || !ct) { av_freep(&tt); av_freep(&ct); - av_log(as, AV_LOG_WARNING, "out-of-memory error. skipping VorbisComment tag.\n"); + av_log(as, AV_LOG_WARNING, + "out-of-memory error. skipping VorbisComment tag.\n"); continue; } @@ -151,13 +153,14 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in } } else if (!ogm_chapter(as, tt, ct)) av_dict_set(m, tt, ct, - AV_DICT_DONT_STRDUP_KEY | - AV_DICT_DONT_STRDUP_VAL); + AV_DICT_DONT_STRDUP_KEY | + AV_DICT_DONT_STRDUP_VAL); } } if (p != end) - av_log(as, AV_LOG_INFO, "%ti bytes of comment header remain\n", end-p); + av_log(as, AV_LOG_INFO, + "%ti bytes of comment header remain\n", end - p); if (n > 0) av_log(as, AV_LOG_INFO, "truncated comment header, %i comments not found\n", n); @@ -167,8 +170,9 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in return 0; } - -/** Parse the vorbis header +/* + * Parse the vorbis header + * * Vorbis Identification header from Vorbis_I_spec.html#vorbis-spec-codec * [vorbis_version] = read 32 bits as unsigned integer | Not used * [audio_channels] = read 8 bit integer as unsigned | Used @@ -179,7 +183,7 @@ ff_vorbis_comment(AVFormatContext * as, AVDictionary **m, const uint8_t *buf, in * [blocksize_0] = read 4 bits as unsigned integer | Not Used * [blocksize_1] = read 4 bits as unsigned integer | Not Used * [framing_flag] = read one bit | Not Used - * */ + */ struct oggvorbis_private { unsigned int len[3]; @@ -189,24 +193,23 @@ struct oggvorbis_private { int final_duration; }; - -static unsigned int -fixup_vorbis_headers(AVFormatContext * as, struct oggvorbis_private *priv, - uint8_t **buf) +static unsigned int fixup_vorbis_headers(AVFormatContext *as, + struct oggvorbis_private *priv, + uint8_t **buf) { int i, offset, len, err; int buf_len; unsigned char *ptr; len = priv->len[0] + priv->len[1] + priv->len[2]; - buf_len = len + len/255 + 64; + buf_len = len + len / 255 + 64; ptr = *buf = av_realloc(NULL, buf_len); if (!*buf) return 0; memset(*buf, '\0', buf_len); - ptr[0] = 2; - offset = 1; + ptr[0] = 2; + offset = 1; offset += av_xiphlacing(&ptr[offset], priv->len[0]); offset += av_xiphlacing(&ptr[offset], priv->len[1]); for (i = 0; i < 3; i++) { @@ -230,12 +233,11 @@ static void vorbis_cleanup(AVFormatContext *s, int idx) av_freep(&priv->packet[i]); } -static int -vorbis_header (AVFormatContext * s, int idx) +static int vorbis_header(AVFormatContext *s, int idx) { struct ogg *ogg = s->priv_data; + AVStream *st = s->streams[idx]; struct ogg_stream *os = ogg->streams + idx; - AVStream *st = s->streams[idx]; struct oggvorbis_private *priv; int pkt_type = os->buf[os->pstart]; @@ -253,12 +255,12 @@ vorbis_header (AVFormatContext * s, int idx) priv = os->private; - if (priv->packet[pkt_type>>1]) + if (priv->packet[pkt_type >> 1]) return -1; if (pkt_type > 1 && !priv->packet[0] || pkt_type > 3 && !priv->packet[1]) return -1; - priv->len[pkt_type >> 1] = os->psize; + priv->len[pkt_type >> 1] = os->psize; priv->packet[pkt_type >> 1] = av_mallocz(os->psize); if (!priv->packet[pkt_type >> 1]) return AVERROR(ENOMEM); @@ -275,20 +277,20 @@ vorbis_header (AVFormatContext * s, int idx) if (bytestream_get_le32(&p) != 0) /* vorbis_version */ return -1; - channels= bytestream_get_byte(&p); + channels = bytestream_get_byte(&p); if (st->codec->channels && channels != st->codec->channels) { av_log(s, AV_LOG_ERROR, "Channel change is not supported\n"); return AVERROR_PATCHWELCOME; } st->codec->channels = channels; - srate = bytestream_get_le32(&p); + srate = bytestream_get_le32(&p); p += 4; // skip maximum bitrate st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate p += 4; // skip minimum bitrate blocksize = bytestream_get_byte(&p); - bs0 = blocksize & 15; - bs1 = blocksize >> 4; + bs0 = blocksize & 15; + bs1 = blocksize >> 4; if (bs0 > bs1) return -1; @@ -299,7 +301,7 @@ vorbis_header (AVFormatContext * s, int idx) return -1; st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - st->codec->codec_id = AV_CODEC_ID_VORBIS; + st->codec->codec_id = AV_CODEC_ID_VORBIS; if (srate > 0) { st->codec->sample_rate = srate; @@ -307,13 +309,14 @@ vorbis_header (AVFormatContext * s, int idx) } } else if (os->buf[os->pstart] == 3) { if (os->psize > 8 && - ff_vorbis_comment(s, &st->metadata, os->buf + os->pstart + 7, os->psize - 8) >= 0) { + ff_vorbis_comment(s, &st->metadata, os->buf + os->pstart + 7, + os->psize - 8) >= 0) { // drop all metadata we parsed and which is not required by libvorbis unsigned new_len = 7 + 4 + AV_RL32(priv->packet[1] + 7) + 4 + 1; if (new_len >= 16 && new_len < os->psize) { AV_WL32(priv->packet[1] + new_len - 5, 0); priv->packet[1][new_len - 1] = 1; - priv->len[1] = new_len; + priv->len[1] = new_len; } } } else { @@ -341,13 +344,13 @@ static int vorbis_packet(AVFormatContext *s, int idx) int duration; /* first packet handling - here we parse the duration of each packet in the first page and compare - the total duration to the page granule to find the encoder delay and - set the first timestamp */ + * here we parse the duration of each packet in the first page and compare + * the total duration to the page granule to find the encoder delay and + * set the first timestamp */ if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS)) { int seg, d; - uint8_t *last_pkt = os->buf + os->pstart; - uint8_t *next_pkt = last_pkt; + uint8_t *last_pkt = os->buf + os->pstart; + uint8_t *next_pkt = last_pkt; avpriv_vorbis_parse_reset(&priv->vp); duration = 0; @@ -367,17 +370,18 @@ static int vorbis_packet(AVFormatContext *s, int idx) break; } duration += d; - last_pkt = next_pkt + os->segments[seg]; + last_pkt = next_pkt + os->segments[seg]; } next_pkt += os->segments[seg]; } - os->lastpts = os->lastdts = os->granule - duration; - if(s->streams[idx]->start_time == AV_NOPTS_VALUE) { + os->lastpts = + os->lastdts = os->granule - duration; + if (s->streams[idx]->start_time == AV_NOPTS_VALUE) { s->streams[idx]->start_time = FFMAX(os->lastpts, 0); if (s->streams[idx]->duration) s->streams[idx]->duration -= s->streams[idx]->start_time; } - priv->final_pts = AV_NOPTS_VALUE; + priv->final_pts = AV_NOPTS_VALUE; avpriv_vorbis_parse_reset(&priv->vp); } @@ -392,12 +396,12 @@ static int vorbis_packet(AVFormatContext *s, int idx) } /* final packet handling - here we save the pts of the first packet in the final page, sum up all - packet durations in the final page except for the last one, and compare - to the page granule to find the duration of the final packet */ + * here we save the pts of the first packet in the final page, sum up all + * packet durations in the final page except for the last one, and compare + * to the page granule to find the duration of the final packet */ if (os->flags & OGG_FLAG_EOS) { if (os->lastpts != AV_NOPTS_VALUE) { - priv->final_pts = os->lastpts; + priv->final_pts = os->lastpts; priv->final_duration = 0; } if (os->segp == os->nsegs) @@ -409,10 +413,10 @@ static int vorbis_packet(AVFormatContext *s, int idx) } const struct ogg_codec ff_vorbis_codec = { - .magic = "\001vorbis", + .magic = "\001vorbis", .magicsize = 7, - .header = vorbis_header, - .packet = vorbis_packet, - .cleanup= vorbis_cleanup, + .header = vorbis_header, + .packet = vorbis_packet, + .cleanup = vorbis_cleanup, .nb_header = 3, };