2 * Musepack decoder core
3 * Copyright (c) 2006 Konstantin Shishkov
5 * This file is part of FFmpeg.
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.
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.
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
24 * Musepack decoder core
25 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
26 * divided into 32 subbands.
29 #include "libavutil/attributes.h"
32 #include "mpegaudiodsp.h"
33 #include "mpegaudio.h"
38 av_cold
void ff_mpc_init(void)
40 ff_mpa_synth_init_fixed(ff_mpa_synth_window_fixed
);
44 * Process decoded Musepack data and produce PCM
46 static void mpc_synth(MPCContext
*c
, int16_t **out
, int channels
)
51 for(ch
= 0; ch
< channels
; ch
++){
52 for(i
= 0; i
< SAMPLES_PER_BAND
; i
++) {
53 ff_mpa_synth_filter_fixed(&c
->mpadsp
,
54 c
->synth_buf
[ch
], &(c
->synth_buf_offset
[ch
]),
55 ff_mpa_synth_window_fixed
, &dither_state
,
57 c
->sb_samples
[ch
][i
]);
62 void ff_mpc_dequantize_and_synth(MPCContext
* c
, int maxband
, int16_t **out
,
66 Band
*bands
= c
->bands
;
71 memset(c
->sb_samples
, 0, sizeof(c
->sb_samples
));
73 for(i
= 0; i
<= maxband
; i
++, off
+= SAMPLES_PER_BAND
){
74 for(ch
= 0; ch
< 2; ch
++){
77 mul
= (mpc_CC
+1)[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][0] & 0xFF];
79 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
80 mul
= (mpc_CC
+1)[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][1] & 0xFF];
82 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
83 mul
= (mpc_CC
+1)[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][2] & 0xFF];
85 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
90 for(j
= 0; j
< SAMPLES_PER_BAND
; j
++){
91 t1
= c
->sb_samples
[0][j
][i
];
92 t2
= c
->sb_samples
[1][j
][i
];
93 c
->sb_samples
[0][j
][i
] = t1
+ t2
;
94 c
->sb_samples
[1][j
][i
] = t1
- t2
;
99 mpc_synth(c
, out
, channels
);