annotate oggparseflac.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 6f61c3b36632
children 11169564fbdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
1 /*
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
2 * Copyright (C) 2005 Matthieu CASTET
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
3 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
4 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
5 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
10 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
14 * Lesser General Public License for more details.
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
15 *
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
19 */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
20
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
21 #include <stdlib.h>
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2714
diff changeset
22 #include "libavcodec/bitstream.h"
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
23 #include "avformat.h"
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents: 2378
diff changeset
24 #include "oggdec.h"
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
25
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
26 #define FLAC_STREAMINFO_SIZE 0x22
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
27
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
28 static int
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
29 flac_header (AVFormatContext * s, int idx)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
30 {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
31 ogg_t *ogg = s->priv_data;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
32 ogg_stream_t *os = ogg->streams + idx;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
33 AVStream *st = s->streams[idx];
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
34 GetBitContext gb;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
35 int mdt;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
36
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
37 if (os->buf[os->pstart] == 0xff)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
38 return 0;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
39
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
40 init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
41 get_bits(&gb, 1); /* metadata_last */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
42 mdt = get_bits(&gb, 7);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
43
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
44 if (mdt == 0x7f) {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
45 skip_bits(&gb, 4*8); /* "FLAC" */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
46 if(get_bits(&gb, 8) != 1) /* unsupported major version */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
47 return -1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
48 skip_bits(&gb, 8 + 16); /* minor version + header count */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
49 skip_bits(&gb, 4*8); /* "fLaC" */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
50
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
51 /* METADATA_BLOCK_HEADER */
2168
d095666dedf3 use get_bits_long() where needed
mru
parents: 1358
diff changeset
52 if (get_bits_long(&gb, 32) != FLAC_STREAMINFO_SIZE)
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
53 return -1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
54
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
55 skip_bits(&gb, 16*2+24*2);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
56
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
57 st->codec->sample_rate = get_bits_long(&gb, 20);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
58 st->codec->channels = get_bits(&gb, 3) + 1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
59
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
60 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
61 st->codec->codec_id = CODEC_ID_FLAC;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
62
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
63 st->codec->extradata =
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
64 av_malloc(FLAC_STREAMINFO_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
65 memcpy (st->codec->extradata, os->buf + os->pstart + 5 + 4 + 4 + 4,
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
66 FLAC_STREAMINFO_SIZE);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
67 st->codec->extradata_size = FLAC_STREAMINFO_SIZE;
1077
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
68
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
69 st->time_base.num = 1;
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
70 st->time_base.den = st->codec->sample_rate;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
71 } else if (mdt == 4) {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
72 vorbis_comment (s, os->buf + os->pstart + 4, os->psize - 4);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
73 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
74
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
75 return 1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
76 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
77
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
78 static int
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
79 old_flac_header (AVFormatContext * s, int idx)
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
80 {
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
81 AVStream *st = s->streams[idx];
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
82 st->codec->codec_type = CODEC_TYPE_AUDIO;
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
83 st->codec->codec_id = CODEC_ID_FLAC;
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
84
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
85 return 0;
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
86 }
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
87
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
88 ogg_codec_t flac_codec = {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
89 .magic = "\177FLAC",
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
90 .magicsize = 5,
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
91 .header = flac_header
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
92 };
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
93
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
94 ogg_codec_t old_flac_codec = {
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
95 .magic = "fLaC",
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
96 .magicsize = 4,
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
97 .header = old_flac_header
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
98 };