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
23 * @file mpc.c Musepack decoder core
24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
25 * divided into 32 subbands.
28 #include "libavutil/random.h"
30 #include "bitstream.h"
33 #ifdef CONFIG_MPEGAUDIO_HP
34 #define USE_HIGHPRECISION
36 #include "mpegaudio.h"
41 static DECLARE_ALIGNED_16(MPA_INT
, mpa_window
[512]);
45 ff_mpa_synth_init(mpa_window
);
49 * Process decoded Musepack data and produce PCM
51 static void mpc_synth(MPCContext
*c
, int16_t *out
)
55 OUT_INT samples
[MPA_MAX_CHANNELS
* MPA_FRAME_SIZE
], *samples_ptr
;
57 for(ch
= 0; ch
< 2; ch
++){
58 samples_ptr
= samples
+ ch
;
59 for(i
= 0; i
< SAMPLES_PER_BAND
; i
++) {
60 ff_mpa_synth_filter(c
->synth_buf
[ch
], &(c
->synth_buf_offset
[ch
]),
61 mpa_window
, &dither_state
,
63 c
->sb_samples
[ch
][i
]);
67 for(i
= 0; i
< MPC_FRAME_SIZE
*2; i
++)
71 void ff_mpc_dequantize_and_synth(MPCContext
* c
, int maxband
, void *data
)
74 Band
*bands
= c
->bands
;
79 memset(c
->sb_samples
, 0, sizeof(c
->sb_samples
));
81 for(i
= 0; i
<= maxband
; i
++, off
+= SAMPLES_PER_BAND
){
82 for(ch
= 0; ch
< 2; ch
++){
85 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][0]];
87 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
88 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][1]];
90 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
91 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][2]];
93 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
98 for(j
= 0; j
< SAMPLES_PER_BAND
; j
++){
99 t1
= c
->sb_samples
[0][j
][i
];
100 t2
= c
->sb_samples
[1][j
][i
];
101 c
->sb_samples
[0][j
][i
] = t1
+ t2
;
102 c
->sb_samples
[1][j
][i
] = t1
- t2
;