Mercurial > libavcodec.hg
annotate flacdec.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
| author | cehoyos |
|---|---|
| date | Fri, 20 Feb 2009 16:20:01 +0000 |
| parents | 49817775b44f |
| children | 7eedb5796dd8 |
| rev | line source |
|---|---|
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
1 /* |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
2 * FLAC (Free Lossless Audio Codec) decoder |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
3 * Copyright (c) 2003 Alex Beregszaszi |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
4 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
5 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
6 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
11 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
16 * |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3649
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
20 */ |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
21 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
22 /** |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8712
diff
changeset
|
23 * @file libavcodec/flacdec.c |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
24 * FLAC (Free Lossless Audio Codec) decoder |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
25 * @author Alex Beregszaszi |
|
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
26 * |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
27 * For more information on the FLAC format, visit: |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
28 * http://flac.sourceforge.net/ |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
29 * |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
30 * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
31 * through, starting from the initial 'fLaC' signature; or by passing the |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
32 * 34-byte streaminfo structure through avctx->extradata[_size] followed |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
33 * by data starting with the 0xFFF8 marker. |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
34 */ |
| 2967 | 35 |
| 1812 | 36 #include <limits.h> |
| 2967 | 37 |
| 3649 | 38 #define ALT_BITSTREAM_READER |
| 6763 | 39 #include "libavutil/crc.h" |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
40 #include "avcodec.h" |
|
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2098
diff
changeset
|
41 #include "bitstream.h" |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
42 #include "golomb.h" |
|
6728
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
43 #include "flac.h" |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
44 |
| 1812 | 45 #undef NDEBUG |
| 46 #include <assert.h> | |
| 47 | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
48 #define MAX_CHANNELS 8 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
49 #define MAX_BLOCKSIZE 65535 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
50 |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
51 enum decorrelation_type { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
52 INDEPENDENT, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
53 LEFT_SIDE, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
54 RIGHT_SIDE, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
55 MID_SIDE, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
56 }; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
57 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
58 typedef struct FLACContext { |
|
6728
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
59 FLACSTREAMINFO |
|
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
60 |
| 8711 | 61 AVCodecContext *avctx; ///< parent AVCodecContext |
| 62 GetBitContext gb; ///< GetBitContext initialized to start at the current frame | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
63 |
| 8711 | 64 int blocksize; ///< number of samples in the current frame |
| 65 int curr_bps; ///< bps for current subframe, adjusted for channel correlation and wasted bits | |
| 8712 | 66 int sample_shift; ///< shift required to make output samples 16-bit or 32-bit |
| 67 int is32; ///< flag to indicate if output should be 32-bit instead of 16-bit | |
| 8711 | 68 enum decorrelation_type decorrelation; ///< channel decorrelation type in the current frame |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
69 |
| 8711 | 70 int32_t *decoded[MAX_CHANNELS]; ///< decoded samples |
| 1812 | 71 uint8_t *bitstream; |
| 7303 | 72 unsigned int bitstream_size; |
| 73 unsigned int bitstream_index; | |
|
3066
04b924f8f5a5
warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents:
3036
diff
changeset
|
74 unsigned int allocated_bitstream_size; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
75 } FLACContext; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
76 |
| 7129 | 77 static const int sample_rate_table[] = |
|
8638
1088ea188568
flacdec: add support for 3 additional sample rate codes
jbr
parents:
7785
diff
changeset
|
78 { 0, |
|
1088ea188568
flacdec: add support for 3 additional sample rate codes
jbr
parents:
7785
diff
changeset
|
79 88200, 176400, 192000, |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
80 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, |
| 2967 | 81 0, 0, 0, 0 }; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
82 |
| 7129 | 83 static const int sample_size_table[] = |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
84 { 0, 8, 12, 0, 16, 20, 24, 0 }; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
85 |
| 7129 | 86 static const int blocksize_table[] = { |
| 2967 | 87 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0, |
| 88 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7 | |
| 1816 | 89 }; |
| 90 | |
| 8656 | 91 static int64_t get_utf8(GetBitContext *gb) |
| 92 { | |
| 3436 | 93 int64_t val; |
| 94 GET_UTF8(val, get_bits(gb, 8), return -1;) | |
| 1812 | 95 return val; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
96 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
97 |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
98 static void allocate_buffers(FLACContext *s); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
99 static int metadata_parse(FLACContext *s); |
|
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
100 |
| 8656 | 101 static av_cold int flac_decode_init(AVCodecContext *avctx) |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
102 { |
|
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
103 FLACContext *s = avctx->priv_data; |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
104 s->avctx = avctx; |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
105 |
|
8728
329e332e829f
flacdec: set default sample_fmt before parsing extradata
jbr
parents:
8718
diff
changeset
|
106 avctx->sample_fmt = SAMPLE_FMT_S16; |
|
329e332e829f
flacdec: set default sample_fmt before parsing extradata
jbr
parents:
8718
diff
changeset
|
107 |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
108 if (avctx->extradata_size > 4) { |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
109 /* initialize based on the demuxer-supplied streamdata header */ |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
110 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) { |
| 8658 | 111 ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, |
| 112 avctx->extradata); | |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
113 allocate_buffers(s); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
114 } else { |
| 6730 | 115 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8); |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
116 metadata_parse(s); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
117 } |
|
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
118 } |
|
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
119 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
120 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
121 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
122 |
| 6729 | 123 static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s) |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
124 { |
| 8658 | 125 av_log(avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d\n", s->min_blocksize, |
| 126 s->max_blocksize); | |
| 6727 | 127 av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize); |
| 128 av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate); | |
| 129 av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels); | |
| 130 av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps); | |
| 1812 | 131 } |
| 132 | |
| 8656 | 133 static void allocate_buffers(FLACContext *s) |
| 134 { | |
| 1812 | 135 int i; |
| 136 | |
| 137 assert(s->max_blocksize); | |
| 138 | |
| 8656 | 139 if (s->max_framesize == 0 && s->max_blocksize) { |
| 8658 | 140 // FIXME header overhead |
| 141 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; | |
| 1812 | 142 } |
| 143 | |
| 8656 | 144 for (i = 0; i < s->channels; i++) { |
| 8658 | 145 s->decoded[i] = av_realloc(s->decoded[i], |
| 146 sizeof(int32_t)*s->max_blocksize); | |
| 1812 | 147 } |
| 148 | |
| 8656 | 149 if (s->allocated_bitstream_size < s->max_framesize) |
| 8658 | 150 s->bitstream= av_fast_realloc(s->bitstream, |
| 151 &s->allocated_bitstream_size, | |
| 152 s->max_framesize); | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
153 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
154 |
| 6729 | 155 void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, |
| 156 const uint8_t *buffer) | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
157 { |
| 6726 | 158 GetBitContext gb; |
| 159 init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8); | |
| 160 | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
161 /* mandatory streaminfo */ |
| 6726 | 162 s->min_blocksize = get_bits(&gb, 16); |
| 163 s->max_blocksize = get_bits(&gb, 16); | |
| 2967 | 164 |
| 6726 | 165 skip_bits(&gb, 24); /* skip min frame size */ |
| 166 s->max_framesize = get_bits_long(&gb, 24); | |
| 167 | |
| 168 s->samplerate = get_bits_long(&gb, 20); | |
| 169 s->channels = get_bits(&gb, 3) + 1; | |
| 170 s->bps = get_bits(&gb, 5) + 1; | |
| 2967 | 171 |
| 6726 | 172 avctx->channels = s->channels; |
| 173 avctx->sample_rate = s->samplerate; | |
| 8701 | 174 avctx->bits_per_raw_sample = s->bps; |
| 175 if (s->bps > 16) | |
| 176 avctx->sample_fmt = SAMPLE_FMT_S32; | |
| 177 else | |
| 178 avctx->sample_fmt = SAMPLE_FMT_S16; | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
179 |
| 8661 | 180 s->samples = get_bits_long(&gb, 32) << 4; |
| 181 s->samples |= get_bits_long(&gb, 4); | |
| 2967 | 182 |
| 6726 | 183 skip_bits(&gb, 64); /* md5 sum */ |
| 184 skip_bits(&gb, 64); /* md5 sum */ | |
| 2967 | 185 |
| 6727 | 186 dump_headers(avctx, s); |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
187 } |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
188 |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
189 /** |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
190 * Parse a list of metadata blocks. This list of blocks must begin with |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
191 * the fLaC marker. |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
192 * @param s the flac decoding context containing the gb bit reader used to |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
193 * parse metadata |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
194 * @return 1 if some metadata was read, 0 if no fLaC marker was found |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
195 */ |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
196 static int metadata_parse(FLACContext *s) |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
197 { |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
198 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0; |
| 7304 | 199 int initial_pos= get_bits_count(&s->gb); |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
200 |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
201 if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) { |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
202 skip_bits(&s->gb, 32); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
203 |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
204 do { |
| 5513 | 205 metadata_last = get_bits1(&s->gb); |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
206 metadata_type = get_bits(&s->gb, 7); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
207 metadata_size = get_bits_long(&s->gb, 24); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
208 |
| 8656 | 209 if (get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits) { |
| 7304 | 210 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb)); |
| 211 break; | |
| 212 } | |
| 213 | |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
214 if (metadata_size) { |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
215 switch (metadata_type) { |
| 8659 | 216 case FLAC_METADATA_TYPE_STREAMINFO: |
| 8658 | 217 ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, |
| 218 s->gb.buffer+get_bits_count(&s->gb)/8); | |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
219 streaminfo_updated = 1; |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
220 |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
221 default: |
| 8656 | 222 for (i = 0; i < metadata_size; i++) |
|
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
223 skip_bits(&s->gb, 8); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
224 } |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
225 } |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
226 } while (!metadata_last); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
227 |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
228 if (streaminfo_updated) |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
229 allocate_buffers(s); |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
230 return 1; |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
231 } |
|
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
232 return 0; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
233 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
234 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
235 static int decode_residuals(FLACContext *s, int channel, int pred_order) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
236 { |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
237 int i, tmp, partition, method_type, rice_order; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
238 int sample = 0, samples; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
239 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
240 method_type = get_bits(&s->gb, 2); |
| 8656 | 241 if (method_type > 1) { |
| 8658 | 242 av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n", |
| 243 method_type); | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
244 return -1; |
| 1812 | 245 } |
| 2967 | 246 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
247 rice_order = get_bits(&s->gb, 4); |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
248 |
| 1812 | 249 samples= s->blocksize >> rice_order; |
|
4366
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
250 if (pred_order > samples) { |
| 8658 | 251 av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", |
| 252 pred_order, samples); | |
|
4366
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
253 return -1; |
|
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
254 } |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
255 |
| 2967 | 256 sample= |
| 1812 | 257 i= pred_order; |
| 8656 | 258 for (partition = 0; partition < (1 << rice_order); partition++) { |
|
5871
83554c0e9ce6
Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents:
5741
diff
changeset
|
259 tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5); |
| 8656 | 260 if (tmp == (method_type == 0 ? 15 : 31)) { |
| 1812 | 261 tmp = get_bits(&s->gb, 5); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
262 for (; i < samples; i++, sample++) |
| 1813 | 263 s->decoded[channel][sample] = get_sbits(&s->gb, tmp); |
| 8656 | 264 } else { |
| 265 for (; i < samples; i++, sample++) { | |
| 1813 | 266 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); |
| 1812 | 267 } |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
268 } |
| 1812 | 269 i= 0; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
270 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
271 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
272 return 0; |
| 2967 | 273 } |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
274 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
275 static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
276 { |
| 5740 | 277 const int blocksize = s->blocksize; |
| 278 int32_t *decoded = s->decoded[channel]; | |
|
8952
49817775b44f
flacdec: Silence false positive warning about uninitialized variables in
jbr
parents:
8728
diff
changeset
|
279 int av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d), i; |
| 2967 | 280 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
281 /* warm up samples */ |
| 8656 | 282 for (i = 0; i < pred_order; i++) { |
| 5740 | 283 decoded[i] = get_sbits(&s->gb, s->curr_bps); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
284 } |
| 2967 | 285 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
286 if (decode_residuals(s, channel, pred_order) < 0) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
287 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
288 |
| 8656 | 289 if (pred_order > 0) |
| 6746 | 290 a = decoded[pred_order-1]; |
| 8656 | 291 if (pred_order > 1) |
| 6746 | 292 b = a - decoded[pred_order-2]; |
| 8656 | 293 if (pred_order > 2) |
| 6746 | 294 c = b - decoded[pred_order-2] + decoded[pred_order-3]; |
| 8656 | 295 if (pred_order > 3) |
| 6746 | 296 d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4]; |
| 5740 | 297 |
| 8656 | 298 switch (pred_order) { |
| 299 case 0: | |
| 300 break; | |
| 301 case 1: | |
| 302 for (i = pred_order; i < blocksize; i++) | |
| 303 decoded[i] = a += decoded[i]; | |
| 304 break; | |
| 305 case 2: | |
| 306 for (i = pred_order; i < blocksize; i++) | |
| 307 decoded[i] = a += b += decoded[i]; | |
| 308 break; | |
| 309 case 3: | |
| 310 for (i = pred_order; i < blocksize; i++) | |
| 311 decoded[i] = a += b += c += decoded[i]; | |
| 312 break; | |
| 313 case 4: | |
| 314 for (i = pred_order; i < blocksize; i++) | |
| 315 decoded[i] = a += b += c += d += decoded[i]; | |
| 316 break; | |
| 317 default: | |
| 318 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); | |
| 319 return -1; | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
320 } |
| 1812 | 321 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
322 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
323 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
324 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
325 static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
326 { |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
327 int i, j; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
328 int coeff_prec, qlevel; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
329 int coeffs[pred_order]; |
| 5741 | 330 int32_t *decoded = s->decoded[channel]; |
| 2967 | 331 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
332 /* warm up samples */ |
| 8656 | 333 for (i = 0; i < pred_order; i++) { |
| 5741 | 334 decoded[i] = get_sbits(&s->gb, s->curr_bps); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
335 } |
| 2967 | 336 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
337 coeff_prec = get_bits(&s->gb, 4) + 1; |
| 8656 | 338 if (coeff_prec == 16) { |
| 8652 | 339 av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n"); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
340 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
341 } |
| 1812 | 342 qlevel = get_sbits(&s->gb, 5); |
| 8656 | 343 if (qlevel < 0) { |
| 8658 | 344 av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n", |
| 345 qlevel); | |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
346 return -1; |
|
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
347 } |
|
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
348 |
| 8656 | 349 for (i = 0; i < pred_order; i++) { |
| 1812 | 350 coeffs[i] = get_sbits(&s->gb, coeff_prec); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
351 } |
| 2967 | 352 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
353 if (decode_residuals(s, channel, pred_order) < 0) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
354 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
355 |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
356 if (s->bps > 16) { |
|
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
357 int64_t sum; |
| 8656 | 358 for (i = pred_order; i < s->blocksize; i++) { |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
359 sum = 0; |
|
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
360 for (j = 0; j < pred_order; j++) |
| 5741 | 361 sum += (int64_t)coeffs[j] * decoded[i-j-1]; |
| 362 decoded[i] += sum >> qlevel; | |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
363 } |
|
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
364 } else { |
| 8656 | 365 for (i = pred_order; i < s->blocksize-1; i += 2) { |
| 5741 | 366 int c; |
| 367 int d = decoded[i-pred_order]; | |
| 368 int s0 = 0, s1 = 0; | |
| 8656 | 369 for (j = pred_order-1; j > 0; j--) { |
| 5741 | 370 c = coeffs[j]; |
| 5721 | 371 s0 += c*d; |
| 5741 | 372 d = decoded[i-j]; |
| 373 s1 += c*d; | |
| 5721 | 374 } |
| 5741 | 375 c = coeffs[0]; |
| 376 s0 += c*d; | |
| 377 d = decoded[i] += s0 >> qlevel; | |
| 378 s1 += c*d; | |
| 379 decoded[i+1] += s1 >> qlevel; | |
| 5721 | 380 } |
| 8656 | 381 if (i < s->blocksize) { |
| 5721 | 382 int sum = 0; |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
383 for (j = 0; j < pred_order; j++) |
| 5741 | 384 sum += coeffs[j] * decoded[i-j-1]; |
| 385 decoded[i] += sum >> qlevel; | |
|
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
386 } |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
387 } |
| 2967 | 388 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
389 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
390 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
391 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
392 static inline int decode_subframe(FLACContext *s, int channel) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
393 { |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
394 int type, wasted = 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
395 int i, tmp; |
| 2967 | 396 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
397 s->curr_bps = s->bps; |
| 8656 | 398 if (channel == 0) { |
| 399 if (s->decorrelation == RIGHT_SIDE) | |
| 1812 | 400 s->curr_bps++; |
| 8656 | 401 } else { |
| 402 if (s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE) | |
| 1812 | 403 s->curr_bps++; |
| 404 } | |
| 405 | |
| 8656 | 406 if (get_bits1(&s->gb)) { |
| 2859 | 407 av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n"); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
408 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
409 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
410 type = get_bits(&s->gb, 6); |
| 2967 | 411 |
| 8656 | 412 if (get_bits1(&s->gb)) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
413 wasted = 1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
414 while (!get_bits1(&s->gb)) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
415 wasted++; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
416 s->curr_bps -= wasted; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
417 } |
| 8649 | 418 |
| 1812 | 419 //FIXME use av_log2 for types |
| 8656 | 420 if (type == 0) { |
| 1812 | 421 tmp = get_sbits(&s->gb, s->curr_bps); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
422 for (i = 0; i < s->blocksize; i++) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
423 s->decoded[channel][i] = tmp; |
| 8656 | 424 } else if (type == 1) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
425 for (i = 0; i < s->blocksize; i++) |
| 1812 | 426 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); |
| 8656 | 427 } else if ((type >= 8) && (type <= 12)) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
428 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
429 return -1; |
| 8656 | 430 } else if (type >= 32) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
431 if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
432 return -1; |
| 8656 | 433 } else { |
| 2859 | 434 av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
435 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
436 } |
| 2967 | 437 |
| 8656 | 438 if (wasted) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
439 int i; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
440 for (i = 0; i < s->blocksize; i++) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
441 s->decoded[channel][i] <<= wasted; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
442 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
443 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
444 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
445 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
446 |
| 4351 | 447 static int decode_frame(FLACContext *s, int alloc_data_size) |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
448 { |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
449 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8; |
| 1816 | 450 int decorrelation, bps, blocksize, samplerate; |
| 2967 | 451 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
452 blocksize_code = get_bits(&s->gb, 4); |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
453 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
454 sample_rate_code = get_bits(&s->gb, 4); |
| 2967 | 455 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
456 assignment = get_bits(&s->gb, 4); /* channel assignment */ |
| 1816 | 457 if (assignment < 8 && s->channels == assignment+1) |
| 458 decorrelation = INDEPENDENT; | |
| 459 else if (assignment >=8 && assignment < 11 && s->channels == 2) | |
| 460 decorrelation = LEFT_SIDE + assignment - 8; | |
| 8656 | 461 else { |
| 8658 | 462 av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", |
| 463 assignment, s->channels); | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
464 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
465 } |
| 2967 | 466 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
467 sample_size_code = get_bits(&s->gb, 3); |
| 8656 | 468 if (sample_size_code == 0) |
| 1816 | 469 bps= s->bps; |
| 8656 | 470 else if ((sample_size_code != 3) && (sample_size_code != 7)) |
| 1816 | 471 bps = sample_size_table[sample_size_code]; |
| 8656 | 472 else { |
| 8658 | 473 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", |
| 474 sample_size_code); | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
475 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
476 } |
| 8701 | 477 if (bps > 16) { |
| 478 s->avctx->sample_fmt = SAMPLE_FMT_S32; | |
| 479 s->sample_shift = 32 - bps; | |
| 480 s->is32 = 1; | |
| 481 } else { | |
| 482 s->avctx->sample_fmt = SAMPLE_FMT_S16; | |
| 483 s->sample_shift = 16 - bps; | |
| 484 s->is32 = 0; | |
| 485 } | |
| 486 s->bps = s->avctx->bits_per_raw_sample = bps; | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
487 |
| 8656 | 488 if (get_bits1(&s->gb)) { |
| 2859 | 489 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n"); |
| 1816 | 490 return -1; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
491 } |
| 2967 | 492 |
| 8656 | 493 if (get_utf8(&s->gb) < 0) { |
| 1816 | 494 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n"); |
| 495 return -1; | |
| 496 } | |
| 2967 | 497 |
| 1812 | 498 if (blocksize_code == 0) |
| 1816 | 499 blocksize = s->min_blocksize; |
| 1812 | 500 else if (blocksize_code == 6) |
| 1816 | 501 blocksize = get_bits(&s->gb, 8)+1; |
| 1812 | 502 else if (blocksize_code == 7) |
| 1816 | 503 blocksize = get_bits(&s->gb, 16)+1; |
| 2967 | 504 else |
| 1816 | 505 blocksize = blocksize_table[blocksize_code]; |
| 1812 | 506 |
| 8656 | 507 if (blocksize > s->max_blocksize) { |
| 8658 | 508 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, |
| 509 s->max_blocksize); | |
| 1812 | 510 return -1; |
| 511 } | |
| 512 | |
| 8656 | 513 if (blocksize * s->channels * sizeof(int16_t) > alloc_data_size) |
| 4351 | 514 return -1; |
| 515 | |
| 8656 | 516 if (sample_rate_code == 0) |
| 1816 | 517 samplerate= s->samplerate; |
| 8656 | 518 else if (sample_rate_code < 12) |
| 1816 | 519 samplerate = sample_rate_table[sample_rate_code]; |
| 1812 | 520 else if (sample_rate_code == 12) |
| 1816 | 521 samplerate = get_bits(&s->gb, 8) * 1000; |
| 1812 | 522 else if (sample_rate_code == 13) |
| 1816 | 523 samplerate = get_bits(&s->gb, 16); |
| 1812 | 524 else if (sample_rate_code == 14) |
| 1816 | 525 samplerate = get_bits(&s->gb, 16) * 10; |
| 8656 | 526 else { |
| 8658 | 527 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", |
| 528 sample_rate_code); | |
| 1812 | 529 return -1; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
530 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
531 |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
532 skip_bits(&s->gb, 8); |
| 6108 | 533 crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, |
| 534 s->gb.buffer, get_bits_count(&s->gb)/8); | |
| 8656 | 535 if (crc8) { |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2529
diff
changeset
|
536 av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8); |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
537 return -1; |
|
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
538 } |
| 2967 | 539 |
| 1816 | 540 s->blocksize = blocksize; |
| 541 s->samplerate = samplerate; | |
| 542 s->bps = bps; | |
| 543 s->decorrelation= decorrelation; | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
544 |
| 6729 | 545 // dump_headers(s->avctx, (FLACStreaminfo *)s); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
546 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
547 /* subframes */ |
| 8656 | 548 for (i = 0; i < s->channels; i++) { |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
549 if (decode_subframe(s, i) < 0) |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
550 return -1; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
551 } |
| 2967 | 552 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
553 align_get_bits(&s->gb); |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
554 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
555 /* frame footer */ |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
556 skip_bits(&s->gb, 16); /* data crc */ |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
557 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
558 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
559 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
560 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
561 static int flac_decode_frame(AVCodecContext *avctx, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
562 void *data, int *data_size, |
| 6235 | 563 const uint8_t *buf, int buf_size) |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
564 { |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
565 FLACContext *s = avctx->priv_data; |
| 2078 | 566 int tmp = 0, i, j = 0, input_buf_size = 0; |
| 8701 | 567 int16_t *samples_16 = data; |
| 568 int32_t *samples_32 = data; | |
| 4351 | 569 int alloc_data_size= *data_size; |
| 570 | |
| 571 *data_size=0; | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
572 |
| 8656 | 573 if (s->max_framesize == 0) { |
|
7785
a969253a82ff
fix issue 616 on roundup : decoding of short flac files
jai_menon
parents:
7451
diff
changeset
|
574 s->max_framesize= FFMAX(4, buf_size); // should hopefully be enough for the first header |
| 1812 | 575 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
| 576 } | |
| 577 | |
| 8656 | 578 if (1 && s->max_framesize) { //FIXME truncated |
| 8657 | 579 if (s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C')) |
| 580 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize)); | |
| 581 input_buf_size= buf_size; | |
| 1812 | 582 |
| 8657 | 583 if (s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index) |
| 584 return -1; | |
| 7304 | 585 |
| 8657 | 586 if (s->allocated_bitstream_size < s->bitstream_size + buf_size) |
| 587 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size); | |
| 7304 | 588 |
| 8657 | 589 if (s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size) { |
| 8658 | 590 memmove(s->bitstream, &s->bitstream[s->bitstream_index], |
| 591 s->bitstream_size); | |
| 8657 | 592 s->bitstream_index=0; |
| 593 } | |
| 8658 | 594 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], |
| 595 buf, buf_size); | |
| 8657 | 596 buf= &s->bitstream[s->bitstream_index]; |
| 597 buf_size += s->bitstream_size; | |
| 598 s->bitstream_size= buf_size; | |
| 2967 | 599 |
| 8657 | 600 if (buf_size < s->max_framesize && input_buf_size) { |
| 601 return input_buf_size; | |
| 602 } | |
| 1812 | 603 } |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
604 |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
605 init_get_bits(&s->gb, buf, buf_size*8); |
| 2967 | 606 |
| 8656 | 607 if (metadata_parse(s)) |
|
7301
aab7f1fb59ea
If metadata has been parsed goto end instead of trying to
michael
parents:
7273
diff
changeset
|
608 goto end; |
|
aab7f1fb59ea
If metadata has been parsed goto end instead of trying to
michael
parents:
7273
diff
changeset
|
609 |
| 8653 | 610 tmp = show_bits(&s->gb, 16); |
| 8656 | 611 if ((tmp & 0xFFFE) != 0xFFF8) { |
| 8653 | 612 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n"); |
| 8656 | 613 while (get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8) |
| 8653 | 614 skip_bits(&s->gb, 8); |
| 615 goto end; // we may not have enough bits left to decode a frame, so try next time | |
| 616 } | |
| 617 skip_bits(&s->gb, 16); | |
| 8656 | 618 if (decode_frame(s, alloc_data_size) < 0) { |
| 8653 | 619 av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n"); |
| 620 s->bitstream_size=0; | |
| 621 s->bitstream_index=0; | |
| 622 return -1; | |
| 623 } | |
| 1812 | 624 |
| 3434 | 625 #define DECORRELATE(left, right)\ |
| 626 assert(s->channels == 2);\ | |
| 8656 | 627 for (i = 0; i < s->blocksize; i++) {\ |
| 3434 | 628 int a= s->decoded[0][i];\ |
| 629 int b= s->decoded[1][i];\ | |
| 8701 | 630 if (s->is32) {\ |
| 631 *samples_32++ = (left) << s->sample_shift;\ | |
| 632 *samples_32++ = (right) << s->sample_shift;\ | |
| 633 } else {\ | |
| 634 *samples_16++ = (left) << s->sample_shift;\ | |
| 635 *samples_16++ = (right) << s->sample_shift;\ | |
| 636 }\ | |
| 3434 | 637 }\ |
| 638 break; | |
| 639 | |
| 8656 | 640 switch (s->decorrelation) { |
| 641 case INDEPENDENT: | |
| 642 for (j = 0; j < s->blocksize; j++) { | |
| 8701 | 643 for (i = 0; i < s->channels; i++) { |
| 644 if (s->is32) | |
| 645 *samples_32++ = s->decoded[i][j] << s->sample_shift; | |
| 646 else | |
| 647 *samples_16++ = s->decoded[i][j] << s->sample_shift; | |
| 648 } | |
| 8656 | 649 } |
| 650 break; | |
| 651 case LEFT_SIDE: | |
| 652 DECORRELATE(a,a-b) | |
| 653 case RIGHT_SIDE: | |
| 654 DECORRELATE(a+b,b) | |
| 655 case MID_SIDE: | |
| 656 DECORRELATE( (a-=b>>1) + b, a) | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
657 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
658 |
| 8701 | 659 *data_size = s->blocksize * s->channels * (s->is32 ? 4 : 2); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
660 |
| 1812 | 661 end: |
| 6377 | 662 i= (get_bits_count(&s->gb)+7)/8; |
| 8656 | 663 if (i > buf_size) { |
| 1812 | 664 av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size); |
|
1814
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
665 s->bitstream_size=0; |
|
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
666 s->bitstream_index=0; |
| 1812 | 667 return -1; |
| 668 } | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
669 |
| 8656 | 670 if (s->bitstream_size) { |
| 1812 | 671 s->bitstream_index += i; |
| 672 s->bitstream_size -= i; | |
| 673 return input_buf_size; | |
| 8656 | 674 } else |
| 1812 | 675 return i; |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
676 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
677 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6377
diff
changeset
|
678 static av_cold int flac_decode_close(AVCodecContext *avctx) |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
679 { |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
680 FLACContext *s = avctx->priv_data; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
681 int i; |
| 2967 | 682 |
| 8656 | 683 for (i = 0; i < s->channels; i++) { |
| 1812 | 684 av_freep(&s->decoded[i]); |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
685 } |
| 1812 | 686 av_freep(&s->bitstream); |
| 2967 | 687 |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
688 return 0; |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
689 } |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
690 |
| 8656 | 691 static void flac_flush(AVCodecContext *avctx) |
| 692 { | |
| 1817 | 693 FLACContext *s = avctx->priv_data; |
| 694 | |
| 695 s->bitstream_size= | |
| 696 s->bitstream_index= 0; | |
| 697 } | |
| 698 | |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
699 AVCodec flac_decoder = { |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
700 "flac", |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
701 CODEC_TYPE_AUDIO, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
702 CODEC_ID_FLAC, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
703 sizeof(FLACContext), |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
704 flac_decode_init, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
705 NULL, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
706 flac_decode_close, |
|
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
707 flac_decode_frame, |
| 7273 | 708 CODEC_CAP_DELAY, |
| 2967 | 709 .flush= flac_flush, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
710 .long_name= NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), |
|
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
711 }; |
