annotate mpc.c @ 6017:e1404acccac3 libavcodec

Actually return with an error condition if we're being asked to deal with too many reference frames. Also check max num ref frames against our internal ref buffer sizes. Part of fix for roundup issue 281
author heydowns
date Fri, 14 Dec 2007 05:48:27 +0000
parents 2cc044ac80d4
children f7cbb7733146
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
1 /*
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
2 * Musepack decoder core
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
4 *
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
6 *
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
11 *
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
16 *
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
20 */
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
21
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
22 /**
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
23 * @file mpc.c Musepack decoder core
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
25 * divided into 32 subbands.
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
26 */
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
27
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
28 #include "avcodec.h"
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
29 #include "bitstream.h"
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
30 #include "dsputil.h"
4536
0430aafe6f01 Use AVRandom
kostya
parents: 4535
diff changeset
31 #include "random.h"
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
32
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
33 #ifdef CONFIG_MPEGAUDIO_HP
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
34 #define USE_HIGHPRECISION
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
35 #endif
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
36 #include "mpegaudio.h"
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
37
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
38 #include "mpc.h"
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
39 #include "mpcdata.h"
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
40
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
41 static DECLARE_ALIGNED_16(MPA_INT, mpa_window[512]);
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
42
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
43 void ff_mpc_init()
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
44 {
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
45 ff_mpa_synth_init(mpa_window);
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
46 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
47
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
48 /**
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
49 * Process decoded Musepack data and produce PCM
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
50 */
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
51 static void mpc_synth(MPCContext *c, int16_t *out)
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
52 {
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
53 int dither_state = 0;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
54 int i, ch;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
55 OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
56
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
57 for(ch = 0; ch < 2; ch++){
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
58 samples_ptr = samples + ch;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
59 for(i = 0; i < SAMPLES_PER_BAND; i++) {
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
60 ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]),
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
61 mpa_window, &dither_state,
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
62 samples_ptr, 2,
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
63 c->sb_samples[ch][i]);
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
64 samples_ptr += 64;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
65 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
66 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
67 for(i = 0; i < MPC_FRAME_SIZE*2; i++)
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
68 *out++=samples[i];
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
69 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
70
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
71 void ff_mpc_dequantize_and_synth(MPCContext * c, int maxband, void *data)
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
72 {
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
73 int i, j, ch;
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
74 Band *bands = c->bands;
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
75 int off;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
76 float mul;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
77
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
78 /* dequantize */
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
79 memset(c->sb_samples, 0, sizeof(c->sb_samples));
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
80 off = 0;
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
81 for(i = 0; i <= maxband; i++, off += SAMPLES_PER_BAND){
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
82 for(ch = 0; ch < 2; ch++){
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
83 if(bands[i].res[ch]){
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
84 j = 0;
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
85 mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][0]];
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
86 for(; j < 12; j++)
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
87 c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off];
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
88 mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][1]];
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
89 for(; j < 24; j++)
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
90 c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off];
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
91 mul = mpc_CC[bands[i].res[ch]] * mpc_SCF[bands[i].scf_idx[ch][2]];
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
92 for(; j < 36; j++)
5868
2cc044ac80d4 Split Musepack decoder into SV7 decoder and synth core
kostya
parents: 5215
diff changeset
93 c->sb_samples[ch][j][i] = mul * c->Q[ch][j + off];
4328
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
94 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
95 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
96 if(bands[i].msf){
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
97 int t1, t2;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
98 for(j = 0; j < SAMPLES_PER_BAND; j++){
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
99 t1 = c->sb_samples[0][j][i];
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
100 t2 = c->sb_samples[1][j][i];
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
101 c->sb_samples[0][j][i] = t1 + t2;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
102 c->sb_samples[1][j][i] = t1 - t2;
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
103 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
104 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
105 }
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
106
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
107 mpc_synth(c, data);
a0cfbd6679c0 Musepack SV7 decoding support
kostya
parents:
diff changeset
108 }