Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
6668bc80
Commit
6668bc80
authored
Apr 18, 2016
by
Alexandra Hájková
Committed by
Diego Biurrun
Jan 25, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpc: Convert to the new bitstream reader
parent
b83aea73
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
94 additions
and
88 deletions
+94
-88
mpc7.c
libavcodec/mpc7.c
+39
-34
mpc8.c
libavcodec/mpc8.c
+42
-41
mpc8.c
libavformat/mpc8.c
+13
-13
No files found.
libavcodec/mpc7.c
View file @
6668bc80
...
...
@@ -28,8 +28,9 @@
#include "libavutil/channel_layout.h"
#include "libavutil/internal.h"
#include "libavutil/lfg.h"
#include "avcodec.h"
#include "
get_bits
.h"
#include "
bitstream
.h"
#include "internal.h"
#include "mpegaudiodsp.h"
...
...
@@ -53,7 +54,7 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
{
int
i
,
j
;
MPCContext
*
c
=
avctx
->
priv_data
;
GetBitContext
gb
;
BitstreamContext
bc
;
LOCAL_ALIGNED_16
(
uint8_t
,
buf
,
[
16
]);
static
int
vlc_initialized
=
0
;
...
...
@@ -78,18 +79,18 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
ff_mpadsp_init
(
&
c
->
mpadsp
);
c
->
bdsp
.
bswap_buf
((
uint32_t
*
)
buf
,
(
const
uint32_t
*
)
avctx
->
extradata
,
4
);
ff_mpc_init
();
init_get_bits
(
&
gb
,
buf
,
128
);
bitstream_init
(
&
bc
,
buf
,
128
);
c
->
IS
=
get_bits1
(
&
gb
);
c
->
MSS
=
get_bits1
(
&
gb
);
c
->
maxbands
=
get_bits
(
&
gb
,
6
);
c
->
IS
=
bitstream_read_bit
(
&
bc
);
c
->
MSS
=
bitstream_read_bit
(
&
bc
);
c
->
maxbands
=
bitstream_read
(
&
bc
,
6
);
if
(
c
->
maxbands
>=
BANDS
){
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too many bands: %i
\n
"
,
c
->
maxbands
);
return
-
1
;
}
skip_bits_long
(
&
gb
,
88
);
c
->
gapless
=
get_bits1
(
&
gb
);
c
->
lastframelen
=
get_bits
(
&
gb
,
11
);
bitstream_skip
(
&
bc
,
88
);
c
->
gapless
=
bitstream_read_bit
(
&
bc
);
c
->
lastframelen
=
bitstream_read
(
&
bc
,
11
);
av_log
(
avctx
,
AV_LOG_DEBUG
,
"IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d
\n
"
,
c
->
IS
,
c
->
MSS
,
c
->
gapless
,
c
->
lastframelen
,
c
->
maxbands
);
c
->
frames_to_skip
=
0
;
...
...
@@ -143,7 +144,7 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
/**
* Fill samples for given subband
*/
static
inline
void
idx_to_quant
(
MPCContext
*
c
,
GetBitContext
*
gb
,
int
idx
,
int
*
dst
)
static
inline
void
idx_to_quant
(
MPCContext
*
c
,
BitstreamContext
*
bc
,
int
idx
,
int
*
dst
)
{
int
i
,
i1
,
t
;
switch
(
idx
){
...
...
@@ -153,43 +154,43 @@ static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *
}
break
;
case
1
:
i1
=
get_bits1
(
gb
);
i1
=
bitstream_read_bit
(
bc
);
for
(
i
=
0
;
i
<
SAMPLES_PER_BAND
/
3
;
i
++
){
t
=
get_vlc2
(
gb
,
quant_vlc
[
0
][
i1
].
table
,
9
,
2
);
t
=
bitstream_read_vlc
(
bc
,
quant_vlc
[
0
][
i1
].
table
,
9
,
2
);
*
dst
++
=
mpc7_idx30
[
t
];
*
dst
++
=
mpc7_idx31
[
t
];
*
dst
++
=
mpc7_idx32
[
t
];
}
break
;
case
2
:
i1
=
get_bits1
(
gb
);
i1
=
bitstream_read_bit
(
bc
);
for
(
i
=
0
;
i
<
SAMPLES_PER_BAND
/
2
;
i
++
){
t
=
get_vlc2
(
gb
,
quant_vlc
[
1
][
i1
].
table
,
9
,
2
);
t
=
bitstream_read_vlc
(
bc
,
quant_vlc
[
1
][
i1
].
table
,
9
,
2
);
*
dst
++
=
mpc7_idx50
[
t
];
*
dst
++
=
mpc7_idx51
[
t
];
}
break
;
case
3
:
case
4
:
case
5
:
case
6
:
case
7
:
i1
=
get_bits1
(
gb
);
i1
=
bitstream_read_bit
(
bc
);
for
(
i
=
0
;
i
<
SAMPLES_PER_BAND
;
i
++
)
*
dst
++
=
get_vlc2
(
gb
,
quant_vlc
[
idx
-
1
][
i1
].
table
,
9
,
2
)
-
mpc7_quant_vlc_off
[
idx
-
1
];
*
dst
++
=
bitstream_read_vlc
(
bc
,
quant_vlc
[
idx
-
1
][
i1
].
table
,
9
,
2
)
-
mpc7_quant_vlc_off
[
idx
-
1
];
break
;
case
8
:
case
9
:
case
10
:
case
11
:
case
12
:
case
13
:
case
14
:
case
15
:
case
16
:
case
17
:
t
=
(
1
<<
(
idx
-
2
))
-
1
;
for
(
i
=
0
;
i
<
SAMPLES_PER_BAND
;
i
++
)
*
dst
++
=
get_bits
(
gb
,
idx
-
1
)
-
t
;
*
dst
++
=
bitstream_read
(
bc
,
idx
-
1
)
-
t
;
break
;
default:
// case 0 and -2..-17
return
;
}
}
static
int
get_scale_idx
(
GetBitContext
*
gb
,
int
ref
)
static
int
get_scale_idx
(
BitstreamContext
*
bc
,
int
ref
)
{
int
t
=
get_vlc2
(
gb
,
dscf_vlc
.
table
,
MPC7_DSCF_BITS
,
1
)
-
7
;
int
t
=
bitstream_read_vlc
(
bc
,
dscf_vlc
.
table
,
MPC7_DSCF_BITS
,
1
)
-
7
;
if
(
t
==
8
)
return
get_bits
(
gb
,
6
);
return
bitstream_read
(
bc
,
6
);
return
av_clip_uintp2
(
ref
+
t
,
7
);
}
...
...
@@ -200,7 +201,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
;
MPCContext
*
c
=
avctx
->
priv_data
;
GetBitContext
gb
;
BitstreamContext
bc
;
int
i
,
ch
;
int
mb
=
-
1
;
Band
*
bands
=
c
->
bands
;
...
...
@@ -237,45 +238,49 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
return
AVERROR
(
ENOMEM
);
c
->
bdsp
.
bswap_buf
((
uint32_t
*
)
c
->
bits
,
(
const
uint32_t
*
)
buf
,
buf_size
>>
2
);
init_get_bits
(
&
gb
,
c
->
bits
,
buf_size
*
8
);
skip_bits_long
(
&
gb
,
skip
);
bitstream_init
(
&
bc
,
c
->
bits
,
buf_size
*
8
);
bitstream_skip
(
&
bc
,
skip
);
/* read subband indexes */
for
(
i
=
0
;
i
<=
c
->
maxbands
;
i
++
){
for
(
ch
=
0
;
ch
<
2
;
ch
++
){
int
t
=
4
;
if
(
i
)
t
=
get_vlc2
(
&
gb
,
hdr_vlc
.
table
,
MPC7_HDR_BITS
,
1
)
-
5
;
if
(
t
==
4
)
bands
[
i
].
res
[
ch
]
=
get_bits
(
&
gb
,
4
);
if
(
i
)
t
=
bitstream_read_vlc
(
&
bc
,
hdr_vlc
.
table
,
MPC7_HDR_BITS
,
1
)
-
5
;
if
(
t
==
4
)
bands
[
i
].
res
[
ch
]
=
bitstream_read
(
&
bc
,
4
);
else
bands
[
i
].
res
[
ch
]
=
av_clip
(
bands
[
i
-
1
].
res
[
ch
]
+
t
,
0
,
17
);
}
if
(
bands
[
i
].
res
[
0
]
||
bands
[
i
].
res
[
1
]){
mb
=
i
;
if
(
c
->
MSS
)
bands
[
i
].
msf
=
get_bits1
(
&
gb
);
if
(
c
->
MSS
)
bands
[
i
].
msf
=
bitstream_read_bit
(
&
bc
);
}
}
/* get scale indexes coding method */
for
(
i
=
0
;
i
<=
mb
;
i
++
)
for
(
ch
=
0
;
ch
<
2
;
ch
++
)
if
(
bands
[
i
].
res
[
ch
])
bands
[
i
].
scfi
[
ch
]
=
get_vlc2
(
&
gb
,
scfi_vlc
.
table
,
MPC7_SCFI_BITS
,
1
);
if
(
bands
[
i
].
res
[
ch
])
bands
[
i
].
scfi
[
ch
]
=
bitstream_read_vlc
(
&
bc
,
scfi_vlc
.
table
,
MPC7_SCFI_BITS
,
1
);
/* get scale indexes */
for
(
i
=
0
;
i
<=
mb
;
i
++
){
for
(
ch
=
0
;
ch
<
2
;
ch
++
){
if
(
bands
[
i
].
res
[
ch
]){
bands
[
i
].
scf_idx
[
ch
][
2
]
=
c
->
oldDSCF
[
ch
][
i
];
bands
[
i
].
scf_idx
[
ch
][
0
]
=
get_scale_idx
(
&
gb
,
bands
[
i
].
scf_idx
[
ch
][
2
]);
bands
[
i
].
scf_idx
[
ch
][
0
]
=
get_scale_idx
(
&
bc
,
bands
[
i
].
scf_idx
[
ch
][
2
]);
switch
(
bands
[
i
].
scfi
[
ch
]){
case
0
:
bands
[
i
].
scf_idx
[
ch
][
1
]
=
get_scale_idx
(
&
gb
,
bands
[
i
].
scf_idx
[
ch
][
0
]);
bands
[
i
].
scf_idx
[
ch
][
2
]
=
get_scale_idx
(
&
gb
,
bands
[
i
].
scf_idx
[
ch
][
1
]);
bands
[
i
].
scf_idx
[
ch
][
1
]
=
get_scale_idx
(
&
bc
,
bands
[
i
].
scf_idx
[
ch
][
0
]);
bands
[
i
].
scf_idx
[
ch
][
2
]
=
get_scale_idx
(
&
bc
,
bands
[
i
].
scf_idx
[
ch
][
1
]);
break
;
case
1
:
bands
[
i
].
scf_idx
[
ch
][
1
]
=
get_scale_idx
(
&
gb
,
bands
[
i
].
scf_idx
[
ch
][
0
]);
bands
[
i
].
scf_idx
[
ch
][
1
]
=
get_scale_idx
(
&
bc
,
bands
[
i
].
scf_idx
[
ch
][
0
]);
bands
[
i
].
scf_idx
[
ch
][
2
]
=
bands
[
i
].
scf_idx
[
ch
][
1
];
break
;
case
2
:
bands
[
i
].
scf_idx
[
ch
][
1
]
=
bands
[
i
].
scf_idx
[
ch
][
0
];
bands
[
i
].
scf_idx
[
ch
][
2
]
=
get_scale_idx
(
&
gb
,
bands
[
i
].
scf_idx
[
ch
][
1
]);
bands
[
i
].
scf_idx
[
ch
][
2
]
=
get_scale_idx
(
&
bc
,
bands
[
i
].
scf_idx
[
ch
][
1
]);
break
;
case
3
:
bands
[
i
].
scf_idx
[
ch
][
2
]
=
bands
[
i
].
scf_idx
[
ch
][
1
]
=
bands
[
i
].
scf_idx
[
ch
][
0
];
...
...
@@ -290,11 +295,11 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
off
=
0
;
for
(
i
=
0
;
i
<
BANDS
;
i
++
,
off
+=
SAMPLES_PER_BAND
)
for
(
ch
=
0
;
ch
<
2
;
ch
++
)
idx_to_quant
(
c
,
&
gb
,
bands
[
i
].
res
[
ch
],
c
->
Q
[
ch
]
+
off
);
idx_to_quant
(
c
,
&
bc
,
bands
[
i
].
res
[
ch
],
c
->
Q
[
ch
]
+
off
);
ff_mpc_dequantize_and_synth
(
c
,
mb
,
(
int16_t
**
)
frame
->
extended_data
,
2
);
bits_used
=
get_bits_count
(
&
gb
);
bits_used
=
bitstream_tell
(
&
bc
);
bits_avail
=
buf_size
*
8
;
if
(
!
last_frame
&&
((
bits_avail
<
bits_used
)
||
(
bits_used
+
32
<=
bits_avail
)))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error decoding frame: used %i of %i bits
\n
"
,
bits_used
,
bits_avail
);
...
...
libavcodec/mpc8.c
View file @
6668bc80
...
...
@@ -27,8 +27,9 @@
#include "libavutil/channel_layout.h"
#include "libavutil/lfg.h"
#include "avcodec.h"
#include "
get_bits
.h"
#include "
bitstream
.h"
#include "internal.h"
#include "mpegaudiodsp.h"
...
...
@@ -42,22 +43,22 @@ static VLC q1_vlc, q2_vlc[2], q3_vlc[2], quant_vlc[4][2], q9up_vlc;
static
const
int
q3_offsets
[
2
]
=
{
MPC8_Q3_OFFSET
,
MPC8_Q4_OFFSET
};
static
const
int
quant_offsets
[
6
]
=
{
MPC8_Q5_OFFSET
,
MPC8_Q6_OFFSET
,
MPC8_Q7_OFFSET
,
MPC8_Q8_OFFSET
};
static
inline
int
mpc8_dec_base
(
GetBitContext
*
gb
,
int
k
,
int
n
)
static
inline
int
mpc8_dec_base
(
BitstreamContext
*
bc
,
int
k
,
int
n
)
{
int
len
=
mpc8_cnk_len
[
k
-
1
][
n
-
1
]
-
1
;
int
code
=
len
?
get_bits_long
(
gb
,
len
)
:
0
;
int
code
=
len
?
bitstream_read
(
bc
,
len
)
:
0
;
if
(
code
>=
mpc8_cnk_lost
[
k
-
1
][
n
-
1
])
code
=
((
code
<<
1
)
|
get_bits1
(
gb
))
-
mpc8_cnk_lost
[
k
-
1
][
n
-
1
];
code
=
((
code
<<
1
)
|
bitstream_read_bit
(
bc
))
-
mpc8_cnk_lost
[
k
-
1
][
n
-
1
];
return
code
;
}
static
inline
int
mpc8_dec_enum
(
GetBitContext
*
gb
,
int
k
,
int
n
)
static
inline
int
mpc8_dec_enum
(
BitstreamContext
*
bc
,
int
k
,
int
n
)
{
int
bits
=
0
;
const
uint32_t
*
C
=
mpc8_cnk
[
k
-
1
];
int
code
=
mpc8_dec_base
(
gb
,
k
,
n
);
int
code
=
mpc8_dec_base
(
bc
,
k
,
n
);
do
{
n
--
;
...
...
@@ -72,18 +73,18 @@ static inline int mpc8_dec_enum(GetBitContext *gb, int k, int n)
return
bits
;
}
static
inline
int
mpc8_get_mod_golomb
(
GetBitContext
*
gb
,
int
m
)
static
inline
int
mpc8_get_mod_golomb
(
BitstreamContext
*
bc
,
int
m
)
{
if
(
mpc8_cnk_len
[
0
][
m
]
<
1
)
return
0
;
return
mpc8_dec_base
(
gb
,
1
,
m
+
1
);
return
mpc8_dec_base
(
bc
,
1
,
m
+
1
);
}
static
int
mpc8_get_mask
(
GetBitContext
*
gb
,
int
size
,
int
t
)
static
int
mpc8_get_mask
(
BitstreamContext
*
bc
,
int
size
,
int
t
)
{
int
mask
=
0
;
if
(
t
&&
t
!=
size
)
mask
=
mpc8_dec_enum
(
gb
,
FFMIN
(
t
,
size
-
t
),
size
);
mask
=
mpc8_dec_enum
(
bc
,
FFMIN
(
t
,
size
-
t
),
size
);
if
((
t
<<
1
)
>
size
)
mask
=
~
mask
;
return
mask
;
...
...
@@ -97,7 +98,7 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
{
int
i
;
MPCContext
*
c
=
avctx
->
priv_data
;
GetBitContext
gb
;
BitstreamContext
bc
;
static
int
vlc_initialized
=
0
;
int
channels
;
...
...
@@ -122,17 +123,17 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
ff_mpc_init
();
init_get_bits
(
&
gb
,
avctx
->
extradata
,
16
);
bitstream_init
(
&
bc
,
avctx
->
extradata
,
16
);
skip_bits
(
&
gb
,
3
);
//
sample rate
c
->
maxbands
=
get_bits
(
&
gb
,
5
)
+
1
;
channels
=
get_bits
(
&
gb
,
4
)
+
1
;
bitstream_skip
(
&
bc
,
3
);
//
sample rate
c
->
maxbands
=
bitstream_read
(
&
bc
,
5
)
+
1
;
channels
=
bitstream_read
(
&
bc
,
4
)
+
1
;
if
(
channels
>
2
)
{
avpriv_request_sample
(
avctx
,
"Multichannel MPC SV8"
);
return
AVERROR_PATCHWELCOME
;
}
c
->
MSS
=
get_bits1
(
&
gb
);
c
->
frames
=
1
<<
(
get_bits
(
&
gb
,
3
)
*
2
);
c
->
MSS
=
bitstream_read_bit
(
&
bc
);
c
->
frames
=
1
<<
(
bitstream_read
(
&
bc
,
3
)
*
2
);
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16P
;
avctx
->
channel_layout
=
(
avctx
->
channels
==
2
)
?
AV_CH_LAYOUT_STEREO
:
AV_CH_LAYOUT_MONO
;
...
...
@@ -238,7 +239,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
MPCContext
*
c
=
avctx
->
priv_data
;
GetBitContext
gb2
,
*
gb
=
&
gb
2
;
BitstreamContext
bc2
,
*
bc
=
&
bc
2
;
int
i
,
j
,
k
,
ch
,
cnt
,
res
,
t
;
Band
*
bands
=
c
->
bands
;
int
off
;
...
...
@@ -258,13 +259,13 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
memset
(
c
->
Q
,
0
,
sizeof
(
c
->
Q
));
c
->
last_bits_used
=
0
;
}
init_get_bits
(
gb
,
buf
,
buf_size
*
8
);
skip_bits
(
gb
,
c
->
last_bits_used
&
7
);
bitstream_init
(
bc
,
buf
,
buf_size
*
8
);
bitstream_skip
(
bc
,
c
->
last_bits_used
&
7
);
if
(
keyframe
)
maxband
=
mpc8_get_mod_golomb
(
gb
,
c
->
maxbands
+
1
);
maxband
=
mpc8_get_mod_golomb
(
bc
,
c
->
maxbands
+
1
);
else
{
maxband
=
c
->
last_max_band
+
get_vlc2
(
gb
,
band_vlc
.
table
,
MPC8_BANDS_BITS
,
2
);
maxband
=
c
->
last_max_band
+
bitstream_read_vlc
(
bc
,
band_vlc
.
table
,
MPC8_BANDS_BITS
,
2
);
if
(
maxband
>
32
)
maxband
-=
33
;
}
if
(
maxband
>
c
->
maxbands
+
1
)
...
...
@@ -276,7 +277,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
last
[
0
]
=
last
[
1
]
=
0
;
for
(
i
=
maxband
-
1
;
i
>=
0
;
i
--
){
for
(
ch
=
0
;
ch
<
2
;
ch
++
){
last
[
ch
]
=
get_vlc2
(
gb
,
res_vlc
[
last
[
ch
]
>
2
].
table
,
MPC8_RES_BITS
,
2
)
+
last
[
ch
];
last
[
ch
]
=
bitstream_read_vlc
(
bc
,
res_vlc
[
last
[
ch
]
>
2
].
table
,
MPC8_RES_BITS
,
2
)
+
last
[
ch
];
if
(
last
[
ch
]
>
15
)
last
[
ch
]
-=
17
;
bands
[
i
].
res
[
ch
]
=
last
[
ch
];
}
...
...
@@ -288,8 +289,8 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
for
(
i
=
0
;
i
<
maxband
;
i
++
)
if
(
bands
[
i
].
res
[
0
]
||
bands
[
i
].
res
[
1
])
cnt
++
;
t
=
mpc8_get_mod_golomb
(
gb
,
cnt
);
mask
=
mpc8_get_mask
(
gb
,
cnt
,
t
);
t
=
mpc8_get_mod_golomb
(
bc
,
cnt
);
mask
=
mpc8_get_mask
(
bc
,
cnt
,
t
);
for
(
i
=
maxband
-
1
;
i
>=
0
;
i
--
)
if
(
bands
[
i
].
res
[
0
]
||
bands
[
i
].
res
[
1
]){
bands
[
i
].
msf
=
mask
&
1
;
...
...
@@ -309,7 +310,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
if
(
bands
[
i
].
res
[
0
]
||
bands
[
i
].
res
[
1
]){
cnt
=
!!
bands
[
i
].
res
[
0
]
+
!!
bands
[
i
].
res
[
1
]
-
1
;
if
(
cnt
>=
0
){
t
=
get_vlc2
(
gb
,
scfi_vlc
[
cnt
].
table
,
scfi_vlc
[
cnt
].
bits
,
1
);
t
=
bitstream_read_vlc
(
bc
,
scfi_vlc
[
cnt
].
table
,
scfi_vlc
[
cnt
].
bits
,
1
);
if
(
bands
[
i
].
res
[
0
])
bands
[
i
].
scfi
[
0
]
=
t
>>
(
2
*
cnt
);
if
(
bands
[
i
].
res
[
1
])
bands
[
i
].
scfi
[
1
]
=
t
&
3
;
}
...
...
@@ -321,21 +322,21 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
if
(
!
bands
[
i
].
res
[
ch
])
continue
;
if
(
c
->
oldDSCF
[
ch
][
i
]){
bands
[
i
].
scf_idx
[
ch
][
0
]
=
get_bits
(
gb
,
7
)
-
6
;
bands
[
i
].
scf_idx
[
ch
][
0
]
=
bitstream_read
(
bc
,
7
)
-
6
;
c
->
oldDSCF
[
ch
][
i
]
=
0
;
}
else
{
t
=
get_vlc2
(
gb
,
dscf_vlc
[
1
].
table
,
MPC8_DSCF1_BITS
,
2
);
t
=
bitstream_read_vlc
(
bc
,
dscf_vlc
[
1
].
table
,
MPC8_DSCF1_BITS
,
2
);
if
(
t
==
64
)
t
+=
get_bits
(
gb
,
6
);
t
+=
bitstream_read
(
bc
,
6
);
bands
[
i
].
scf_idx
[
ch
][
0
]
=
((
bands
[
i
].
scf_idx
[
ch
][
2
]
+
t
-
25
)
&
0x7F
)
-
6
;
}
for
(
j
=
0
;
j
<
2
;
j
++
){
if
((
bands
[
i
].
scfi
[
ch
]
<<
j
)
&
2
)
bands
[
i
].
scf_idx
[
ch
][
j
+
1
]
=
bands
[
i
].
scf_idx
[
ch
][
j
];
else
{
t
=
get_vlc2
(
gb
,
dscf_vlc
[
0
].
table
,
MPC8_DSCF0_BITS
,
2
);
t
=
bitstream_read_vlc
(
bc
,
dscf_vlc
[
0
].
table
,
MPC8_DSCF0_BITS
,
2
);
if
(
t
==
31
)
t
=
64
+
get_bits
(
gb
,
6
);
t
=
64
+
bitstream_read
(
bc
,
6
);
bands
[
i
].
scf_idx
[
ch
][
j
+
1
]
=
((
bands
[
i
].
scf_idx
[
ch
][
j
]
+
t
-
25
)
&
0x7F
)
-
6
;
}
}
...
...
@@ -354,16 +355,16 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
break
;
case
1
:
for
(
j
=
0
;
j
<
SAMPLES_PER_BAND
;
j
+=
SAMPLES_PER_BAND
/
2
){
cnt
=
get_vlc2
(
gb
,
q1_vlc
.
table
,
MPC8_Q1_BITS
,
2
);
t
=
mpc8_get_mask
(
gb
,
18
,
cnt
);
cnt
=
bitstream_read_vlc
(
bc
,
q1_vlc
.
table
,
MPC8_Q1_BITS
,
2
);
t
=
mpc8_get_mask
(
bc
,
18
,
cnt
);
for
(
k
=
0
;
k
<
SAMPLES_PER_BAND
/
2
;
k
++
,
t
<<=
1
)
c
->
Q
[
ch
][
off
+
j
+
k
]
=
(
t
&
0x20000
)
?
(
get_bits1
(
gb
)
<<
1
)
-
1
:
0
;
c
->
Q
[
ch
][
off
+
j
+
k
]
=
(
t
&
0x20000
)
?
(
bitstream_read_bit
(
bc
)
<<
1
)
-
1
:
0
;
}
break
;
case
2
:
cnt
=
6
;
//2*mpc8_thres[res]
for
(
j
=
0
;
j
<
SAMPLES_PER_BAND
;
j
+=
3
){
t
=
get_vlc2
(
gb
,
q2_vlc
[
cnt
>
3
].
table
,
MPC8_Q2_BITS
,
2
);
t
=
bitstream_read_vlc
(
bc
,
q2_vlc
[
cnt
>
3
].
table
,
MPC8_Q2_BITS
,
2
);
c
->
Q
[
ch
][
off
+
j
+
0
]
=
mpc8_idx50
[
t
];
c
->
Q
[
ch
][
off
+
j
+
1
]
=
mpc8_idx51
[
t
];
c
->
Q
[
ch
][
off
+
j
+
2
]
=
mpc8_idx52
[
t
];
...
...
@@ -373,7 +374,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
case
3
:
case
4
:
for
(
j
=
0
;
j
<
SAMPLES_PER_BAND
;
j
+=
2
){
t
=
get_vlc2
(
gb
,
q3_vlc
[
res
-
3
].
table
,
MPC8_Q3_BITS
,
2
)
+
q3_offsets
[
res
-
3
];
t
=
bitstream_read_vlc
(
bc
,
q3_vlc
[
res
-
3
].
table
,
MPC8_Q3_BITS
,
2
)
+
q3_offsets
[
res
-
3
];
c
->
Q
[
ch
][
off
+
j
+
1
]
=
t
>>
4
;
c
->
Q
[
ch
][
off
+
j
+
0
]
=
(
t
&
8
)
?
(
t
&
0xF
)
-
16
:
(
t
&
0xF
);
}
...
...
@@ -384,17 +385,17 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
case
8
:
cnt
=
2
*
mpc8_thres
[
res
];
for
(
j
=
0
;
j
<
SAMPLES_PER_BAND
;
j
++
){
t
=
get_vlc2
(
gb
,
quant_vlc
[
res
-
5
][
cnt
>
mpc8_thres
[
res
]].
table
,
quant_vlc
[
res
-
5
][
cnt
>
mpc8_thres
[
res
]].
bits
,
2
)
+
quant_offsets
[
res
-
5
];
t
=
bitstream_read_vlc
(
bc
,
quant_vlc
[
res
-
5
][
cnt
>
mpc8_thres
[
res
]].
table
,
quant_vlc
[
res
-
5
][
cnt
>
mpc8_thres
[
res
]].
bits
,
2
)
+
quant_offsets
[
res
-
5
];
c
->
Q
[
ch
][
off
+
j
]
=
t
;
cnt
=
(
cnt
>>
1
)
+
FFABS
(
c
->
Q
[
ch
][
off
+
j
]);
}
break
;
default:
for
(
j
=
0
;
j
<
SAMPLES_PER_BAND
;
j
++
){
c
->
Q
[
ch
][
off
+
j
]
=
get_vlc2
(
gb
,
q9up_vlc
.
table
,
MPC8_Q9UP_BITS
,
2
);
c
->
Q
[
ch
][
off
+
j
]
=
bitstream_read_vlc
(
bc
,
q9up_vlc
.
table
,
MPC8_Q9UP_BITS
,
2
);
if
(
res
!=
9
){
c
->
Q
[
ch
][
off
+
j
]
<<=
res
-
9
;
c
->
Q
[
ch
][
off
+
j
]
|=
get_bits
(
gb
,
res
-
9
);
c
->
Q
[
ch
][
off
+
j
]
|=
bitstream_read
(
bc
,
res
-
9
);
}
c
->
Q
[
ch
][
off
+
j
]
-=
(
1
<<
(
res
-
2
))
-
1
;
}
...
...
@@ -408,8 +409,8 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
c
->
cur_frame
++
;
c
->
last_bits_used
=
get_bits_count
(
gb
);
if
(
get_bits_left
(
gb
)
<
8
)
// we have only padding left
c
->
last_bits_used
=
bitstream_tell
(
bc
);
if
(
bitstream_bits_left
(
bc
)
<
8
)
// we have only padding left
c
->
last_bits_used
=
buf_size
<<
3
;
if
(
c
->
cur_frame
>=
c
->
frames
)
c
->
cur_frame
=
0
;
...
...
libavformat/mpc8.c
View file @
6668bc80
...
...
@@ -19,8 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavcodec/
get_bits
.h"
#include "libavcodec/unary
_legacy
.h"
#include "libavcodec/
bitstream
.h"
#include "libavcodec/unary.h"
#include "apetag.h"
#include "avformat.h"
...
...
@@ -107,17 +107,17 @@ static int mpc8_probe(AVProbeData *p)
return
0
;
}
static
inline
int64_t
gb_get_v
(
GetBitContext
*
gb
)
static
inline
int64_t
gb_get_v
(
BitstreamContext
*
bc
)
{
int64_t
v
=
0
;
int
bits
=
0
;
while
(
get_bits1
(
gb
)
&&
bits
<
64
-
7
)
{
while
(
bitstream_read_bit
(
bc
)
&&
bits
<
64
-
7
)
{
v
<<=
7
;
v
|=
get_bits
(
gb
,
7
);
v
|=
bitstream_read
(
bc
,
7
);
bits
+=
7
;
}
v
<<=
7
;
v
|=
get_bits
(
gb
,
7
);
v
|=
bitstream_read
(
bc
,
7
);
return
v
;
}
...
...
@@ -138,7 +138,7 @@ static void mpc8_parse_seektable(AVFormatContext *s, int64_t off)
int64_t
size
,
pos
,
ppos
[
2
];
uint8_t
*
buf
;
int
i
,
t
,
seekd
;
GetBitContext
gb
;
BitstreamContext
bc
;
if
(
s
->
nb_streams
==
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"No stream added before parsing seek table
\n
"
);
...
...
@@ -158,21 +158,21 @@ static void mpc8_parse_seektable(AVFormatContext *s, int64_t off)
if
(
!
(
buf
=
av_malloc
(
size
+
AV_INPUT_BUFFER_PADDING_SIZE
)))
return
;
avio_read
(
s
->
pb
,
buf
,
size
);
init_get_bits
(
&
gb
,
buf
,
size
*
8
);
size
=
gb_get_v
(
&
gb
);
bitstream_init8
(
&
bc
,
buf
,
size
);
size
=
gb_get_v
(
&
bc
);
if
(
size
>
UINT_MAX
/
4
||
size
>
c
->
samples
/
1152
){
av_log
(
s
,
AV_LOG_ERROR
,
"Seek table is too big
\n
"
);
return
;
}
seekd
=
get_bits
(
&
gb
,
4
);
seekd
=
bitstream_read
(
&
bc
,
4
);
for
(
i
=
0
;
i
<
2
;
i
++
){
pos
=
gb_get_v
(
&
gb
)
+
c
->
header_pos
;
pos
=
gb_get_v
(
&
bc
)
+
c
->
header_pos
;
ppos
[
1
-
i
]
=
pos
;
av_add_index_entry
(
s
->
streams
[
0
],
pos
,
i
,
0
,
0
,
AVINDEX_KEYFRAME
);
}
for
(;
i
<
size
;
i
++
){
t
=
get_unary
(
&
gb
,
1
,
33
)
<<
12
;
t
+=
get_bits
(
&
gb
,
12
);
t
=
get_unary
(
&
bc
,
1
,
33
)
<<
12
;
t
+=
bitstream_read
(
&
bc
,
12
);
if
(
t
&
1
)
t
=
-
(
t
&
~
1
);
pos
=
(
t
>>
1
)
+
ppos
[
0
]
*
2
-
ppos
[
1
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment