~ubuntu-branches/ubuntu/jaunty/xvidcap/jaunty-proposed

« back to all changes in this revision

Viewing changes to ffmpeg/libavformat/oggparseflac.c

  • Committer: Bazaar Package Importer
  • Author(s): John Dong
  • Date: 2008-02-25 15:47:12 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080225154712-qvr11ekcea4c9ry8
Tags: 1.1.6-0.1ubuntu1
* Merge from debian-multimedia (LP: #120003), Ubuntu Changes:
 - For ffmpeg-related build-deps, remove cvs from package names.
 - Standards-Version 3.7.3
 - Maintainer Spec

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *    Copyright (C) 2005  Matthieu CASTET
 
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
#include <stdlib.h>
 
22
#include "avformat.h"
 
23
#include "bitstream.h"
 
24
#include "ogg2.h"
 
25
 
 
26
#define FLAC_STREAMINFO_SIZE 0x22
 
27
 
 
28
static int
 
29
flac_header (AVFormatContext * s, int idx)
 
30
{
 
31
    ogg_t *ogg = s->priv_data;
 
32
    ogg_stream_t *os = ogg->streams + idx;
 
33
    AVStream *st = s->streams[idx];
 
34
    GetBitContext gb;
 
35
    int mdt;
 
36
 
 
37
    if (os->buf[os->pstart] == 0xff)
 
38
        return 0;
 
39
 
 
40
    init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
 
41
    get_bits(&gb, 1); /* metadata_last */
 
42
    mdt = get_bits(&gb, 7);
 
43
 
 
44
    if (mdt == 0x7f) {
 
45
        skip_bits(&gb, 4*8); /* "FLAC" */
 
46
        if(get_bits(&gb, 8) != 1) /* unsupported major version */
 
47
            return -1;
 
48
        skip_bits(&gb, 8 + 16);      /* minor version + header count */
 
49
        skip_bits(&gb, 4*8); /* "fLaC" */
 
50
 
 
51
        /* METADATA_BLOCK_HEADER */
 
52
        if (get_bits(&gb, 32) != FLAC_STREAMINFO_SIZE)
 
53
            return -1;
 
54
 
 
55
        skip_bits(&gb, 16*2+24*2);
 
56
 
 
57
        st->codec->sample_rate = get_bits_long(&gb, 20);
 
58
        st->codec->channels = get_bits(&gb, 3) + 1;
 
59
 
 
60
        st->codec->codec_type = CODEC_TYPE_AUDIO;
 
61
        st->codec->codec_id = CODEC_ID_FLAC;
 
62
 
 
63
        st->codec->extradata =
 
64
            av_malloc(FLAC_STREAMINFO_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
 
65
        memcpy (st->codec->extradata, os->buf + os->pstart + 5 + 4 + 4 + 4,
 
66
                FLAC_STREAMINFO_SIZE);
 
67
        st->codec->extradata_size = FLAC_STREAMINFO_SIZE;
 
68
 
 
69
        st->time_base.num = 1;
 
70
        st->time_base.den = st->codec->sample_rate;
 
71
    } else if (mdt == 4) {
 
72
        vorbis_comment (s, os->buf + os->pstart + 4, os->psize - 4);
 
73
    }
 
74
 
 
75
    return 1;
 
76
}
 
77
 
 
78
ogg_codec_t flac_codec = {
 
79
    .magic = "\177FLAC",
 
80
    .magicsize = 5,
 
81
    .header = flac_header
 
82
};