Mercurial > libavcodec.hg
annotate flac.c @ 7352:c2318e551ff5 libavcodec
When picking a "high utility centroid" do not pick one
that has no corresponding points. Not only it is the
worst possible pick, but also the code was written
without this case in mind.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:55:37 +0000 |
parents | ac25a6f7147e |
children | 85ab7655ad4d |
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 /** |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
23 * @file flac.c |
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 |
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
50 #define FLAC_STREAMINFO_SIZE 34 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
51 |
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
|
52 enum decorrelation_type { |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
53 INDEPENDENT, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
54 LEFT_SIDE, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
55 RIGHT_SIDE, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
56 MID_SIDE, |
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 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
59 typedef struct FLACContext { |
6728
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
60 FLACSTREAMINFO |
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
61 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
62 AVCodecContext *avctx; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
63 GetBitContext gb; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
64 |
1812 | 65 int blocksize/*, last_blocksize*/; |
6728
56c5bbd0996f
split out some decoder context params to a shared macro
jbr
parents:
6727
diff
changeset
|
66 int curr_bps; |
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
|
67 enum decorrelation_type decorrelation; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
68 |
1812 | 69 int32_t *decoded[MAX_CHANNELS]; |
70 uint8_t *bitstream; | |
7303 | 71 unsigned int bitstream_size; |
72 unsigned int bitstream_index; | |
3066
04b924f8f5a5
warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents:
3036
diff
changeset
|
73 unsigned int allocated_bitstream_size; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
74 } FLACContext; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
75 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
76 #define METADATA_TYPE_STREAMINFO 0 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
77 |
7129 | 78 static const int sample_rate_table[] = |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
79 { 0, 0, 0, 0, |
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 | |
3436 | 91 static int64_t get_utf8(GetBitContext *gb){ |
92 int64_t val; | |
93 GET_UTF8(val, get_bits(gb, 8), return -1;) | |
1812 | 94 return val; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
95 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
96 |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
97 static void allocate_buffers(FLACContext *s); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
98 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
|
99 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6377
diff
changeset
|
100 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
|
101 { |
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
102 FLACContext *s = avctx->priv_data; |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
103 s->avctx = avctx; |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
104 |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
105 if (avctx->extradata_size > 4) { |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
106 /* initialize based on the demuxer-supplied streamdata header */ |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
107 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) { |
6729 | 108 ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, avctx->extradata); |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
109 allocate_buffers(s); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
110 } else { |
6730 | 111 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
|
112 metadata_parse(s); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
113 } |
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
114 } |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
115 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
116 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
117 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
118 |
6729 | 119 static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
120 { |
6729 | 121 av_log(avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d\n", s->min_blocksize, s->max_blocksize); |
6727 | 122 av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize); |
123 av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate); | |
124 av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels); | |
125 av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps); | |
1812 | 126 } |
127 | |
128 static void allocate_buffers(FLACContext *s){ | |
129 int i; | |
130 | |
131 assert(s->max_blocksize); | |
132 | |
133 if(s->max_framesize == 0 && s->max_blocksize){ | |
134 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead | |
135 } | |
136 | |
137 for (i = 0; i < s->channels; i++) | |
138 { | |
139 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize); | |
140 } | |
141 | |
7302
3d8cf33fbafb
Only realloc() bitstream buffer when the needed size increased,
michael
parents:
7301
diff
changeset
|
142 if(s->allocated_bitstream_size < s->max_framesize) |
3d8cf33fbafb
Only realloc() bitstream buffer when the needed size increased,
michael
parents:
7301
diff
changeset
|
143 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
144 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
145 |
6729 | 146 void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, |
147 const uint8_t *buffer) | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
148 { |
6726 | 149 GetBitContext gb; |
150 init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8); | |
151 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
152 /* mandatory streaminfo */ |
6726 | 153 s->min_blocksize = get_bits(&gb, 16); |
154 s->max_blocksize = get_bits(&gb, 16); | |
2967 | 155 |
6726 | 156 skip_bits(&gb, 24); /* skip min frame size */ |
157 s->max_framesize = get_bits_long(&gb, 24); | |
158 | |
159 s->samplerate = get_bits_long(&gb, 20); | |
160 s->channels = get_bits(&gb, 3) + 1; | |
161 s->bps = get_bits(&gb, 5) + 1; | |
2967 | 162 |
6726 | 163 avctx->channels = s->channels; |
164 avctx->sample_rate = s->samplerate; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
165 |
6726 | 166 skip_bits(&gb, 36); /* total num of samples */ |
2967 | 167 |
6726 | 168 skip_bits(&gb, 64); /* md5 sum */ |
169 skip_bits(&gb, 64); /* md5 sum */ | |
2967 | 170 |
6727 | 171 dump_headers(avctx, s); |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
172 } |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
173 |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
174 /** |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
175 * 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
|
176 * the fLaC marker. |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
177 * @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
|
178 * parse metadata |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
179 * @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
|
180 */ |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
181 static int metadata_parse(FLACContext *s) |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
182 { |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
183 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0; |
7304 | 184 int initial_pos= get_bits_count(&s->gb); |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
185 |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
186 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
|
187 skip_bits(&s->gb, 32); |
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 av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n"); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
190 do { |
5513 | 191 metadata_last = get_bits1(&s->gb); |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
192 metadata_type = get_bits(&s->gb, 7); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
193 metadata_size = get_bits_long(&s->gb, 24); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
194 |
7304 | 195 if(get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits){ |
196 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb)); | |
197 break; | |
198 } | |
199 | |
4231
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
200 av_log(s->avctx, AV_LOG_DEBUG, |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
201 " metadata block: flag = %d, type = %d, size = %d\n", |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
202 metadata_last, metadata_type, metadata_size); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
203 if (metadata_size) { |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
204 switch (metadata_type) { |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
205 case METADATA_TYPE_STREAMINFO: |
6729 | 206 ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, 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
|
207 streaminfo_updated = 1; |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
208 |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
209 default: |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
210 for (i=0; i<metadata_size; i++) |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
211 skip_bits(&s->gb, 8); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
212 } |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
213 } |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
214 } while (!metadata_last); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
215 |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
216 if (streaminfo_updated) |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
217 allocate_buffers(s); |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
218 return 1; |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
219 } |
c769e4b0c75e
flac: allow reading of full metadata headers from extradata
aurel
parents:
3947
diff
changeset
|
220 return 0; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
221 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
222 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
223 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
|
224 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
225 int i, tmp, partition, method_type, rice_order; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
226 int sample = 0, samples; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
227 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
228 method_type = get_bits(&s->gb, 2); |
5871
83554c0e9ce6
Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents:
5741
diff
changeset
|
229 if (method_type > 1){ |
1812 | 230 av_log(s->avctx, AV_LOG_DEBUG, "illegal residual coding method %d\n", method_type); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
231 return -1; |
1812 | 232 } |
2967 | 233 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
234 rice_order = get_bits(&s->gb, 4); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
235 |
1812 | 236 samples= s->blocksize >> rice_order; |
4366
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
237 if (pred_order > samples) { |
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
238 av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", pred_order, samples); |
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
239 return -1; |
f8753597422c
Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents:
4351
diff
changeset
|
240 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
241 |
2967 | 242 sample= |
1812 | 243 i= pred_order; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
244 for (partition = 0; partition < (1 << rice_order); partition++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
245 { |
5871
83554c0e9ce6
Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents:
5741
diff
changeset
|
246 tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5); |
83554c0e9ce6
Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents:
5741
diff
changeset
|
247 if (tmp == (method_type == 0 ? 15 : 31)) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
248 { |
1812 | 249 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n"); |
250 tmp = get_bits(&s->gb, 5); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
251 for (; i < samples; i++, sample++) |
1813 | 252 s->decoded[channel][sample] = get_sbits(&s->gb, tmp); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
253 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
254 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
255 { |
1812 | 256 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp); |
257 for (; i < samples; i++, sample++){ | |
1813 | 258 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); |
1812 | 259 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
260 } |
1812 | 261 i= 0; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
262 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
263 |
1812 | 264 // av_log(s->avctx, AV_LOG_DEBUG, "partitions: %d, samples: %d\n", 1 << rice_order, sample); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
265 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
266 return 0; |
2967 | 267 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
268 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
269 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
|
270 { |
5740 | 271 const int blocksize = s->blocksize; |
272 int32_t *decoded = s->decoded[channel]; | |
273 int a, b, c, d, i; | |
2967 | 274 |
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
|
275 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n"); |
2967 | 276 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
277 /* warm up samples */ |
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
|
278 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); |
2967 | 279 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
280 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
281 { |
5740 | 282 decoded[i] = get_sbits(&s->gb, s->curr_bps); |
1812 | 283 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]); |
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 |
6745 | 289 if(pred_order > 0) |
6746 | 290 a = decoded[pred_order-1]; |
6745 | 291 if(pred_order > 1) |
6746 | 292 b = a - decoded[pred_order-2]; |
6745 | 293 if(pred_order > 2) |
6746 | 294 c = b - decoded[pred_order-2] + decoded[pred_order-3]; |
6745 | 295 if(pred_order > 3) |
6746 | 296 d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4]; |
5740 | 297 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
298 switch(pred_order) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
299 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
300 case 0: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
301 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
302 case 1: |
5740 | 303 for (i = pred_order; i < blocksize; i++) |
304 decoded[i] = a += decoded[i]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
305 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
306 case 2: |
5740 | 307 for (i = pred_order; i < blocksize; i++) |
308 decoded[i] = a += b += decoded[i]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
309 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
310 case 3: |
5740 | 311 for (i = pred_order; i < blocksize; i++) |
312 decoded[i] = a += b += c += decoded[i]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
313 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
314 case 4: |
5740 | 315 for (i = pred_order; i < blocksize; i++) |
316 decoded[i] = a += b += c += d += decoded[i]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
317 break; |
1812 | 318 default: |
319 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); | |
320 return -1; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
321 } |
1812 | 322 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
323 return 0; |
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 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
326 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
|
327 { |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
328 int i, j; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
329 int coeff_prec, qlevel; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
330 int coeffs[pred_order]; |
5741 | 331 int32_t *decoded = s->decoded[channel]; |
2967 | 332 |
1812 | 333 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n"); |
2967 | 334 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
335 /* warm up samples */ |
1812 | 336 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); |
2967 | 337 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
338 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
339 { |
5741 | 340 decoded[i] = get_sbits(&s->gb, s->curr_bps); |
341 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, decoded[i]); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
342 } |
2967 | 343 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
344 coeff_prec = get_bits(&s->gb, 4) + 1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
345 if (coeff_prec == 16) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
346 { |
1812 | 347 av_log(s->avctx, AV_LOG_DEBUG, "invalid coeff precision\n"); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
348 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
349 } |
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
|
350 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec); |
1812 | 351 qlevel = get_sbits(&s->gb, 5); |
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
|
352 // av_log(s->avctx, AV_LOG_DEBUG, " quant level: %d\n", qlevel); |
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
353 if(qlevel < 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
|
354 av_log(s->avctx, AV_LOG_DEBUG, "qlevel %d not supported, maybe buggy stream\n", qlevel); |
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
355 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
|
356 } |
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
357 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
358 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
359 { |
1812 | 360 coeffs[i] = get_sbits(&s->gb, coeff_prec); |
361 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, coeffs[i]); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
362 } |
2967 | 363 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
364 if (decode_residuals(s, channel, pred_order) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
365 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
366 |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
367 if (s->bps > 16) { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
368 int64_t sum; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
369 for (i = pred_order; i < s->blocksize; i++) |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
370 { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
371 sum = 0; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
372 for (j = 0; j < pred_order; j++) |
5741 | 373 sum += (int64_t)coeffs[j] * decoded[i-j-1]; |
374 decoded[i] += sum >> qlevel; | |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
375 } |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
376 } else { |
5721 | 377 for (i = pred_order; i < s->blocksize-1; i += 2) |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
378 { |
5741 | 379 int c; |
380 int d = decoded[i-pred_order]; | |
381 int s0 = 0, s1 = 0; | |
5721 | 382 for (j = pred_order-1; j > 0; j--) |
383 { | |
5741 | 384 c = coeffs[j]; |
5721 | 385 s0 += c*d; |
5741 | 386 d = decoded[i-j]; |
387 s1 += c*d; | |
5721 | 388 } |
5741 | 389 c = coeffs[0]; |
390 s0 += c*d; | |
391 d = decoded[i] += s0 >> qlevel; | |
392 s1 += c*d; | |
393 decoded[i+1] += s1 >> qlevel; | |
5721 | 394 } |
395 if (i < s->blocksize) | |
396 { | |
397 int sum = 0; | |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
398 for (j = 0; j < pred_order; j++) |
5741 | 399 sum += coeffs[j] * decoded[i-j-1]; |
400 decoded[i] += sum >> qlevel; | |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
401 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
402 } |
2967 | 403 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
404 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
405 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
406 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
407 static inline int decode_subframe(FLACContext *s, int channel) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
408 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
409 int type, wasted = 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
410 int i, tmp; |
2967 | 411 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
412 s->curr_bps = s->bps; |
1812 | 413 if(channel == 0){ |
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
|
414 if(s->decorrelation == RIGHT_SIDE) |
1812 | 415 s->curr_bps++; |
416 }else{ | |
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
|
417 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE) |
1812 | 418 s->curr_bps++; |
419 } | |
420 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
421 if (get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
422 { |
2859 | 423 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
|
424 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
425 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
426 type = get_bits(&s->gb, 6); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
427 // wasted = get_bits1(&s->gb); |
2967 | 428 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
429 // if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
430 // { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
431 // while (!get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
432 // wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
433 // if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
434 // wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
435 // s->curr_bps -= wasted; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
436 // } |
1812 | 437 #if 0 |
438 wasted= 16 - av_log2(show_bits(&s->gb, 17)); | |
439 skip_bits(&s->gb, wasted+1); | |
440 s->curr_bps -= wasted; | |
441 #else | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
442 if (get_bits1(&s->gb)) |
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 wasted = 1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
445 while (!get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
446 wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
447 s->curr_bps -= wasted; |
1812 | 448 av_log(s->avctx, AV_LOG_DEBUG, "%d wasted bits\n", wasted); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
449 } |
1812 | 450 #endif |
451 //FIXME use av_log2 for types | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
452 if (type == 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
453 { |
1812 | 454 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n"); |
455 tmp = get_sbits(&s->gb, s->curr_bps); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
456 for (i = 0; i < s->blocksize; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
457 s->decoded[channel][i] = tmp; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
458 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
459 else if (type == 1) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
460 { |
1812 | 461 av_log(s->avctx, AV_LOG_DEBUG, "coding type: verbatim\n"); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
462 for (i = 0; i < s->blocksize; i++) |
1812 | 463 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
464 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
465 else if ((type >= 8) && (type <= 12)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
466 { |
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
|
467 // av_log(s->avctx, AV_LOG_DEBUG, "coding type: fixed\n"); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
468 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
469 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
470 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
471 else if (type >= 32) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
472 { |
1812 | 473 // av_log(s->avctx, AV_LOG_DEBUG, "coding type: lpc\n"); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
474 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
|
475 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
476 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
477 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
478 { |
2859 | 479 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
|
480 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
481 } |
2967 | 482 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
483 if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
484 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
485 int i; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
486 for (i = 0; i < s->blocksize; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
487 s->decoded[channel][i] <<= wasted; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
488 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
489 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
490 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
491 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
492 |
4351 | 493 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
|
494 { |
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
|
495 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8; |
1816 | 496 int decorrelation, bps, blocksize, samplerate; |
2967 | 497 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
498 blocksize_code = get_bits(&s->gb, 4); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
499 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
500 sample_rate_code = get_bits(&s->gb, 4); |
2967 | 501 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
502 assignment = get_bits(&s->gb, 4); /* channel assignment */ |
1816 | 503 if (assignment < 8 && s->channels == assignment+1) |
504 decorrelation = INDEPENDENT; | |
505 else if (assignment >=8 && assignment < 11 && s->channels == 2) | |
506 decorrelation = LEFT_SIDE + assignment - 8; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
507 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
508 { |
2859 | 509 av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
510 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
511 } |
2967 | 512 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
513 sample_size_code = get_bits(&s->gb, 3); |
1816 | 514 if(sample_size_code == 0) |
515 bps= s->bps; | |
516 else if((sample_size_code != 3) && (sample_size_code != 7)) | |
517 bps = sample_size_table[sample_size_code]; | |
2967 | 518 else |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
519 { |
2859 | 520 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
521 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
522 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
523 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
524 if (get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
525 { |
2859 | 526 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n"); |
1816 | 527 return -1; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
528 } |
2967 | 529 |
1816 | 530 if(get_utf8(&s->gb) < 0){ |
531 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n"); | |
532 return -1; | |
533 } | |
2967 | 534 #if 0 |
1812 | 535 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/ |
536 (s->min_blocksize != s->max_blocksize)){ | |
537 }else{ | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
538 } |
1816 | 539 #endif |
2967 | 540 |
1812 | 541 if (blocksize_code == 0) |
1816 | 542 blocksize = s->min_blocksize; |
1812 | 543 else if (blocksize_code == 6) |
1816 | 544 blocksize = get_bits(&s->gb, 8)+1; |
1812 | 545 else if (blocksize_code == 7) |
1816 | 546 blocksize = get_bits(&s->gb, 16)+1; |
2967 | 547 else |
1816 | 548 blocksize = blocksize_table[blocksize_code]; |
1812 | 549 |
1816 | 550 if(blocksize > s->max_blocksize){ |
551 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize); | |
1812 | 552 return -1; |
553 } | |
554 | |
4351 | 555 if(blocksize * s->channels * sizeof(int16_t) > alloc_data_size) |
556 return -1; | |
557 | |
1812 | 558 if (sample_rate_code == 0){ |
1816 | 559 samplerate= s->samplerate; |
1812 | 560 }else if ((sample_rate_code > 3) && (sample_rate_code < 12)) |
1816 | 561 samplerate = sample_rate_table[sample_rate_code]; |
1812 | 562 else if (sample_rate_code == 12) |
1816 | 563 samplerate = get_bits(&s->gb, 8) * 1000; |
1812 | 564 else if (sample_rate_code == 13) |
1816 | 565 samplerate = get_bits(&s->gb, 16); |
1812 | 566 else if (sample_rate_code == 14) |
1816 | 567 samplerate = get_bits(&s->gb, 16) * 10; |
1812 | 568 else{ |
569 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code); | |
570 return -1; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
571 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
572 |
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
|
573 skip_bits(&s->gb, 8); |
6108 | 574 crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, |
575 s->gb.buffer, get_bits_count(&s->gb)/8); | |
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
|
576 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
|
577 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
|
578 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
|
579 } |
2967 | 580 |
1816 | 581 s->blocksize = blocksize; |
582 s->samplerate = samplerate; | |
583 s->bps = bps; | |
584 s->decorrelation= decorrelation; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
585 |
6729 | 586 // dump_headers(s->avctx, (FLACStreaminfo *)s); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
587 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
588 /* subframes */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
589 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
590 { |
1812 | 591 // av_log(s->avctx, AV_LOG_DEBUG, "decoded: %x residual: %x\n", s->decoded[i], s->residual[i]); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
592 if (decode_subframe(s, i) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
593 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
594 } |
2967 | 595 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
596 align_get_bits(&s->gb); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
597 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
598 /* frame footer */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
599 skip_bits(&s->gb, 16); /* data crc */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
600 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
601 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
602 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
603 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
604 static int flac_decode_frame(AVCodecContext *avctx, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
605 void *data, int *data_size, |
6235 | 606 const uint8_t *buf, int buf_size) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
607 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
608 FLACContext *s = avctx->priv_data; |
2078 | 609 int tmp = 0, i, j = 0, input_buf_size = 0; |
610 int16_t *samples = data; | |
4351 | 611 int alloc_data_size= *data_size; |
612 | |
613 *data_size=0; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
614 |
1812 | 615 if(s->max_framesize == 0){ |
2513
ab32402c7e09
Fix a crash when multiple metadata packets are present.
lorenm
parents:
2500
diff
changeset
|
616 s->max_framesize= 65536; // should hopefully be enough for the first header |
1812 | 617 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
618 } | |
619 | |
620 if(1 && s->max_framesize){//FIXME truncated | |
7304 | 621 if(s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C')) |
622 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize)); | |
1812 | 623 input_buf_size= buf_size; |
624 | |
7304 | 625 if(s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index) |
626 return -1; | |
627 | |
628 if(s->allocated_bitstream_size < s->bitstream_size + buf_size) | |
629 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size); | |
630 | |
1812 | 631 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){ |
632 // printf("memmove\n"); | |
633 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); | |
634 s->bitstream_index=0; | |
635 } | |
636 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size); | |
637 buf= &s->bitstream[s->bitstream_index]; | |
638 buf_size += s->bitstream_size; | |
639 s->bitstream_size= buf_size; | |
2967 | 640 |
7273 | 641 if(buf_size < s->max_framesize && input_buf_size){ |
1812 | 642 // printf("wanna more data ...\n"); |
643 return input_buf_size; | |
644 } | |
645 } | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
646 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
647 init_get_bits(&s->gb, buf, buf_size*8); |
2967 | 648 |
7301
aab7f1fb59ea
If metadata has been parsed goto end instead of trying to
michael
parents:
7273
diff
changeset
|
649 if(metadata_parse(s)) |
aab7f1fb59ea
If metadata has been parsed goto end instead of trying to
michael
parents:
7273
diff
changeset
|
650 goto end; |
aab7f1fb59ea
If metadata has been parsed goto end instead of trying to
michael
parents:
7273
diff
changeset
|
651 |
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
|
652 tmp = show_bits(&s->gb, 16); |
5872
cd4b72a32517
Add decoding support for variable block size FLAC files using the latest FLAC
jbr
parents:
5871
diff
changeset
|
653 if((tmp & 0xFFFE) != 0xFFF8){ |
1812 | 654 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n"); |
5872
cd4b72a32517
Add decoding support for variable block size FLAC files using the latest FLAC
jbr
parents:
5871
diff
changeset
|
655 while(get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8) |
1812 | 656 skip_bits(&s->gb, 8); |
657 goto end; // we may not have enough bits left to decode a frame, so try next time | |
658 } | |
659 skip_bits(&s->gb, 16); | |
4351 | 660 if (decode_frame(s, alloc_data_size) < 0){ |
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
|
661 av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n"); |
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
662 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
|
663 s->bitstream_index=0; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
664 return -1; |
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 } |
1812 | 666 |
2967 | 667 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
668 #if 0 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
669 /* fix the channel order here */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
670 if (s->order == MID_SIDE) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
671 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
672 short *left = samples; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
673 short *right = samples + s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
674 for (i = 0; i < s->blocksize; i += 2) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
675 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
676 uint32_t x = s->decoded[0][i]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
677 uint32_t y = s->decoded[0][i+1]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
678 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
679 right[i] = x - (y / 2); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
680 left[i] = right[i] + y; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
681 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
682 *data_size = 2 * s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
683 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
684 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
685 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
686 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
687 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
688 switch(s->order) |
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 case INDEPENDENT: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
691 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
692 samples[(s->blocksize*i)+j] = s->decoded[i][j]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
693 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
694 case LEFT_SIDE: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
695 case RIGHT_SIDE: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
696 if (i == 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
697 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
698 samples[(s->blocksize*i)+j] = s->decoded[0][j]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
699 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
700 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
701 samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
702 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
703 // case MID_SIDE: |
1812 | 704 // av_log(s->avctx, AV_LOG_DEBUG, "mid-side unsupported\n"); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
705 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
706 *data_size += s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
707 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
708 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
709 #else |
3434 | 710 #define DECORRELATE(left, right)\ |
711 assert(s->channels == 2);\ | |
712 for (i = 0; i < s->blocksize; i++)\ | |
713 {\ | |
714 int a= s->decoded[0][i];\ | |
715 int b= s->decoded[1][i];\ | |
5141 | 716 *samples++ = ((left) << (24 - s->bps)) >> 8;\ |
717 *samples++ = ((right) << (24 - s->bps)) >> 8;\ | |
3434 | 718 }\ |
719 break; | |
720 | |
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
|
721 switch(s->decorrelation) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
722 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
723 case INDEPENDENT: |
1812 | 724 for (j = 0; j < s->blocksize; j++) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
725 { |
1812 | 726 for (i = 0; i < s->channels; i++) |
5141 | 727 *samples++ = (s->decoded[i][j] << (24 - s->bps)) >> 8; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
728 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
729 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
730 case LEFT_SIDE: |
3434 | 731 DECORRELATE(a,a-b) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
732 case RIGHT_SIDE: |
3434 | 733 DECORRELATE(a+b,b) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
734 case MID_SIDE: |
3434 | 735 DECORRELATE( (a-=b>>1) + b, a) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
736 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
737 #endif |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
738 |
1812 | 739 *data_size = (int8_t *)samples - (int8_t *)data; |
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
|
740 // av_log(s->avctx, AV_LOG_DEBUG, "data size: %d\n", *data_size); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
741 |
1812 | 742 // s->last_blocksize = s->blocksize; |
743 end: | |
6377 | 744 i= (get_bits_count(&s->gb)+7)/8; |
1812 | 745 if(i > buf_size){ |
746 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
|
747 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
|
748 s->bitstream_index=0; |
1812 | 749 return -1; |
750 } | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
751 |
1812 | 752 if(s->bitstream_size){ |
753 s->bitstream_index += i; | |
754 s->bitstream_size -= i; | |
755 return input_buf_size; | |
2967 | 756 }else |
1812 | 757 return i; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
758 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
759 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6377
diff
changeset
|
760 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
|
761 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
762 FLACContext *s = avctx->priv_data; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
763 int i; |
2967 | 764 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
765 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
766 { |
1812 | 767 av_freep(&s->decoded[i]); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
768 } |
1812 | 769 av_freep(&s->bitstream); |
2967 | 770 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
771 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
772 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
773 |
1817 | 774 static void flac_flush(AVCodecContext *avctx){ |
775 FLACContext *s = avctx->priv_data; | |
776 | |
777 s->bitstream_size= | |
778 s->bitstream_index= 0; | |
779 } | |
780 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
781 AVCodec flac_decoder = { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
782 "flac", |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
783 CODEC_TYPE_AUDIO, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
784 CODEC_ID_FLAC, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
785 sizeof(FLACContext), |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
786 flac_decode_init, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
787 NULL, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
788 flac_decode_close, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
789 flac_decode_frame, |
7273 | 790 CODEC_CAP_DELAY, |
2967 | 791 .flush= flac_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
792 .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
|
793 }; |