ffmpeg / libavformat / oggparseflac.c @ a351110e
History | View | Annotate | Download (2.91 KB)
1 | bcfc40ae | Måns Rullgård | /*
|
---|---|---|---|
2 | * Copyright (C) 2005 Matthieu CASTET
|
||
3 | 115329f1 | Diego Biurrun | *
|
4 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
5 | *
|
||
6 | * FFmpeg is free software; you can redistribute it and/or
|
||
7 | bcfc40ae | Måns Rullgård | * modify it under the terms of the GNU Lesser General Public
|
8 | * License as published by the Free Software Foundation; either
|
||
9 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
10 | bcfc40ae | Måns Rullgård | *
|
11 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
12 | bcfc40ae | Måns Rullgård | * 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 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
18 | 5509bffa | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | bcfc40ae | Måns Rullgård | */
|
20 | |||
21 | #include <stdlib.h> |
||
22 | 9106a698 | Stefano Sabatini | #include "libavcodec/get_bits.h" |
23 | 7fa9a0a2 | Justin Ruggles | #include "libavcodec/flac.h" |
24 | bcfc40ae | Måns Rullgård | #include "avformat.h" |
25 | a0ddef24 | Diego Biurrun | #include "oggdec.h" |
26 | bcfc40ae | Måns Rullgård | |
27 | 7fa9a0a2 | Justin Ruggles | #define OGG_FLAC_METADATA_TYPE_STREAMINFO 0x7F |
28 | bcfc40ae | Måns Rullgård | |
29 | static int |
||
30 | flac_header (AVFormatContext * s, int idx)
|
||
31 | { |
||
32 | 77be08ee | Måns Rullgård | struct ogg *ogg = s->priv_data;
|
33 | struct ogg_stream *os = ogg->streams + idx;
|
||
34 | bcfc40ae | Måns Rullgård | AVStream *st = s->streams[idx]; |
35 | GetBitContext gb; |
||
36 | 7fa9a0a2 | Justin Ruggles | FLACStreaminfo si; |
37 | bcfc40ae | Måns Rullgård | int mdt;
|
38 | |||
39 | if (os->buf[os->pstart] == 0xff) |
||
40 | return 0; |
||
41 | |||
42 | init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
|
||
43 | eedfe222 | Måns Rullgård | skip_bits1(&gb); /* metadata_last */
|
44 | bcfc40ae | Måns Rullgård | mdt = get_bits(&gb, 7);
|
45 | |||
46 | 7fa9a0a2 | Justin Ruggles | if (mdt == OGG_FLAC_METADATA_TYPE_STREAMINFO) {
|
47 | uint8_t *streaminfo_start = os->buf + os->pstart + 5 + 4 + 4 + 4; |
||
48 | eedfe222 | Måns Rullgård | skip_bits_long(&gb, 4*8); /* "FLAC" */ |
49 | bcfc40ae | Måns Rullgård | if(get_bits(&gb, 8) != 1) /* unsupported major version */ |
50 | return -1; |
||
51 | eedfe222 | Måns Rullgård | skip_bits_long(&gb, 8 + 16); /* minor version + header count */ |
52 | skip_bits_long(&gb, 4*8); /* "fLaC" */ |
||
53 | 115329f1 | Diego Biurrun | |
54 | bcfc40ae | Måns Rullgård | /* METADATA_BLOCK_HEADER */
|
55 | b997b67c | Aurelien Jacobs | if (get_bits_long(&gb, 32) != FLAC_STREAMINFO_SIZE) |
56 | bcfc40ae | Måns Rullgård | return -1; |
57 | |||
58 | 7fa9a0a2 | Justin Ruggles | ff_flac_parse_streaminfo(st->codec, &si, streaminfo_start); |
59 | 115329f1 | Diego Biurrun | |
60 | 72415b2a | Stefano Sabatini | st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
61 | 01f4895c | Michael Niedermayer | st->codec->codec_id = CODEC_ID_FLAC; |
62 | bcfc40ae | Måns Rullgård | |
63 | 01f4895c | Michael Niedermayer | st->codec->extradata = |
64 | bcfc40ae | Måns Rullgård | av_malloc(FLAC_STREAMINFO_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); |
65 | 7fa9a0a2 | Justin Ruggles | memcpy(st->codec->extradata, streaminfo_start, FLAC_STREAMINFO_SIZE); |
66 | 01f4895c | Michael Niedermayer | st->codec->extradata_size = FLAC_STREAMINFO_SIZE; |
67 | 3644cb8f | Måns Rullgård | |
68 | a351110e | Reimar Döffinger | av_set_pts_info(st, 64, 1, st->codec->sample_rate); |
69 | 7fa9a0a2 | Justin Ruggles | } else if (mdt == FLAC_METADATA_TYPE_VORBIS_COMMENT) { |
70 | b53cde48 | David Conrad | ff_vorbis_comment (s, &st->metadata, os->buf + os->pstart + 4, os->psize - 4); |
71 | bcfc40ae | Måns Rullgård | } |
72 | |||
73 | return 1; |
||
74 | } |
||
75 | |||
76 | 880e3ef4 | Michael Niedermayer | static int |
77 | old_flac_header (AVFormatContext * s, int idx)
|
||
78 | { |
||
79 | AVStream *st = s->streams[idx]; |
||
80 | 72415b2a | Stefano Sabatini | st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
81 | 880e3ef4 | Michael Niedermayer | st->codec->codec_id = CODEC_ID_FLAC; |
82 | |||
83 | return 0; |
||
84 | } |
||
85 | |||
86 | 77be08ee | Måns Rullgård | const struct ogg_codec ff_flac_codec = { |
87 | bcfc40ae | Måns Rullgård | .magic = "\177FLAC",
|
88 | .magicsize = 5,
|
||
89 | .header = flac_header |
||
90 | }; |
||
91 | 880e3ef4 | Michael Niedermayer | |
92 | 77be08ee | Måns Rullgård | const struct ogg_codec ff_old_flac_codec = { |
93 | 880e3ef4 | Michael Niedermayer | .magic = "fLaC",
|
94 | .magicsize = 4,
|
||
95 | .header = old_flac_header |
||
96 | }; |