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
45a82edb
Commit
45a82edb
authored
Jul 13, 2002
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rl vlc decoding optimizations
Originally committed as revision 748 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
6b765cd2
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
153 additions
and
69 deletions
+153
-69
common.h
libavcodec/common.h
+29
-0
h263.c
libavcodec/h263.c
+40
-0
mpegvideo.h
libavcodec/mpegvideo.h
+2
-2
msmpeg4.c
libavcodec/msmpeg4.c
+82
-67
No files found.
libavcodec/common.h
View file @
45a82edb
...
@@ -238,6 +238,12 @@ typedef struct VLC {
...
@@ -238,6 +238,12 @@ typedef struct VLC {
int
table_size
,
table_allocated
;
int
table_size
,
table_allocated
;
}
VLC
;
}
VLC
;
typedef
struct
RL_VLC_ELEM
{
int16_t
level
;
int8_t
len
;
uint8_t
run
;
}
RL_VLC_ELEM
;
/* used to avoid missaligned exceptions on some archs (alpha, ...) */
/* used to avoid missaligned exceptions on some archs (alpha, ...) */
#ifdef ARCH_X86
#ifdef ARCH_X86
#define unaligned32(a) (*(UINT32*)(a))
#define unaligned32(a) (*(UINT32*)(a))
...
@@ -755,6 +761,28 @@ void free_vlc(VLC *vlc);
...
@@ -755,6 +761,28 @@ void free_vlc(VLC *vlc);
SKIP_BITS(name, gb, n)\
SKIP_BITS(name, gb, n)\
}
}
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth)\
{\
int n, index, nb_bits;\
\
index= SHOW_UBITS(name, gb, bits);\
level = table[index].level;\
n = table[index].len;\
\
if(max_depth > 1 && n < 0){\
LAST_SKIP_BITS(name, gb, bits)\
UPDATE_CACHE(name, gb)\
\
nb_bits = -n;\
\
index= SHOW_UBITS(name, gb, nb_bits) + level;\
level = table[index].level;\
n = table[index].len;\
}\
run= table[index].run;\
SKIP_BITS(name, gb, n)\
}
// deprecated, dont use get_vlc for new code, use get_vlc2 instead or use GET_VLC directly
// deprecated, dont use get_vlc for new code, use get_vlc2 instead or use GET_VLC directly
static
inline
int
get_vlc
(
GetBitContext
*
s
,
VLC
*
vlc
)
static
inline
int
get_vlc
(
GetBitContext
*
s
,
VLC
*
vlc
)
{
{
...
@@ -783,6 +811,7 @@ static inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int
...
@@ -783,6 +811,7 @@ static inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int
return
code
;
return
code
;
}
}
/* define it to include statistics code (useful only for optimizing
/* define it to include statistics code (useful only for optimizing
codec efficiency */
codec efficiency */
//#define STATS
//#define STATS
...
...
libavcodec/h263.c
View file @
45a82edb
...
@@ -1622,9 +1622,49 @@ void init_rl(RLTable *rl)
...
@@ -1622,9 +1622,49 @@ void init_rl(RLTable *rl)
void
init_vlc_rl
(
RLTable
*
rl
)
void
init_vlc_rl
(
RLTable
*
rl
)
{
{
int
i
,
q
;
init_vlc
(
&
rl
->
vlc
,
9
,
rl
->
n
+
1
,
init_vlc
(
&
rl
->
vlc
,
9
,
rl
->
n
+
1
,
&
rl
->
table_vlc
[
0
][
1
],
4
,
2
,
&
rl
->
table_vlc
[
0
][
1
],
4
,
2
,
&
rl
->
table_vlc
[
0
][
0
],
4
,
2
);
&
rl
->
table_vlc
[
0
][
0
],
4
,
2
);
for
(
q
=
0
;
q
<
32
;
q
++
){
int
qmul
=
q
*
2
;
int
qadd
=
(
q
-
1
)
|
1
;
if
(
q
==
0
){
qmul
=
1
;
qadd
=
0
;
}
rl
->
rl_vlc
[
q
]
=
av_malloc
(
rl
->
vlc
.
table_size
*
sizeof
(
RL_VLC_ELEM
));
for
(
i
=
0
;
i
<
rl
->
vlc
.
table_size
;
i
++
){
int
code
=
rl
->
vlc
.
table
[
i
][
0
];
int
len
=
rl
->
vlc
.
table
[
i
][
1
];
int
level
,
run
;
if
(
len
==
0
){
// illegal code
run
=
65
;
level
=
MAX_LEVEL
;
}
else
if
(
len
<
0
){
//more bits needed
run
=
0
;
level
=
code
;
}
else
{
if
(
code
==
rl
->
n
){
//esc
run
=
65
;
level
=
0
;
}
else
{
run
=
rl
->
table_run
[
code
]
+
1
;
level
=
rl
->
table_level
[
code
]
*
qmul
+
qadd
;
if
(
code
>=
rl
->
last
)
run
+=
192
;
}
}
rl
->
rl_vlc
[
q
][
i
].
len
=
len
;
rl
->
rl_vlc
[
q
][
i
].
level
=
level
;
rl
->
rl_vlc
[
q
][
i
].
run
=
run
;
}
}
}
}
/* init vlcs */
/* init vlcs */
...
...
libavcodec/mpegvideo.h
View file @
45a82edb
...
@@ -482,7 +482,6 @@ void mpeg1_encode_mb(MpegEncContext *s,
...
@@ -482,7 +482,6 @@ void mpeg1_encode_mb(MpegEncContext *s,
void
ff_mpeg1_encode_init
(
MpegEncContext
*
s
);
void
ff_mpeg1_encode_init
(
MpegEncContext
*
s
);
/* h263enc.c */
/* h263enc.c */
typedef
struct
RLTable
{
typedef
struct
RLTable
{
int
n
;
/* number of entries of table_vlc minus 1 */
int
n
;
/* number of entries of table_vlc minus 1 */
int
last
;
/* number of values for last = 0 */
int
last
;
/* number of values for last = 0 */
...
@@ -492,7 +491,8 @@ typedef struct RLTable {
...
@@ -492,7 +491,8 @@ typedef struct RLTable {
UINT8
*
index_run
[
2
];
/* encoding only */
UINT8
*
index_run
[
2
];
/* encoding only */
INT8
*
max_level
[
2
];
/* encoding & decoding */
INT8
*
max_level
[
2
];
/* encoding & decoding */
INT8
*
max_run
[
2
];
/* encoding & decoding */
INT8
*
max_run
[
2
];
/* encoding & decoding */
VLC
vlc
;
/* decoding only */
VLC
vlc
;
/* decoding only deprected FIXME remove*/
RL_VLC_ELEM
*
rl_vlc
[
32
];
/* decoding only */
}
RLTable
;
}
RLTable
;
void
init_rl
(
RLTable
*
rl
);
void
init_rl
(
RLTable
*
rl
);
...
...
libavcodec/msmpeg4.c
View file @
45a82edb
...
@@ -1629,9 +1629,10 @@ printf("%c", s->ac_pred ? 'A' : 'I');
...
@@ -1629,9 +1629,10 @@ printf("%c", s->ac_pred ? 'A' : 'I');
static
inline
int
msmpeg4_decode_block
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
static
inline
int
msmpeg4_decode_block
(
MpegEncContext
*
s
,
DCTELEM
*
block
,
int
n
,
int
coded
)
int
n
,
int
coded
)
{
{
int
code
,
level
,
i
,
j
,
last
,
run
,
run_diff
;
int
level
,
i
,
last
,
run
,
run_diff
;
int
dc_pred_dir
;
int
dc_pred_dir
;
RLTable
*
rl
;
RLTable
*
rl
;
RL_VLC_ELEM
*
rl_vlc
;
const
UINT8
*
scan_table
;
const
UINT8
*
scan_table
;
int
qmul
,
qadd
;
int
qmul
,
qadd
;
...
@@ -1671,7 +1672,7 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
...
@@ -1671,7 +1672,7 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
block
[
0
]
=
level
;
block
[
0
]
=
level
;
run_diff
=
0
;
run_diff
=
0
;
i
=
1
;
i
=
0
;
if
(
!
coded
)
{
if
(
!
coded
)
{
goto
not_coded
;
goto
not_coded
;
}
}
...
@@ -1684,10 +1685,11 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
...
@@ -1684,10 +1685,11 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
scan_table
=
s
->
intra_scantable
;
scan_table
=
s
->
intra_scantable
;
}
}
set_stat
(
ST_INTRA_AC
);
set_stat
(
ST_INTRA_AC
);
rl_vlc
=
rl
->
rl_vlc
[
0
];
}
else
{
}
else
{
qmul
=
s
->
qscale
<<
1
;
qmul
=
s
->
qscale
<<
1
;
qadd
=
(
s
->
qscale
-
1
)
|
1
;
qadd
=
(
s
->
qscale
-
1
)
|
1
;
i
=
0
;
i
=
-
1
;
rl
=
&
rl_table
[
3
+
s
->
rl_table_index
];
rl
=
&
rl_table
[
3
+
s
->
rl_table_index
];
if
(
s
->
msmpeg4_version
==
2
)
if
(
s
->
msmpeg4_version
==
2
)
...
@@ -1696,53 +1698,66 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
...
@@ -1696,53 +1698,66 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
run_diff
=
1
;
run_diff
=
1
;
if
(
!
coded
)
{
if
(
!
coded
)
{
s
->
block_last_index
[
n
]
=
i
-
1
;
s
->
block_last_index
[
n
]
=
i
;
return
0
;
return
0
;
}
}
scan_table
=
s
->
inter_scantable
;
scan_table
=
s
->
inter_scantable
;
set_stat
(
ST_INTER_AC
);
set_stat
(
ST_INTER_AC
);
rl_vlc
=
rl
->
rl_vlc
[
s
->
qscale
];
}
}
{
OPEN_READER
(
re
,
&
s
->
gb
);
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_vlc
,
TEX_VLC_BITS
,
2
);
fprintf
(
stderr
,
"illegal AC-VLC code at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
if
(
level
==
0
)
{
return
-
1
;
int
cache
;
}
cache
=
GET_CACHE
(
re
,
&
s
->
gb
);
if
(
code
==
rl
->
n
)
{
/* escape */
/* escape */
if
(
s
->
msmpeg4_version
==
1
||
get_bits1
(
&
s
->
gb
)
==
0
)
{
if
(
s
->
msmpeg4_version
==
1
||
(
cache
&
0x80000000
)
==
0
)
{
if
(
s
->
msmpeg4_version
==
1
||
get_bits1
(
&
s
->
gb
)
==
0
)
{
if
(
s
->
msmpeg4_version
==
1
||
(
cache
&
0x40000000
)
==
0
)
{
/* third escape */
/* third escape */
if
(
s
->
msmpeg4_version
!=
1
)
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
if
(
s
->
msmpeg4_version
<=
3
){
if
(
s
->
msmpeg4_version
<=
3
){
last
=
get_bits1
(
&
s
->
gb
);
last
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_CACHE
(
re
,
&
s
->
gb
,
1
);
run
=
get_bits
(
&
s
->
gb
,
6
);
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
6
);
SKIP_CACHE
(
re
,
&
s
->
gb
,
6
);
level
=
get_bits
(
&
s
->
gb
,
8
);
level
=
SHOW_SBITS
(
re
,
&
s
->
gb
,
8
);
LAST_SKIP_CACHE
(
re
,
&
s
->
gb
,
8
);
level
=
((
int8_t
)
level
);
SKIP_COUNTER
(
re
,
&
s
->
gb
,
1
+
6
+
8
);
}
else
{
}
else
{
int
sign
;
int
sign
;
last
=
get_bits1
(
&
s
->
gb
);
last
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
if
(
!
s
->
esc3_level_length
){
if
(
!
s
->
esc3_level_length
){
int
ll
;
int
ll
;
//printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
//printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
if
(
s
->
qscale
<
8
){
if
(
s
->
qscale
<
8
){
ll
=
get_bits
(
&
s
->
gb
,
3
);
ll
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
3
);
SKIP_BITS
(
re
,
&
s
->
gb
,
3
);
if
(
ll
==
0
){
if
(
ll
==
0
){
if
(
get_bits1
(
&
s
->
gb
))
printf
(
"cool a new vlc code ,contact the ffmpeg developers and upload the file
\n
"
);
if
(
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
))
printf
(
"cool a new vlc code ,contact the ffmpeg developers and upload the file
\n
"
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
ll
=
8
;
ll
=
8
;
}
}
}
else
{
}
else
{
ll
=
2
;
ll
=
2
;
while
(
ll
<
8
&&
get_bits1
(
&
s
->
gb
)
==
0
)
ll
++
;
while
(
ll
<
8
&&
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
)
==
0
){
ll
++
;
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
}
}
s
->
esc3_level_length
=
ll
;
s
->
esc3_level_length
=
ll
;
s
->
esc3_run_length
=
get_bits
(
&
s
->
gb
,
2
)
+
3
;
s
->
esc3_run_length
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
2
)
+
3
;
SKIP_BITS
(
re
,
&
s
->
gb
,
2
)
;
//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
}
}
run
=
get_bits
(
&
s
->
gb
,
s
->
esc3_run_length
);
run
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
s
->
esc3_run_length
);
sign
=
get_bits1
(
&
s
->
gb
);
SKIP_BITS
(
re
,
&
s
->
gb
,
s
->
esc3_run_length
);
level
=
get_bits
(
&
s
->
gb
,
s
->
esc3_level_length
);
sign
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
1
);
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
level
=
SHOW_UBITS
(
re
,
&
s
->
gb
,
s
->
esc3_level_length
);
SKIP_BITS
(
re
,
&
s
->
gb
,
s
->
esc3_level_length
);
if
(
sign
)
level
=
-
level
;
if
(
sign
)
level
=
-
level
;
}
}
//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
...
@@ -1775,64 +1790,64 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
...
@@ -1775,64 +1790,64 @@ static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
return DECODING_AC_LOST;
return DECODING_AC_LOST;
}
}
#endif
#endif
i
+=
run
+
1
;
if
(
last
)
i
+=
192
;
}
else
{
}
else
{
/* second escape */
/* second escape */
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
#if MIN_CACHE_BITS < 23
if
(
code
<
0
||
code
>=
rl
->
n
){
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
fprintf
(
stderr
,
"illegal ESC2-VLC code %d at %d %d
\n
"
,
code
,
s
->
mb_x
,
s
->
mb_y
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
return
-
1
;
#else
}
SKIP_BITS
(
re
,
&
s
->
gb
,
2
);
run
=
rl
->
table_run
[
code
];
#endif
level
=
rl
->
table_level
[
code
];
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl_vlc
,
TEX_VLC_BITS
,
2
);
last
=
code
>=
rl
->
last
;
i
+=
run
+
rl
->
max_run
[
run
>>
7
][
level
/
qmul
]
+
run_diff
;
//FIXME opt indexing
run
+=
rl
->
max_run
[
last
][
level
]
+
run_diff
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
level
=
level
*
qmul
+
qadd
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
if
(
get_bits1
(
&
s
->
gb
))
level
=
-
level
;
}
}
}
else
{
}
else
{
/* first escape */
/* first escape */
code
=
get_vlc2
(
&
s
->
gb
,
rl
->
vlc
.
table
,
TEX_VLC_BITS
,
2
);
#if MIN_CACHE_BITS < 22
if
(
code
<
0
||
code
>=
rl
->
n
){
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
fprintf
(
stderr
,
"illegal ESC2-VLC code %d at %d %d
\n
"
,
code
,
s
->
mb_x
,
s
->
mb_y
);
UPDATE_CACHE
(
re
,
&
s
->
gb
);
return
-
1
;
#else
}
SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
run
=
rl
->
table_run
[
code
];
#endif
level
=
rl
->
table_level
[
code
];
GET_RL_VLC
(
level
,
run
,
re
,
&
s
->
gb
,
rl_vlc
,
TEX_VLC_BITS
,
2
);
last
=
code
>=
rl
->
last
;
i
+=
run
;
level
+=
rl
->
max_level
[
last
][
run
];
level
=
level
+
rl
->
max_level
[
run
>>
7
][(
run
-
1
)
&
63
]
*
qmul
;
//FIXME opt indexing
level
=
level
*
qmul
+
qadd
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
if
(
get_bits1
(
&
s
->
gb
))
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
level
=
-
level
;
}
}
}
else
{
}
else
{
run
=
rl
->
table_run
[
code
];
i
+=
run
;
level
=
rl
->
table_level
[
code
]
*
qmul
+
qadd
;
level
=
(
level
^
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
))
-
SHOW_SBITS
(
re
,
&
s
->
gb
,
1
);
last
=
code
>=
rl
->
last
;
LAST_SKIP_BITS
(
re
,
&
s
->
gb
,
1
);
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
;
}
}
if
(
i
>
62
){
i
-=
192
;
if
(
i
&
(
~
63
)){
fprintf
(
stderr
,
"ac-tex damaged at %d %d
\n
"
,
s
->
mb_x
,
s
->
mb_y
);
return
-
1
;
}
j
=
scan_table
[
i
];
block
[
scan_table
[
i
]]
=
level
;
block
[
j
]
=
level
;
i
++
;
if
(
last
)
break
;
break
;
}
block
[
scan_table
[
i
]]
=
level
;
}
}
CLOSE_READER
(
re
,
&
s
->
gb
);
}
not_coded:
not_coded:
if
(
s
->
mb_intra
)
{
if
(
s
->
mb_intra
)
{
mpeg4_pred_ac
(
s
,
block
,
n
,
dc_pred_dir
);
mpeg4_pred_ac
(
s
,
block
,
n
,
dc_pred_dir
);
if
(
s
->
ac_pred
)
{
if
(
s
->
ac_pred
)
{
i
=
6
4
;
/* XXX: not optimal */
i
=
6
3
;
/* XXX: not optimal */
}
}
}
}
if
(
s
->
msmpeg4_version
==
4
&&
i
>
1
)
i
=
64
;
//FIXME/XXX optimize
if
(
s
->
msmpeg4_version
==
4
&&
i
>
0
)
i
=
63
;
//FIXME/XXX optimize
s
->
block_last_index
[
n
]
=
i
-
1
;
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