annotate flac.c @ 2071:41d30bae5019 libavcodec

attempt to create some separation in the FLAC system with respect to demuxer and decoder layers by enabling the FLAC decoder to decode data without needing the entire file, from start to finish
author melanson
date Thu, 10 Jun 2004 04:13:43 +0000
parents 141a9539e270
children 3dabadc91d19
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
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
24 *
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
25 * 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
26 * http://flac.sourceforge.net/
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
27 *
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
28 * 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
29 * 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
30 * 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
31 * by data starting with the 0xFFF8 marker.
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
32 */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
33
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
34 #include <limits.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
35
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
36 #include "avcodec.h"
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
37 #include "golomb.h"
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
38
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
39 #undef NDEBUG
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
40 #include <assert.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
41
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
42 #define MAX_CHANNELS 8
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
43 #define MAX_BLOCKSIZE 65535
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
44 #define FLAC_STREAMINFO_SIZE 34
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
45
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
46 enum decorrelation_type {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
47 INDEPENDENT,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
48 LEFT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
49 RIGHT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
50 MID_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
51 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
52
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
53 typedef struct FLACContext {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
54 AVCodecContext *avctx;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
55 GetBitContext gb;
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 int min_blocksize, max_blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
58 int min_framesize, max_framesize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
59 int samplerate, channels;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
60 int blocksize/*, last_blocksize*/;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
61 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
62 enum decorrelation_type decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
63
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
64 int32_t *decoded[MAX_CHANNELS];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
65 uint8_t *bitstream;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
66 int bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
67 int bitstream_index;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
68 int allocated_bitstream_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
69 } FLACContext;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
70
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
71 #define METADATA_TYPE_STREAMINFO 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
72
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
73 static int sample_rate_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
74 { 0, 0, 0, 0,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
75 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
76 0, 0, 0, 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_size_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
79 { 0, 8, 12, 0, 16, 20, 24, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
80
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
81 static int blocksize_table[] = {
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
82 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
83 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
84 };
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
85
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
86 static const uint8_t table_crc8[256] = {
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
87 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
88 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
89 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
90 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
91 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
92 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
93 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
94 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
95 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
96 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
97 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
98 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
99 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
100 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
101 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
102 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
103 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
104 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
105 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
106 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
107 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
108 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
109 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
110 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
111 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
112 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
113 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
114 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
115 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
116 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
117 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb,
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
118 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
119 };
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
120
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
121 static int64_t get_utf8(GetBitContext *gb)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
122 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
123 uint64_t val;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
124 int ones=0, bytes;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
125
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
126 while(get_bits1(gb))
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
127 ones++;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
128
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
129 if (ones==0) bytes=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
130 else if(ones==1) return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
131 else bytes= ones - 1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
132
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
133 val= get_bits(gb, 7-ones);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
134 while(bytes--){
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
135 const int tmp = get_bits(gb, 8);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
136
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
137 if((tmp>>6) != 2)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
138 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
139 val<<=6;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
140 val|= tmp&0x3F;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
141 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
142 return val;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
143 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
144
1860
7072086a0dd3 * const warn elimintation
kabi
parents: 1817
diff changeset
145 static int get_crc8(const uint8_t *buf, int count){
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
146 int crc=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
147 int i;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
148
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
149 for(i=0; i<count; i++){
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
150 crc = table_crc8[crc ^ buf[i]];
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
151 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
152
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
153 return crc;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
154 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
155
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
156 static void metadata_streaminfo(FLACContext *s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
157 static void dump_headers(FLACContext *s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
158
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
159 static int flac_decode_init(AVCodecContext * avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
160 {
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
161 FLACContext *s = avctx->priv_data;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
162 s->avctx = avctx;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
163
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
164 /* 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
165 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
166 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
167 metadata_streaminfo(s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
168 dump_headers(s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
169 }
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
170
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
171 return 0;
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
174 static void dump_headers(FLACContext *s)
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, " Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
177 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
178 av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
179 av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
180 av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
181 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
182
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
183 static void allocate_buffers(FLACContext *s){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
184 int i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
185
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
186 assert(s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
187
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
188 if(s->max_framesize == 0 && s->max_blocksize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
189 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
190 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
191
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
192 for (i = 0; i < s->channels; i++)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
193 {
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
194 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
195 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
196
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
197 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
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 void metadata_streaminfo(FLACContext *s)
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 /* mandatory streaminfo */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
203 s->min_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
204 s->max_blocksize = get_bits(&s->gb, 16);
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 s->min_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
207 s->max_framesize = get_bits_long(&s->gb, 24);
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 s->samplerate = get_bits_long(&s->gb, 20);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
210 s->channels = get_bits(&s->gb, 3) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
211 s->bps = get_bits(&s->gb, 5) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
212
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
213 s->avctx->channels = s->channels;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
214 s->avctx->sample_rate = s->samplerate;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
215
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
216 skip_bits(&s->gb, 36); /* total num of samples */
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 skip_bits(&s->gb, 64); /* md5 sum */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
219 skip_bits(&s->gb, 64); /* md5 sum */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
220
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
221 allocate_buffers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
222 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
223
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
224 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
225 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
226 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
227 int sample = 0, samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
228
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
229 method_type = get_bits(&s->gb, 2);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
230 if (method_type != 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
231 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
232 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
233 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
234
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
235 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
236
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
237 samples= s->blocksize >> rice_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
238
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
239 sample=
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
240 i= pred_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
241 for (partition = 0; partition < (1 << rice_order); partition++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
242 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
243 tmp = get_bits(&s->gb, 4);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
244 if (tmp == 15)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
245 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
246 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
247 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
248 for (; i < samples; i++, sample++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
249 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
250 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
251 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
252 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
253 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
254 for (; i < samples; i++, sample++){
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
255 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
256 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
257 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
258 i= 0;
1811
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
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
261 // 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
262
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
263 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
264 }
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 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
267 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
268 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
269
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
270 // 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
271
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
272 /* 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
273 // 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
274
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
275 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
276 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
277 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
278 // 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
279 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
280
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
281 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
282 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
283
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
284 switch(pred_order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
285 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
286 case 0:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
287 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
288 case 1:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
289 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
290 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
291 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
292 case 2:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
293 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
294 s->decoded[channel][i] += 2*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
295 - s->decoded[channel][i-2];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
296 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
297 case 3:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
298 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
299 s->decoded[channel][i] += 3*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
300 - 3*s->decoded[channel][i-2]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
301 + s->decoded[channel][i-3];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
302 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
303 case 4:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
304 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
305 s->decoded[channel][i] += 4*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
306 - 6*s->decoded[channel][i-2]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
307 + 4*s->decoded[channel][i-3]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
308 - s->decoded[channel][i-4];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
309 break;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
310 default:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
311 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
312 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
313 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
314
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
315 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
316 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
317
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
318 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
319 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
320 int sum, i, j;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
321 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
322 int coeffs[pred_order];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
323
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
324 // 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
325
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
326 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
327 // 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
328
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
329 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
330 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
331 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
332 // 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
333 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
334
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
335 coeff_prec = get_bits(&s->gb, 4) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
336 if (coeff_prec == 16)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
337 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
338 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
339 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
340 }
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
341 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
342 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
343 // 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
344 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
345 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
346 return -1;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
347 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
348
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
349 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
350 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
351 coeffs[i] = get_sbits(&s->gb, coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
352 // 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
353 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
354
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
355 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
356 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
357
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
358 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
359 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
360 sum = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
361 for (j = 0; j < pred_order; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
362 sum += coeffs[j] * s->decoded[channel][i-j-1];
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
363 s->decoded[channel][i] += sum >> qlevel;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
364 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
365
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
366 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
367 }
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 static inline int decode_subframe(FLACContext *s, int channel)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
370 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
371 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
372 int 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 s->curr_bps = s->bps;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
375 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
376 if(s->decorrelation == RIGHT_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
377 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
378 }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
379 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
380 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
381 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
382
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
383 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
384 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
385 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
386 return -1;
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 type = get_bits(&s->gb, 6);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
389 // wasted = get_bits1(&s->gb);
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 // if (wasted)
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 // while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
394 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
395 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
396 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
397 // s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
398 // }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
399 #if 0
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
400 wasted= 16 - av_log2(show_bits(&s->gb, 17));
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
401 skip_bits(&s->gb, wasted+1);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
402 s->curr_bps -= wasted;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
403 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
404 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
405 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
406 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
407 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
408 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
409 s->curr_bps -= wasted;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
410 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
411 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
412 #endif
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
413 //FIXME use av_log2 for types
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
414 if (type == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
415 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
416 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
417 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
418 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
419 s->decoded[channel][i] = tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
420 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
421 else if (type == 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
422 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
423 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
424 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
425 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
426 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
427 else if ((type >= 8) && (type <= 12))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
428 {
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
429 // 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
430 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 return -1;
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 else if (type >= 32)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
434 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
435 // 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
436 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
437 return -1;
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 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
440 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
441 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
442 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
445 if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
446 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
447 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
448 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
449 s->decoded[channel][i] <<= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
450 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
451
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
452 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
453 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
454
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
455 static int decode_frame(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
456 {
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
457 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
458 int decorrelation, bps, blocksize, samplerate;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
459
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
460 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
461
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
462 sample_rate_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
463
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
464 assignment = get_bits(&s->gb, 4); /* channel assignment */
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
465 if (assignment < 8 && s->channels == assignment+1)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
466 decorrelation = INDEPENDENT;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
467 else if (assignment >=8 && assignment < 11 && s->channels == 2)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
468 decorrelation = LEFT_SIDE + assignment - 8;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
469 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
470 {
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
471 av_log(s->avctx, AV_LOG_DEBUG, "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
472 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
473 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
474
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
475 sample_size_code = get_bits(&s->gb, 3);
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
476 if(sample_size_code == 0)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
477 bps= s->bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
478 else if((sample_size_code != 3) && (sample_size_code != 7))
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
479 bps = sample_size_table[sample_size_code];
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
480 else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
481 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
482 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
483 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
484 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
485
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
486 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
487 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
488 av_log(s->avctx, AV_LOG_DEBUG, "broken stream, invalid padding\n");
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
489 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
490 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
491
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
492 if(get_utf8(&s->gb) < 0){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
493 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
494 return -1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
495 }
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
496 #if 0
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
497 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
498 (s->min_blocksize != s->max_blocksize)){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
499 }else{
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
500 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
501 #endif
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
502
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
503 if (blocksize_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
504 blocksize = s->min_blocksize;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
505 else if (blocksize_code == 6)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
506 blocksize = get_bits(&s->gb, 8)+1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
507 else if (blocksize_code == 7)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
508 blocksize = get_bits(&s->gb, 16)+1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
509 else
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
510 blocksize = blocksize_table[blocksize_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
511
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
512 if(blocksize > s->max_blocksize){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
513 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
514 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
515 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
516
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
517 if (sample_rate_code == 0){
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
518 samplerate= s->samplerate;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
519 }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
520 samplerate = sample_rate_table[sample_rate_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
521 else if (sample_rate_code == 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
522 samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
523 else if (sample_rate_code == 13)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
524 samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
525 else if (sample_rate_code == 14)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
526 samplerate = get_bits(&s->gb, 16) * 10;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
527 else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
528 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
529 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
530 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
531
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
532 skip_bits(&s->gb, 8);
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
533 crc8= get_crc8(s->gb.buffer, get_bits_count(&s->gb)/8);
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
534 if(crc8){
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
535 av_log(s->avctx, AV_LOG_ERROR, "header crc missmatch crc=%2X\n", crc8);
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
536 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
537 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
538
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
539 s->blocksize = blocksize;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
540 s->samplerate = samplerate;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
541 s->bps = bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
542 s->decorrelation= decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
543
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
544 // dump_headers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
545
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
546 /* subframes */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
547 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
548 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
549 // 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
550 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
551 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
552 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
553
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
554 align_get_bits(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
555
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
556 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
557 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
558
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
559 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
560 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
561
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
562 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
563 void *data, int *data_size,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
564 uint8_t *buf, int buf_size)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
565 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
566 FLACContext *s = avctx->priv_data;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
567 int metadata_last, metadata_type, metadata_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
568 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
569 int16_t *samples = data, *left, *right;
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 if(s->max_framesize == 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
572 s->max_framesize= 8192; // should hopefully be enough for the first header
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
573 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
574 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
575
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
576 if(1 && s->max_framesize){//FIXME truncated
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
577 buf_size= FFMIN(buf_size, s->max_framesize - s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
578 input_buf_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
579
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
580 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
581 // printf("memmove\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
582 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
583 s->bitstream_index=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
584 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
585 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
586 buf= &s->bitstream[s->bitstream_index];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
587 buf_size += s->bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
588 s->bitstream_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
589
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
590 if(buf_size < s->max_framesize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
591 // printf("wanna more data ...\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
592 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
593 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
594 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
595
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
596 init_get_bits(&s->gb, buf, buf_size*8);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
597
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
598 /* fLaC signature (be) */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
599 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
600 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
601 skip_bits(&s->gb, 32);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
602
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
603 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
604 do {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
605 metadata_last = get_bits(&s->gb, 1);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
606 metadata_type = get_bits(&s->gb, 7);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
607 metadata_size = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
608
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
609 av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
610 metadata_last, metadata_type,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
611 metadata_size);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
612 if(metadata_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
613 switch(metadata_type)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
614 {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
615 case METADATA_TYPE_STREAMINFO:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
616 metadata_streaminfo(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
617 dump_headers(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
618 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
619 default:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
620 for(i=0; i<metadata_size; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
621 skip_bits(&s->gb, 8);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
622 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
623 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
624 } while(!metadata_last);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
625 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
626 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
627 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
628
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
629 tmp = show_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
630 if(tmp != 0xFFF8){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
631 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
632 while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
633 skip_bits(&s->gb, 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
634 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
635 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
636 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
637 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
638 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
639 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
640 s->bitstream_index=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
641 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
642 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
643 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
644
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
645
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
646 #if 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
647 /* fix the channel order here */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
648 if (s->order == MID_SIDE)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
649 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
650 short *left = samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
651 short *right = samples + s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
652 for (i = 0; i < s->blocksize; i += 2)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
653 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
654 uint32_t x = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
655 uint32_t y = s->decoded[0][i+1];
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 right[i] = x - (y / 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
658 left[i] = right[i] + y;
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 *data_size = 2 * s->blocksize;
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 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
663 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
664 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
665 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
666 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
667 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
668 case INDEPENDENT:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
670 samples[(s->blocksize*i)+j] = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
671 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
672 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
673 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
674 if (i == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
675 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
676 samples[(s->blocksize*i)+j] = s->decoded[0][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
677 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
678 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
679 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
680 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
681 // case MID_SIDE:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
682 // 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
683 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
684 *data_size += s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
685 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
686 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
687 #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
688 switch(s->decorrelation)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
689 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
690 case INDEPENDENT:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
691 for (j = 0; j < s->blocksize; j++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
692 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
693 for (i = 0; i < s->channels; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
694 *(samples++) = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
695 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
696 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
697 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
698 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
699 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
700 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
701 *(samples++) = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702 *(samples++) = s->decoded[0][i] - s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
703 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
704 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
705 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
706 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
707 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
708 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
709 *(samples++) = s->decoded[0][i] + s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
710 *(samples++) = s->decoded[1][i];
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 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
713 case MID_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
714 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
715 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
716 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
717 int mid, side;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
718 mid = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
719 side = s->decoded[1][i];
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
720
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
721 #if 1 //needs to be checked but IMHO it should be binary identical
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
722 mid -= side>>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
723 *(samples++) = mid + side;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
724 *(samples++) = mid;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
725 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
726
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
727 mid <<= 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
728 if (side & 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
729 mid++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
730 *(samples++) = (mid + side) >> 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
731 *(samples++) = (mid - side) >> 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
732 #endif
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
733 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
734 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
735 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
736 #endif
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
737
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
738 *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
739 // 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
740
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
741 // s->last_blocksize = s->blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
742 end:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
743 i= (get_bits_count(&s->gb)+7)/8;;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
744 if(i > buf_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
745 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
746 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
747 s->bitstream_index=0;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
748 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
749 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
750
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
751 if(s->bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
752 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
753 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
754 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
755 }else
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
756 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
757 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
758
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
759 static int flac_decode_close(AVCodecContext *avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
760 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
761 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
762 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
763
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
764 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
765 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
766 av_freep(&s->decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
767 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
768 av_freep(&s->bitstream);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
769
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
770 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
771 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
772
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
773 static void flac_flush(AVCodecContext *avctx){
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
774 FLACContext *s = avctx->priv_data;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
775
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
776 s->bitstream_size=
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
777 s->bitstream_index= 0;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
778 }
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
779
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
780 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
781 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
782 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
783 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
784 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
785 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
786 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
787 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
788 flac_decode_frame,
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
789 .flush= flac_flush,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
790 };