Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
external
ffmpeg
Commits
3729c912
Commit
3729c912
authored
Oct 01, 2002
by
Michael Niedermayer
Browse files
optimizing mpeg2 decode block stuff
Originally committed as revision 989 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
144f0625
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
116 additions
and
113 deletions
+116
-113
libavcodec/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,
static
inline
int
mpeg1_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
static
inline
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
);
static
int
mpeg_decode_motion
(
MpegEncContext
*
s
,
int
fcode
,
int
pred
);
...
...
@@ -1117,18 +1117,15 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
UPDATE_CACHE
(
re
,
&
s
->
gb
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
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
=
(
level
-
1
)
|
1
;
if
(
v
&
1
)
level
=
-
level
;
block
[
scantable
[
0
]
]
=
level
;
block
[
0
]
=
level
;
i
++
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefs */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
...
...
@@ -1180,110 +1177,114 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s,
/* Also does unquantization here, since I will never support mpeg2
encoding */
static
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
static
inline
int
mpeg2_decode_block_non_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
i
,
j
,
run
;
int
code
;
RLTable
*
rl
=
&
rl_mpeg1
;
const
UINT8
*
scan_table
;
const
UINT16
*
matrix
;
UINT8
*
scantable
;
const
UINT16
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
s
->
alternate_scan
)
scan
_
table
=
s
->
intra_v_scantable
.
permutated
;
scantable
=
s
->
intra_v_scantable
.
permutated
;
else
scan
_
table
=
s
->
intra_scantable
.
permutated
;
scantable
=
s
->
intra_scantable
.
permutated
;
mismatch
=
1
;
{
int
v
;
OPEN_READER
(
re
,
&
s
->
gb
);
i
=
0
;
i
=
-
1
;
if
(
n
<
4
)
matrix
=
s
->
inter_matrix
;
quant_
matrix
=
s
->
inter_matrix
;
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 */
UPDATE_CACHE
(
re
,
&
s
->
gb
);
v
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
);
if
(
v
&
2
)
{
run
=
0
;
level
=
5
-
(
v
<<
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
CLOSE_READER
(
re
,
&
s
->
gb
);
goto
add_coef
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
level
=
(
3
*
qscale
*
quant_matrix
[
0
])
>>
5
;
if
(
v
&
1
)
level
=
-
level
;
block
[
0
]
=
level
;
mismatch
^=
level
;
i
++
;
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
/* now quantify & encode AC coefs */
for
(;;)
{
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
if
(
code
<
0
){
fprintf
(
stderr
,
"invalid ac code at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
if
(
code
==
112
)
{
break
;
}
else
if
(
code
==
111
)
{
/* escape */
run
=
get_bits
(
&
s
->
gb
,
6
);
level
=
get_bits
(
&
s
->
gb
,
12
);
level
=
(
level
+
((
-
1
)
<<
11
))
^
((
-
1
)
<<
11
);
//sign extension
}
else
{
run
=
rl
->
table_run
[
code
];
level
=
rl
->
table_level
[
code
];
if
(
get_bits1
(
&
s
->
gb
))
level
=
-
level
;
}
i
+=
run
;
if
(
i
>=
64
){
fprintf
(
stderr
,
"run too long at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
add_coef:
j
=
scan_table
[
i
];
dprintf
(
"%d: run=%d level=%d
\n
"
,
n
,
run
,
level
);
/* XXX: optimize */
if
(
level
>
0
)
{
level
=
((
level
*
2
+
1
)
*
s
->
qscale
*
matrix
[
j
])
>>
5
;
}
else
{
level
=
((
-
level
*
2
+
1
)
*
s
->
qscale
*
matrix
[
j
])
>>
5
;
level
=
-
level
;
/* now quantify & encode AC coefs */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
);
if
(
level
==
127
){
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
){
level
=
((
-
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
level
=
-
level
;
}
else
{
level
=
((
level
*
2
+
1
)
*
qscale
*
quant_matrix
[
j
])
>>
5
;
}
}
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
;
}
/* XXX: is it really necessary to saturate since the encoder
knows whats going on ? */
mismatch
^=
level
;
block
[
j
]
=
level
;
i
++
;
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
(
mismatch
&
1
);
s
->
block_last_index
[
n
]
=
i
;
return
0
;
}
static
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
static
inline
int
mpeg2_decode_block_intra
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
)
{
int
level
,
dc
,
diff
,
i
,
j
,
run
;
int
code
,
component
;
int
component
;
RLTable
*
rl
;
const
UINT8
*
scan_table
;
const
UINT16
*
matrix
;
UINT8
*
scantable
;
const
UINT16
*
quant_matrix
;
const
int
qscale
=
s
->
qscale
;
int
mismatch
;
if
(
s
->
alternate_scan
)
scan
_
table
=
s
->
intra_v_scantable
.
permutated
;
scantable
=
s
->
intra_v_scantable
.
permutated
;
else
scan
_
table
=
s
->
intra_scantable
.
permutated
;
scantable
=
s
->
intra_scantable
.
permutated
;
/* 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
);
if
(
diff
>=
0xffff
)
return
-
1
;
...
...
@@ -1293,51 +1294,53 @@ static int mpeg2_decode_block_intra(MpegEncContext *s,
block
[
0
]
=
dc
<<
(
3
-
s
->
intra_dc_precision
);
dprintf
(
"dc=%d
\n
"
,
block
[
0
]);
mismatch
=
block
[
0
]
^
1
;
i
=
1
;
i
=
0
;
if
(
s
->
intra_vlc_format
)
rl
=
&
rl_mpeg2
;
else
rl
=
&
rl_mpeg1
;
if
(
n
<
4
)
matrix
=
s
->
intra_matrix
;
else
matrix
=
s
->
chroma_intra_matrix
;
/* now quantify & encode AC coefs */
for
(;;)
{
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
if
(
code
<
0
){
fprintf
(
stderr
,
"invalid ac code at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
if
(
code
==
112
)
{
break
;
}
else
if
(
code
==
111
)
{
/* escape */
run
=
get_bits
(
&
s
->
gb
,
6
);
level
=
get_bits
(
&
s
->
gb
,
12
);
level
=
(
level
+
((
-
1
)
<<
11
))
^
((
-
1
)
<<
11
);
//sign extension
}
else
{
run
=
rl
->
table_run
[
code
];
level
=
rl
->
table_level
[
code
];
if
(
get_bits1
(
&
s
->
gb
))
level
=
-
level
;
}
i
+=
run
;
if
(
i
>=
64
){
fprintf
(
stderr
,
"run too long at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
{
OPEN_READER
(
re
,
&
s
->
gb
);
/* now quantify & encode AC coefs */
for
(;;)
{
UPDATE_CACHE
(
re
,
&
s
->
gb
);
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl
->
rl_vlc
[
0
],
TEX_VLC_BITS
,
2
);
if
(
level
==
127
){
break
;
}
else
if
(
level
!=
0
)
{
i
+=
run
;
j
=
scantable
[
i
];
level
=
(
level
*
qscale
*
quant_matrix
[
j
])
>>
4
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
else
{
/* escape */
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
)
+
1
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
6
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
12
);
SKIP_BITS
(
re
,
&
s
->
gb
,
12
);
i
+=
run
;
j
=
scantable
[
i
];
if
(
level
<
0
){
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
];
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
++
;
CLOSE_READER
(
re
,
&
s
->
gb
);
}
block
[
63
]
^=
(
mismatch
&
1
);
block
[
63
]
^=
mismatch
&
1
;
s
->
block_last_index
[
n
]
=
i
;
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