FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mpc8.c
Date: 2024-04-26 14:42:52
Exec Total Coverage
Lines: 201 221 91.0%
Functions: 8 9 88.9%
Branches: 121 139 87.1%

Line Branch Exec Source
1 /*
2 * Musepack SV8 decoder
3 * Copyright (c) 2007 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
25 * divided into 32 subbands.
26 */
27
28 #include "libavutil/channel_layout.h"
29 #include "libavutil/lfg.h"
30 #include "libavutil/thread.h"
31 #include "avcodec.h"
32 #include "codec_internal.h"
33 #include "decode.h"
34 #include "get_bits.h"
35 #include "mpegaudiodsp.h"
36
37 #include "mpc.h"
38 #include "mpc8data.h"
39 #include "mpc8huff.h"
40
41 static VLC band_vlc, scfi_vlc[2], dscf_vlc[2], res_vlc[2];
42 static VLC q1_vlc, q2_vlc[2], q3_vlc[2], quant_vlc[4][2], q9up_vlc;
43
44 7797 static inline int mpc8_dec_base(GetBitContext *gb, int k, int n)
45 {
46 7797 int len = mpc8_cnk_len[k-1][n-1] - 1;
47
1/2
✓ Branch 0 taken 7797 times.
✗ Branch 1 not taken.
7797 int code = len ? get_bits_long(gb, len) : 0;
48
49
2/2
✓ Branch 0 taken 3746 times.
✓ Branch 1 taken 4051 times.
7797 if (code >= mpc8_cnk_lost[k-1][n-1])
50 3746 code = ((code << 1) | get_bits1(gb)) - mpc8_cnk_lost[k-1][n-1];
51
52 7797 return code;
53 }
54
55 7335 static inline int mpc8_dec_enum(GetBitContext *gb, int k, int n)
56 {
57 7335 int bits = 0;
58 7335 const uint32_t * C = mpc8_cnk[k-1];
59 7335 int code = mpc8_dec_base(gb, k, n);
60
61 do {
62 109711 n--;
63
2/2
✓ Branch 0 taken 41077 times.
✓ Branch 1 taken 68634 times.
109711 if (code >= C[n]) {
64 41077 bits |= 1U << n;
65 41077 code -= C[n];
66 41077 C -= 32;
67 41077 k--;
68 }
69
2/2
✓ Branch 0 taken 102376 times.
✓ Branch 1 taken 7335 times.
109711 } while(k > 0);
70
71 7335 return bits;
72 }
73
74 462 static inline int mpc8_get_mod_golomb(GetBitContext *gb, int m)
75 {
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 462 times.
462 if(mpc8_cnk_len[0][m] < 1) return 0;
77 462 return mpc8_dec_base(gb, 1, m+1);
78 }
79
80 7492 static int mpc8_get_mask(GetBitContext *gb, int size, int t)
81 {
82 7492 int mask = 0;
83
84
4/4
✓ Branch 0 taken 7388 times.
✓ Branch 1 taken 104 times.
✓ Branch 2 taken 7335 times.
✓ Branch 3 taken 53 times.
7492 if(t && t != size)
85 7335 mask = mpc8_dec_enum(gb, FFMIN(t, size - t), size);
86
2/2
✓ Branch 0 taken 1317 times.
✓ Branch 1 taken 6175 times.
7492 if((t << 1) > size) mask = ~mask;
87
88 7492 return mask;
89 }
90
91 42 static av_cold void build_vlc(VLC *vlc, unsigned *buf_offset,
92 const uint8_t codes_counts[16],
93 const uint8_t **syms, int offset)
94 {
95 static VLCElem vlc_buf[9296];
96 uint8_t len[MPC8_MAX_VLC_SIZE];
97 42 unsigned num = 0;
98
99 42 vlc->table = &vlc_buf[*buf_offset];
100 42 vlc->table_allocated = FF_ARRAY_ELEMS(vlc_buf) - *buf_offset;
101
102
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 42 times.
714 for (int i = 16; i > 0; i--)
103
2/2
✓ Branch 0 taken 2686 times.
✓ Branch 1 taken 672 times.
3358 for (unsigned tmp = num + codes_counts[i - 1]; num < tmp; num++)
104 2686 len[num] = i;
105
106 42 ff_vlc_init_from_lengths(vlc, FFMIN(len[0], 9), num, len, 1,
107 *syms, 1, 1, offset, VLC_INIT_STATIC_OVERLONG, NULL);
108 42 *buf_offset += vlc->table_size;
109 42 *syms += num;
110 42 }
111
112 2 static av_cold void mpc8_init_static(void)
113 {
114 2 const uint8_t *q_syms = mpc8_q_syms, *bands_syms = mpc8_bands_syms;
115 2 const uint8_t *res_syms = mpc8_res_syms, *scfi_syms = mpc8_scfi_syms;
116 2 const uint8_t *dscf_syms = mpc8_dscf_syms;
117 2 unsigned offset = 0;
118
119 2 build_vlc(&band_vlc, &offset, mpc8_bands_len_counts, &bands_syms, 0);
120
121 2 build_vlc(&q1_vlc, &offset, mpc8_q1_len_counts, &q_syms, 0);
122 2 build_vlc(&q9up_vlc, &offset, mpc8_q9up_len_counts, &q_syms, 0);
123
124
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
6 for (int i = 0; i < 2; i++){
125 4 build_vlc(&scfi_vlc[i], &offset, mpc8_scfi_len_counts[i], &scfi_syms, 0);
126
127 4 build_vlc(&dscf_vlc[i], &offset, mpc8_dscf_len_counts[i], &dscf_syms, 0);
128
129 4 build_vlc(&res_vlc[i], &offset, mpc8_res_len_counts[i], &res_syms, 0);
130
131 4 build_vlc(&q2_vlc[i], &offset, mpc8_q2_len_counts[i], &q_syms, 0);
132 4 build_vlc(&q3_vlc[i], &offset, mpc8_q34_len_counts[i],
133 4 &q_syms, -48 - 16 * i);
134
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
20 for (int j = 0; j < 4; j++)
135 16 build_vlc(&quant_vlc[j][i], &offset, mpc8_q5_8_len_counts[i][j],
136 16 &q_syms, -((8 << j) - 1));
137 }
138 2 ff_mpa_synth_init_fixed();
139 2 }
140
141 3 static av_cold int mpc8_decode_init(AVCodecContext * avctx)
142 {
143 static AVOnce init_static_once = AV_ONCE_INIT;
144 3 MPCContext *c = avctx->priv_data;
145 GetBitContext gb;
146 int channels;
147
148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(avctx->extradata_size < 2){
149 av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
150 return -1;
151 }
152 3 memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
153 3 av_lfg_init(&c->rnd, 0xDEADBEEF);
154 3 ff_mpadsp_init(&c->mpadsp);
155
156 3 init_get_bits(&gb, avctx->extradata, 16);
157
158 3 skip_bits(&gb, 3);//sample rate
159 3 c->maxbands = get_bits(&gb, 5) + 1;
160
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (c->maxbands >= BANDS) {
161 av_log(avctx,AV_LOG_ERROR, "maxbands %d too high\n", c->maxbands);
162 return AVERROR_INVALIDDATA;
163 }
164 3 channels = get_bits(&gb, 4) + 1;
165
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (channels > 2) {
166 avpriv_request_sample(avctx, "Multichannel MPC SV8");
167 return AVERROR_PATCHWELCOME;
168 }
169 3 c->MSS = get_bits1(&gb);
170 3 c->frames = 1 << (get_bits(&gb, 3) * 2);
171
172 3 avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
173 3 av_channel_layout_uninit(&avctx->ch_layout);
174 3 av_channel_layout_default(&avctx->ch_layout, channels);
175
176 3 ff_thread_once(&init_static_once, mpc8_init_static);
177
178 3 return 0;
179 }
180
181 459 static int mpc8_decode_frame(AVCodecContext *avctx, AVFrame *frame,
182 int *got_frame_ptr, AVPacket *avpkt)
183 {
184 459 const uint8_t *buf = avpkt->data;
185 459 int buf_size = avpkt->size;
186 459 MPCContext *c = avctx->priv_data;
187 459 GetBitContext gb2, *gb = &gb2;
188 int i, j, k, ch, cnt, res, t;
189 459 Band *bands = c->bands;
190 int off;
191 int maxband, keyframe;
192 int last[2];
193
194 459 keyframe = c->cur_frame == 0;
195
196
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 449 times.
459 if(keyframe){
197 10 memset(c->Q, 0, sizeof(c->Q));
198 10 c->last_bits_used = 0;
199 }
200
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 459 times.
459 if ((res = init_get_bits8(gb, buf, buf_size)) < 0)
201 return res;
202
203 459 skip_bits(gb, c->last_bits_used & 7);
204
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 449 times.
459 if(keyframe)
206 10 maxband = mpc8_get_mod_golomb(gb, c->maxbands + 1);
207 else{
208 449 maxband = c->last_max_band + get_vlc2(gb, band_vlc.table, MPC8_BANDS_BITS, 2);
209
2/2
✓ Branch 0 taken 103 times.
✓ Branch 1 taken 346 times.
449 if(maxband > 32) maxband -= 33;
210 }
211
212
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 458 times.
459 if (get_bits_left(gb) < 0) {
213 1 *got_frame_ptr = 0;
214 1 return buf_size;
215 }
216
217
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 458 times.
458 if(maxband > c->maxbands + 1) {
218 av_log(avctx, AV_LOG_ERROR, "maxband %d too large\n",maxband);
219 return AVERROR_INVALIDDATA;
220 }
221 458 c->last_max_band = maxband;
222
223 /* read subband indexes */
224
2/2
✓ Branch 0 taken 452 times.
✓ Branch 1 taken 6 times.
458 if(maxband){
225 452 last[0] = last[1] = 0;
226
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 452 times.
10866 for(i = maxband - 1; i >= 0; i--){
227
2/2
✓ Branch 0 taken 20828 times.
✓ Branch 1 taken 10414 times.
31242 for(ch = 0; ch < 2; ch++){
228 20828 last[ch] = get_vlc2(gb, res_vlc[last[ch] > 2].table, MPC8_RES_BITS, 2) + last[ch];
229
2/2
✓ Branch 0 taken 4063 times.
✓ Branch 1 taken 16765 times.
20828 if(last[ch] > 15) last[ch] -= 17;
230 20828 bands[i].res[ch] = last[ch];
231 }
232 }
233
1/2
✓ Branch 0 taken 452 times.
✗ Branch 1 not taken.
452 if(c->MSS){
234 int mask;
235
236 452 cnt = 0;
237
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 452 times.
10866 for(i = 0; i < maxband; i++)
238
3/4
✓ Branch 0 taken 103 times.
✓ Branch 1 taken 10311 times.
✓ Branch 2 taken 103 times.
✗ Branch 3 not taken.
10414 if(bands[i].res[0] || bands[i].res[1])
239 10414 cnt++;
240 452 t = mpc8_get_mod_golomb(gb, cnt);
241 452 mask = mpc8_get_mask(gb, cnt, t);
242
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 452 times.
10866 for(i = maxband - 1; i >= 0; i--)
243
3/4
✓ Branch 0 taken 103 times.
✓ Branch 1 taken 10311 times.
✓ Branch 2 taken 103 times.
✗ Branch 3 not taken.
10414 if(bands[i].res[0] || bands[i].res[1]){
244 10414 bands[i].msf = mask & 1;
245 10414 mask >>= 1;
246 }
247 }
248 }
249
2/2
✓ Branch 0 taken 2410 times.
✓ Branch 1 taken 458 times.
2868 for(i = maxband; i < c->maxbands; i++)
250 2410 bands[i].res[0] = bands[i].res[1] = 0;
251
252
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 448 times.
458 if(keyframe){
253
2/2
✓ Branch 0 taken 320 times.
✓ Branch 1 taken 10 times.
330 for(i = 0; i < 32; i++)
254 320 c->oldDSCF[0][i] = c->oldDSCF[1][i] = 1;
255 }
256
257
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 458 times.
10872 for(i = 0; i < maxband; i++){
258
3/4
✓ Branch 0 taken 103 times.
✓ Branch 1 taken 10311 times.
✓ Branch 2 taken 103 times.
✗ Branch 3 not taken.
10414 if(bands[i].res[0] || bands[i].res[1]){
259 10414 cnt = !!bands[i].res[0] + !!bands[i].res[1] - 1;
260
1/2
✓ Branch 0 taken 10414 times.
✗ Branch 1 not taken.
10414 if(cnt >= 0){
261 10414 t = get_vlc2(gb, scfi_vlc[cnt].table, scfi_vlc[cnt].bits, 1);
262
2/2
✓ Branch 0 taken 10311 times.
✓ Branch 1 taken 103 times.
10414 if(bands[i].res[0]) bands[i].scfi[0] = t >> (2 * cnt);
263
2/2
✓ Branch 0 taken 7971 times.
✓ Branch 1 taken 2443 times.
10414 if(bands[i].res[1]) bands[i].scfi[1] = t & 3;
264 }
265 }
266 }
267
268
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 458 times.
10872 for(i = 0; i < maxband; i++){
269
2/2
✓ Branch 0 taken 20828 times.
✓ Branch 1 taken 10414 times.
31242 for(ch = 0; ch < 2; ch++){
270
2/2
✓ Branch 0 taken 2546 times.
✓ Branch 1 taken 18282 times.
20828 if(!bands[i].res[ch]) continue;
271
272
2/2
✓ Branch 0 taken 388 times.
✓ Branch 1 taken 17894 times.
18282 if(c->oldDSCF[ch][i]){
273 388 bands[i].scf_idx[ch][0] = get_bits(gb, 7) - 6;
274 388 c->oldDSCF[ch][i] = 0;
275 }else{
276 17894 t = get_vlc2(gb, dscf_vlc[1].table, MPC8_DSCF1_BITS, 2);
277
2/2
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 17844 times.
17894 if(t == 64)
278 50 t += get_bits(gb, 6);
279 17894 bands[i].scf_idx[ch][0] = ((bands[i].scf_idx[ch][2] + t - 25) & 0x7F) - 6;
280 }
281
2/2
✓ Branch 0 taken 36564 times.
✓ Branch 1 taken 18282 times.
54846 for(j = 0; j < 2; j++){
282
2/2
✓ Branch 0 taken 23434 times.
✓ Branch 1 taken 13130 times.
36564 if((bands[i].scfi[ch] << j) & 2)
283 23434 bands[i].scf_idx[ch][j + 1] = bands[i].scf_idx[ch][j];
284 else{
285 13130 t = get_vlc2(gb, dscf_vlc[0].table, MPC8_DSCF0_BITS, 2);
286
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 13032 times.
13130 if(t == 31)
287 98 t = 64 + get_bits(gb, 6);
288 13130 bands[i].scf_idx[ch][j + 1] = ((bands[i].scf_idx[ch][j] + t - 25) & 0x7F) - 6;
289 }
290 }
291 }
292 }
293
294
2/2
✓ Branch 0 taken 10414 times.
✓ Branch 1 taken 458 times.
10872 for(i = 0, off = 0; i < maxband; i++, off += SAMPLES_PER_BAND){
295
2/2
✓ Branch 0 taken 20828 times.
✓ Branch 1 taken 10414 times.
31242 for(ch = 0; ch < 2; ch++){
296 20828 res = bands[i].res[ch];
297
6/7
✗ Branch 0 not taken.
✓ Branch 1 taken 2546 times.
✓ Branch 2 taken 3520 times.
✓ Branch 3 taken 6121 times.
✓ Branch 4 taken 4822 times.
✓ Branch 5 taken 3454 times.
✓ Branch 6 taken 365 times.
20828 switch(res){
298 case -1:
299 for(j = 0; j < SAMPLES_PER_BAND; j++)
300 c->Q[ch][off + j] = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
301 break;
302 2546 case 0:
303 2546 break;
304 3520 case 1:
305
2/2
✓ Branch 0 taken 7040 times.
✓ Branch 1 taken 3520 times.
10560 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){
306 7040 cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2);
307 7040 t = mpc8_get_mask(gb, 18, cnt);
308
2/2
✓ Branch 0 taken 126720 times.
✓ Branch 1 taken 7040 times.
133760 for(k = 0; k < SAMPLES_PER_BAND / 2; k++)
309 126720 c->Q[ch][off + j + k] = t & (1 << (SAMPLES_PER_BAND / 2 - k - 1))
310
2/2
✓ Branch 0 taken 43848 times.
✓ Branch 1 taken 82872 times.
126720 ? (get_bits1(gb) << 1) - 1 : 0;
311 }
312 3520 break;
313 6121 case 2:
314 6121 cnt = 6;//2*mpc8_thres[res]
315
2/2
✓ Branch 0 taken 73452 times.
✓ Branch 1 taken 6121 times.
79573 for(j = 0; j < SAMPLES_PER_BAND; j += 3){
316 73452 t = get_vlc2(gb, q2_vlc[cnt > 3].table, MPC8_Q2_BITS, 2);
317 73452 c->Q[ch][off + j + 0] = mpc8_idx50[t];
318 73452 c->Q[ch][off + j + 1] = mpc8_idx51[t];
319 73452 c->Q[ch][off + j + 2] = mpc8_idx52[t];
320 73452 cnt = (cnt >> 1) + mpc8_huffq2[t];
321 }
322 6121 break;
323 4822 case 3:
324 case 4:
325
2/2
✓ Branch 0 taken 86796 times.
✓ Branch 1 taken 4822 times.
91618 for(j = 0; j < SAMPLES_PER_BAND; j += 2){
326 86796 t = get_vlc2(gb, q3_vlc[res - 3].table, MPC8_Q3_BITS, 2);
327 86796 c->Q[ch][off + j + 1] = t >> 4;
328 86796 c->Q[ch][off + j + 0] = sign_extend(t, 4);
329 }
330 4822 break;
331 3454 case 5:
332 case 6:
333 case 7:
334 case 8:
335 3454 cnt = 2 * mpc8_thres[res];
336
2/2
✓ Branch 0 taken 124344 times.
✓ Branch 1 taken 3454 times.
127798 for(j = 0; j < SAMPLES_PER_BAND; j++){
337 124344 const VLC *vlc = &quant_vlc[res - 5][cnt > mpc8_thres[res]];
338 124344 c->Q[ch][off + j] = get_vlc2(gb, vlc->table, vlc->bits, 2);
339 124344 cnt = (cnt >> 1) + FFABS(c->Q[ch][off + j]);
340 }
341 3454 break;
342 365 default:
343
2/2
✓ Branch 0 taken 13140 times.
✓ Branch 1 taken 365 times.
13505 for(j = 0; j < SAMPLES_PER_BAND; j++){
344 13140 c->Q[ch][off + j] = get_vlc2(gb, q9up_vlc.table, MPC8_Q9UP_BITS, 2);
345
2/2
✓ Branch 0 taken 5544 times.
✓ Branch 1 taken 7596 times.
13140 if(res != 9){
346 5544 c->Q[ch][off + j] <<= res - 9;
347 5544 c->Q[ch][off + j] |= get_bits(gb, res - 9);
348 }
349 13140 c->Q[ch][off + j] -= (1 << (res - 2)) - 1;
350 }
351 }
352 }
353 }
354
355 458 frame->nb_samples = MPC_FRAME_SIZE;
356
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 458 times.
458 if ((res = ff_get_buffer(avctx, frame, 0)) < 0)
357 return res;
358
359 458 ff_mpc_dequantize_and_synth(c, maxband - 1,
360 458 (int16_t **)frame->extended_data,
361 avctx->ch_layout.nb_channels);
362
363 458 c->cur_frame++;
364
365 458 c->last_bits_used = get_bits_count(gb);
366
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 451 times.
458 if(c->cur_frame >= c->frames)
367 7 c->cur_frame = 0;
368
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 458 times.
458 if (get_bits_left(gb) < 0) {
369 av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -get_bits_left(gb));
370 c->last_bits_used = buf_size << 3;
371
3/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 451 times.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
458 } else if (c->cur_frame == 0 && get_bits_left(gb) < 8) {// we have only padding left
372 7 c->last_bits_used = buf_size << 3;
373 }
374
375 458 *got_frame_ptr = 1;
376
377
2/2
✓ Branch 0 taken 451 times.
✓ Branch 1 taken 7 times.
458 return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
378 }
379
380 static av_cold void mpc8_decode_flush(AVCodecContext *avctx)
381 {
382 MPCContext *c = avctx->priv_data;
383 c->cur_frame = 0;
384 }
385
386 const FFCodec ff_mpc8_decoder = {
387 .p.name = "mpc8",
388 CODEC_LONG_NAME("Musepack SV8"),
389 .p.type = AVMEDIA_TYPE_AUDIO,
390 .p.id = AV_CODEC_ID_MUSEPACK8,
391 .priv_data_size = sizeof(MPCContext),
392 .init = mpc8_decode_init,
393 FF_CODEC_DECODE_CB(mpc8_decode_frame),
394 .flush = mpc8_decode_flush,
395 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
396 .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
397 AV_SAMPLE_FMT_NONE },
398 };
399