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
c3a76c3d
Commit
c3a76c3d
authored
Nov 14, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
asvdec: cosmetics, reformat
parent
bdfa2451
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
128 additions
and
102 deletions
+128
-102
asvdec.c
libavcodec/asvdec.c
+128
-102
No files found.
libavcodec/asvdec.c
View file @
c3a76c3d
...
@@ -46,124 +46,148 @@ static VLC dc_ccp_vlc;
...
@@ -46,124 +46,148 @@ static VLC dc_ccp_vlc;
static
VLC
ac_ccp_vlc
;
static
VLC
ac_ccp_vlc
;
static
VLC
asv2_level_vlc
;
static
VLC
asv2_level_vlc
;
static
av_cold
void
init_vlcs
(
ASV1Context
*
a
){
static
av_cold
void
init_vlcs
(
ASV1Context
*
a
)
{
static
int
done
=
0
;
static
int
done
=
0
;
if
(
!
done
)
{
if
(
!
done
)
{
done
=
1
;
done
=
1
;
INIT_VLC_STATIC
(
&
ccp_vlc
,
VLC_BITS
,
17
,
INIT_VLC_STATIC
(
&
ccp_vlc
,
VLC_BITS
,
17
,
&
ff_asv_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
&
ff_asv_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
dc_ccp_vlc
,
VLC_BITS
,
8
,
INIT_VLC_STATIC
(
&
dc_ccp_vlc
,
VLC_BITS
,
8
,
&
ff_asv_dc_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_dc_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_dc_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
&
ff_asv_dc_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
ac_ccp_vlc
,
VLC_BITS
,
16
,
INIT_VLC_STATIC
(
&
ac_ccp_vlc
,
VLC_BITS
,
16
,
&
ff_asv_ac_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_ac_ccp_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_ac_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
&
ff_asv_ac_ccp_tab
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
level_vlc
,
VLC_BITS
,
7
,
INIT_VLC_STATIC
(
&
level_vlc
,
VLC_BITS
,
7
,
&
ff_asv_level_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_level_tab
[
0
][
1
],
2
,
1
,
&
ff_asv_level_tab
[
0
][
0
],
2
,
1
,
64
);
&
ff_asv_level_tab
[
0
][
0
],
2
,
1
,
64
);
INIT_VLC_STATIC
(
&
asv2_level_vlc
,
ASV2_LEVEL_VLC_BITS
,
63
,
INIT_VLC_STATIC
(
&
asv2_level_vlc
,
ASV2_LEVEL_VLC_BITS
,
63
,
&
ff_asv2_level_tab
[
0
][
1
],
2
,
1
,
&
ff_asv2_level_tab
[
0
][
1
],
2
,
1
,
&
ff_asv2_level_tab
[
0
][
0
],
2
,
1
,
1024
);
&
ff_asv2_level_tab
[
0
][
0
],
2
,
1
,
1024
);
}
}
}
}
//FIXME write a reversed bitstream reader to avoid the double reverse
//FIXME write a reversed bitstream reader to avoid the double reverse
static
inline
int
asv2_get_bits
(
GetBitContext
*
gb
,
int
n
){
static
inline
int
asv2_get_bits
(
GetBitContext
*
gb
,
int
n
)
return
ff_reverse
[
get_bits
(
gb
,
n
)
<<
(
8
-
n
)
];
{
return
ff_reverse
[
get_bits
(
gb
,
n
)
<<
(
8
-
n
)];
}
}
static
inline
int
asv1_get_level
(
GetBitContext
*
gb
){
static
inline
int
asv1_get_level
(
GetBitContext
*
gb
)
int
code
=
get_vlc2
(
gb
,
level_vlc
.
table
,
VLC_BITS
,
1
);
{
int
code
=
get_vlc2
(
gb
,
level_vlc
.
table
,
VLC_BITS
,
1
);
if
(
code
==
3
)
return
get_sbits
(
gb
,
8
);
if
(
code
==
3
)
else
return
code
-
3
;
return
get_sbits
(
gb
,
8
);
else
return
code
-
3
;
}
}
static
inline
int
asv2_get_level
(
GetBitContext
*
gb
){
static
inline
int
asv2_get_level
(
GetBitContext
*
gb
)
int
code
=
get_vlc2
(
gb
,
asv2_level_vlc
.
table
,
ASV2_LEVEL_VLC_BITS
,
1
);
{
int
code
=
get_vlc2
(
gb
,
asv2_level_vlc
.
table
,
ASV2_LEVEL_VLC_BITS
,
1
);
if
(
code
==
31
)
return
(
int8_t
)
asv2_get_bits
(
gb
,
8
);
if
(
code
==
31
)
else
return
code
-
31
;
return
(
int8_t
)
asv2_get_bits
(
gb
,
8
);
else
return
code
-
31
;
}
}
static
inline
int
asv1_decode_block
(
ASV1Context
*
a
,
DCTELEM
block
[
64
]){
static
inline
int
asv1_decode_block
(
ASV1Context
*
a
,
DCTELEM
block
[
64
])
{
int
i
;
int
i
;
block
[
0
]
=
8
*
get_bits
(
&
a
->
gb
,
8
);
block
[
0
]
=
8
*
get_bits
(
&
a
->
gb
,
8
);
for
(
i
=
0
;
i
<
11
;
i
++
)
{
for
(
i
=
0
;
i
<
11
;
i
++
)
{
const
int
ccp
=
get_vlc2
(
&
a
->
gb
,
ccp_vlc
.
table
,
VLC_BITS
,
1
);
const
int
ccp
=
get_vlc2
(
&
a
->
gb
,
ccp_vlc
.
table
,
VLC_BITS
,
1
);
if
(
ccp
){
if
(
ccp
)
{
if
(
ccp
==
16
)
break
;
if
(
ccp
==
16
)
if
(
ccp
<
0
||
i
>=
10
){
break
;
if
(
ccp
<
0
||
i
>=
10
)
{
av_log
(
a
->
avctx
,
AV_LOG_ERROR
,
"coded coeff pattern damaged
\n
"
);
av_log
(
a
->
avctx
,
AV_LOG_ERROR
,
"coded coeff pattern damaged
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
ccp
&
8
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
0
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
0
])
>>
4
;
if
(
ccp
&
8
)
if
(
ccp
&
4
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
1
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
1
])
>>
4
;
block
[
a
->
scantable
.
permutated
[
4
*
i
+
0
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
0
])
>>
4
;
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
2
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
2
])
>>
4
;
if
(
ccp
&
4
)
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
3
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
3
])
>>
4
;
block
[
a
->
scantable
.
permutated
[
4
*
i
+
1
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
1
])
>>
4
;
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
2
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
2
])
>>
4
;
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
3
]]
=
(
asv1_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
3
])
>>
4
;
}
}
}
}
return
0
;
return
0
;
}
}
static
inline
int
asv2_decode_block
(
ASV1Context
*
a
,
DCTELEM
block
[
64
]){
static
inline
int
asv2_decode_block
(
ASV1Context
*
a
,
DCTELEM
block
[
64
])
{
int
i
,
count
,
ccp
;
int
i
,
count
,
ccp
;
count
=
asv2_get_bits
(
&
a
->
gb
,
4
);
count
=
asv2_get_bits
(
&
a
->
gb
,
4
);
block
[
0
]
=
8
*
asv2_get_bits
(
&
a
->
gb
,
8
);
block
[
0
]
=
8
*
asv2_get_bits
(
&
a
->
gb
,
8
);
ccp
=
get_vlc2
(
&
a
->
gb
,
dc_ccp_vlc
.
table
,
VLC_BITS
,
1
);
ccp
=
get_vlc2
(
&
a
->
gb
,
dc_ccp_vlc
.
table
,
VLC_BITS
,
1
);
if
(
ccp
){
if
(
ccp
)
{
if
(
ccp
&
4
)
block
[
a
->
scantable
.
permutated
[
1
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
1
])
>>
4
;
if
(
ccp
&
4
)
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
2
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
2
])
>>
4
;
block
[
a
->
scantable
.
permutated
[
1
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
1
])
>>
4
;
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
3
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
3
])
>>
4
;
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
2
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
2
])
>>
4
;
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
3
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
3
])
>>
4
;
}
}
for
(
i
=
1
;
i
<
count
+
1
;
i
++
){
for
(
i
=
1
;
i
<
count
+
1
;
i
++
)
{
const
int
ccp
=
get_vlc2
(
&
a
->
gb
,
ac_ccp_vlc
.
table
,
VLC_BITS
,
1
);
const
int
ccp
=
get_vlc2
(
&
a
->
gb
,
ac_ccp_vlc
.
table
,
VLC_BITS
,
1
);
if
(
ccp
){
if
(
ccp
)
{
if
(
ccp
&
8
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
0
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
0
])
>>
4
;
if
(
ccp
&
8
)
if
(
ccp
&
4
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
1
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
1
])
>>
4
;
block
[
a
->
scantable
.
permutated
[
4
*
i
+
0
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
0
])
>>
4
;
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
2
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
2
])
>>
4
;
if
(
ccp
&
4
)
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
3
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
3
])
>>
4
;
block
[
a
->
scantable
.
permutated
[
4
*
i
+
1
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
1
])
>>
4
;
if
(
ccp
&
2
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
2
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
2
])
>>
4
;
if
(
ccp
&
1
)
block
[
a
->
scantable
.
permutated
[
4
*
i
+
3
]]
=
(
asv2_get_level
(
&
a
->
gb
)
*
a
->
intra_matrix
[
4
*
i
+
3
])
>>
4
;
}
}
}
}
return
0
;
return
0
;
}
}
static
inline
int
decode_mb
(
ASV1Context
*
a
,
DCTELEM
block
[
6
][
64
]){
static
inline
int
decode_mb
(
ASV1Context
*
a
,
DCTELEM
block
[
6
][
64
])
{
int
i
;
int
i
;
a
->
dsp
.
clear_blocks
(
block
[
0
]);
a
->
dsp
.
clear_blocks
(
block
[
0
]);
if
(
a
->
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
{
if
(
a
->
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
asv1_decode_block
(
a
,
block
[
i
])
<
0
)
if
(
asv1_decode_block
(
a
,
block
[
i
])
<
0
)
return
-
1
;
return
-
1
;
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
if
(
asv2_decode_block
(
a
,
block
[
i
])
<
0
)
if
(
asv2_decode_block
(
a
,
block
[
i
])
<
0
)
return
-
1
;
return
-
1
;
}
}
}
}
return
0
;
return
0
;
}
}
static
inline
void
idct_put
(
ASV1Context
*
a
,
int
mb_x
,
int
mb_y
){
static
inline
void
idct_put
(
ASV1Context
*
a
,
int
mb_x
,
int
mb_y
)
DCTELEM
(
*
block
)[
64
]
=
a
->
block
;
{
int
linesize
=
a
->
picture
.
linesize
[
0
];
DCTELEM
(
*
block
)[
64
]
=
a
->
block
;
int
linesize
=
a
->
picture
.
linesize
[
0
];
uint8_t
*
dest_y
=
a
->
picture
.
data
[
0
]
+
(
mb_y
*
16
*
linesize
)
+
mb_x
*
16
;
uint8_t
*
dest_y
=
a
->
picture
.
data
[
0
]
+
(
mb_y
*
16
*
linesize
)
+
mb_x
*
16
;
uint8_t
*
dest_cb
=
a
->
picture
.
data
[
1
]
+
(
mb_y
*
8
*
a
->
picture
.
linesize
[
1
])
+
mb_x
*
8
;
uint8_t
*
dest_cb
=
a
->
picture
.
data
[
1
]
+
(
mb_y
*
8
*
a
->
picture
.
linesize
[
1
])
+
mb_x
*
8
;
...
@@ -174,7 +198,7 @@ static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
...
@@ -174,7 +198,7 @@ static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){
a
->
dsp
.
idct_put
(
dest_y
+
8
*
linesize
,
linesize
,
block
[
2
]);
a
->
dsp
.
idct_put
(
dest_y
+
8
*
linesize
,
linesize
,
block
[
2
]);
a
->
dsp
.
idct_put
(
dest_y
+
8
*
linesize
+
8
,
linesize
,
block
[
3
]);
a
->
dsp
.
idct_put
(
dest_y
+
8
*
linesize
+
8
,
linesize
,
block
[
3
]);
if
(
!
(
a
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
{
if
(
!
(
a
->
avctx
->
flags
&
CODEC_FLAG_GRAY
))
{
a
->
dsp
.
idct_put
(
dest_cb
,
a
->
picture
.
linesize
[
1
],
block
[
4
]);
a
->
dsp
.
idct_put
(
dest_cb
,
a
->
picture
.
linesize
[
1
],
block
[
4
]);
a
->
dsp
.
idct_put
(
dest_cr
,
a
->
picture
.
linesize
[
2
],
block
[
5
]);
a
->
dsp
.
idct_put
(
dest_cr
,
a
->
picture
.
linesize
[
2
],
block
[
5
]);
}
}
...
@@ -184,62 +208,62 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -184,62 +208,62 @@ static int decode_frame(AVCodecContext *avctx,
void
*
data
,
int
*
got_frame
,
void
*
data
,
int
*
got_frame
,
AVPacket
*
avpkt
)
AVPacket
*
avpkt
)
{
{
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
ASV1Context
*
const
a
=
avctx
->
priv_data
;
ASV1Context
*
const
a
=
avctx
->
priv_data
;
AVFrame
*
picture
=
data
;
const
uint8_t
*
buf
=
avpkt
->
data
;
AVFrame
*
const
p
=
&
a
->
picture
;
int
buf_size
=
avpkt
->
size
;
AVFrame
*
picture
=
data
;
AVFrame
*
const
p
=
&
a
->
picture
;
int
mb_x
,
mb_y
;
int
mb_x
,
mb_y
;
if
(
p
->
data
[
0
])
if
(
p
->
data
[
0
])
avctx
->
release_buffer
(
avctx
,
p
);
avctx
->
release_buffer
(
avctx
,
p
);
p
->
reference
=
0
;
p
->
reference
=
0
;
if
(
ff_get_buffer
(
avctx
,
p
)
<
0
)
{
if
(
ff_get_buffer
(
avctx
,
p
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
p
->
pict_type
=
AV_PICTURE_TYPE_I
;
p
->
pict_type
=
AV_PICTURE_TYPE_I
;
p
->
key_frame
=
1
;
p
->
key_frame
=
1
;
av_fast_padded_malloc
(
&
a
->
bitstream_buffer
,
&
a
->
bitstream_buffer_size
,
av_fast_padded_malloc
(
&
a
->
bitstream_buffer
,
&
a
->
bitstream_buffer_size
,
buf_size
);
buf_size
);
if
(
!
a
->
bitstream_buffer
)
if
(
!
a
->
bitstream_buffer
)
return
AVERROR
(
ENOMEM
);
return
AVERROR
(
ENOMEM
);
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
a
->
dsp
.
bswap_buf
((
uint32_t
*
)
a
->
bitstream_buffer
,
(
const
uint32_t
*
)
buf
,
buf_size
/
4
);
a
->
dsp
.
bswap_buf
((
uint32_t
*
)
a
->
bitstream_buffer
,
(
const
uint32_t
*
)
buf
,
buf_size
/
4
);
else
{
else
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
buf_size
;
i
++
)
for
(
i
=
0
;
i
<
buf_size
;
i
++
)
a
->
bitstream_buffer
[
i
]
=
ff_reverse
[
buf
[
i
]
];
a
->
bitstream_buffer
[
i
]
=
ff_reverse
[
buf
[
i
]
];
}
}
init_get_bits
(
&
a
->
gb
,
a
->
bitstream_buffer
,
buf_size
*
8
);
init_get_bits
(
&
a
->
gb
,
a
->
bitstream_buffer
,
buf_size
*
8
);
for
(
mb_y
=
0
;
mb_y
<
a
->
mb_height2
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
a
->
mb_height2
;
mb_y
++
)
{
for
(
mb_x
=
0
;
mb_x
<
a
->
mb_width2
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
a
->
mb_width2
;
mb_x
++
)
{
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
return
-
1
;
return
-
1
;
idct_put
(
a
,
mb_x
,
mb_y
);
idct_put
(
a
,
mb_x
,
mb_y
);
}
}
}
}
if
(
a
->
mb_width2
!=
a
->
mb_width
)
{
if
(
a
->
mb_width2
!=
a
->
mb_width
)
{
mb_x
=
a
->
mb_width2
;
mb_x
=
a
->
mb_width2
;
for
(
mb_y
=
0
;
mb_y
<
a
->
mb_height2
;
mb_y
++
)
{
for
(
mb_y
=
0
;
mb_y
<
a
->
mb_height2
;
mb_y
++
)
{
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
return
-
1
;
return
-
1
;
idct_put
(
a
,
mb_x
,
mb_y
);
idct_put
(
a
,
mb_x
,
mb_y
);
}
}
}
}
if
(
a
->
mb_height2
!=
a
->
mb_height
)
{
if
(
a
->
mb_height2
!=
a
->
mb_height
)
{
mb_y
=
a
->
mb_height2
;
mb_y
=
a
->
mb_height2
;
for
(
mb_x
=
0
;
mb_x
<
a
->
mb_width
;
mb_x
++
)
{
for
(
mb_x
=
0
;
mb_x
<
a
->
mb_width
;
mb_x
++
)
{
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
if
(
decode_mb
(
a
,
a
->
block
)
<
0
)
return
-
1
;
return
-
1
;
idct_put
(
a
,
mb_x
,
mb_y
);
idct_put
(
a
,
mb_x
,
mb_y
);
...
@@ -251,51 +275,53 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -251,51 +275,53 @@ static int decode_frame(AVCodecContext *avctx,
emms_c
();
emms_c
();
return
(
get_bits_count
(
&
a
->
gb
)
+
31
)
/
32
*
4
;
return
(
get_bits_count
(
&
a
->
gb
)
+
31
)
/
32
*
4
;
}
}
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
){
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
{
ASV1Context
*
const
a
=
avctx
->
priv_data
;
ASV1Context
*
const
a
=
avctx
->
priv_data
;
AVFrame
*
p
=
&
a
->
picture
;
AVFrame
*
p
=
&
a
->
picture
;
const
int
scale
=
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
?
1
:
2
;
int
i
;
int
i
;
const
int
scale
=
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
?
1
:
2
;
ff_asv_common_init
(
avctx
);
ff_asv_common_init
(
avctx
);
init_vlcs
(
a
);
init_vlcs
(
a
);
ff_init_scantable
(
a
->
dsp
.
idct_permutation
,
&
a
->
scantable
,
ff_asv_scantab
);
ff_init_scantable
(
a
->
dsp
.
idct_permutation
,
&
a
->
scantable
,
ff_asv_scantab
);
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
avctx
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
a
->
inv_qscale
=
avctx
->
extradata
[
0
];
a
->
inv_qscale
=
avctx
->
extradata
[
0
];
if
(
a
->
inv_qscale
==
0
)
{
if
(
a
->
inv_qscale
==
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"illegal qscale 0
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"illegal qscale 0
\n
"
);
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
if
(
avctx
->
codec_id
==
AV_CODEC_ID_ASV1
)
a
->
inv_qscale
=
6
;
a
->
inv_qscale
=
6
;
else
else
a
->
inv_qscale
=
10
;
a
->
inv_qscale
=
10
;
}
}
for
(
i
=
0
;
i
<
64
;
i
++
)
{
for
(
i
=
0
;
i
<
64
;
i
++
)
{
int
index
=
ff_asv_scantab
[
i
];
int
index
=
ff_asv_scantab
[
i
];
a
->
intra_matrix
[
i
]
=
64
*
scale
*
ff_mpeg1_default_intra_matrix
[
index
]
/
a
->
inv_qscale
;
a
->
intra_matrix
[
i
]
=
64
*
scale
*
ff_mpeg1_default_intra_matrix
[
index
]
/
a
->
inv_qscale
;
}
}
p
->
qstride
=
a
->
mb_width
;
p
->
qstride
=
a
->
mb_width
;
p
->
qscale_table
=
av_malloc
(
p
->
qstride
*
a
->
mb_height
);
p
->
qscale_table
=
av_malloc
(
p
->
qstride
*
a
->
mb_height
);
p
->
quality
=
(
32
*
scale
+
a
->
inv_qscale
/
2
)
/
a
->
inv_qscale
;
p
->
quality
=
(
32
*
scale
+
a
->
inv_qscale
/
2
)
/
a
->
inv_qscale
;
memset
(
p
->
qscale_table
,
p
->
quality
,
p
->
qstride
*
a
->
mb_height
);
memset
(
p
->
qscale_table
,
p
->
quality
,
p
->
qstride
*
a
->
mb_height
);
return
0
;
return
0
;
}
}
static
av_cold
int
decode_end
(
AVCodecContext
*
avctx
){
static
av_cold
int
decode_end
(
AVCodecContext
*
avctx
)
{
ASV1Context
*
const
a
=
avctx
->
priv_data
;
ASV1Context
*
const
a
=
avctx
->
priv_data
;
av_freep
(
&
a
->
bitstream_buffer
);
av_freep
(
&
a
->
bitstream_buffer
);
av_freep
(
&
a
->
picture
.
qscale_table
);
av_freep
(
&
a
->
picture
.
qscale_table
);
a
->
bitstream_buffer_size
=
0
;
a
->
bitstream_buffer_size
=
0
;
if
(
a
->
picture
.
data
[
0
])
if
(
a
->
picture
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
a
->
picture
);
avctx
->
release_buffer
(
avctx
,
&
a
->
picture
);
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