Mercurial > libavcodec.hg
annotate flac.c @ 3990:746a60ba3177 libavcodec
enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author | michael |
---|---|
date | Wed, 11 Oct 2006 12:23:40 +0000 |
parents | c8c591fe26f8 |
children | c769e4b0c75e |
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 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
39 #include "avcodec.h" |
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2098
diff
changeset
|
40 #include "bitstream.h" |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
41 #include "golomb.h" |
3171 | 42 #include "crc.h" |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
43 |
1812 | 44 #undef NDEBUG |
45 #include <assert.h> | |
46 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
47 #define MAX_CHANNELS 8 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
48 #define MAX_BLOCKSIZE 65535 |
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
49 #define FLAC_STREAMINFO_SIZE 34 |
1811
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 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
59 AVCodecContext *avctx; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
60 GetBitContext gb; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
61 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
62 int min_blocksize, max_blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
63 int min_framesize, max_framesize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
64 int samplerate, channels; |
1812 | 65 int blocksize/*, last_blocksize*/; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
66 int bps, 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; | |
71 int bitstream_size; | |
72 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 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
78 static int sample_rate_table[] = |
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 |
2967 | 83 static 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 |
1816 | 86 static 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 |
2071
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
97 static void metadata_streaminfo(FLACContext *s); |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
98 static void dump_headers(FLACContext *s); |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
99 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
100 static int flac_decode_init(AVCodecContext * avctx) |
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 |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
105 /* initialize based on the demuxer-supplied streamdata header */ |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
106 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) { |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
107 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8); |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
108 metadata_streaminfo(s); |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
109 dump_headers(s); |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
110 } |
41d30bae5019
attempt to create some separation in the FLAC system with respect to
melanson
parents:
2028
diff
changeset
|
111 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
112 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
113 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
114 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
115 static void dump_headers(FLACContext *s) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
116 { |
1812 | 117 av_log(s->avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize); |
118 av_log(s->avctx, AV_LOG_DEBUG, " Framesize: %d .. %d\n", s->min_framesize, s->max_framesize); | |
119 av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate); | |
120 av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels); | |
121 av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps); | |
122 } | |
123 | |
124 static void allocate_buffers(FLACContext *s){ | |
125 int i; | |
126 | |
127 assert(s->max_blocksize); | |
128 | |
129 if(s->max_framesize == 0 && s->max_blocksize){ | |
130 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead | |
131 } | |
132 | |
133 for (i = 0; i < s->channels; i++) | |
134 { | |
135 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize); | |
136 } | |
137 | |
138 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
|
139 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
140 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
141 static void metadata_streaminfo(FLACContext *s) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
142 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
143 /* mandatory streaminfo */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
144 s->min_blocksize = get_bits(&s->gb, 16); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
145 s->max_blocksize = get_bits(&s->gb, 16); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
146 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
147 s->min_framesize = get_bits_long(&s->gb, 24); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
148 s->max_framesize = get_bits_long(&s->gb, 24); |
2967 | 149 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
150 s->samplerate = get_bits_long(&s->gb, 20); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
151 s->channels = get_bits(&s->gb, 3) + 1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
152 s->bps = get_bits(&s->gb, 5) + 1; |
2967 | 153 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
154 s->avctx->channels = s->channels; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
155 s->avctx->sample_rate = s->samplerate; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
156 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
157 skip_bits(&s->gb, 36); /* total num of samples */ |
2967 | 158 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
159 skip_bits(&s->gb, 64); /* md5 sum */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
160 skip_bits(&s->gb, 64); /* md5 sum */ |
2967 | 161 |
1812 | 162 allocate_buffers(s); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
163 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
164 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
165 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
|
166 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
167 int i, tmp, partition, method_type, rice_order; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
168 int sample = 0, samples; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
169 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
170 method_type = get_bits(&s->gb, 2); |
1812 | 171 if (method_type != 0){ |
172 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
|
173 return -1; |
1812 | 174 } |
2967 | 175 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
176 rice_order = get_bits(&s->gb, 4); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
177 |
1812 | 178 samples= s->blocksize >> rice_order; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
179 |
2967 | 180 sample= |
1812 | 181 i= pred_order; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
182 for (partition = 0; partition < (1 << rice_order); partition++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
183 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
184 tmp = get_bits(&s->gb, 4); |
1812 | 185 if (tmp == 15) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
186 { |
1812 | 187 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n"); |
188 tmp = get_bits(&s->gb, 5); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
189 for (; i < samples; i++, sample++) |
1813 | 190 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
|
191 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
192 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
193 { |
1812 | 194 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp); |
195 for (; i < samples; i++, sample++){ | |
1813 | 196 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); |
1812 | 197 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
198 } |
1812 | 199 i= 0; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
200 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
201 |
1812 | 202 // 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
|
203 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
204 return 0; |
2967 | 205 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
206 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
207 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
|
208 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
209 int i; |
2967 | 210 |
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
|
211 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n"); |
2967 | 212 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
213 /* 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
|
214 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); |
2967 | 215 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
216 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
217 { |
1812 | 218 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); |
219 // 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
|
220 } |
2967 | 221 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
222 if (decode_residuals(s, channel, pred_order) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
223 return -1; |
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 switch(pred_order) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
226 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
227 case 0: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
228 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
229 case 1: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
230 for (i = pred_order; i < s->blocksize; i++) |
1813 | 231 s->decoded[channel][i] += s->decoded[channel][i-1]; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
232 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
233 case 2: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
234 for (i = pred_order; i < s->blocksize; i++) |
1813 | 235 s->decoded[channel][i] += 2*s->decoded[channel][i-1] |
236 - s->decoded[channel][i-2]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
237 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
238 case 3: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
239 for (i = pred_order; i < s->blocksize; i++) |
2967 | 240 s->decoded[channel][i] += 3*s->decoded[channel][i-1] |
1813 | 241 - 3*s->decoded[channel][i-2] |
242 + s->decoded[channel][i-3]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
243 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
244 case 4: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
245 for (i = pred_order; i < s->blocksize; i++) |
2967 | 246 s->decoded[channel][i] += 4*s->decoded[channel][i-1] |
1813 | 247 - 6*s->decoded[channel][i-2] |
248 + 4*s->decoded[channel][i-3] | |
249 - s->decoded[channel][i-4]; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
250 break; |
1812 | 251 default: |
252 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); | |
253 return -1; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
254 } |
1812 | 255 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
256 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
257 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
258 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
259 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
|
260 { |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
261 int i, j; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
262 int coeff_prec, qlevel; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
263 int coeffs[pred_order]; |
2967 | 264 |
1812 | 265 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n"); |
2967 | 266 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
267 /* warm up samples */ |
1812 | 268 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); |
2967 | 269 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
270 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
271 { |
1812 | 272 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); |
273 // 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
|
274 } |
2967 | 275 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
276 coeff_prec = get_bits(&s->gb, 4) + 1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
277 if (coeff_prec == 16) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
278 { |
1812 | 279 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
|
280 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
281 } |
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
|
282 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec); |
1812 | 283 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
|
284 // 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
|
285 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
|
286 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
|
287 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
|
288 } |
4804dddf2d0e
crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents:
1813
diff
changeset
|
289 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
290 for (i = 0; i < pred_order; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
291 { |
1812 | 292 coeffs[i] = get_sbits(&s->gb, coeff_prec); |
293 // 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
|
294 } |
2967 | 295 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
296 if (decode_residuals(s, channel, pred_order) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
297 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
298 |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
299 if (s->bps > 16) { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
300 int64_t sum; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
301 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
|
302 { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
303 sum = 0; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
304 for (j = 0; j < pred_order; j++) |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
305 sum += (int64_t)coeffs[j] * s->decoded[channel][i-j-1]; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
306 s->decoded[channel][i] += sum >> qlevel; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
307 } |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
308 } else { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
309 int sum; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
310 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
|
311 { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
312 sum = 0; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
313 for (j = 0; j < pred_order; j++) |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
314 sum += coeffs[j] * s->decoded[channel][i-j-1]; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
315 s->decoded[channel][i] += sum >> qlevel; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
316 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
317 } |
2967 | 318 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
319 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
320 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
321 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
322 static inline int decode_subframe(FLACContext *s, int channel) |
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 int type, wasted = 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
325 int i, tmp; |
2967 | 326 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
327 s->curr_bps = s->bps; |
1812 | 328 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
|
329 if(s->decorrelation == RIGHT_SIDE) |
1812 | 330 s->curr_bps++; |
331 }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
|
332 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE) |
1812 | 333 s->curr_bps++; |
334 } | |
335 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
336 if (get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
337 { |
2859 | 338 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
|
339 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
340 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
341 type = get_bits(&s->gb, 6); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
342 // wasted = get_bits1(&s->gb); |
2967 | 343 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
344 // if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
345 // { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
346 // while (!get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
347 // wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
348 // if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
349 // wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
350 // s->curr_bps -= wasted; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
351 // } |
1812 | 352 #if 0 |
353 wasted= 16 - av_log2(show_bits(&s->gb, 17)); | |
354 skip_bits(&s->gb, wasted+1); | |
355 s->curr_bps -= wasted; | |
356 #else | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
357 if (get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
358 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
359 wasted = 1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
360 while (!get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
361 wasted++; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
362 s->curr_bps -= wasted; |
1812 | 363 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
|
364 } |
1812 | 365 #endif |
366 //FIXME use av_log2 for types | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
367 if (type == 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
368 { |
1812 | 369 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n"); |
370 tmp = get_sbits(&s->gb, s->curr_bps); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
371 for (i = 0; i < s->blocksize; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
372 s->decoded[channel][i] = tmp; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
373 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
374 else if (type == 1) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
375 { |
1812 | 376 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
|
377 for (i = 0; i < s->blocksize; i++) |
1812 | 378 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
|
379 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
380 else if ((type >= 8) && (type <= 12)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
381 { |
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
|
382 // 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
|
383 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
384 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
385 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
386 else if (type >= 32) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
387 { |
1812 | 388 // 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
|
389 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
|
390 return -1; |
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 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
393 { |
2859 | 394 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
|
395 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
396 } |
2967 | 397 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
398 if (wasted) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
399 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
400 int i; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
401 for (i = 0; i < s->blocksize; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
402 s->decoded[channel][i] <<= wasted; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
403 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
404 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
405 return 0; |
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 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
408 static int decode_frame(FLACContext *s) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
409 { |
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
|
410 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8; |
1816 | 411 int decorrelation, bps, blocksize, samplerate; |
2967 | 412 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
413 blocksize_code = get_bits(&s->gb, 4); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
414 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
415 sample_rate_code = get_bits(&s->gb, 4); |
2967 | 416 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
417 assignment = get_bits(&s->gb, 4); /* channel assignment */ |
1816 | 418 if (assignment < 8 && s->channels == assignment+1) |
419 decorrelation = INDEPENDENT; | |
420 else if (assignment >=8 && assignment < 11 && s->channels == 2) | |
421 decorrelation = LEFT_SIDE + assignment - 8; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
422 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
423 { |
2859 | 424 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
|
425 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
426 } |
2967 | 427 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
428 sample_size_code = get_bits(&s->gb, 3); |
1816 | 429 if(sample_size_code == 0) |
430 bps= s->bps; | |
431 else if((sample_size_code != 3) && (sample_size_code != 7)) | |
432 bps = sample_size_table[sample_size_code]; | |
2967 | 433 else |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
434 { |
2859 | 435 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
|
436 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
437 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
438 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
439 if (get_bits1(&s->gb)) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
440 { |
2859 | 441 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n"); |
1816 | 442 return -1; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
443 } |
2967 | 444 |
1816 | 445 if(get_utf8(&s->gb) < 0){ |
446 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n"); | |
447 return -1; | |
448 } | |
2967 | 449 #if 0 |
1812 | 450 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/ |
451 (s->min_blocksize != s->max_blocksize)){ | |
452 }else{ | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
453 } |
1816 | 454 #endif |
2967 | 455 |
1812 | 456 if (blocksize_code == 0) |
1816 | 457 blocksize = s->min_blocksize; |
1812 | 458 else if (blocksize_code == 6) |
1816 | 459 blocksize = get_bits(&s->gb, 8)+1; |
1812 | 460 else if (blocksize_code == 7) |
1816 | 461 blocksize = get_bits(&s->gb, 16)+1; |
2967 | 462 else |
1816 | 463 blocksize = blocksize_table[blocksize_code]; |
1812 | 464 |
1816 | 465 if(blocksize > s->max_blocksize){ |
466 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize); | |
1812 | 467 return -1; |
468 } | |
469 | |
470 if (sample_rate_code == 0){ | |
1816 | 471 samplerate= s->samplerate; |
1812 | 472 }else if ((sample_rate_code > 3) && (sample_rate_code < 12)) |
1816 | 473 samplerate = sample_rate_table[sample_rate_code]; |
1812 | 474 else if (sample_rate_code == 12) |
1816 | 475 samplerate = get_bits(&s->gb, 8) * 1000; |
1812 | 476 else if (sample_rate_code == 13) |
1816 | 477 samplerate = get_bits(&s->gb, 16); |
1812 | 478 else if (sample_rate_code == 14) |
1816 | 479 samplerate = get_bits(&s->gb, 16) * 10; |
1812 | 480 else{ |
481 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code); | |
482 return -1; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
483 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
484 |
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
|
485 skip_bits(&s->gb, 8); |
3171 | 486 crc8= av_crc(av_crc07, 0, 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
|
487 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
|
488 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
|
489 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
|
490 } |
2967 | 491 |
1816 | 492 s->blocksize = blocksize; |
493 s->samplerate = samplerate; | |
494 s->bps = bps; | |
495 s->decorrelation= decorrelation; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
496 |
1812 | 497 // dump_headers(s); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
498 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
499 /* subframes */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
500 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
501 { |
1812 | 502 // 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
|
503 if (decode_subframe(s, i) < 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
504 return -1; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
505 } |
2967 | 506 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
507 align_get_bits(&s->gb); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
508 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
509 /* frame footer */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
510 skip_bits(&s->gb, 16); /* data crc */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
511 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
512 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
513 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
514 |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
515 static inline int16_t shift_to_16_bits(int32_t data, int bps) |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
516 { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
517 if (bps == 24) { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
518 return (data >> 8); |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
519 } else if (bps == 20) { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
520 return (data >> 4); |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
521 } else { |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
522 return data; |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
523 } |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
524 } |
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
525 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
526 static int flac_decode_frame(AVCodecContext *avctx, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
527 void *data, int *data_size, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
528 uint8_t *buf, int buf_size) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
529 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
530 FLACContext *s = avctx->priv_data; |
1812 | 531 int metadata_last, metadata_type, metadata_size; |
2078 | 532 int tmp = 0, i, j = 0, input_buf_size = 0; |
533 int16_t *samples = data; | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
534 |
1812 | 535 if(s->max_framesize == 0){ |
2513
ab32402c7e09
Fix a crash when multiple metadata packets are present.
lorenm
parents:
2500
diff
changeset
|
536 s->max_framesize= 65536; // should hopefully be enough for the first header |
1812 | 537 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
538 } | |
539 | |
540 if(1 && s->max_framesize){//FIXME truncated | |
2513
ab32402c7e09
Fix a crash when multiple metadata packets are present.
lorenm
parents:
2500
diff
changeset
|
541 buf_size= FFMAX(FFMIN(buf_size, s->max_framesize - s->bitstream_size), 0); |
1812 | 542 input_buf_size= buf_size; |
543 | |
544 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){ | |
545 // printf("memmove\n"); | |
546 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); | |
547 s->bitstream_index=0; | |
548 } | |
549 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size); | |
550 buf= &s->bitstream[s->bitstream_index]; | |
551 buf_size += s->bitstream_size; | |
552 s->bitstream_size= buf_size; | |
2967 | 553 |
1812 | 554 if(buf_size < s->max_framesize){ |
555 // printf("wanna more data ...\n"); | |
556 return input_buf_size; | |
557 } | |
558 } | |
1811
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 init_get_bits(&s->gb, buf, buf_size*8); |
2967 | 561 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
562 /* fLaC signature (be) */ |
1812 | 563 if (show_bits_long(&s->gb, 32) == bswap_32(ff_get_fourcc("fLaC"))) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
564 { |
1812 | 565 skip_bits(&s->gb, 32); |
566 | |
567 av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n"); | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
568 do { |
1812 | 569 metadata_last = get_bits(&s->gb, 1); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
570 metadata_type = get_bits(&s->gb, 7); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
571 metadata_size = get_bits_long(&s->gb, 24); |
2967 | 572 |
1812 | 573 av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n", |
574 metadata_last, metadata_type, | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
575 metadata_size); |
1812 | 576 if(metadata_size){ |
577 switch(metadata_type) | |
578 { | |
2500 | 579 case METADATA_TYPE_STREAMINFO:{ |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
580 metadata_streaminfo(s); |
2500 | 581 |
2529 | 582 /* Buffer might have been reallocated, reinit bitreader */ |
583 if(buf != &s->bitstream[s->bitstream_index]) | |
584 { | |
585 int bits_count = get_bits_count(&s->gb); | |
586 buf= &s->bitstream[s->bitstream_index]; | |
587 init_get_bits(&s->gb, buf, buf_size*8); | |
588 skip_bits(&s->gb, bits_count); | |
589 } | |
2967 | 590 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
591 dump_headers(s); |
2500 | 592 break;} |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
593 default: |
1812 | 594 for(i=0; i<metadata_size; i++) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
595 skip_bits(&s->gb, 8); |
1812 | 596 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
597 } |
1812 | 598 } while(!metadata_last); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
599 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
600 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
601 { |
2967 | 602 |
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
|
603 tmp = show_bits(&s->gb, 16); |
1812 | 604 if(tmp != 0xFFF8){ |
605 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n"); | |
606 while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8) | |
607 skip_bits(&s->gb, 8); | |
608 goto end; // we may not have enough bits left to decode a frame, so try next time | |
609 } | |
610 skip_bits(&s->gb, 16); | |
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
|
611 if (decode_frame(s) < 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
|
612 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
|
613 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
|
614 s->bitstream_index=0; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
615 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
|
616 } |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
617 } |
1812 | 618 |
2967 | 619 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
620 #if 0 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
621 /* fix the channel order here */ |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
622 if (s->order == MID_SIDE) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
623 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
624 short *left = samples; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
625 short *right = samples + s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
626 for (i = 0; i < s->blocksize; i += 2) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
627 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
628 uint32_t x = s->decoded[0][i]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
629 uint32_t y = s->decoded[0][i+1]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
630 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
631 right[i] = x - (y / 2); |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
632 left[i] = right[i] + y; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
633 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
634 *data_size = 2 * s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
635 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
636 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
637 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
638 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
639 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
640 switch(s->order) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
641 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
642 case INDEPENDENT: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
643 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
644 samples[(s->blocksize*i)+j] = s->decoded[i][j]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
645 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
646 case LEFT_SIDE: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
647 case RIGHT_SIDE: |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
648 if (i == 0) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
649 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
650 samples[(s->blocksize*i)+j] = s->decoded[0][j]; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
651 else |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
652 for (j = 0; j < s->blocksize; j++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
653 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
|
654 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
655 // case MID_SIDE: |
1812 | 656 // 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
|
657 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
658 *data_size += s->blocksize; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
659 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
660 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
661 #else |
3434 | 662 #define DECORRELATE(left, right)\ |
663 assert(s->channels == 2);\ | |
664 for (i = 0; i < s->blocksize; i++)\ | |
665 {\ | |
666 int a= s->decoded[0][i];\ | |
667 int b= s->decoded[1][i];\ | |
668 *(samples++) = (left ) >> (16 - s->bps);\ | |
669 *(samples++) = (right) >> (16 - s->bps);\ | |
670 }\ | |
671 break; | |
672 | |
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
|
673 switch(s->decorrelation) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
674 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
675 case INDEPENDENT: |
1812 | 676 for (j = 0; j < s->blocksize; j++) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
677 { |
1812 | 678 for (i = 0; i < s->channels; i++) |
3351
42b85e03b408
fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents:
3171
diff
changeset
|
679 *(samples++) = shift_to_16_bits(s->decoded[i][j], s->bps); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
680 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
681 break; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
682 case LEFT_SIDE: |
3434 | 683 DECORRELATE(a,a-b) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
684 case RIGHT_SIDE: |
3434 | 685 DECORRELATE(a+b,b) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
686 case MID_SIDE: |
3434 | 687 DECORRELATE( (a-=b>>1) + b, a) |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
688 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
689 #endif |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
690 |
1812 | 691 *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
|
692 // 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
|
693 |
1812 | 694 // s->last_blocksize = s->blocksize; |
695 end: | |
696 i= (get_bits_count(&s->gb)+7)/8;; | |
697 if(i > buf_size){ | |
698 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
|
699 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
|
700 s->bitstream_index=0; |
1812 | 701 return -1; |
702 } | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
703 |
1812 | 704 if(s->bitstream_size){ |
705 s->bitstream_index += i; | |
706 s->bitstream_size -= i; | |
707 return input_buf_size; | |
2967 | 708 }else |
1812 | 709 return i; |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
710 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
711 |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
712 static int flac_decode_close(AVCodecContext *avctx) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
713 { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
714 FLACContext *s = avctx->priv_data; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
715 int i; |
2967 | 716 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
717 for (i = 0; i < s->channels; i++) |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
718 { |
1812 | 719 av_freep(&s->decoded[i]); |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
720 } |
1812 | 721 av_freep(&s->bitstream); |
2967 | 722 |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
723 return 0; |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
724 } |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
725 |
1817 | 726 static void flac_flush(AVCodecContext *avctx){ |
727 FLACContext *s = avctx->priv_data; | |
728 | |
729 s->bitstream_size= | |
730 s->bitstream_index= 0; | |
731 } | |
732 | |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
733 AVCodec flac_decoder = { |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
734 "flac", |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
735 CODEC_TYPE_AUDIO, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
736 CODEC_ID_FLAC, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
737 sizeof(FLACContext), |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
738 flac_decode_init, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
739 NULL, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
740 flac_decode_close, |
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
741 flac_decode_frame, |
2967 | 742 .flush= flac_flush, |
1811
98d4d32b90e8
flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff
changeset
|
743 }; |