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
Expand all
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
This diff is collapsed.
Click to expand it.
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