yading@10
|
1 /*
|
yading@10
|
2 * FLAC common code
|
yading@10
|
3 * Copyright (c) 2009 Justin Ruggles
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 #include "libavutil/channel_layout.h"
|
yading@10
|
23 #include "libavutil/crc.h"
|
yading@10
|
24 #include "libavutil/log.h"
|
yading@10
|
25 #include "bytestream.h"
|
yading@10
|
26 #include "get_bits.h"
|
yading@10
|
27 #include "flac.h"
|
yading@10
|
28 #include "flacdata.h"
|
yading@10
|
29
|
yading@10
|
30 static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 };
|
yading@10
|
31
|
yading@10
|
32 static const uint64_t flac_channel_layouts[8] = {
|
yading@10
|
33 AV_CH_LAYOUT_MONO,
|
yading@10
|
34 AV_CH_LAYOUT_STEREO,
|
yading@10
|
35 AV_CH_LAYOUT_SURROUND,
|
yading@10
|
36 AV_CH_LAYOUT_QUAD,
|
yading@10
|
37 AV_CH_LAYOUT_5POINT0,
|
yading@10
|
38 AV_CH_LAYOUT_5POINT1,
|
yading@10
|
39 AV_CH_LAYOUT_6POINT1,
|
yading@10
|
40 AV_CH_LAYOUT_7POINT1
|
yading@10
|
41 };
|
yading@10
|
42
|
yading@10
|
43 static int64_t get_utf8(GetBitContext *gb)
|
yading@10
|
44 {
|
yading@10
|
45 int64_t val;
|
yading@10
|
46 GET_UTF8(val, get_bits(gb, 8), return -1;)
|
yading@10
|
47 return val;
|
yading@10
|
48 }
|
yading@10
|
49
|
yading@10
|
50 int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
|
yading@10
|
51 FLACFrameInfo *fi, int log_level_offset)
|
yading@10
|
52 {
|
yading@10
|
53 int bs_code, sr_code, bps_code;
|
yading@10
|
54
|
yading@10
|
55 /* frame sync code */
|
yading@10
|
56 if ((get_bits(gb, 15) & 0x7FFF) != 0x7FFC) {
|
yading@10
|
57 av_log(avctx, AV_LOG_ERROR + log_level_offset, "invalid sync code\n");
|
yading@10
|
58 return -1;
|
yading@10
|
59 }
|
yading@10
|
60
|
yading@10
|
61 /* variable block size stream code */
|
yading@10
|
62 fi->is_var_size = get_bits1(gb);
|
yading@10
|
63
|
yading@10
|
64 /* block size and sample rate codes */
|
yading@10
|
65 bs_code = get_bits(gb, 4);
|
yading@10
|
66 sr_code = get_bits(gb, 4);
|
yading@10
|
67
|
yading@10
|
68 /* channels and decorrelation */
|
yading@10
|
69 fi->ch_mode = get_bits(gb, 4);
|
yading@10
|
70 if (fi->ch_mode < FLAC_MAX_CHANNELS) {
|
yading@10
|
71 fi->channels = fi->ch_mode + 1;
|
yading@10
|
72 fi->ch_mode = FLAC_CHMODE_INDEPENDENT;
|
yading@10
|
73 } else if (fi->ch_mode < FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE) {
|
yading@10
|
74 fi->channels = 2;
|
yading@10
|
75 fi->ch_mode -= FLAC_MAX_CHANNELS - 1;
|
yading@10
|
76 } else {
|
yading@10
|
77 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
78 "invalid channel mode: %d\n", fi->ch_mode);
|
yading@10
|
79 return -1;
|
yading@10
|
80 }
|
yading@10
|
81
|
yading@10
|
82 /* bits per sample */
|
yading@10
|
83 bps_code = get_bits(gb, 3);
|
yading@10
|
84 if (bps_code == 3 || bps_code == 7) {
|
yading@10
|
85 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
86 "invalid sample size code (%d)\n",
|
yading@10
|
87 bps_code);
|
yading@10
|
88 return -1;
|
yading@10
|
89 }
|
yading@10
|
90 fi->bps = sample_size_table[bps_code];
|
yading@10
|
91
|
yading@10
|
92 /* reserved bit */
|
yading@10
|
93 if (get_bits1(gb)) {
|
yading@10
|
94 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
95 "broken stream, invalid padding\n");
|
yading@10
|
96 return -1;
|
yading@10
|
97 }
|
yading@10
|
98
|
yading@10
|
99 /* sample or frame count */
|
yading@10
|
100 fi->frame_or_sample_num = get_utf8(gb);
|
yading@10
|
101 if (fi->frame_or_sample_num < 0) {
|
yading@10
|
102 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
103 "sample/frame number invalid; utf8 fscked\n");
|
yading@10
|
104 return -1;
|
yading@10
|
105 }
|
yading@10
|
106
|
yading@10
|
107 /* blocksize */
|
yading@10
|
108 if (bs_code == 0) {
|
yading@10
|
109 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
110 "reserved blocksize code: 0\n");
|
yading@10
|
111 return -1;
|
yading@10
|
112 } else if (bs_code == 6) {
|
yading@10
|
113 fi->blocksize = get_bits(gb, 8) + 1;
|
yading@10
|
114 } else if (bs_code == 7) {
|
yading@10
|
115 fi->blocksize = get_bits(gb, 16) + 1;
|
yading@10
|
116 } else {
|
yading@10
|
117 fi->blocksize = ff_flac_blocksize_table[bs_code];
|
yading@10
|
118 }
|
yading@10
|
119
|
yading@10
|
120 /* sample rate */
|
yading@10
|
121 if (sr_code < 12) {
|
yading@10
|
122 fi->samplerate = ff_flac_sample_rate_table[sr_code];
|
yading@10
|
123 } else if (sr_code == 12) {
|
yading@10
|
124 fi->samplerate = get_bits(gb, 8) * 1000;
|
yading@10
|
125 } else if (sr_code == 13) {
|
yading@10
|
126 fi->samplerate = get_bits(gb, 16);
|
yading@10
|
127 } else if (sr_code == 14) {
|
yading@10
|
128 fi->samplerate = get_bits(gb, 16) * 10;
|
yading@10
|
129 } else {
|
yading@10
|
130 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
131 "illegal sample rate code %d\n",
|
yading@10
|
132 sr_code);
|
yading@10
|
133 return -1;
|
yading@10
|
134 }
|
yading@10
|
135
|
yading@10
|
136 /* header CRC-8 check */
|
yading@10
|
137 skip_bits(gb, 8);
|
yading@10
|
138 if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer,
|
yading@10
|
139 get_bits_count(gb)/8)) {
|
yading@10
|
140 av_log(avctx, AV_LOG_ERROR + log_level_offset,
|
yading@10
|
141 "header crc mismatch\n");
|
yading@10
|
142 return -1;
|
yading@10
|
143 }
|
yading@10
|
144
|
yading@10
|
145 return 0;
|
yading@10
|
146 }
|
yading@10
|
147
|
yading@10
|
148 int ff_flac_get_max_frame_size(int blocksize, int ch, int bps)
|
yading@10
|
149 {
|
yading@10
|
150 /* Technically, there is no limit to FLAC frame size, but an encoder
|
yading@10
|
151 should not write a frame that is larger than if verbatim encoding mode
|
yading@10
|
152 were to be used. */
|
yading@10
|
153
|
yading@10
|
154 int count;
|
yading@10
|
155
|
yading@10
|
156 count = 16; /* frame header */
|
yading@10
|
157 count += ch * ((7+bps+7)/8); /* subframe headers */
|
yading@10
|
158 if (ch == 2) {
|
yading@10
|
159 /* for stereo, need to account for using decorrelation */
|
yading@10
|
160 count += (( 2*bps+1) * blocksize + 7) / 8;
|
yading@10
|
161 } else {
|
yading@10
|
162 count += ( ch*bps * blocksize + 7) / 8;
|
yading@10
|
163 }
|
yading@10
|
164 count += 2; /* frame footer */
|
yading@10
|
165
|
yading@10
|
166 return count;
|
yading@10
|
167 }
|
yading@10
|
168
|
yading@10
|
169 int avpriv_flac_is_extradata_valid(AVCodecContext *avctx,
|
yading@10
|
170 enum FLACExtradataFormat *format,
|
yading@10
|
171 uint8_t **streaminfo_start)
|
yading@10
|
172 {
|
yading@10
|
173 if (!avctx->extradata || avctx->extradata_size < FLAC_STREAMINFO_SIZE) {
|
yading@10
|
174 av_log(avctx, AV_LOG_ERROR, "extradata NULL or too small.\n");
|
yading@10
|
175 return 0;
|
yading@10
|
176 }
|
yading@10
|
177 if (AV_RL32(avctx->extradata) != MKTAG('f','L','a','C')) {
|
yading@10
|
178 /* extradata contains STREAMINFO only */
|
yading@10
|
179 if (avctx->extradata_size != FLAC_STREAMINFO_SIZE) {
|
yading@10
|
180 av_log(avctx, AV_LOG_WARNING, "extradata contains %d bytes too many.\n",
|
yading@10
|
181 FLAC_STREAMINFO_SIZE-avctx->extradata_size);
|
yading@10
|
182 }
|
yading@10
|
183 *format = FLAC_EXTRADATA_FORMAT_STREAMINFO;
|
yading@10
|
184 *streaminfo_start = avctx->extradata;
|
yading@10
|
185 } else {
|
yading@10
|
186 if (avctx->extradata_size < 8+FLAC_STREAMINFO_SIZE) {
|
yading@10
|
187 av_log(avctx, AV_LOG_ERROR, "extradata too small.\n");
|
yading@10
|
188 return 0;
|
yading@10
|
189 }
|
yading@10
|
190 *format = FLAC_EXTRADATA_FORMAT_FULL_HEADER;
|
yading@10
|
191 *streaminfo_start = &avctx->extradata[8];
|
yading@10
|
192 }
|
yading@10
|
193 return 1;
|
yading@10
|
194 }
|
yading@10
|
195
|
yading@10
|
196 void ff_flac_set_channel_layout(AVCodecContext *avctx)
|
yading@10
|
197 {
|
yading@10
|
198 if (avctx->channels <= FF_ARRAY_ELEMS(flac_channel_layouts))
|
yading@10
|
199 avctx->channel_layout = flac_channel_layouts[avctx->channels - 1];
|
yading@10
|
200 else
|
yading@10
|
201 avctx->channel_layout = 0;
|
yading@10
|
202 }
|
yading@10
|
203
|
yading@10
|
204 void avpriv_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
|
yading@10
|
205 const uint8_t *buffer)
|
yading@10
|
206 {
|
yading@10
|
207 GetBitContext gb;
|
yading@10
|
208 init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8);
|
yading@10
|
209
|
yading@10
|
210 skip_bits(&gb, 16); /* skip min blocksize */
|
yading@10
|
211 s->max_blocksize = get_bits(&gb, 16);
|
yading@10
|
212 if (s->max_blocksize < FLAC_MIN_BLOCKSIZE) {
|
yading@10
|
213 av_log(avctx, AV_LOG_WARNING, "invalid max blocksize: %d\n",
|
yading@10
|
214 s->max_blocksize);
|
yading@10
|
215 s->max_blocksize = 16;
|
yading@10
|
216 }
|
yading@10
|
217
|
yading@10
|
218 skip_bits(&gb, 24); /* skip min frame size */
|
yading@10
|
219 s->max_framesize = get_bits_long(&gb, 24);
|
yading@10
|
220
|
yading@10
|
221 s->samplerate = get_bits_long(&gb, 20);
|
yading@10
|
222 s->channels = get_bits(&gb, 3) + 1;
|
yading@10
|
223 s->bps = get_bits(&gb, 5) + 1;
|
yading@10
|
224
|
yading@10
|
225 avctx->channels = s->channels;
|
yading@10
|
226 avctx->sample_rate = s->samplerate;
|
yading@10
|
227 avctx->bits_per_raw_sample = s->bps;
|
yading@10
|
228 ff_flac_set_channel_layout(avctx);
|
yading@10
|
229
|
yading@10
|
230 s->samples = get_bits64(&gb, 36);
|
yading@10
|
231
|
yading@10
|
232 skip_bits_long(&gb, 64); /* md5 sum */
|
yading@10
|
233 skip_bits_long(&gb, 64); /* md5 sum */
|
yading@10
|
234 }
|
yading@10
|
235
|
yading@10
|
236 void avpriv_flac_parse_block_header(const uint8_t *block_header,
|
yading@10
|
237 int *last, int *type, int *size)
|
yading@10
|
238 {
|
yading@10
|
239 int tmp = bytestream_get_byte(&block_header);
|
yading@10
|
240 if (last)
|
yading@10
|
241 *last = tmp & 0x80;
|
yading@10
|
242 if (type)
|
yading@10
|
243 *type = tmp & 0x7F;
|
yading@10
|
244 if (size)
|
yading@10
|
245 *size = bytestream_get_be24(&block_header);
|
yading@10
|
246 }
|