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
3729c912
Commit
3729c912
authored
Oct 01, 2002
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
optimizing mpeg2 decode block stuff
Originally committed as revision 989 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
144f0625
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
116 additions
and
113 deletions
+116
-113
mpeg12.c
libavcodec/mpeg12.c
+116
-113
No files found.
libavcodec/mpeg12.c
View file @
3729c912
...
@@ -58,10 +58,10 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
...
@@ -58,10 +58,10 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
DCTELEM
*
block
,
int
n
);
int
n
);
static
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
static
in
line
in
t
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
DCTELEM
*
block
,
int
n
);
int
n
);
static
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
static
in
line
in
t
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
DCTELEM
*
block
,
int
n
);
int
n
);
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
);
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
);
...
@@ -1117,18 +1117,15 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
...
@@ -1117,18 +1117,15 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
);
if
(
v
&
2
)
{
if
(
v
&
2
)
{
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
LAST_
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
4
;
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
4
;
level
=
(
level
-
1
)
|
1
;
level
=
(
level
-
1
)
|
1
;
if
(
v
&
1
)
if
(
v
&
1
)
level
=
-
level
;
level
=
-
level
;
block
[
scantable
[
0
]
]
=
level
;
block
[
0
]
=
level
;
i
++
;
i
++
;
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefs */
/* now quantify & encode AC coefs */
for
(;;)
{
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
...
@@ -1180,110 +1177,114 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
...
@@ -1180,110 +1177,114 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
/* Also does unquantization here, since I will never support mpeg2
/* Also does unquantization here, since I will never support mpeg2
encoding */
encoding */
static
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
static
in
line
in
t
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
DCTELEM
*
block
,
int
n
)
int
n
)
{
{
int
level
,
i
,
j
,
run
;
int
level
,
i
,
j
,
run
;
int
code
;
RLTable
*
rl
=
&
rl_mpeg1
;
RLTable
*
rl
=
&
rl_mpeg1
;
const
UINT8
*
scan_table
;
UINT8
*
scantable
;
const
UINT16
*
matrix
;
const
UINT16
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
int
mismatch
;
if
(
s
->
alternate_scan
)
if
(
s
->
alternate_scan
)
scan
_
table
=
s
->
intra_v_scantable
.
permutated
;
scantable
=
s
->
intra_v_scantable
.
permutated
;
else
else
scan
_
table
=
s
->
intra_scantable
.
permutated
;
scantable
=
s
->
intra_scantable
.
permutated
;
mismatch
=
1
;
mismatch
=
1
;
{
{
int
v
;
int
v
;
OPEN_READER
(
re
,
&
s
->
gb
);
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
0
;
i
=
-
1
;
if
(
n
<
4
)
if
(
n
<
4
)
matrix
=
s
->
inter_matrix
;
quant_
matrix
=
s
->
inter_matrix
;
else
else
matrix
=
s
->
chroma_inter_matrix
;
quant_
matrix
=
s
->
chroma_inter_matrix
;
/* special case for the first coef. no need to add a second vlc table */
/* special case for the first coef. no need to add a second vlc table */
UPDATE_CACHE
(
re
,
&
s
->
gb
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
);
if
(
v
&
2
)
{
if
(
v
&
2
)
{
run
=
0
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
level
=
5
-
(
v
<<
1
);
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
if
(
v
&
1
)
CLOSE_READER
(
re
,
&
s
->
gb
);
level
=
-
level
;
goto
add_coef
;
block
[
0
]
=
level
;
mismatch
^=
level
;
i
++
;
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
/* now quantify & encode AC coefs */
/* now quantify & encode AC coefs */
for
(;;)
{
for
(;;)
{
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
code
<
0
){
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
);
fprintf
(
stderr
,
"invalid ac code at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
if
(
level
==
127
){
}
break
;
if
(
code
==
112
)
{
}
else
if
(
level
!=
0
)
{
break
;
i
+=
run
;
}
else
if
(
code
==
111
)
{
j
=
scantable
[
i
];
/* escape */
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
run
=
get_bits
(
&
s
->
gb
,
6
);
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
level
=
get_bits
(
&
s
->
gb
,
12
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
level
=
(
level
+
((
-
1
)
<<
11
))
^
((
-
1
)
<<
11
);
//sign extension
}
else
{
}
else
{
/* escape */
run
=
rl
->
table_run
[
code
];
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
level
=
rl
->
table_level
[
code
];
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
get_bits1
(
&
s
->
gb
))
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
level
=
-
level
;
}
i
+=
run
;
i
+=
run
;
j
=
scantable
[
i
];
if
(
i
>=
64
){
if
(
level
<
0
){
fprintf
(
stderr
,
"run too long at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
level
=
((
-
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
return
-
1
;
level
=
-
level
;
}
}
else
{
add_coef:
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
j
=
scan_table
[
i
];
}
dprintf
(
"%d: run=%d level=%d
\n
"
,
n
,
run
,
level
);
}
/* XXX: optimize */
if
(
i
>
63
){
if
(
level
>
0
)
{
fprintf
(
stderr
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
level
=
((
level
*
2
+
1
)
*
s
->
qscale
*
matrix
[
j
])
>>
5
;
return
-
1
;
}
else
{
}
level
=
((
-
level
*
2
+
1
)
*
s
->
qscale
*
matrix
[
j
])
>>
5
;
level
=
-
level
;
mismatch
^=
level
;
block
[
j
]
=
level
;
}
}
/* XXX: is it really necessary to saturate since the encoder
CLOSE_READER
(
re
,
&
s
->
gb
);
knows whats going on ? */
mismatch
^=
level
;
block
[
j
]
=
level
;
i
++
;
}
}
block
[
63
]
^=
(
mismatch
&
1
);
block
[
63
]
^=
(
mismatch
&
1
);
s
->
block_last_index
[
n
]
=
i
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
return
0
;
}
}
static
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
static
in
line
in
t
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
DCTELEM
*
block
,
int
n
)
int
n
)
{
{
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
co
de
,
co
mponent
;
int
component
;
RLTable
*
rl
;
RLTable
*
rl
;
const
UINT8
*
scan_table
;
UINT8
*
scantable
;
const
UINT16
*
matrix
;
const
UINT16
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
int
mismatch
;
if
(
s
->
alternate_scan
)
if
(
s
->
alternate_scan
)
scan
_
table
=
s
->
intra_v_scantable
.
permutated
;
scantable
=
s
->
intra_v_scantable
.
permutated
;
else
else
scan
_
table
=
s
->
intra_scantable
.
permutated
;
scantable
=
s
->
intra_scantable
.
permutated
;
/* DC coef */
/* DC coef */
component
=
(
n
<=
3
?
0
:
n
-
4
+
1
);
if
(
n
<
4
){
quant_matrix
=
s
->
intra_matrix
;
component
=
0
;
}
else
{
quant_matrix
=
s
->
chroma_intra_matrix
;
component
=
n
-
3
;
}
diff
=
decode_dc
(
s
,
component
);
diff
=
decode_dc
(
s
,
component
);
if
(
diff
>=
0xffff
)
if
(
diff
>=
0xffff
)
return
-
1
;
return
-
1
;
...
@@ -1293,51 +1294,53 @@ static int mpeg2_decode_block_intra(MpegEncContext *s,
...
@@ -1293,51 +1294,53 @@ static int mpeg2_decode_block_intra(MpegEncContext *s,
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
dprintf
(
"dc=%d
\n
"
,
block
[
0
]);
dprintf
(
"dc=%d
\n
"
,
block
[
0
]);
mismatch
=
block
[
0
]
^
1
;
mismatch
=
block
[
0
]
^
1
;
i
=
1
;
i
=
0
;
if
(
s
->
intra_vlc_format
)
if
(
s
->
intra_vlc_format
)
rl
=
&
rl_mpeg2
;
rl
=
&
rl_mpeg2
;
else
else
rl
=
&
rl_mpeg1
;
rl
=
&
rl_mpeg1
;
if
(
n
<
4
)
matrix
=
s
->
intra_matrix
;
else
matrix
=
s
->
chroma_intra_matrix
;
/* now quantify & encode AC coefs */
{
for
(;;)
{
OPEN_READER
(
re
,
&
s
->
gb
);
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
/* now quantify & encode AC coefs */
if
(
code
<
0
){
for
(;;)
{
fprintf
(
stderr
,
"invalid ac code at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
return
-
1
;
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
);
}
if
(
code
==
112
)
{
if
(
level
==
127
){
break
;
break
;
}
else
if
(
code
==
111
)
{
}
else
if
(
level
!=
0
)
{
/* escape */
i
+=
run
;
run
=
get_bits
(
&
s
->
gb
,
6
);
j
=
scantable
[
i
];
level
=
get_bits
(
&
s
->
gb
,
12
);
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
+
((
-
1
)
<<
11
))
^
((
-
1
)
<<
11
);
//sign extension
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
run
=
rl
->
table_run
[
code
];
}
else
{
level
=
rl
->
table_level
[
code
];
/* escape */
if
(
get_bits1
(
&
s
->
gb
))
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
level
=
-
level
;
UPDATE_CACHE
(
re
,
&
s
->
gb
);
}
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
i
+=
run
;
if
(
i
>=
64
){
j
=
scantable
[
i
];
fprintf
(
stderr
,
"run too long at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
if
(
level
<
0
){
return
-
1
;
level
=
(
-
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
-
level
;
}
else
{
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
}
}
if
(
i
>
63
){
fprintf
(
stderr
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
mismatch
^=
level
;
block
[
j
]
=
level
;
}
}
j
=
scan_table
[
i
];
CLOSE_READER
(
re
,
&
s
->
gb
);
dprintf
(
"%d: run=%d level=%d
\n
"
,
n
,
run
,
level
);
level
=
(
level
*
s
->
qscale
*
matrix
[
j
])
/
16
;
/* XXX: is it really necessary to saturate since the encoder
knows whats going on ? */
mismatch
^=
level
;
block
[
j
]
=
level
;
i
++
;
}
}
block
[
63
]
^=
(
mismatch
&
1
);
block
[
63
]
^=
mismatch
&
1
;
s
->
block_last_index
[
n
]
=
i
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
return
0
;
}
}
...
...
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