annotate flac.c @ 1812:6d762acfff5d libavcodec

flac fixes: fix data types of residual&decoded fix twos complement bitfields fix utf8 (no, utf8 is not the same as the simple and compact uvlc used in nut) add truncated bitstream support, both ogg and flac demuxers in mplayer cvs provide incomplete frames, and furthermore it isnt possible to find frameboundaries in flac without decoding it completly add escape-less golomb rice decoder (=flac style golomb rice) (ultra efficient, the longest vlc code is just 2^32-1 bits) printf->av_log fix bps for non independant channels fix a few +-1 bugs fix sample order for independant channels fix data_size
author michael
date Wed, 18 Feb 2004 01:49:30 +0000
parents 98d4d32b90e8
children ec0e71b1fc3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 *
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
6 * 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
7 * License as published by the Free Software Foundation; either
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
9 *
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
11 * 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
12 * 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
13 * Lesser General Public License for more details.
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
14 *
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
18 */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
19
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 * @file flac.c
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
22 * FLAC (Free Lossless Audio Codec) decoder
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
23 * @author Alex Beregszaszi
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
24 */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
25
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
26 #include <limits.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
27
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
28 #include "avcodec.h"
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
29 #include "golomb.h"
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
30
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
31 #undef NDEBUG
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
32 #include <assert.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
33
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
34 #define MAX_CHANNELS 8
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
35 #define MAX_BLOCKSIZE 65535
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
36
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
37 enum channel_order {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
38 INDEPENDENT,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
39 LEFT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
40 RIGHT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
41 MID_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
42 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
43
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
44 typedef struct FLACContext {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
45 AVCodecContext *avctx;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
46 GetBitContext gb;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
47
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
48 int min_blocksize, max_blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
49 int min_framesize, max_framesize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
50 int samplerate, channels;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
51 int blocksize/*, last_blocksize*/;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
52 int bps, curr_bps;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
53 enum channel_order order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
54
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
55 int32_t *residual[MAX_CHANNELS];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
56 int32_t *decoded[MAX_CHANNELS];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
57 uint8_t *bitstream;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
58 int bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
59 int bitstream_index;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
60 int allocated_bitstream_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
61 } FLACContext;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
62
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
63 #define METADATA_TYPE_STREAMINFO 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
64
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
65 static int sample_rate_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
66 { 0, 0, 0, 0,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
67 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
68 0, 0, 0, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
69
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
70 static int sample_size_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
71 { 0, 8, 12, 0, 16, 20, 24, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
72
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
73 static int64_t get_utf8(GetBitContext *gb)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
74 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
75 uint64_t val;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
76 int ones=0, bytes;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
77
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
78 while(get_bits1(gb))
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
79 ones++;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
80
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
81 if (ones==0) bytes=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
82 else if(ones==1) return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
83 else bytes= ones - 1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
84
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
85 val= get_bits(gb, 7-ones);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
86 while(bytes--){
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
87 const int tmp = get_bits(gb, 8);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
88
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
89 if((tmp>>6) != 2)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
90 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
91 val<<=6;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
92 val|= tmp&0x3F;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
93 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
97 static int flac_decode_init(AVCodecContext * avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
98 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
99 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
100 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
101
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
102 static void dump_headers(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
103 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
104 av_log(s->avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
105 av_log(s->avctx, AV_LOG_DEBUG, " Framesize: %d .. %d\n", s->min_framesize, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
106 av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
107 av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
108 av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
109 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
110
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
111 static void allocate_buffers(FLACContext *s){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
112 int i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
113
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
114 assert(s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
115
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
116 if(s->max_framesize == 0 && s->max_blocksize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
117 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
118 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
119
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
120 for (i = 0; i < s->channels; i++)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
121 {
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
122 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
123 s->residual[i] = av_realloc(s->residual[i], sizeof(int32_t)*s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
124 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
125
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
126 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
127 // s->bitstream= av_realloc(s->bitstream, s->max_framesize);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
128 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
129
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
130 static void metadata_streaminfo(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
131 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
132 /* mandatory streaminfo */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
133 s->min_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
134 s->max_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
135
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
136 s->min_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
137 s->max_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
138
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
139 s->samplerate = get_bits_long(&s->gb, 20);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
140 s->channels = get_bits(&s->gb, 3) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
141 s->bps = get_bits(&s->gb, 5) + 1;
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 s->avctx->channels = s->channels;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
144 s->avctx->sample_rate = s->samplerate;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
145
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
146 skip_bits(&s->gb, 36); /* total num of samples */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
147
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
148 skip_bits(&s->gb, 64); /* md5 sum */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
149 skip_bits(&s->gb, 64); /* md5 sum */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
150
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
151 allocate_buffers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
152 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
153
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
154 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
155 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
156 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
157 int sample = 0, samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
158
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
159 method_type = get_bits(&s->gb, 2);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
160 if (method_type != 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
161 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
162 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
163 }
1811
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 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
166
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
167 samples= s->blocksize >> rice_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
168
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
169 sample=
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
170 i= pred_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
171 for (partition = 0; partition < (1 << rice_order); partition++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
172 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
173 tmp = get_bits(&s->gb, 4);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
174 if (tmp == 15)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
175 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
176 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
177 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
178 for (; i < samples; i++, sample++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
179 s->residual[channel][sample] = get_sbits(&s->gb, tmp);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
180 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
181 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
182 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
183 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
184 for (; i < samples; i++, sample++){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
185 s->residual[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
186 if(get_bits_count(&s->gb) > s->gb.size_in_bits){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
187 av_log(s->avctx, AV_LOG_ERROR, "fucking FLAC\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
188 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
189 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
190 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
191 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
192 i= 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
193 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
194
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
195 // 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
196
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
197 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
198 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
199
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
200 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
201 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
202 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
203
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
204 av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
205
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
206 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
207 av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
1811
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 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
210 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
211 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
212 // 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
213 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
214
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
215 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
216 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
217
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
218 switch(pred_order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
219 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
220 case 0:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
221 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
222 s->decoded[channel][i] = s->residual[channel][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
223 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
224 case 1:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
225 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
226 s->decoded[channel][i] = s->residual[channel][i] +
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
227 s->decoded[channel][i-1];
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 2:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
230 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
231 s->decoded[channel][i] = s->residual[channel][i] +
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
232 (s->decoded[channel][i-1] << 1) -
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
233 s->decoded[channel][i-2];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
234 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
235 case 3:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
236 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
237 s->decoded[channel][i] = s->residual[channel][i] +
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
238 3*(s->decoded[channel][i-1] - s->decoded[channel][i-2])
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
239 + s->decoded[channel][i-3];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
240 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
241 case 4:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
242 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
243 s->decoded[channel][i] = s->residual[channel][i] +
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
244 ((s->decoded[channel][i-1] +
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
245 s->decoded[channel][i-3]) << 2) -
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
246 ((s->decoded[channel][i-2] << 2) +
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
247 (s->decoded[channel][i-2] << 1)) -
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
248 s->decoded[channel][i-4];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
249 break;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
250 default:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
251 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
252 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
253 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
254
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
255 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
256 }
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 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
259 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
260 int sum, i, j;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
261 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
262 int coeffs[pred_order];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
263
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
264 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
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 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
267 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
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 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
270 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
271 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
272 // 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
273 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
274
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
275 coeff_prec = get_bits(&s->gb, 4) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
276 if (coeff_prec == 16)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
277 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
278 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
279 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
280 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
281 av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
282 qlevel = get_sbits(&s->gb, 5);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
283 av_log(s->avctx, AV_LOG_DEBUG, " quant level: %d\n", qlevel);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
284 assert(qlevel >= 0); //FIXME
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
285 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
286 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
287 coeffs[i] = get_sbits(&s->gb, coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
288 // 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
289 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
290
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
291 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
292 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
293
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
294 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
295 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
296 sum = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
297 for (j = 0; j < pred_order; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
298 sum += coeffs[j] * s->decoded[channel][i-j-1];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
299 s->decoded[channel][i] = s->residual[channel][i] + (sum >> qlevel);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
300 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
301
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
302 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
303 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
304
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
305 static inline int decode_subframe(FLACContext *s, int channel)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
306 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
307 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
308 int i, tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
309
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
310 s->curr_bps = s->bps;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
311 if(channel == 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
312 if(s->order == RIGHT_SIDE)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
313 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
314 }else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
315 if(s->order == LEFT_SIDE || s->order == MID_SIDE)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
316 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
317 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
318
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
319 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
320 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
321 av_log(s->avctx, AV_LOG_DEBUG, "invalid subframe padding\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
322 return -1;
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 type = get_bits(&s->gb, 6);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
325 // wasted = get_bits1(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
326
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
327 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
328 // {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
329 // while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
330 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
331 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
332 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
333 // s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
334 // }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
335 #if 0
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
336 wasted= 16 - av_log2(show_bits(&s->gb, 17));
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
337 skip_bits(&s->gb, wasted+1);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
338 s->curr_bps -= wasted;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
339 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
340 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
341 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
342 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
343 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
344 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
345 s->curr_bps -= wasted;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
346 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
347 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
348 #endif
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
349 //FIXME use av_log2 for types
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
350 if (type == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
351 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
352 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
353 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
354 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
355 s->decoded[channel][i] = tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
356 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
357 else if (type == 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
358 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
359 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
360 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
361 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
362 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
363 else if ((type >= 8) && (type <= 12))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
364 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
365 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
366 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
367 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
368 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
369 else if (type >= 32)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
370 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
371 // 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
372 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
373 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
374 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
375 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
376 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
377 av_log(s->avctx, AV_LOG_DEBUG, "invalid coding type\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
378 return -1;
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
381 if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
382 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
383 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
384 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
385 s->decoded[channel][i] <<= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
386 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
387
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
388 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
389 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
390
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
391 static int decode_frame(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
392 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
393 int blocksize_code, sample_rate_code, sample_size_code, assignment, i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
394
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
395 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
396
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
397 sample_rate_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
398
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
399 assignment = get_bits(&s->gb, 4); /* channel assignment */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
400 if (assignment < 8)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
401 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
402 s->order = INDEPENDENT;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
403 if (s->channels != assignment+1)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
404 av_log(s->avctx, AV_LOG_DEBUG, "channel number and number of assigned channels differ!\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
405 av_log(s->avctx, AV_LOG_DEBUG, "channels: %d\n", assignment+1);
1811
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 else if (assignment == 8)
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 s->order = LEFT_SIDE;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
410 av_log(s->avctx, AV_LOG_DEBUG, "left/side\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
411 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
412 else if (assignment == 9)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
413 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
414 s->order = RIGHT_SIDE;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
415 av_log(s->avctx, AV_LOG_DEBUG, "right/side\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
416 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
417 else if (assignment == 10)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
418 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
419 s->order = MID_SIDE;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
420 av_log(s->avctx, AV_LOG_DEBUG, "mid/side\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
421 }
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 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
424 av_log(s->avctx, AV_LOG_DEBUG, "unsupported channel assignment\n");
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 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
427
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
428 if ((assignment >= 8) && (s->channels != 2))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
429 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
430 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
432
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
433 sample_size_code = get_bits(&s->gb, 3);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
434 if (sample_size_code != 0)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
435 s->bps = sample_size_table[sample_size_code];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
436
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
437 if ((sample_size_code == 3) || (sample_size_code == 7))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
438 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
439 av_log(s->avctx, AV_LOG_DEBUG, "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
440 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
441 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
442
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
445 av_log(s->avctx, AV_LOG_DEBUG, "broken stream, invalid padding\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
446 // return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
447 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
448
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
449 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
450 (s->min_blocksize != s->max_blocksize)){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
451 if(get_utf8(&s->gb) < 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
452 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
453 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
454 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
455 }else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
456 if(get_utf8(&s->gb) < 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
457 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
458 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
459 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
460 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
461
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
462 if (blocksize_code == 0)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
463 s->blocksize = s->min_blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
464 else if (blocksize_code == 1)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
465 s->blocksize = 192;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
466 else if (blocksize_code <= 5)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
467 s->blocksize = 576 << (blocksize_code - 2);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
468 else if (blocksize_code == 6)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
469 s->blocksize = get_bits(&s->gb, 8)+1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
470 else if (blocksize_code == 7)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
471 s->blocksize = get_bits(&s->gb, 16)+1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
472 else if (blocksize_code >= 8)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
473 s->blocksize = 256 << (blocksize_code - 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
474
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
475 if(s->blocksize > s->max_blocksize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
476 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", s->blocksize, s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
477 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
478 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
479
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
480 if (sample_rate_code == 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
481 //Streaminfo
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
482 }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
483 s->samplerate = sample_rate_table[sample_rate_code];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
484 else if (sample_rate_code == 12)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
485 s->samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
486 else if (sample_rate_code == 13)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
487 s->samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
488 else if (sample_rate_code == 14)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
489 s->samplerate = get_bits(&s->gb, 16) * 10;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
490 else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
491 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
492 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
493 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
494
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
495 skip_bits(&s->gb, 8); /* header crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
496
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
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
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
502 /* if (s->blocksize != s->last_blocksize)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
503 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
504 s->decoded[i] = av_realloc(s->decoded[i], sizeof(uint32_t)*s->blocksize);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
505 s->residual[i] = av_realloc(s->residual[i], sizeof(uint8_t)*s->blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
506 }*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
507 // 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
508 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
509 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
510 }
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 align_get_bits(&s->gb);
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 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
515 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
516
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
517 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
518 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
519
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
520 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
521 void *data, int *data_size,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
522 uint8_t *buf, int buf_size)
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 FLACContext *s = avctx->priv_data;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
525 int metadata_last, metadata_type, metadata_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
526 int tmp = 0, i, j = 0, input_buf_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
527 int16_t *samples = data, *left, *right;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
528
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
529 *data_size = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
530
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
531 s->avctx = avctx;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
532
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
533 if(s->max_framesize == 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
534 s->max_framesize= 8192; // should hopefully be enough for the first header
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
535 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
536 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
537
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
538 if(1 && s->max_framesize){//FIXME truncated
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
539 buf_size= FFMIN(buf_size, s->max_framesize - s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
540 input_buf_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
541
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
542 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
543 // printf("memmove\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
544 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
545 s->bitstream_index=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
546 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
547 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
548 buf= &s->bitstream[s->bitstream_index];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
549 buf_size += s->bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
550 s->bitstream_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
551
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
552 if(buf_size < s->max_framesize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
553 // printf("wanna more data ...\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
554 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
555 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
556 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
557
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
558 init_get_bits(&s->gb, buf, buf_size*8);
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 /* fLaC signature (be) */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
561 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
562 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
563 skip_bits(&s->gb, 32);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
564
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
565 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
566 do {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
567 metadata_last = get_bits(&s->gb, 1);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
568 metadata_type = get_bits(&s->gb, 7);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
569 metadata_size = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
570
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
571 av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
572 metadata_last, metadata_type,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
573 metadata_size);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
574 if(metadata_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
575 switch(metadata_type)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
576 {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
577 case METADATA_TYPE_STREAMINFO:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
578 if(metadata_size == 0)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
579 av_log(s->avctx, AV_LOG_DEBUG, "size= 0 WTF!?\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
580
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
581 metadata_streaminfo(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
582 dump_headers(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
583 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
584 default:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
585 for(i=0; i<metadata_size; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
586 skip_bits(&s->gb, 8);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
587 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
588 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
589 } while(!metadata_last);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
590 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
591 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
592 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
593
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
594 tmp = show_bits(&s->gb, 16);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
595 if(tmp != 0xFFF8){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
596 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
597 while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
598 skip_bits(&s->gb, 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
599 goto end; // we may not have enough bits left to decode a frame, so try next time
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
600 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
601 skip_bits(&s->gb, 16);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
602 if (decode_frame(s) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
603 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
604 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
605
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
606
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
607 #if 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
608 /* fix the channel order here */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
609 if (s->order == MID_SIDE)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
610 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
611 short *left = samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
612 short *right = samples + s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
613 for (i = 0; i < s->blocksize; i += 2)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
614 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
615 uint32_t x = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
616 uint32_t y = s->decoded[0][i+1];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
617
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
618 right[i] = x - (y / 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
619 left[i] = right[i] + y;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
620 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
621 *data_size = 2 * s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
622 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
623 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
624 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
625 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
626 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
627 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
628 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
629 case INDEPENDENT:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
630 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
631 samples[(s->blocksize*i)+j] = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
632 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
633 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
634 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
635 if (i == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
636 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
637 samples[(s->blocksize*i)+j] = s->decoded[0][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
638 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
639 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
640 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
641 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
642 // case MID_SIDE:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
643 // 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
644 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
645 *data_size += s->blocksize;
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 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
648 #else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
649 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
650 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
651 case INDEPENDENT:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
652 for (j = 0; j < s->blocksize; j++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
653 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
654 for (i = 0; i < s->channels; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
655 *(samples++) = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
656 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
657 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
658 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
659 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
660 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
661 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
662 *(samples++) = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
663 *(samples++) = s->decoded[0][i] - s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
664 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
665 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
666 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
667 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
668 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
670 *(samples++) = s->decoded[0][i] + s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
671 *(samples++) = s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
672 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
673 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
674 case MID_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
675 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
676 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
677 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
678 int mid, side;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
679 mid = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
680 side = s->decoded[1][i];
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 mid <<= 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
683 if (side & 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
684 mid++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
685 *(samples++) = (mid + side) >> 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
686 *(samples++) = (mid - side) >> 1;
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 break;
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 #endif
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
691
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
692 *data_size = (int8_t *)samples - (int8_t *)data;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
693 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
694
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
695 // s->last_blocksize = s->blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
696 end:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
697 i= (get_bits_count(&s->gb)+7)/8;;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
698 if(i > buf_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
699 av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
700 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
701 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
703 if(s->bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
704 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
705 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
706 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
707 }else
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
708 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
709 }
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 static int flac_decode_close(AVCodecContext *avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
712 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
713 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
714 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
715
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
716 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
717 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
718 av_freep(&s->decoded[i]);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
719 av_freep(&s->residual[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
720 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
721 av_freep(&s->bitstream);
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 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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
726 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
727 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
728 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
729 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
730 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
731 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
732 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
733 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
734 flac_decode_frame,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
735 };