annotate flac.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents 154b02065699
children 83554c0e9ce6
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 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
16 *
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3649
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
20 */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
21
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
22 /**
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
23 * @file flac.c
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
24 * FLAC (Free Lossless Audio Codec) decoder
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
25 * @author Alex Beregszaszi
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
26 *
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
27 * For more information on the FLAC format, visit:
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
28 * http://flac.sourceforge.net/
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
29 *
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
30 * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
31 * through, starting from the initial 'fLaC' signature; or by passing the
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
32 * 34-byte streaminfo structure through avctx->extradata[_size] followed
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
33 * by data starting with the 0xFFF8 marker.
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
34 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
35
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
36 #include <limits.h>
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
37
3649
3335f51b6cd3 force usage of ALT_BITSTREAM_READER where needed
aurel
parents: 3436
diff changeset
38 #define ALT_BITSTREAM_READER
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
39 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2098
diff changeset
40 #include "bitstream.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
41 #include "golomb.h"
3171
47f2f56a6a28 switch flac to av_crc
michael
parents: 3066
diff changeset
42 #include "crc.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
43
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
44 #undef NDEBUG
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
45 #include <assert.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
46
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
47 #define MAX_CHANNELS 8
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
48 #define MAX_BLOCKSIZE 65535
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
49 #define FLAC_STREAMINFO_SIZE 34
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
50
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
51 enum decorrelation_type {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
52 INDEPENDENT,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
53 LEFT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
54 RIGHT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
55 MID_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
56 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
57
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
58 typedef struct FLACContext {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
59 AVCodecContext *avctx;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
60 GetBitContext gb;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
61
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
62 int min_blocksize, max_blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
63 int min_framesize, max_framesize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
64 int samplerate, channels;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
65 int blocksize/*, last_blocksize*/;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
66 int bps, curr_bps;
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
67 enum decorrelation_type decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
68
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
69 int32_t *decoded[MAX_CHANNELS];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
70 uint8_t *bitstream;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
71 int bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
72 int bitstream_index;
3066
04b924f8f5a5 warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents: 3036
diff changeset
73 unsigned int allocated_bitstream_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
74 } FLACContext;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
75
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
76 #define METADATA_TYPE_STREAMINFO 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
77
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
78 static int sample_rate_table[] =
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
79 { 0, 0, 0, 0,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
80 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
81 0, 0, 0, 0 };
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
82
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
83 static int sample_size_table[] =
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
84 { 0, 8, 12, 0, 16, 20, 24, 0 };
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
85
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
86 static int blocksize_table[] = {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
87 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
88 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
89 };
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
90
3436
3ccec186532f moving utf8 reading function to libavutil
michael
parents: 3434
diff changeset
91 static int64_t get_utf8(GetBitContext *gb){
3ccec186532f moving utf8 reading function to libavutil
michael
parents: 3434
diff changeset
92 int64_t val;
3ccec186532f moving utf8 reading function to libavutil
michael
parents: 3434
diff changeset
93 GET_UTF8(val, get_bits(gb, 8), return -1;)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
94 return val;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
95 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
96
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
97 static void metadata_streaminfo(FLACContext *s);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
98 static void allocate_buffers(FLACContext *s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
99 static int metadata_parse(FLACContext *s);
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
100
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
101 static int flac_decode_init(AVCodecContext * avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
102 {
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
103 FLACContext *s = avctx->priv_data;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
104 s->avctx = avctx;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
105
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
106 if (avctx->extradata_size > 4) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
107 /* initialize based on the demuxer-supplied streamdata header */
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
108 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
109 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
110 metadata_streaminfo(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
111 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
112 } else {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
113 metadata_parse(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
114 }
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
115 }
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
116
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
117 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
118 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
119
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
120 static void dump_headers(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
121 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
122 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
123 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
124 av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
125 av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
126 av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
127 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
128
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
129 static void allocate_buffers(FLACContext *s){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
130 int i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
131
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
132 assert(s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
133
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
134 if(s->max_framesize == 0 && s->max_blocksize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
135 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
136 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
137
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
138 for (i = 0; i < s->channels; i++)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
139 {
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
140 s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
141 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
142
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
143 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
144 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
145
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
146 static void metadata_streaminfo(FLACContext *s)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
147 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
148 /* mandatory streaminfo */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
149 s->min_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
150 s->max_blocksize = get_bits(&s->gb, 16);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
151
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
152 s->min_framesize = get_bits_long(&s->gb, 24);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
153 s->max_framesize = get_bits_long(&s->gb, 24);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
154
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
155 s->samplerate = get_bits_long(&s->gb, 20);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
156 s->channels = get_bits(&s->gb, 3) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
157 s->bps = get_bits(&s->gb, 5) + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
158
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
159 s->avctx->channels = s->channels;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
160 s->avctx->sample_rate = s->samplerate;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
161
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
162 skip_bits(&s->gb, 36); /* total num of samples */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
163
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
164 skip_bits(&s->gb, 64); /* md5 sum */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
165 skip_bits(&s->gb, 64); /* md5 sum */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
166
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
167 dump_headers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
168 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
169
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
170 /**
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
171 * Parse a list of metadata blocks. This list of blocks must begin with
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
172 * the fLaC marker.
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
173 * @param s the flac decoding context containing the gb bit reader used to
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
174 * parse metadata
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
175 * @return 1 if some metadata was read, 0 if no fLaC marker was found
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
176 */
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
177 static int metadata_parse(FLACContext *s)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
178 {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
179 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
180
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
181 if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
182 skip_bits(&s->gb, 32);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
183
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
184 av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n");
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
185 do {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5141
diff changeset
186 metadata_last = get_bits1(&s->gb);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
187 metadata_type = get_bits(&s->gb, 7);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
188 metadata_size = get_bits_long(&s->gb, 24);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
189
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
190 av_log(s->avctx, AV_LOG_DEBUG,
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
191 " metadata block: flag = %d, type = %d, size = %d\n",
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
192 metadata_last, metadata_type, metadata_size);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
193 if (metadata_size) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
194 switch (metadata_type) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
195 case METADATA_TYPE_STREAMINFO:
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
196 metadata_streaminfo(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
197 streaminfo_updated = 1;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
198 break;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
199
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
200 default:
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
201 for (i=0; i<metadata_size; i++)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
202 skip_bits(&s->gb, 8);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
203 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
204 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
205 } while (!metadata_last);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
206
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
207 if (streaminfo_updated)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
208 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
209 return 1;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
210 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
211 return 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
212 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
213
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
214 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
215 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
216 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
217 int sample = 0, samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
218
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
219 method_type = get_bits(&s->gb, 2);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
220 if (method_type != 0){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
221 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
222 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
223 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
224
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
225 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
226
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
227 samples= s->blocksize >> rice_order;
4366
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
228 if (pred_order > samples) {
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
229 av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", pred_order, samples);
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
230 return -1;
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
231 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
232
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
233 sample=
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
234 i= pred_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
235 for (partition = 0; partition < (1 << rice_order); partition++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
236 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
237 tmp = get_bits(&s->gb, 4);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
238 if (tmp == 15)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
239 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
240 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
241 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
242 for (; i < samples; i++, sample++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
243 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
244 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
245 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
246 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
247 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
248 for (; i < samples; i++, sample++){
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
249 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
250 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
251 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
252 i= 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
253 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
254
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
255 // 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
256
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
257 return 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
258 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
259
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
260 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
261 {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
262 const int blocksize = s->blocksize;
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
263 int32_t *decoded = s->decoded[channel];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
264 int a, b, c, d, i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
265
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
266 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
267
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
268 /* 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
269 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
270
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
271 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
272 {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
273 decoded[i] = get_sbits(&s->gb, s->curr_bps);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
274 // 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
275 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
276
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
277 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
278 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
279
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
280 a = decoded[pred_order-1];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
281 b = a - decoded[pred_order-2];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
282 c = b - decoded[pred_order-2] + decoded[pred_order-3];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
283 d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
284
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
285 switch(pred_order)
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 case 0:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
288 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
289 case 1:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
290 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
291 decoded[i] = a += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
292 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
293 case 2:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
294 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
295 decoded[i] = a += b += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
296 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
297 case 3:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
298 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
299 decoded[i] = a += b += c += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
300 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
301 case 4:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
302 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
303 decoded[i] = a += b += c += d += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
304 break;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
305 default:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
306 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
307 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
308 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
309
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
310 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
311 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
312
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
313 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
314 {
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
315 int i, j;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
316 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
317 int coeffs[pred_order];
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
318 int32_t *decoded = s->decoded[channel];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
319
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
320 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
321
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
322 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
323 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
324
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
325 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
326 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
327 decoded[i] = get_sbits(&s->gb, s->curr_bps);
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
328 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
329 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
330
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
331 coeff_prec = get_bits(&s->gb, 4) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
332 if (coeff_prec == 16)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
333 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
334 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
335 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
336 }
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
337 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
338 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
339 // 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
340 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
341 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
342 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
343 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
344
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
345 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
346 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
347 coeffs[i] = get_sbits(&s->gb, coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
348 // 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
349 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
350
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
351 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
352 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
353
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
354 if (s->bps > 16) {
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
355 int64_t sum;
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
356 for (i = pred_order; i < s->blocksize; i++)
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
357 {
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
358 sum = 0;
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
359 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
360 sum += (int64_t)coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
361 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
362 }
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
363 } else {
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
364 for (i = pred_order; i < s->blocksize-1; i += 2)
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
365 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
366 int c;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
367 int d = decoded[i-pred_order];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
368 int s0 = 0, s1 = 0;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
369 for (j = pred_order-1; j > 0; j--)
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
370 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
371 c = coeffs[j];
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
372 s0 += c*d;
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
373 d = decoded[i-j];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
374 s1 += c*d;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
375 }
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
376 c = coeffs[0];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
377 s0 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
378 d = decoded[i] += s0 >> qlevel;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
379 s1 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
380 decoded[i+1] += s1 >> qlevel;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
381 }
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
382 if (i < s->blocksize)
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
383 {
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
384 int sum = 0;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
385 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
386 sum += coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
387 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
388 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
389 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
390
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
391 return 0;
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
394 static inline int decode_subframe(FLACContext *s, int channel)
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 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
397 int i, tmp;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
398
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
399 s->curr_bps = s->bps;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
400 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
401 if(s->decorrelation == RIGHT_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
402 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
403 }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
404 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
405 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
406 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
407
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
408 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
409 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
410 av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
411 return -1;
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 type = get_bits(&s->gb, 6);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
414 // wasted = get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
415
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
416 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
417 // {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
418 // while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
419 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
420 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
421 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
422 // s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
423 // }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
424 #if 0
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
425 wasted= 16 - av_log2(show_bits(&s->gb, 17));
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
426 skip_bits(&s->gb, wasted+1);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
427 s->curr_bps -= wasted;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
428 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
429 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
430 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
432 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
433 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
434 s->curr_bps -= wasted;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
435 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
436 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
437 #endif
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
438 //FIXME use av_log2 for types
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
439 if (type == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
440 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
441 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
442 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444 s->decoded[channel][i] = tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
445 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
446 else if (type == 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
447 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
448 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
449 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
450 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
451 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
452 else if ((type >= 8) && (type <= 12))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
453 {
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
454 // 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
455 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
456 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
457 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
458 else if (type >= 32)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
459 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
460 // 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
461 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
462 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
463 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
464 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
465 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
466 av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
467 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
468 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
469
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
470 if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
471 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
472 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
473 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
474 s->decoded[channel][i] <<= wasted;
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 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
478 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
479
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
480 static int decode_frame(FLACContext *s, int alloc_data_size)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
481 {
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
482 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
483 int decorrelation, bps, blocksize, samplerate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
484
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
485 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
486
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
487 sample_rate_code = get_bits(&s->gb, 4);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
488
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
489 assignment = get_bits(&s->gb, 4); /* channel assignment */
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
490 if (assignment < 8 && s->channels == assignment+1)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
491 decorrelation = INDEPENDENT;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
492 else if (assignment >=8 && assignment < 11 && s->channels == 2)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
493 decorrelation = LEFT_SIDE + assignment - 8;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
494 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
495 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
496 av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
497 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
498 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
499
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
500 sample_size_code = get_bits(&s->gb, 3);
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
501 if(sample_size_code == 0)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
502 bps= s->bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
503 else if((sample_size_code != 3) && (sample_size_code != 7))
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
504 bps = sample_size_table[sample_size_code];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
505 else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
506 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
507 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
508 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
509 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
510
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
511 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
512 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
513 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
514 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
515 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
516
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
517 if(get_utf8(&s->gb) < 0){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
518 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
519 return -1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
520 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
521 #if 0
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
522 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
523 (s->min_blocksize != s->max_blocksize)){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
524 }else{
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
525 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
526 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
527
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
528 if (blocksize_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
529 blocksize = s->min_blocksize;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
530 else if (blocksize_code == 6)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
531 blocksize = get_bits(&s->gb, 8)+1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
532 else if (blocksize_code == 7)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
533 blocksize = get_bits(&s->gb, 16)+1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
534 else
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
535 blocksize = blocksize_table[blocksize_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
536
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
537 if(blocksize > s->max_blocksize){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
538 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
539 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
540 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
541
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
542 if(blocksize * s->channels * sizeof(int16_t) > alloc_data_size)
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
543 return -1;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
544
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
545 if (sample_rate_code == 0){
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
546 samplerate= s->samplerate;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
547 }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
548 samplerate = sample_rate_table[sample_rate_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
549 else if (sample_rate_code == 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
550 samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
551 else if (sample_rate_code == 13)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
552 samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
553 else if (sample_rate_code == 14)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
554 samplerate = get_bits(&s->gb, 16) * 10;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
555 else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
556 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
557 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
558 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
559
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
560 skip_bits(&s->gb, 8);
3171
47f2f56a6a28 switch flac to av_crc
michael
parents: 3066
diff changeset
561 crc8= av_crc(av_crc07, 0, s->gb.buffer, get_bits_count(&s->gb)/8);
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
562 if(crc8){
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2529
diff changeset
563 av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8);
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
564 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
565 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
566
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
567 s->blocksize = blocksize;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
568 s->samplerate = samplerate;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
569 s->bps = bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
570 s->decorrelation= decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
571
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
572 // dump_headers(s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
573
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
574 /* subframes */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
575 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
576 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
577 // 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
578 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
579 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
580 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
581
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
582 align_get_bits(&s->gb);
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 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
585 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
586
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
587 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
588 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
589
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
590 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
591 void *data, int *data_size,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
592 uint8_t *buf, int buf_size)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
593 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
594 FLACContext *s = avctx->priv_data;
2078
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
595 int tmp = 0, i, j = 0, input_buf_size = 0;
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
596 int16_t *samples = data;
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
597 int alloc_data_size= *data_size;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
598
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
599 *data_size=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
600
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
601 if(s->max_framesize == 0){
2513
ab32402c7e09 Fix a crash when multiple metadata packets are present.
lorenm
parents: 2500
diff changeset
602 s->max_framesize= 65536; // should hopefully be enough for the first header
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
603 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
604 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
605
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
606 if(1 && s->max_framesize){//FIXME truncated
2513
ab32402c7e09 Fix a crash when multiple metadata packets are present.
lorenm
parents: 2500
diff changeset
607 buf_size= FFMAX(FFMIN(buf_size, s->max_framesize - s->bitstream_size), 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
608 input_buf_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
609
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
610 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
611 // printf("memmove\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
612 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
613 s->bitstream_index=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
614 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
615 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
616 buf= &s->bitstream[s->bitstream_index];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
617 buf_size += s->bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
618 s->bitstream_size= buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
619
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
620 if(buf_size < s->max_framesize){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
621 // printf("wanna more data ...\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
622 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
623 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
624 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
625
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
626 init_get_bits(&s->gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
627
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
628 if (!metadata_parse(s))
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
629 {
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
630 tmp = show_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
631 if(tmp != 0xFFF8){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
632 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
633 while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
634 skip_bits(&s->gb, 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
635 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
636 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
637 skip_bits(&s->gb, 16);
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
638 if (decode_frame(s, alloc_data_size) < 0){
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
639 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
640 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
641 s->bitstream_index=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
642 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
643 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
644 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
645
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
646
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
647 #if 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
648 /* fix the channel order here */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
649 if (s->order == MID_SIDE)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
650 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
651 short *left = samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
652 short *right = samples + s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
653 for (i = 0; i < s->blocksize; i += 2)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
654 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
655 uint32_t x = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
656 uint32_t y = s->decoded[0][i+1];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
657
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
658 right[i] = x - (y / 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
659 left[i] = right[i] + y;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
660 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
661 *data_size = 2 * s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
662 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
663 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
664 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
665 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
666 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
667 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
668 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669 case INDEPENDENT:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
670 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
671 samples[(s->blocksize*i)+j] = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
672 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
673 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
674 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
675 if (i == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
676 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
677 samples[(s->blocksize*i)+j] = s->decoded[0][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
678 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
679 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
680 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
681 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
682 // case MID_SIDE:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
683 // 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
684 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
685 *data_size += s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
686 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
687 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
688 #else
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
689 #define DECORRELATE(left, right)\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
690 assert(s->channels == 2);\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
691 for (i = 0; i < s->blocksize; i++)\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
692 {\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
693 int a= s->decoded[0][i];\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
694 int b= s->decoded[1][i];\
5141
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
695 *samples++ = ((left) << (24 - s->bps)) >> 8;\
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
696 *samples++ = ((right) << (24 - s->bps)) >> 8;\
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
697 }\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
698 break;
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
699
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
700 switch(s->decorrelation)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
701 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702 case INDEPENDENT:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
703 for (j = 0; j < s->blocksize; j++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
704 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
705 for (i = 0; i < s->channels; i++)
5141
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
706 *samples++ = (s->decoded[i][j] << (24 - s->bps)) >> 8;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
707 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
708 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
709 case LEFT_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
710 DECORRELATE(a,a-b)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
711 case RIGHT_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
712 DECORRELATE(a+b,b)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
713 case MID_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
714 DECORRELATE( (a-=b>>1) + b, a)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
715 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
716 #endif
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
717
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
718 *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
719 // 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
720
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
721 // s->last_blocksize = s->blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
722 end:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
723 i= (get_bits_count(&s->gb)+7)/8;;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
724 if(i > buf_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
725 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
726 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
727 s->bitstream_index=0;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
728 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
729 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
730
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
731 if(s->bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
732 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
733 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
734 return input_buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
735 }else
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
736 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
737 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
738
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
739 static int flac_decode_close(AVCodecContext *avctx)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
740 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
741 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
742 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
743
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
744 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
745 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
746 av_freep(&s->decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
747 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
748 av_freep(&s->bitstream);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
749
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
750 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
751 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
752
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
753 static void flac_flush(AVCodecContext *avctx){
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
754 FLACContext *s = avctx->priv_data;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
755
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
756 s->bitstream_size=
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
757 s->bitstream_index= 0;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
758 }
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
759
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
760 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
761 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
762 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
763 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
764 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
765 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
766 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
767 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
768 flac_decode_frame,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
769 .flush= flac_flush,
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
770 };