annotate flac.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 582e635cfa08
children 99b1de0018bb
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"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2098
diff changeset
37 #include "bitstream.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
38 #include "golomb.h"
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
39
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
40 #undef NDEBUG
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
41 #include <assert.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
42
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
43 #define MAX_CHANNELS 8
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
44 #define MAX_BLOCKSIZE 65535
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
45 #define FLAC_STREAMINFO_SIZE 34
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
46
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
47 enum decorrelation_type {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
48 INDEPENDENT,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
49 LEFT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
50 RIGHT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
51 MID_SIDE,
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
54 typedef struct FLACContext {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
55 AVCodecContext *avctx;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
56 GetBitContext gb;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
57
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
58 int min_blocksize, max_blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
59 int min_framesize, max_framesize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
60 int samplerate, channels;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
61 int blocksize/*, last_blocksize*/;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
62 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
63 enum decorrelation_type decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
64
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
65 int32_t *decoded[MAX_CHANNELS];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
66 uint8_t *bitstream;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
67 int bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
68 int bitstream_index;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
69 int allocated_bitstream_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
70 } FLACContext;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
71
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
72 #define METADATA_TYPE_STREAMINFO 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
73
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
74 static int sample_rate_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
75 { 0, 0, 0, 0,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
76 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
77 0, 0, 0, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
78
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
79 static int sample_size_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
80 { 0, 8, 12, 0, 16, 20, 24, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
81
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
82 static int blocksize_table[] = {
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
83 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
84 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
85 };
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
86
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
87 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
88 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
89 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
90 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 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
103 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
104 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
105 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
106 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
107 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
108 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
109 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
110 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
111 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
112 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
113 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
114 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
115 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
116 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
117 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
118 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
119 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
120 };
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
121
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
122 static int64_t get_utf8(GetBitContext *gb)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
123 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
124 uint64_t val;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
125 int ones=0, bytes;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
126
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
127 while(get_bits1(gb))
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
128 ones++;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
129
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
130 if (ones==0) bytes=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
131 else if(ones==1) return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
132 else bytes= ones - 1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
133
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
134 val= get_bits(gb, 7-ones);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
135 while(bytes--){
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
136 const int tmp = get_bits(gb, 8);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
137
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
138 if((tmp>>6) != 2)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
139 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
140 val<<=6;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
141 val|= tmp&0x3F;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
142 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
143 return val;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
144 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
145
2098
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
146 static int skip_utf8(GetBitContext *gb)
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
147 {
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
148 int ones=0, bytes;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
149
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
150 while(get_bits1(gb))
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
151 ones++;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
152
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
153 if (ones==0) bytes=0;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
154 else if(ones==1) return -1;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
155 else bytes= ones - 1;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
156
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
157 skip_bits(gb, 7-ones);
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
158 while(bytes--){
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
159 const int tmp = get_bits(gb, 8);
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
160
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
161 if((tmp>>6) != 2)
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
162 return -1;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
163 }
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
164 return 0;
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
165 }
9a1f3f29bf99 skip_utf8, unused yet
alex
parents: 2078
diff changeset
166
1860
7072086a0dd3 * const warn elimintation
kabi
parents: 1817
diff changeset
167 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
168 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
169 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
170
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
171 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
172 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
173 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
174
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
175 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
176 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
177
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
178 static void metadata_streaminfo(FLACContext *s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
179 static void dump_headers(FLACContext *s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
180
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
181 static int flac_decode_init(AVCodecContext * avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
182 {
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
183 FLACContext *s = avctx->priv_data;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
184 s->avctx = avctx;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
185
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
186 /* 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
187 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
188 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
189 metadata_streaminfo(s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
190 dump_headers(s);
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
191 }
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
192
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
193 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
194 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
195
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
196 static void dump_headers(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
197 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
198 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
199 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
200 av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
201 av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
202 av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
203 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
204
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
205 static void allocate_buffers(FLACContext *s){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
206 int i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
207
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
208 assert(s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
209
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
210 if(s->max_framesize == 0 && s->max_blocksize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
211 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
212 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
213
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
214 for (i = 0; i < s->channels; i++)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
215 {
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
216 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
217 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
218
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
219 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
220 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
221
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
222 static void metadata_streaminfo(FLACContext *s)
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 /* mandatory streaminfo */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
225 s->min_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
226 s->max_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
227
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
228 s->min_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
229 s->max_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
230
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
231 s->samplerate = get_bits_long(&s->gb, 20);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
232 s->channels = get_bits(&s->gb, 3) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
233 s->bps = get_bits(&s->gb, 5) + 1;
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 s->avctx->channels = s->channels;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
236 s->avctx->sample_rate = s->samplerate;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
237
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
238 skip_bits(&s->gb, 36); /* total num of samples */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
239
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
240 skip_bits(&s->gb, 64); /* md5 sum */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
241 skip_bits(&s->gb, 64); /* md5 sum */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
242
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
243 allocate_buffers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
244 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
245
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
246 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
247 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
248 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
249 int sample = 0, samples;
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 method_type = get_bits(&s->gb, 2);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
252 if (method_type != 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
253 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
254 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
255 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
256
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
257 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
258
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
259 samples= s->blocksize >> rice_order;
1811
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 sample=
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
262 i= pred_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
263 for (partition = 0; partition < (1 << rice_order); partition++)
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 tmp = get_bits(&s->gb, 4);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
266 if (tmp == 15)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
267 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
268 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
269 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
270 for (; i < samples; i++, sample++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
271 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
272 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
273 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
274 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
275 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
276 for (; i < samples; i++, sample++){
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
277 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
278 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
279 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
280 i= 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
281 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
282
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
283 // 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
284
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
285 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
286 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
287
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
288 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
289 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
290 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
291
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
292 // 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
293
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
294 /* 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
295 // 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
296
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
297 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
298 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
299 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
300 // 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
301 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
302
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
303 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
304 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
305
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
306 switch(pred_order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
307 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
308 case 0:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
309 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
310 case 1:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
311 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
312 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
313 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
314 case 2:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
315 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
316 s->decoded[channel][i] += 2*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
317 - s->decoded[channel][i-2];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
318 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
319 case 3:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
320 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
321 s->decoded[channel][i] += 3*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
322 - 3*s->decoded[channel][i-2]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
323 + s->decoded[channel][i-3];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
324 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
325 case 4:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
326 for (i = pred_order; i < s->blocksize; i++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
327 s->decoded[channel][i] += 4*s->decoded[channel][i-1]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
328 - 6*s->decoded[channel][i-2]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
329 + 4*s->decoded[channel][i-3]
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
330 - s->decoded[channel][i-4];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
331 break;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
332 default:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
333 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
334 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
335 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
336
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
337 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
338 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
339
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
340 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
341 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
342 int sum, i, j;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
343 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
344 int coeffs[pred_order];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
345
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
346 // 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
347
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
348 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
349 // 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
350
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
351 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
352 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
353 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
354 // 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
355 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
356
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
357 coeff_prec = get_bits(&s->gb, 4) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
358 if (coeff_prec == 16)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
359 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
360 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
361 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
362 }
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
363 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
364 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
365 // 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
366 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
367 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
368 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
369 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
370
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
371 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
372 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
373 coeffs[i] = get_sbits(&s->gb, coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
374 // 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
375 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
376
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
377 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
378 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
379
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
380 for (i = pred_order; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
381 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
382 sum = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
383 for (j = 0; j < pred_order; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
384 sum += coeffs[j] * s->decoded[channel][i-j-1];
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
385 s->decoded[channel][i] += sum >> qlevel;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
386 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
387
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
388 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
389 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
390
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
391 static inline int decode_subframe(FLACContext *s, int channel)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
392 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
393 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
394 int i, tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
395
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
396 s->curr_bps = s->bps;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
397 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
398 if(s->decorrelation == RIGHT_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
399 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
400 }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
401 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
402 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
403 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
404
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
405 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
406 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
407 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
408 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
409 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
410 type = get_bits(&s->gb, 6);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
411 // wasted = get_bits1(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
412
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
413 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
414 // {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
415 // while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
416 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
417 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
418 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
419 // s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
420 // }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
421 #if 0
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
422 wasted= 16 - av_log2(show_bits(&s->gb, 17));
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
423 skip_bits(&s->gb, wasted+1);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
424 s->curr_bps -= wasted;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
425 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
426 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
427 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
428 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
429 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
430 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 s->curr_bps -= wasted;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
432 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
433 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
434 #endif
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
435 //FIXME use av_log2 for types
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
436 if (type == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
437 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
438 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
439 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
440 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
441 s->decoded[channel][i] = tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
442 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443 else if (type == 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
445 av_log(s->avctx, AV_LOG_DEBUG, "coding type: verbatim\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
446 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
447 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
448 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
449 else if ((type >= 8) && (type <= 12))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
450 {
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
451 // 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
452 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
453 return -1;
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 else if (type >= 32)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
456 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
457 // 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
458 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
459 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
460 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
461 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
462 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
463 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
464 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
465 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
466
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
467 if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
468 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
469 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
470 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
471 s->decoded[channel][i] <<= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
472 }
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 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
475 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
476
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
477 static int decode_frame(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
478 {
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
479 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
480 int decorrelation, bps, blocksize, samplerate;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
481
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
482 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
483
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
484 sample_rate_code = get_bits(&s->gb, 4);
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 assignment = get_bits(&s->gb, 4); /* channel assignment */
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
487 if (assignment < 8 && s->channels == assignment+1)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
488 decorrelation = INDEPENDENT;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
489 else if (assignment >=8 && assignment < 11 && s->channels == 2)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
490 decorrelation = LEFT_SIDE + assignment - 8;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
491 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
492 {
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
493 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
494 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
495 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
496
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
497 sample_size_code = get_bits(&s->gb, 3);
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
498 if(sample_size_code == 0)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
499 bps= s->bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
500 else if((sample_size_code != 3) && (sample_size_code != 7))
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
501 bps = sample_size_table[sample_size_code];
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
502 else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
503 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
504 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
505 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
506 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
507
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
508 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
509 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
510 av_log(s->avctx, AV_LOG_DEBUG, "broken stream, invalid padding\n");
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
511 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
512 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
513
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
514 if(get_utf8(&s->gb) < 0){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
515 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
516 return -1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
517 }
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
518 #if 0
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
519 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
520 (s->min_blocksize != s->max_blocksize)){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
521 }else{
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
522 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
523 #endif
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
524
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
525 if (blocksize_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
526 blocksize = s->min_blocksize;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
527 else if (blocksize_code == 6)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
528 blocksize = get_bits(&s->gb, 8)+1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
529 else if (blocksize_code == 7)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
530 blocksize = get_bits(&s->gb, 16)+1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
531 else
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
532 blocksize = blocksize_table[blocksize_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
533
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
534 if(blocksize > s->max_blocksize){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
535 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
536 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
537 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
538
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
539 if (sample_rate_code == 0){
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
540 samplerate= s->samplerate;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
541 }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
542 samplerate = sample_rate_table[sample_rate_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
543 else if (sample_rate_code == 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
544 samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
545 else if (sample_rate_code == 13)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
546 samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
547 else if (sample_rate_code == 14)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
548 samplerate = get_bits(&s->gb, 16) * 10;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
549 else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
550 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
551 return -1;
1811
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
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
554 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
555 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
556 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
557 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
558 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
559 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
560
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
561 s->blocksize = blocksize;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
562 s->samplerate = samplerate;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
563 s->bps = bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
564 s->decorrelation= decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
565
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
566 // dump_headers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
567
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
568 /* subframes */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
569 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
570 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
571 // av_log(s->avctx, AV_LOG_DEBUG, "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
572 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
573 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
574 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
575
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
576 align_get_bits(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
577
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
578 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
579 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
580
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
581 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
582 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
583
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
584 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
585 void *data, int *data_size,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
586 uint8_t *buf, int buf_size)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
587 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
588 FLACContext *s = avctx->priv_data;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
589 int metadata_last, metadata_type, metadata_size;
2078
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
590 int tmp = 0, i, j = 0, input_buf_size = 0;
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
591 int16_t *samples = data;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
592
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
593 if(s->max_framesize == 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
594 s->max_framesize= 8192; // should hopefully be enough for the first header
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
595 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
596 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
597
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
598 if(1 && s->max_framesize){//FIXME truncated
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
599 buf_size= FFMIN(buf_size, s->max_framesize - s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
600 input_buf_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
601
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
602 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
603 // printf("memmove\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
604 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
605 s->bitstream_index=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
606 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
607 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
608 buf= &s->bitstream[s->bitstream_index];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
609 buf_size += s->bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
610 s->bitstream_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
611
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
612 if(buf_size < s->max_framesize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
613 // printf("wanna more data ...\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
614 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
615 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
616 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
617
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
618 init_get_bits(&s->gb, buf, buf_size*8);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
619
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
620 /* fLaC signature (be) */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
621 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
622 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
623 skip_bits(&s->gb, 32);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
624
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
625 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
626 do {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
627 metadata_last = get_bits(&s->gb, 1);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
628 metadata_type = get_bits(&s->gb, 7);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
629 metadata_size = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
630
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
631 av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
632 metadata_last, metadata_type,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
633 metadata_size);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
634 if(metadata_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
635 switch(metadata_type)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
636 {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
637 case METADATA_TYPE_STREAMINFO:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
638 metadata_streaminfo(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
639 dump_headers(s);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
640 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
641 default:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
642 for(i=0; i<metadata_size; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
643 skip_bits(&s->gb, 8);
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 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
646 } while(!metadata_last);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
647 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
648 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
649 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
650
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
651 tmp = show_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
652 if(tmp != 0xFFF8){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
653 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
654 while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
655 skip_bits(&s->gb, 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
656 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
657 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
658 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
659 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
660 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
661 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
662 s->bitstream_index=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
663 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
664 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
665 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
666
1811
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 #if 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669 /* fix the channel order here */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
670 if (s->order == MID_SIDE)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
671 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
672 short *left = samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
673 short *right = samples + s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
674 for (i = 0; i < s->blocksize; i += 2)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
675 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
676 uint32_t x = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
677 uint32_t y = s->decoded[0][i+1];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
678
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
679 right[i] = x - (y / 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
680 left[i] = right[i] + y;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
681 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
682 *data_size = 2 * s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
683 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
684 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
685 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
686 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
687 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
688 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
689 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
690 case INDEPENDENT:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
691 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
692 samples[(s->blocksize*i)+j] = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
693 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
694 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
695 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
696 if (i == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
697 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
698 samples[(s->blocksize*i)+j] = s->decoded[0][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
699 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
700 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
701 samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
703 // case MID_SIDE:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
704 // av_log(s->avctx, AV_LOG_DEBUG, "mid-side unsupported\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
705 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
706 *data_size += s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
707 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
708 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
709 #else
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
710 switch(s->decorrelation)
1811
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 case INDEPENDENT:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
713 for (j = 0; j < s->blocksize; j++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
714 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
715 for (i = 0; i < s->channels; i++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
716 *(samples++) = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
717 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
718 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
719 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
720 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
721 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
722 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
723 *(samples++) = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
724 *(samples++) = s->decoded[0][i] - s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
725 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
726 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
727 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
728 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
729 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
730 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
731 *(samples++) = s->decoded[0][i] + s->decoded[1][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
732 *(samples++) = s->decoded[1][i];
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 case MID_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
736 assert(s->channels == 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
737 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
738 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
739 int mid, side;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
740 mid = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
741 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
742
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
743 #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
744 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
745 *(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
746 *(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
747 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
748
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
749 mid <<= 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
750 if (side & 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
751 mid++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
752 *(samples++) = (mid + side) >> 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
753 *(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
754 #endif
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
755 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
756 break;
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 #endif
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
759
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
760 *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
761 // 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
762
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
763 // s->last_blocksize = s->blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
764 end:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
765 i= (get_bits_count(&s->gb)+7)/8;;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
766 if(i > buf_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
767 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
768 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
769 s->bitstream_index=0;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
770 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
771 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
772
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
773 if(s->bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
774 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
775 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
776 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
777 }else
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
778 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
779 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
780
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
781 static int flac_decode_close(AVCodecContext *avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
782 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
783 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
784 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
785
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
786 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
787 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
788 av_freep(&s->decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
789 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
790 av_freep(&s->bitstream);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
791
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
792 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
793 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
794
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
795 static void flac_flush(AVCodecContext *avctx){
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
796 FLACContext *s = avctx->priv_data;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
797
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
798 s->bitstream_size=
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
799 s->bitstream_index= 0;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
800 }
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
801
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
802 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
803 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
804 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
805 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
806 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
807 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
808 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
809 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
810 flac_decode_frame,
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
811 .flush= flac_flush,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
812 };