annotate flacdec.c @ 8790:1045a26cb90d libavcodec

Fix crash when encoding using libschroedinger. Currently only pixel and half-pixel motion vector precisions are supported in libschroedinger. Setting the mv_precision field to 2 (i.e. quarter pixel) causes a crash in the libschroedinger encoder calls. By not setting this parameter, we fall back to the default value used in libschroedinger. patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
author diego
date Tue, 10 Feb 2009 14:27:16 +0000
parents 329e332e829f
children 49817775b44f
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8712
diff changeset
23 * @file libavcodec/flacdec.c
1811
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
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6746
diff changeset
39 #include "libavutil/crc.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
40 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2098
diff changeset
41 #include "bitstream.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
42 #include "golomb.h"
6728
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
43 #include "flac.h"
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
44
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
45 #undef NDEBUG
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
46 #include <assert.h>
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
47
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
48 #define MAX_CHANNELS 8
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
49 #define MAX_BLOCKSIZE 65535
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 {
6728
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
59 FLACSTREAMINFO
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
60
8711
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
61 AVCodecContext *avctx; ///< parent AVCodecContext
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
62 GetBitContext gb; ///< GetBitContext initialized to start at the current frame
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
63
8711
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
64 int blocksize; ///< number of samples in the current frame
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
65 int curr_bps; ///< bps for current subframe, adjusted for channel correlation and wasted bits
8712
eae97a6f2553 cosmetics: change comment type and vertical alignment
jbr
parents: 8711
diff changeset
66 int sample_shift; ///< shift required to make output samples 16-bit or 32-bit
eae97a6f2553 cosmetics: change comment type and vertical alignment
jbr
parents: 8711
diff changeset
67 int is32; ///< flag to indicate if output should be 32-bit instead of 16-bit
8711
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
68 enum decorrelation_type decorrelation; ///< channel decorrelation type in the current frame
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
69
8711
f284b60e2bc5 cosmetics: add some documentation to FLACContext
jbr
parents: 8701
diff changeset
70 int32_t *decoded[MAX_CHANNELS]; ///< decoded samples
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
71 uint8_t *bitstream;
7303
f0fc58bb9780 Make bitstream_* fields unsigned.
michael
parents: 7302
diff changeset
72 unsigned int bitstream_size;
f0fc58bb9780 Make bitstream_* fields unsigned.
michael
parents: 7302
diff changeset
73 unsigned int bitstream_index;
3066
04b924f8f5a5 warning fixes by Luca Abeni, lucabe72 ##@## email ##.## it
diego
parents: 3036
diff changeset
74 unsigned int allocated_bitstream_size;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
75 } FLACContext;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
76
7129
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
77 static const int sample_rate_table[] =
8638
1088ea188568 flacdec: add support for 3 additional sample rate codes
jbr
parents: 7785
diff changeset
78 { 0,
1088ea188568 flacdec: add support for 3 additional sample rate codes
jbr
parents: 7785
diff changeset
79 88200, 176400, 192000,
1811
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
7129
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
83 static const 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
7129
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
86 static const 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
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
91 static int64_t get_utf8(GetBitContext *gb)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
92 {
3436
3ccec186532f moving utf8 reading function to libavutil
michael
parents: 3434
diff changeset
93 int64_t val;
3ccec186532f moving utf8 reading function to libavutil
michael
parents: 3434
diff changeset
94 GET_UTF8(val, get_bits(gb, 8), return -1;)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
95 return val;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
96 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
97
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
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
101 static av_cold int flac_decode_init(AVCodecContext *avctx)
1811
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
8728
329e332e829f flacdec: set default sample_fmt before parsing extradata
jbr
parents: 8718
diff changeset
106 avctx->sample_fmt = SAMPLE_FMT_S16;
329e332e829f flacdec: set default sample_fmt before parsing extradata
jbr
parents: 8718
diff changeset
107
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
108 if (avctx->extradata_size > 4) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
109 /* initialize based on the demuxer-supplied streamdata header */
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
110 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
111 ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
112 avctx->extradata);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
113 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
114 } else {
6730
362abbd862f1 move call to init_get_bits inside conditional
jbr
parents: 6729
diff changeset
115 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
116 metadata_parse(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
117 }
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
118 }
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
119
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
120 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
121 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
122
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
123 static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
124 {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
125 av_log(avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d\n", s->min_blocksize,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
126 s->max_blocksize);
6727
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
127 av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize);
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
128 av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
129 av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
130 av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
131 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
132
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
133 static void allocate_buffers(FLACContext *s)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
134 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
135 int i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
136
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
137 assert(s->max_blocksize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
138
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
139 if (s->max_framesize == 0 && s->max_blocksize) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
140 // FIXME header overhead
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
141 s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
142 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
143
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
144 for (i = 0; i < s->channels; i++) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
145 s->decoded[i] = av_realloc(s->decoded[i],
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
146 sizeof(int32_t)*s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
147 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
148
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
149 if (s->allocated_bitstream_size < s->max_framesize)
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
150 s->bitstream= av_fast_realloc(s->bitstream,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
151 &s->allocated_bitstream_size,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
152 s->max_framesize);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
153 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
154
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
155 void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
156 const uint8_t *buffer)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
157 {
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
158 GetBitContext gb;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
159 init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
160
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
161 /* mandatory streaminfo */
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
162 s->min_blocksize = get_bits(&gb, 16);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
163 s->max_blocksize = get_bits(&gb, 16);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
164
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
165 skip_bits(&gb, 24); /* skip min frame size */
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
166 s->max_framesize = get_bits_long(&gb, 24);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
167
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
168 s->samplerate = get_bits_long(&gb, 20);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
169 s->channels = get_bits(&gb, 3) + 1;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
170 s->bps = get_bits(&gb, 5) + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
171
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
172 avctx->channels = s->channels;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
173 avctx->sample_rate = s->samplerate;
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
174 avctx->bits_per_raw_sample = s->bps;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
175 if (s->bps > 16)
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
176 avctx->sample_fmt = SAMPLE_FMT_S32;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
177 else
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
178 avctx->sample_fmt = SAMPLE_FMT_S16;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
179
8661
94f7aca055d5 flacdec: get total number of samples from STREAMINFO
jbr
parents: 8660
diff changeset
180 s->samples = get_bits_long(&gb, 32) << 4;
94f7aca055d5 flacdec: get total number of samples from STREAMINFO
jbr
parents: 8660
diff changeset
181 s->samples |= get_bits_long(&gb, 4);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
182
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
183 skip_bits(&gb, 64); /* md5 sum */
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
184 skip_bits(&gb, 64); /* md5 sum */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
185
6727
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
186 dump_headers(avctx, s);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
187 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
188
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 * 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
191 * the fLaC marker.
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
192 * @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
193 * parse metadata
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
194 * @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
195 */
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
196 static int metadata_parse(FLACContext *s)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
197 {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
198 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0;
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
199 int initial_pos= get_bits_count(&s->gb);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
200
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
201 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
202 skip_bits(&s->gb, 32);
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 do {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5141
diff changeset
205 metadata_last = get_bits1(&s->gb);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
206 metadata_type = get_bits(&s->gb, 7);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
207 metadata_size = get_bits_long(&s->gb, 24);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
208
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
209 if (get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits) {
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
210 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb));
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
211 break;
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
212 }
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
213
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
214 if (metadata_size) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
215 switch (metadata_type) {
8659
61ae841cd13e define FLAC metadata types in flac.h
jbr
parents: 8658
diff changeset
216 case FLAC_METADATA_TYPE_STREAMINFO:
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
217 ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
218 s->gb.buffer+get_bits_count(&s->gb)/8);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
219 streaminfo_updated = 1;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
220
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
221 default:
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
222 for (i = 0; i < metadata_size; i++)
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
223 skip_bits(&s->gb, 8);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
224 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
225 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
226 } while (!metadata_last);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
227
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
228 if (streaminfo_updated)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
229 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
230 return 1;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
231 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
232 return 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
233 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
234
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
235 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
236 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
237 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
238 int sample = 0, samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
239
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
240 method_type = get_bits(&s->gb, 2);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
241 if (method_type > 1) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
242 av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
243 method_type);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
244 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
245 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
246
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
247 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
248
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
249 samples= s->blocksize >> rice_order;
4366
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
250 if (pred_order > samples) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
251 av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
252 pred_order, samples);
4366
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
253 return -1;
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
254 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
255
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
256 sample=
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
257 i= pred_order;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
258 for (partition = 0; partition < (1 << rice_order); partition++) {
5871
83554c0e9ce6 Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents: 5741
diff changeset
259 tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
260 if (tmp == (method_type == 0 ? 15 : 31)) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
261 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
262 for (; i < samples; i++, sample++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
263 s->decoded[channel][sample] = get_sbits(&s->gb, tmp);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
264 } else {
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
265 for (; i < samples; i++, sample++) {
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
266 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
267 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
268 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
269 i= 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
270 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
271
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
272 return 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
273 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
274
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
275 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
276 {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
277 const int blocksize = s->blocksize;
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
278 int32_t *decoded = s->decoded[channel];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
279 int a, b, c, d, i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
280
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
281 /* warm up samples */
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
282 for (i = 0; i < pred_order; i++) {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
283 decoded[i] = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
284 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
285
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
286 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
287 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
288
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
289 if (pred_order > 0)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
290 a = decoded[pred_order-1];
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
291 if (pred_order > 1)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
292 b = a - decoded[pred_order-2];
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
293 if (pred_order > 2)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
294 c = b - decoded[pred_order-2] + decoded[pred_order-3];
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
295 if (pred_order > 3)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
296 d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4];
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
297
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
298 switch (pred_order) {
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
299 case 0:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
300 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
301 case 1:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
302 for (i = pred_order; i < blocksize; i++)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
303 decoded[i] = a += decoded[i];
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
304 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
305 case 2:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
306 for (i = pred_order; i < blocksize; i++)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
307 decoded[i] = a += b += decoded[i];
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
308 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
309 case 3:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
310 for (i = pred_order; i < blocksize; i++)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
311 decoded[i] = a += b += c += decoded[i];
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
312 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
313 case 4:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
314 for (i = pred_order; i < blocksize; i++)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
315 decoded[i] = a += b += c += d += decoded[i];
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
316 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
317 default:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
318 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
319 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
320 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
321
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
322 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
323 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
324
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
325 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
326 {
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
327 int i, j;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
328 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
329 int coeffs[pred_order];
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
330 int32_t *decoded = s->decoded[channel];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
331
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
332 /* warm up samples */
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
333 for (i = 0; i < pred_order; i++) {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
334 decoded[i] = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
335 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
336
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
337 coeff_prec = get_bits(&s->gb, 4) + 1;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
338 if (coeff_prec == 16) {
8652
1a88ffbd3233 flacdec: change several AV_LOG_DEBUG to AV_LOG_ERROR
jbr
parents: 8651
diff changeset
339 av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n");
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
340 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
341 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
342 qlevel = get_sbits(&s->gb, 5);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
343 if (qlevel < 0) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
344 av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
345 qlevel);
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
346 return -1;
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
347 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
348
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
349 for (i = 0; i < pred_order; i++) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
350 coeffs[i] = get_sbits(&s->gb, coeff_prec);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
351 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
352
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
353 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
354 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
355
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
356 if (s->bps > 16) {
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
357 int64_t sum;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
358 for (i = pred_order; i < s->blocksize; i++) {
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
359 sum = 0;
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
360 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
361 sum += (int64_t)coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
362 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
363 }
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
364 } else {
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
365 for (i = pred_order; i < s->blocksize-1; i += 2) {
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;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
369 for (j = pred_order-1; j > 0; j--) {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
370 c = coeffs[j];
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
371 s0 += c*d;
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
372 d = decoded[i-j];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
373 s1 += c*d;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
374 }
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
375 c = coeffs[0];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
376 s0 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
377 d = decoded[i] += s0 >> qlevel;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
378 s1 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
379 decoded[i+1] += s1 >> qlevel;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
380 }
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
381 if (i < s->blocksize) {
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
382 int sum = 0;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
383 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
384 sum += coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
385 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
386 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
387 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
388
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
389 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
390 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
391
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
392 static inline int decode_subframe(FLACContext *s, int channel)
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 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
395 int i, tmp;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
396
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
397 s->curr_bps = s->bps;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
398 if (channel == 0) {
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
399 if (s->decorrelation == RIGHT_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
400 s->curr_bps++;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
401 } else {
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
402 if (s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
403 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
404 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
405
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
406 if (get_bits1(&s->gb)) {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
407 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
408 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
409 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
410 type = get_bits(&s->gb, 6);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
411
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
412 if (get_bits1(&s->gb)) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
413 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
414 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
415 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
416 s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
417 }
8649
470a3af1bf4f flacdec: remove some unused code
jbr
parents: 8642
diff changeset
418
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
419 //FIXME use av_log2 for types
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
420 if (type == 0) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
421 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
422 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
423 s->decoded[channel][i] = tmp;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
424 } else if (type == 1) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
425 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
426 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
427 } else if ((type >= 8) && (type <= 12)) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
428 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
429 return -1;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
430 } else if (type >= 32) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 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
432 return -1;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
433 } else {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
434 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
435 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
436 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
437
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
438 if (wasted) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
439 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
440 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
441 s->decoded[channel][i] <<= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
442 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444 return 0;
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
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
447 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
448 {
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
449 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
450 int decorrelation, bps, blocksize, samplerate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
451
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
452 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
453
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
454 sample_rate_code = get_bits(&s->gb, 4);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
455
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
456 assignment = get_bits(&s->gb, 4); /* channel assignment */
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
457 if (assignment < 8 && s->channels == assignment+1)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
458 decorrelation = INDEPENDENT;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
459 else if (assignment >=8 && assignment < 11 && s->channels == 2)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
460 decorrelation = LEFT_SIDE + assignment - 8;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
461 else {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
462 av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
463 assignment, s->channels);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
464 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
465 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
466
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
467 sample_size_code = get_bits(&s->gb, 3);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
468 if (sample_size_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
469 bps= s->bps;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
470 else if ((sample_size_code != 3) && (sample_size_code != 7))
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
471 bps = sample_size_table[sample_size_code];
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
472 else {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
473 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
474 sample_size_code);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
475 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
476 }
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
477 if (bps > 16) {
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
478 s->avctx->sample_fmt = SAMPLE_FMT_S32;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
479 s->sample_shift = 32 - bps;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
480 s->is32 = 1;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
481 } else {
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
482 s->avctx->sample_fmt = SAMPLE_FMT_S16;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
483 s->sample_shift = 16 - bps;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
484 s->is32 = 0;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
485 }
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
486 s->bps = s->avctx->bits_per_raw_sample = bps;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
487
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
488 if (get_bits1(&s->gb)) {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
489 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
490 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
491 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
492
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
493 if (get_utf8(&s->gb) < 0) {
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
494 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
495 return -1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
496 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
497
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
498 if (blocksize_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
499 blocksize = s->min_blocksize;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
500 else if (blocksize_code == 6)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
501 blocksize = get_bits(&s->gb, 8)+1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
502 else if (blocksize_code == 7)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
503 blocksize = get_bits(&s->gb, 16)+1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
504 else
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
505 blocksize = blocksize_table[blocksize_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
506
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
507 if (blocksize > s->max_blocksize) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
508 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize,
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
509 s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
510 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
511 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
512
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
513 if (blocksize * s->channels * sizeof(int16_t) > alloc_data_size)
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
514 return -1;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
515
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
516 if (sample_rate_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
517 samplerate= s->samplerate;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
518 else if (sample_rate_code < 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
519 samplerate = sample_rate_table[sample_rate_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
520 else if (sample_rate_code == 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
521 samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
522 else if (sample_rate_code == 13)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
523 samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
524 else if (sample_rate_code == 14)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
525 samplerate = get_bits(&s->gb, 16) * 10;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
526 else {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
527 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n",
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
528 sample_rate_code);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
529 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
530 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
531
1814
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
532 skip_bits(&s->gb, 8);
6108
75804d49f33b improve CRC API
aurel
parents: 5872
diff changeset
533 crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0,
75804d49f33b improve CRC API
aurel
parents: 5872
diff changeset
534 s->gb.buffer, get_bits_count(&s->gb)/8);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
535 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
536 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
537 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
538 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
539
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
540 s->blocksize = blocksize;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
541 s->samplerate = samplerate;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
542 s->bps = bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
543 s->decorrelation= decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
544
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
545 // dump_headers(s->avctx, (FLACStreaminfo *)s);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
546
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
547 /* subframes */
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
548 for (i = 0; i < s->channels; i++) {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
549 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
550 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
551 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
552
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
553 align_get_bits(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
554
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
555 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
556 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
557
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
558 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
559 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
560
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
561 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
562 void *data, int *data_size,
6235
michael
parents: 6108
diff changeset
563 const uint8_t *buf, int buf_size)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
564 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
565 FLACContext *s = avctx->priv_data;
2078
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
566 int tmp = 0, i, j = 0, input_buf_size = 0;
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
567 int16_t *samples_16 = data;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
568 int32_t *samples_32 = data;
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
569 int alloc_data_size= *data_size;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
570
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
571 *data_size=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
572
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
573 if (s->max_framesize == 0) {
7785
a969253a82ff fix issue 616 on roundup : decoding of short flac files
jai_menon
parents: 7451
diff changeset
574 s->max_framesize= FFMAX(4, buf_size); // should hopefully be enough for the first header
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
575 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
576 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
577
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
578 if (1 && s->max_framesize) { //FIXME truncated
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
579 if (s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C'))
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
580 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize));
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
581 input_buf_size= buf_size;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
582
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
583 if (s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index)
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
584 return -1;
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
585
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
586 if (s->allocated_bitstream_size < s->bitstream_size + buf_size)
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
587 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size);
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
588
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
589 if (s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size) {
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
590 memmove(s->bitstream, &s->bitstream[s->bitstream_index],
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
591 s->bitstream_size);
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
592 s->bitstream_index=0;
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
593 }
8658
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
594 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size],
dc8fd7c55928 flacdec: cosmetics: some line wrapping at 80 chars
jbr
parents: 8657
diff changeset
595 buf, buf_size);
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
596 buf= &s->bitstream[s->bitstream_index];
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
597 buf_size += s->bitstream_size;
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
598 s->bitstream_size= buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
599
8657
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
600 if (buf_size < s->max_framesize && input_buf_size) {
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
601 return input_buf_size;
62c52fff9ac0 flacdec: cosmetics: indentation
jbr
parents: 8656
diff changeset
602 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
603 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
604
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
605 init_get_bits(&s->gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
606
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
607 if (metadata_parse(s))
7301
aab7f1fb59ea If metadata has been parsed goto end instead of trying to
michael
parents: 7273
diff changeset
608 goto end;
aab7f1fb59ea If metadata has been parsed goto end instead of trying to
michael
parents: 7273
diff changeset
609
8653
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
610 tmp = show_bits(&s->gb, 16);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
611 if ((tmp & 0xFFFE) != 0xFFF8) {
8653
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
612 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
613 while (get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8)
8653
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
614 skip_bits(&s->gb, 8);
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
615 goto end; // we may not have enough bits left to decode a frame, so try next time
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
616 }
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
617 skip_bits(&s->gb, 16);
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
618 if (decode_frame(s, alloc_data_size) < 0) {
8653
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
619 av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n");
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
620 s->bitstream_size=0;
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
621 s->bitstream_index=0;
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
622 return -1;
cc6f01be6614 cosmetics: indentation
jbr
parents: 8652
diff changeset
623 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
624
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
625 #define DECORRELATE(left, right)\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
626 assert(s->channels == 2);\
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
627 for (i = 0; i < s->blocksize; i++) {\
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
628 int a= s->decoded[0][i];\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
629 int b= s->decoded[1][i];\
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
630 if (s->is32) {\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
631 *samples_32++ = (left) << s->sample_shift;\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
632 *samples_32++ = (right) << s->sample_shift;\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
633 } else {\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
634 *samples_16++ = (left) << s->sample_shift;\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
635 *samples_16++ = (right) << s->sample_shift;\
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
636 }\
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
637 }\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
638 break;
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
639
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
640 switch (s->decorrelation) {
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
641 case INDEPENDENT:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
642 for (j = 0; j < s->blocksize; j++) {
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
643 for (i = 0; i < s->channels; i++) {
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
644 if (s->is32)
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
645 *samples_32++ = s->decoded[i][j] << s->sample_shift;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
646 else
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
647 *samples_16++ = s->decoded[i][j] << s->sample_shift;
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
648 }
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
649 }
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
650 break;
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
651 case LEFT_SIDE:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
652 DECORRELATE(a,a-b)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
653 case RIGHT_SIDE:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
654 DECORRELATE(a+b,b)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
655 case MID_SIDE:
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
656 DECORRELATE( (a-=b>>1) + b, a)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
657 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
658
8701
bb7f9053df83 flacdec: add support for SAMPLE_FMT_32
jbr
parents: 8661
diff changeset
659 *data_size = s->blocksize * s->channels * (s->is32 ? 4 : 2);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
660
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
661 end:
6377
michael
parents: 6235
diff changeset
662 i= (get_bits_count(&s->gb)+7)/8;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
663 if (i > buf_size) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
664 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
665 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
666 s->bitstream_index=0;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
667 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
668 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
670 if (s->bitstream_size) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
671 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
672 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
673 return input_buf_size;
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
674 } else
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
675 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
676 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
677
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6377
diff changeset
678 static av_cold int flac_decode_close(AVCodecContext *avctx)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
679 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
680 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
681 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
682
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
683 for (i = 0; i < s->channels; i++) {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
684 av_freep(&s->decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
685 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
686 av_freep(&s->bitstream);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
687
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
688 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
689 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
690
8656
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
691 static void flac_flush(AVCodecContext *avctx)
6565469fb8d1 flacdec: cosmetics: use consistent coding style (K&R)
jbr
parents: 8653
diff changeset
692 {
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
693 FLACContext *s = avctx->priv_data;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
694
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
695 s->bitstream_size=
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
696 s->bitstream_index= 0;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
697 }
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
698
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
699 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
700 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
701 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
703 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
704 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
705 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
706 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
707 flac_decode_frame,
7273
3511d8cdd310 Make our flac decoder decode all the data at EOF.
michael
parents: 7129
diff changeset
708 CODEC_CAP_DELAY,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
709 .flush= flac_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6763
diff changeset
710 .long_name= NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
711 };