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 libavcodec/mpc.c Musepack decoder core
24 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
25 * divided into 32 subbands.
31 #include "mpegaudio.h"
36 static DECLARE_ALIGNED_16(MPA_INT
, mpa_window
[512]);
38 void ff_mpc_init(void)
40 ff_mpa_synth_init(mpa_window
);
44 * Process decoded Musepack data and produce PCM
46 static void mpc_synth(MPCContext
*c
, int16_t *out
)
50 OUT_INT samples
[MPA_MAX_CHANNELS
* MPA_FRAME_SIZE
], *samples_ptr
;
52 for(ch
= 0; ch
< 2; ch
++){
53 samples_ptr
= samples
+ ch
;
54 for(i
= 0; i
< SAMPLES_PER_BAND
; i
++) {
55 ff_mpa_synth_filter(c
->synth_buf
[ch
], &(c
->synth_buf_offset
[ch
]),
56 mpa_window
, &dither_state
,
58 c
->sb_samples
[ch
][i
]);
62 for(i
= 0; i
< MPC_FRAME_SIZE
*2; i
++)
66 void ff_mpc_dequantize_and_synth(MPCContext
* c
, int maxband
, void *data
)
69 Band
*bands
= c
->bands
;
74 memset(c
->sb_samples
, 0, sizeof(c
->sb_samples
));
76 for(i
= 0; i
<= maxband
; i
++, off
+= SAMPLES_PER_BAND
){
77 for(ch
= 0; ch
< 2; ch
++){
80 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][0]];
82 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
83 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][1]];
85 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
86 mul
= mpc_CC
[bands
[i
].res
[ch
]] * mpc_SCF
[bands
[i
].scf_idx
[ch
][2]];
88 c
->sb_samples
[ch
][j
][i
] = mul
* c
->Q
[ch
][j
+ off
];
93 for(j
= 0; j
< SAMPLES_PER_BAND
; j
++){
94 t1
= c
->sb_samples
[0][j
][i
];
95 t2
= c
->sb_samples
[1][j
][i
];
96 c
->sb_samples
[0][j
][i
] = t1
+ t2
;
97 c
->sb_samples
[1][j
][i
] = t1
- t2
;