Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
mpc.c
Go to the documentation of this file.
1
/*
2
* Musepack decoder core
3
* Copyright (c) 2006 Konstantin Shishkov
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
29
#include "
avcodec.h
"
30
#include "
get_bits.h
"
31
#include "
dsputil.h
"
32
#include "
mpegaudiodsp.h
"
33
#include "
mpegaudio.h
"
34
35
#include "
mpc.h
"
36
#include "
mpcdata.h
"
37
38
void
ff_mpc_init
(
void
)
39
{
40
ff_mpa_synth_init_fixed
(
ff_mpa_synth_window_fixed
);
41
}
42
46
static
void
mpc_synth
(
MPCContext
*c, int16_t *out,
int
channels)
47
{
48
int
dither_state = 0;
49
int
i, ch;
50
OUT_INT
samples
[
MPA_MAX_CHANNELS
*
MPA_FRAME_SIZE
], *samples_ptr;
51
52
for
(ch = 0; ch < channels; ch++){
53
samples_ptr = samples + ch;
54
for
(i = 0; i <
SAMPLES_PER_BAND
; i++) {
55
ff_mpa_synth_filter_fixed
(&c->
mpadsp
,
56
c->
synth_buf
[ch], &(c->
synth_buf_offset
[ch]),
57
ff_mpa_synth_window_fixed
, &dither_state,
58
samples_ptr, channels,
59
c->
sb_samples
[ch][i]);
60
samples_ptr += 32 * channels;
61
}
62
}
63
for
(i = 0; i <
MPC_FRAME_SIZE
*channels; i++)
64
*out++=samples[i];
65
}
66
67
void
ff_mpc_dequantize_and_synth
(
MPCContext
* c,
int
maxband,
void
*
data
,
int
channels)
68
{
69
int
i, j, ch;
70
Band
*bands = c->
bands
;
71
int
off
;
72
float
mul;
73
74
/* dequantize */
75
memset(c->
sb_samples
, 0,
sizeof
(c->
sb_samples
));
76
off = 0;
77
for
(i = 0; i <= maxband; i++, off +=
SAMPLES_PER_BAND
){
78
for
(ch = 0; ch < 2; ch++){
79
if
(bands[i].res[ch]){
80
j = 0;
81
mul =
mpc_CC
[bands[i].
res
[ch] + 1] *
mpc_SCF
[bands[i].
scf_idx
[ch][0]+6];
82
for
(; j < 12; j++)
83
c->
sb_samples
[ch][j][i] = mul * c->
Q
[ch][j + off];
84
mul =
mpc_CC
[bands[i].
res
[ch] + 1] *
mpc_SCF
[bands[i].
scf_idx
[ch][1]+6];
85
for
(; j < 24; j++)
86
c->
sb_samples
[ch][j][i] = mul * c->
Q
[ch][j +
off
];
87
mul =
mpc_CC
[bands[i].
res
[ch] + 1] *
mpc_SCF
[bands[i].
scf_idx
[ch][2]+6];
88
for
(; j < 36; j++)
89
c->
sb_samples
[ch][j][i] = mul * c->
Q
[ch][j + off];
90
}
91
}
92
if
(bands[i].msf){
93
int
t1
,
t2
;
94
for
(j = 0; j <
SAMPLES_PER_BAND
; j++){
95
t1 = c->
sb_samples
[0][j][i];
96
t2 = c->
sb_samples
[1][j][i];
97
c->
sb_samples
[0][j][i] = t1 +
t2
;
98
c->
sb_samples
[1][j][i] = t1 -
t2
;
99
}
100
}
101
}
102
103
mpc_synth
(c, data, channels);
104
}