1/*
2 * Copyright (c) 2012 Justin Ruggles
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21/**
22 * @file
23 * Vorbis audio parser
24 *
25 * Determines the duration for each packet.
26 */
27
28#include "config_components.h"
29
30#include "libavutil/log.h"
31
32#include "get_bits.h"
33#include "parser.h"
34#include "xiph.h"
35#include "vorbis_parser_internal.h"
36
37static const AVClass vorbis_parser_class = {
38    .class_name = "Vorbis parser",
39    .item_name  = av_default_item_name,
40    .version    = LIBAVUTIL_VERSION_INT,
41};
42
43static int parse_id_header(AVVorbisParseContext *s,
44                           const uint8_t *buf, int buf_size)
45{
46    /* Id header should be 30 bytes */
47    if (buf_size < 30) {
48        av_log(s, AV_LOG_ERROR, "Id header is too short\n");
49        return AVERROR_INVALIDDATA;
50    }
51
52    /* make sure this is the Id header */
53    if (buf[0] != 1) {
54        av_log(s, AV_LOG_ERROR, "Wrong packet type in Id header\n");
55        return AVERROR_INVALIDDATA;
56    }
57
58    /* check for header signature */
59    if (memcmp(&buf[1], "vorbis", 6)) {
60        av_log(s, AV_LOG_ERROR, "Invalid packet signature in Id header\n");
61        return AVERROR_INVALIDDATA;
62    }
63
64    if (!(buf[29] & 0x1)) {
65        av_log(s, AV_LOG_ERROR, "Invalid framing bit in Id header\n");
66        return AVERROR_INVALIDDATA;
67    }
68
69    s->blocksize[0] = 1 << (buf[28] & 0xF);
70    s->blocksize[1] = 1 << (buf[28] >>  4);
71
72    return 0;
73}
74
75static int parse_setup_header(AVVorbisParseContext *s,
76                              const uint8_t *buf, int buf_size)
77{
78    GetBitContext gb, gb0;
79    uint8_t *rev_buf;
80    int i, ret = 0;
81    int got_framing_bit, mode_count, got_mode_header, last_mode_count = 0;
82
83    /* avoid overread */
84    if (buf_size < 7) {
85        av_log(s, AV_LOG_ERROR, "Setup header is too short\n");
86        return AVERROR_INVALIDDATA;
87    }
88
89    /* make sure this is the Setup header */
90    if (buf[0] != 5) {
91        av_log(s, AV_LOG_ERROR, "Wrong packet type in Setup header\n");
92        return AVERROR_INVALIDDATA;
93    }
94
95    /* check for header signature */
96    if (memcmp(&buf[1], "vorbis", 6)) {
97        av_log(s, AV_LOG_ERROR, "Invalid packet signature in Setup header\n");
98        return AVERROR_INVALIDDATA;
99    }
100
101    /* reverse bytes so we can easily read backwards with get_bits() */
102    if (!(rev_buf = av_malloc(buf_size))) {
103        av_log(s, AV_LOG_ERROR, "Out of memory\n");
104        return AVERROR(ENOMEM);
105    }
106    for (i = 0; i < buf_size; i++)
107        rev_buf[i] = buf[buf_size - 1 - i];
108    init_get_bits(&gb, rev_buf, buf_size * 8);
109
110    got_framing_bit = 0;
111    while (get_bits_left(&gb) > 97) {
112        if (get_bits1(&gb)) {
113            got_framing_bit = get_bits_count(&gb);
114            break;
115        }
116    }
117    if (!got_framing_bit) {
118        av_log(s, AV_LOG_ERROR, "Invalid Setup header\n");
119        ret = AVERROR_INVALIDDATA;
120        goto bad_header;
121    }
122
123    /* Now we search backwards to find possible valid mode counts. This is not
124     * fool-proof because we could have false positive matches and read too
125     * far, but there isn't really any way to be sure without parsing through
126     * all the many variable-sized fields before the modes. This approach seems
127     * to work well in testing, and it is similar to how it is handled in
128     * liboggz. */
129    mode_count = 0;
130    got_mode_header = 0;
131    while (get_bits_left(&gb) >= 97) {
132        if (get_bits(&gb, 8) > 63 || get_bits(&gb, 16) || get_bits(&gb, 16))
133            break;
134        skip_bits(&gb, 1);
135        mode_count++;
136        if (mode_count > 64)
137            break;
138        gb0 = gb;
139        if (get_bits(&gb0, 6) + 1 == mode_count) {
140            got_mode_header = 1;
141            last_mode_count = mode_count;
142        }
143    }
144    if (!got_mode_header) {
145        av_log(s, AV_LOG_ERROR, "Invalid Setup header\n");
146        ret = AVERROR_INVALIDDATA;
147        goto bad_header;
148    }
149    /* All samples I've seen use <= 2 modes, so ask for a sample if we find
150     * more than that, as it is most likely a false positive. If we get any
151     * we may need to approach this the long way and parse the whole Setup
152     * header, but I hope very much that it never comes to that. */
153    if (last_mode_count > 2) {
154        avpriv_request_sample(s,
155                              "%d modes (either a false positive or a "
156                              "sample from an unknown encoder)",
157                              last_mode_count);
158    }
159    /* We're limiting the mode count to 63 so that we know that the previous
160     * block flag will be in the first packet byte. */
161    if (last_mode_count > 63) {
162        av_log(s, AV_LOG_ERROR, "Unsupported mode count: %d\n",
163               last_mode_count);
164        ret = AVERROR_INVALIDDATA;
165        goto bad_header;
166    }
167    s->mode_count = mode_count = last_mode_count;
168    /* Determine the number of bits required to code the mode and turn that
169     * into a bitmask to directly access the mode from the first frame byte. */
170    s->mode_mask = ((1 << (av_log2(mode_count - 1) + 1)) - 1) << 1;
171    /* The previous window flag is the next bit after the mode */
172    s->prev_mask = (s->mode_mask | 0x1) + 1;
173
174    init_get_bits(&gb, rev_buf, buf_size * 8);
175    skip_bits_long(&gb, got_framing_bit);
176    for (i = mode_count - 1; i >= 0; i--) {
177        skip_bits_long(&gb, 40);
178        s->mode_blocksize[i] = get_bits1(&gb);
179    }
180
181bad_header:
182    av_free(rev_buf);
183    return ret;
184}
185
186static int vorbis_parse_init(AVVorbisParseContext *s,
187                             const uint8_t *extradata, int extradata_size)
188{
189    const uint8_t *header_start[3];
190    int header_len[3];
191    int ret;
192
193    s->class = &vorbis_parser_class;
194    s->extradata_parsed = 1;
195
196    if ((ret = avpriv_split_xiph_headers(extradata,
197                                         extradata_size, 30,
198                                         header_start, header_len)) < 0) {
199        av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
200        return ret;
201    }
202
203    if ((ret = parse_id_header(s, header_start[0], header_len[0])) < 0)
204        return ret;
205
206    if ((ret = parse_setup_header(s, header_start[2], header_len[2])) < 0)
207        return ret;
208
209    s->valid_extradata = 1;
210    s->previous_blocksize = s->blocksize[s->mode_blocksize[0]];
211
212    return 0;
213}
214
215int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf,
216                                int buf_size, int *flags)
217{
218    int duration = 0;
219
220    if (s->valid_extradata && buf_size > 0) {
221        int mode, current_blocksize;
222        int previous_blocksize = s->previous_blocksize;
223
224        if (buf[0] & 1) {
225            /* If the user doesn't care about special packets, it's a bad one. */
226            if (!flags)
227                goto bad_packet;
228
229            /* Set the flag for which kind of special packet it is. */
230            if (buf[0] == 1)
231                *flags |= VORBIS_FLAG_HEADER;
232            else if (buf[0] == 3)
233                *flags |= VORBIS_FLAG_COMMENT;
234            else if (buf[0] == 5)
235                *flags |= VORBIS_FLAG_SETUP;
236            else
237                goto bad_packet;
238
239            /* Special packets have no duration. */
240            return 0;
241
242bad_packet:
243            av_log(s, AV_LOG_ERROR, "Invalid packet\n");
244            return AVERROR_INVALIDDATA;
245        }
246        if (s->mode_count == 1)
247            mode = 0;
248        else
249            mode = (buf[0] & s->mode_mask) >> 1;
250        if (mode >= s->mode_count) {
251            av_log(s, AV_LOG_ERROR, "Invalid mode in packet\n");
252            return AVERROR_INVALIDDATA;
253        }
254        if(s->mode_blocksize[mode]){
255            int flag = !!(buf[0] & s->prev_mask);
256            previous_blocksize = s->blocksize[flag];
257        }
258        current_blocksize     = s->blocksize[s->mode_blocksize[mode]];
259        duration              = (previous_blocksize + current_blocksize) >> 2;
260        s->previous_blocksize = current_blocksize;
261    }
262
263    return duration;
264}
265
266int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf,
267                          int buf_size)
268{
269    return av_vorbis_parse_frame_flags(s, buf, buf_size, NULL);
270}
271
272void av_vorbis_parse_reset(AVVorbisParseContext *s)
273{
274    if (s->valid_extradata)
275        s->previous_blocksize = s->blocksize[0];
276}
277
278void av_vorbis_parse_free(AVVorbisParseContext **s)
279{
280    av_freep(s);
281}
282
283AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata,
284                                           int extradata_size)
285{
286    AVVorbisParseContext *s = av_mallocz(sizeof(*s));
287    int ret;
288
289    if (!s)
290        return NULL;
291
292    ret = vorbis_parse_init(s, extradata, extradata_size);
293    if (ret < 0) {
294        av_vorbis_parse_free(&s);
295        return NULL;
296    }
297
298    return s;
299}
300
301#if CONFIG_VORBIS_PARSER
302
303typedef struct VorbisParseContext {
304    AVVorbisParseContext *vp;
305} VorbisParseContext;
306
307static int vorbis_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
308                        const uint8_t **poutbuf, int *poutbuf_size,
309                        const uint8_t *buf, int buf_size)
310{
311    VorbisParseContext *s = s1->priv_data;
312    int duration;
313
314    if (!s->vp && avctx->extradata && avctx->extradata_size) {
315        s->vp = av_vorbis_parse_init(avctx->extradata, avctx->extradata_size);
316    }
317    if (!s->vp)
318        goto end;
319
320    if ((duration = av_vorbis_parse_frame(s->vp, buf, buf_size)) >= 0)
321        s1->duration = duration;
322
323end:
324    /* always return the full packet. this parser isn't doing any splitting or
325       combining, only packet analysis */
326    *poutbuf      = buf;
327    *poutbuf_size = buf_size;
328    return buf_size;
329}
330
331static void vorbis_parser_close(AVCodecParserContext *ctx)
332{
333    VorbisParseContext *s = ctx->priv_data;
334    av_vorbis_parse_free(&s->vp);
335}
336
337const AVCodecParser ff_vorbis_parser = {
338    .codec_ids      = { AV_CODEC_ID_VORBIS },
339    .priv_data_size = sizeof(VorbisParseContext),
340    .parser_parse   = vorbis_parse,
341    .parser_close   = vorbis_parser_close,
342};
343#endif /* CONFIG_VORBIS_PARSER */
344