annotate flac.c @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents a969253a82ff
children 1088ea188568
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
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
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
50 #define FLAC_STREAMINFO_SIZE 34
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
51
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
52 enum decorrelation_type {
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
53 INDEPENDENT,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
54 LEFT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
55 RIGHT_SIDE,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
56 MID_SIDE,
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
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
59 typedef struct FLACContext {
6728
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
60 FLACSTREAMINFO
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
61
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
62 AVCodecContext *avctx;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
63 GetBitContext gb;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
64
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
65 int blocksize/*, last_blocksize*/;
6728
56c5bbd0996f split out some decoder context params to a shared macro
jbr
parents: 6727
diff changeset
66 int 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;
7303
f0fc58bb9780 Make bitstream_* fields unsigned.
michael
parents: 7302
diff changeset
71 unsigned int bitstream_size;
f0fc58bb9780 Make bitstream_* fields unsigned.
michael
parents: 7302
diff changeset
72 unsigned 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
7129
322023e630a6 mark read-only data as const
stefang
parents: 7040
diff changeset
78 static const int sample_rate_table[] =
1811
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
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
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
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
97 static void allocate_buffers(FLACContext *s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
98 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
99
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6377
diff changeset
100 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
101 {
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
102 FLACContext *s = avctx->priv_data;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
103 s->avctx = avctx;
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
104
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
105 if (avctx->extradata_size > 4) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
106 /* initialize based on the demuxer-supplied streamdata header */
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
107 if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
108 ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, avctx->extradata);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
109 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
110 } else {
6730
362abbd862f1 move call to init_get_bits inside conditional
jbr
parents: 6729
diff changeset
111 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
112 metadata_parse(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
113 }
2071
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
114 }
41d30bae5019 attempt to create some separation in the FLAC system with respect to
melanson
parents: 2028
diff changeset
115
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7304
diff changeset
116 avctx->sample_fmt = SAMPLE_FMT_S16;
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
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
120 static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
121 {
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
122 av_log(avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d\n", s->min_blocksize, s->max_blocksize);
6727
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
123 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
124 av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
125 av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
126 av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
1812
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
7302
3d8cf33fbafb Only realloc() bitstream buffer when the needed size increased,
michael
parents: 7301
diff changeset
143 if(s->allocated_bitstream_size < s->max_framesize)
3d8cf33fbafb Only realloc() bitstream buffer when the needed size increased,
michael
parents: 7301
diff changeset
144 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
145 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
146
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
147 void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
148 const uint8_t *buffer)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
149 {
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
150 GetBitContext gb;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
151 init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
152
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
153 /* mandatory streaminfo */
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
154 s->min_blocksize = get_bits(&gb, 16);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
155 s->max_blocksize = get_bits(&gb, 16);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
156
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
157 skip_bits(&gb, 24); /* skip min frame size */
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
158 s->max_framesize = get_bits_long(&gb, 24);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
159
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
160 s->samplerate = get_bits_long(&gb, 20);
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
161 s->channels = get_bits(&gb, 3) + 1;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
162 s->bps = get_bits(&gb, 5) + 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
163
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
164 avctx->channels = s->channels;
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
165 avctx->sample_rate = s->samplerate;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
166
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
167 skip_bits(&gb, 36); /* total num of samples */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
168
6726
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
169 skip_bits(&gb, 64); /* md5 sum */
08bdfd7f3ab4 change function parameters for metadata_streaminfo()
jbr
parents: 6715
diff changeset
170 skip_bits(&gb, 64); /* md5 sum */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
171
6727
706dd1afb389 change function parameters for dump_headers()
jbr
parents: 6726
diff changeset
172 dump_headers(avctx, s);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
173 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
174
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
175 /**
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
176 * 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
177 * the fLaC marker.
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
178 * @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
179 * parse metadata
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
180 * @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
181 */
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
182 static int metadata_parse(FLACContext *s)
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 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0;
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
185 int initial_pos= get_bits_count(&s->gb);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
186
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
187 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
188 skip_bits(&s->gb, 32);
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, "STREAM HEADER\n");
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
191 do {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5141
diff changeset
192 metadata_last = get_bits1(&s->gb);
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
193 metadata_type = get_bits(&s->gb, 7);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
194 metadata_size = get_bits_long(&s->gb, 24);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
195
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
196 if(get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits){
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
197 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb));
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
198 break;
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
199 }
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
200
4231
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
201 av_log(s->avctx, AV_LOG_DEBUG,
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
202 " metadata block: flag = %d, type = %d, size = %d\n",
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
203 metadata_last, metadata_type, metadata_size);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
204 if (metadata_size) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
205 switch (metadata_type) {
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
206 case METADATA_TYPE_STREAMINFO:
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
207 ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, 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
208 streaminfo_updated = 1;
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
209
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
210 default:
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
211 for (i=0; i<metadata_size; i++)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
212 skip_bits(&s->gb, 8);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
213 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
214 }
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
215 } while (!metadata_last);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
216
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
217 if (streaminfo_updated)
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
218 allocate_buffers(s);
c769e4b0c75e flac: allow reading of full metadata headers from extradata
aurel
parents: 3947
diff changeset
219 return 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 return 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
222 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
223
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
224 static int decode_residuals(FLACContext *s, int channel, int pred_order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
225 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
226 int i, tmp, partition, method_type, rice_order;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
227 int sample = 0, samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
228
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
229 method_type = get_bits(&s->gb, 2);
5871
83554c0e9ce6 Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents: 5741
diff changeset
230 if (method_type > 1){
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
231 av_log(s->avctx, AV_LOG_DEBUG, "illegal residual coding method %d\n", method_type);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
232 return -1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
233 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
234
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
235 rice_order = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
236
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
237 samples= s->blocksize >> rice_order;
4366
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
238 if (pred_order > samples) {
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
239 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
240 return -1;
f8753597422c Fix crash when pred_order greater s->blocksize >> rice_order.
reimar
parents: 4351
diff changeset
241 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
242
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
243 sample=
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
244 i= pred_order;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
245 for (partition = 0; partition < (1 << rice_order); partition++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
246 {
5871
83554c0e9ce6 Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents: 5741
diff changeset
247 tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5);
83554c0e9ce6 Add support for FLAC's new RICE2 entropy coding method. Patch by Josh Coalson.
jbr
parents: 5741
diff changeset
248 if (tmp == (method_type == 0 ? 15 : 31))
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
249 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
250 av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
251 tmp = get_bits(&s->gb, 5);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
252 for (; i < samples; i++, sample++)
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
253 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
254 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
255 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
256 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
257 // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
258 for (; i < samples; i++, sample++){
1813
ec0e71b1fc3a remove residual array, it isnt really needed
michael
parents: 1812
diff changeset
259 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
260 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
261 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
262 i= 0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
263 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
264
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
265 // 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
266
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
267 return 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
268 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
269
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
270 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
271 {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
272 const int blocksize = s->blocksize;
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
273 int32_t *decoded = s->decoded[channel];
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
274 int a, b, c, d, i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
275
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
276 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
277
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
278 /* 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
279 // 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
280
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
281 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
282 {
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
283 decoded[i] = get_sbits(&s->gb, s->curr_bps);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
284 // 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
285 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
286
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
287 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
288 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
289
6745
da3fecf31fa9 Do not read out of array bounds.
ramiro
parents: 6730
diff changeset
290 if(pred_order > 0)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
291 a = decoded[pred_order-1];
6745
da3fecf31fa9 Do not read out of array bounds.
ramiro
parents: 6730
diff changeset
292 if(pred_order > 1)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
293 b = a - decoded[pred_order-2];
6745
da3fecf31fa9 Do not read out of array bounds.
ramiro
parents: 6730
diff changeset
294 if(pred_order > 2)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
295 c = b - decoded[pred_order-2] + decoded[pred_order-3];
6745
da3fecf31fa9 Do not read out of array bounds.
ramiro
parents: 6730
diff changeset
296 if(pred_order > 3)
6746
459562f7f2ce Indent.
ramiro
parents: 6745
diff changeset
297 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
298
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
299 switch(pred_order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
300 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
301 case 0:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
302 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
303 case 1:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
304 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
305 decoded[i] = a += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
306 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
307 case 2:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
308 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
309 decoded[i] = a += b += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
310 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
311 case 3:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
312 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
313 decoded[i] = a += b += c += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
314 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
315 case 4:
5740
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
316 for (i = pred_order; i < blocksize; i++)
4d62c0055174 replace FIR with finite differences.
lorenm
parents: 5721
diff changeset
317 decoded[i] = a += b += c += d += decoded[i];
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
318 break;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
319 default:
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
320 av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
321 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
322 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
323
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
324 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
325 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
326
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
327 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
328 {
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
329 int i, j;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
330 int coeff_prec, qlevel;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
331 int coeffs[pred_order];
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
332 int32_t *decoded = s->decoded[channel];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
333
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
334 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
335
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
336 /* warm up samples */
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
337 // 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
338
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
339 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
340 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
341 decoded[i] = get_sbits(&s->gb, s->curr_bps);
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
342 // 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
343 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
344
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
345 coeff_prec = get_bits(&s->gb, 4) + 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
346 if (coeff_prec == 16)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
347 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
348 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
349 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
350 }
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
351 // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
352 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
353 // 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
354 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
355 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
356 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
357 }
4804dddf2d0e crc8 checking, based upon a patch by (Miroslav Lichvar <lichvarm at phoenix dot inf dot upol dot cz>)
michael
parents: 1813
diff changeset
358
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
359 for (i = 0; i < pred_order; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
360 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
361 coeffs[i] = get_sbits(&s->gb, coeff_prec);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
362 // 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
363 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
364
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
365 if (decode_residuals(s, channel, pred_order) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
366 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
367
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
368 if (s->bps > 16) {
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
369 int64_t sum;
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
370 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
371 {
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
372 sum = 0;
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
373 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
374 sum += (int64_t)coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
375 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
376 }
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
377 } else {
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
378 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
379 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
380 int c;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
381 int d = decoded[i-pred_order];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
382 int s0 = 0, s1 = 0;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
383 for (j = pred_order-1; j > 0; j--)
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
384 {
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
385 c = coeffs[j];
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
386 s0 += c*d;
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
387 d = decoded[i-j];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
388 s1 += c*d;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
389 }
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
390 c = coeffs[0];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
391 s0 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
392 d = decoded[i] += s0 >> qlevel;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
393 s1 += c*d;
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
394 decoded[i+1] += s1 >> qlevel;
5721
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
395 }
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
396 if (i < s->blocksize)
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
397 {
0c92562f1330 optimize decode_subframe_lpc()
lorenm
parents: 5513
diff changeset
398 int sum = 0;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
399 for (j = 0; j < pred_order; j++)
5741
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
400 sum += coeffs[j] * decoded[i-j-1];
154b02065699 20% faster lpc, 6% overall flac decoding
lorenm
parents: 5740
diff changeset
401 decoded[i] += sum >> qlevel;
3351
42b85e03b408 fix 24bit flac support, revised from Thibaut Mattern <thibaut.mattern@gmail.com>
lu_zero
parents: 3171
diff changeset
402 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
403 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
404
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
405 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
406 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
407
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
408 static inline int decode_subframe(FLACContext *s, int channel)
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 int type, wasted = 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
411 int i, tmp;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
412
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
413 s->curr_bps = s->bps;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
414 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
415 if(s->decorrelation == RIGHT_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
416 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
417 }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
418 if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
419 s->curr_bps++;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
420 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
421
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
422 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
423 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
424 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
425 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
426 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
427 type = get_bits(&s->gb, 6);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
428 // wasted = get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
429
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
430 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
431 // {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
432 // 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 // if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
435 // wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
436 // s->curr_bps -= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
437 // }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
438 #if 0
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
439 wasted= 16 - av_log2(show_bits(&s->gb, 17));
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
440 skip_bits(&s->gb, wasted+1);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
441 s->curr_bps -= wasted;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
442 #else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
443 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
444 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
445 wasted = 1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
446 while (!get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
447 wasted++;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
448 s->curr_bps -= wasted;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
449 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
450 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
451 #endif
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
452 //FIXME use av_log2 for types
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
453 if (type == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
454 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
455 av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
456 tmp = get_sbits(&s->gb, s->curr_bps);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
457 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
458 s->decoded[channel][i] = tmp;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
459 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
460 else if (type == 1)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
461 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
462 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
463 for (i = 0; i < s->blocksize; i++)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
464 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
465 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
466 else if ((type >= 8) && (type <= 12))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
467 {
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
468 // 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
469 if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
470 return -1;
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 else if (type >= 32)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
473 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
474 // 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
475 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
476 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
477 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
478 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
479 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
480 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
481 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
482 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
483
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
484 if (wasted)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
485 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
486 int i;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
487 for (i = 0; i < s->blocksize; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
488 s->decoded[channel][i] <<= wasted;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
489 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
490
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
491 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
492 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
493
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
494 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
495 {
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
496 int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
497 int decorrelation, bps, blocksize, samplerate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
498
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
499 blocksize_code = get_bits(&s->gb, 4);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
500
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
501 sample_rate_code = get_bits(&s->gb, 4);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
502
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
503 assignment = get_bits(&s->gb, 4); /* channel assignment */
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
504 if (assignment < 8 && s->channels == assignment+1)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
505 decorrelation = INDEPENDENT;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
506 else if (assignment >=8 && assignment < 11 && s->channels == 2)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
507 decorrelation = LEFT_SIDE + assignment - 8;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
508 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
509 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
510 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
511 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
512 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
513
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
514 sample_size_code = get_bits(&s->gb, 3);
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
515 if(sample_size_code == 0)
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
516 bps= s->bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
517 else if((sample_size_code != 3) && (sample_size_code != 7))
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
518 bps = sample_size_table[sample_size_code];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
519 else
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
520 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
521 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
522 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
523 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
524
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
525 if (get_bits1(&s->gb))
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
526 {
2859
079b5cca2497 AV_LOG_DEBUG vs. AV_LOG_ERROR
michael
parents: 2628
diff changeset
527 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
528 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
529 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
530
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
531 if(get_utf8(&s->gb) < 0){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
532 av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
533 return -1;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
534 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
535 #if 0
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
536 if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
537 (s->min_blocksize != s->max_blocksize)){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
538 }else{
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
539 }
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
540 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
541
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
542 if (blocksize_code == 0)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
543 blocksize = s->min_blocksize;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
544 else if (blocksize_code == 6)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
545 blocksize = get_bits(&s->gb, 8)+1;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
546 else if (blocksize_code == 7)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
547 blocksize = get_bits(&s->gb, 16)+1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
548 else
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
549 blocksize = blocksize_table[blocksize_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
550
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
551 if(blocksize > s->max_blocksize){
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
552 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
553 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
554 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
555
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
556 if(blocksize * s->channels * sizeof(int16_t) > alloc_data_size)
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
557 return -1;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
558
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
559 if (sample_rate_code == 0){
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
560 samplerate= s->samplerate;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
561 }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
562 samplerate = sample_rate_table[sample_rate_code];
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
563 else if (sample_rate_code == 12)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
564 samplerate = get_bits(&s->gb, 8) * 1000;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
565 else if (sample_rate_code == 13)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
566 samplerate = get_bits(&s->gb, 16);
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
567 else if (sample_rate_code == 14)
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
568 samplerate = get_bits(&s->gb, 16) * 10;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
569 else{
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
570 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
571 return -1;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
572 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
573
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
574 skip_bits(&s->gb, 8);
6108
75804d49f33b improve CRC API
aurel
parents: 5872
diff changeset
575 crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0,
75804d49f33b improve CRC API
aurel
parents: 5872
diff changeset
576 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
577 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
578 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
579 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
580 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
581
1816
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
582 s->blocksize = blocksize;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
583 s->samplerate = samplerate;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
584 s->bps = bps;
fa7d0134f9f0 simplify
michael
parents: 1814
diff changeset
585 s->decorrelation= decorrelation;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
586
6729
071888974d8a share streaminfo parsing function
jbr
parents: 6728
diff changeset
587 // dump_headers(s->avctx, (FLACStreaminfo *)s);
1811
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 /* subframes */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
590 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
591 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
592 // 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
593 if (decode_subframe(s, i) < 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
594 return -1;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
595 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
596
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
597 align_get_bits(&s->gb);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
598
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
599 /* frame footer */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
600 skip_bits(&s->gb, 16); /* data crc */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
601
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
602 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
603 }
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 static int flac_decode_frame(AVCodecContext *avctx,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
606 void *data, int *data_size,
6235
michael
parents: 6108
diff changeset
607 const uint8_t *buf, int buf_size)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
608 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
609 FLACContext *s = avctx->priv_data;
2078
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
610 int tmp = 0, i, j = 0, input_buf_size = 0;
3dabadc91d19 warning vigilance
melanson
parents: 2071
diff changeset
611 int16_t *samples = data;
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
612 int alloc_data_size= *data_size;
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
613
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
614 *data_size=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
615
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
616 if(s->max_framesize == 0){
7785
a969253a82ff fix issue 616 on roundup : decoding of short flac files
jai_menon
parents: 7451
diff changeset
617 s->max_framesize= FFMAX(4, buf_size); // should hopefully be enough for the first header
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
618 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
619 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
620
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
621 if(1 && s->max_framesize){//FIXME truncated
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
622 if(s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C'))
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
623 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize));
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
624 input_buf_size= buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
625
7304
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
626 if(s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index)
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
627 return -1;
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
628
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
629 if(s->allocated_bitstream_size < s->bitstream_size + buf_size)
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
630 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size);
ac25a6f7147e Support reading large metadata.
michael
parents: 7303
diff changeset
631
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
632 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
633 // printf("memmove\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
634 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
635 s->bitstream_index=0;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
636 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
637 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
638 buf= &s->bitstream[s->bitstream_index];
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
639 buf_size += s->bitstream_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
640 s->bitstream_size= buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
641
7273
3511d8cdd310 Make our flac decoder decode all the data at EOF.
michael
parents: 7129
diff changeset
642 if(buf_size < s->max_framesize && input_buf_size){
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
643 // printf("wanna more data ...\n");
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
644 return input_buf_size;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
645 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
646 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
647
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
648 init_get_bits(&s->gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
649
7301
aab7f1fb59ea If metadata has been parsed goto end instead of trying to
michael
parents: 7273
diff changeset
650 if(metadata_parse(s))
aab7f1fb59ea If metadata has been parsed goto end instead of trying to
michael
parents: 7273
diff changeset
651 goto end;
aab7f1fb59ea If metadata has been parsed goto end instead of trying to
michael
parents: 7273
diff changeset
652
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
653 tmp = show_bits(&s->gb, 16);
5872
cd4b72a32517 Add decoding support for variable block size FLAC files using the latest FLAC
jbr
parents: 5871
diff changeset
654 if((tmp & 0xFFFE) != 0xFFF8){
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
655 av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
5872
cd4b72a32517 Add decoding support for variable block size FLAC files using the latest FLAC
jbr
parents: 5871
diff changeset
656 while(get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8)
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
657 skip_bits(&s->gb, 8);
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
658 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
659 }
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
660 skip_bits(&s->gb, 16);
4351
1e251b54cba2 avcodec_decode_audio2()
michael
parents: 4231
diff changeset
661 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
662 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
663 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
664 s->bitstream_index=0;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
665 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
666 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
667
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
668
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
669 #if 0
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
670 /* fix the channel order here */
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
671 if (s->order == MID_SIDE)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
672 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
673 short *left = samples;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
674 short *right = samples + s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
675 for (i = 0; i < s->blocksize; i += 2)
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 uint32_t x = s->decoded[0][i];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
678 uint32_t y = s->decoded[0][i+1];
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 right[i] = x - (y / 2);
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
681 left[i] = right[i] + y;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
682 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
683 *data_size = 2 * s->blocksize;
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 else
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 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
688 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
689 switch(s->order)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
690 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
691 case INDEPENDENT:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
692 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
693 samples[(s->blocksize*i)+j] = s->decoded[i][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
694 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
695 case LEFT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
696 case RIGHT_SIDE:
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
697 if (i == 0)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
698 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
699 samples[(s->blocksize*i)+j] = s->decoded[0][j];
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
700 else
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
701 for (j = 0; j < s->blocksize; j++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
702 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
703 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
704 // case MID_SIDE:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
705 // 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
706 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
707 *data_size += s->blocksize;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
708 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
709 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
710 #else
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
711 #define DECORRELATE(left, right)\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
712 assert(s->channels == 2);\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
713 for (i = 0; i < s->blocksize; i++)\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
714 {\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
715 int a= s->decoded[0][i];\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
716 int b= s->decoded[1][i];\
5141
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
717 *samples++ = ((left) << (24 - s->bps)) >> 8;\
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
718 *samples++ = ((right) << (24 - s->bps)) >> 8;\
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
719 }\
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
720 break;
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
721
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
722 switch(s->decorrelation)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
723 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
724 case INDEPENDENT:
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
725 for (j = 0; j < s->blocksize; j++)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
726 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
727 for (i = 0; i < s->channels; i++)
5141
67953f3ef896 add and remove some parentheses
benoit
parents: 5125
diff changeset
728 *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
729 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
730 break;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
731 case LEFT_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
732 DECORRELATE(a,a-b)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
733 case RIGHT_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
734 DECORRELATE(a+b,b)
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
735 case MID_SIDE:
3434
d42ab8824434 seems i forgot to commit this simplification ...
michael
parents: 3351
diff changeset
736 DECORRELATE( (a-=b>>1) + b, a)
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 #endif
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
739
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
740 *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
741 // 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
742
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
743 // s->last_blocksize = s->blocksize;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
744 end:
6377
michael
parents: 6235
diff changeset
745 i= (get_bits_count(&s->gb)+7)/8;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
746 if(i > buf_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
747 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
748 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
749 s->bitstream_index=0;
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
750 return -1;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
751 }
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
752
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
753 if(s->bitstream_size){
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
754 s->bitstream_index += i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
755 s->bitstream_size -= i;
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
756 return input_buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
757 }else
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
758 return i;
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
759 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
760
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6377
diff changeset
761 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
762 {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
763 FLACContext *s = avctx->priv_data;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
764 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
765
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
766 for (i = 0; i < s->channels; i++)
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
767 {
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
768 av_freep(&s->decoded[i]);
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
769 }
1812
6d762acfff5d flac fixes:
michael
parents: 1811
diff changeset
770 av_freep(&s->bitstream);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
771
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
772 return 0;
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
773 }
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
774
1817
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
775 static void flac_flush(AVCodecContext *avctx){
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
776 FLACContext *s = avctx->priv_data;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
777
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
778 s->bitstream_size=
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
779 s->bitstream_index= 0;
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
780 }
93029a89c173 flac_flush()
michael
parents: 1816
diff changeset
781
1811
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
782 AVCodec flac_decoder = {
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
783 "flac",
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
784 CODEC_TYPE_AUDIO,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
785 CODEC_ID_FLAC,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
786 sizeof(FLACContext),
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
787 flac_decode_init,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
788 NULL,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
789 flac_decode_close,
98d4d32b90e8 flac decoder by (Alex Beregszaszi <alex at fsn dot hu>)
michael
parents:
diff changeset
790 flac_decode_frame,
7273
3511d8cdd310 Make our flac decoder decode all the data at EOF.
michael
parents: 7129
diff changeset
791 CODEC_CAP_DELAY,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2859
diff changeset
792 .flush= flac_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6763
diff changeset
793 .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
794 };