Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
1f948745
Commit
1f948745
authored
Nov 26, 2011
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vc1: use an enum for Frame Coding Mode
Document it a little and possibly fix a bug in dxva2_vc1.
parent
9270b8a3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
35 additions
and
24 deletions
+35
-24
dxva2_vc1.c
libavcodec/dxva2_vc1.c
+2
-2
vc1.c
libavcodec/vc1.c
+8
-8
vc1.h
libavcodec/vc1.h
+11
-1
vc1dec.c
libavcodec/vc1dec.c
+14
-13
No files found.
libavcodec/dxva2_vc1.c
View file @
1f948745
...
@@ -68,7 +68,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
...
@@ -68,7 +68,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
pp
->
bPicStructure
|=
0x01
;
pp
->
bPicStructure
|=
0x01
;
if
(
s
->
picture_structure
&
PICT_BOTTOM_FIELD
)
if
(
s
->
picture_structure
&
PICT_BOTTOM_FIELD
)
pp
->
bPicStructure
|=
0x02
;
pp
->
bPicStructure
|=
0x02
;
pp
->
bSecondField
=
v
->
interlace
&&
v
->
fcm
!=
0x03
&&
!
s
->
first_field
;
pp
->
bSecondField
=
v
->
interlace
&&
v
->
fcm
!=
ILACE_FIELD
&&
!
s
->
first_field
;
pp
->
bPicIntra
=
s
->
pict_type
==
AV_PICTURE_TYPE_I
;
pp
->
bPicIntra
=
s
->
pict_type
==
AV_PICTURE_TYPE_I
;
pp
->
bPicBackwardPrediction
=
s
->
pict_type
==
AV_PICTURE_TYPE_B
;
pp
->
bPicBackwardPrediction
=
s
->
pict_type
==
AV_PICTURE_TYPE_B
;
pp
->
bBidirectionalAveragingMode
=
(
1
<<
7
)
|
pp
->
bBidirectionalAveragingMode
=
(
1
<<
7
)
|
...
@@ -100,7 +100,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
...
@@ -100,7 +100,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
(
s
->
resync_marker
<<
4
)
|
(
s
->
resync_marker
<<
4
)
|
(
v
->
rangered
<<
3
)
|
(
v
->
rangered
<<
3
)
|
(
s
->
max_b_frames
);
(
s
->
max_b_frames
);
pp
->
bPicExtrapolation
=
(
!
v
->
interlace
||
v
->
fcm
==
0x00
)
?
1
:
2
;
pp
->
bPicExtrapolation
=
(
!
v
->
interlace
||
v
->
fcm
==
PROGRESSIVE
)
?
1
:
2
;
pp
->
bPicDeblocked
=
((
v
->
profile
!=
PROFILE_ADVANCED
&&
v
->
rangeredfrm
)
<<
5
)
|
pp
->
bPicDeblocked
=
((
v
->
profile
!=
PROFILE_ADVANCED
&&
v
->
rangeredfrm
)
<<
5
)
|
(
s
->
loop_filter
<<
1
);
(
s
->
loop_filter
<<
1
);
pp
->
bPicDeblockConfined
=
(
v
->
postprocflag
<<
7
)
|
pp
->
bPicDeblockConfined
=
(
v
->
postprocflag
<<
7
)
|
...
...
libavcodec/vc1.c
View file @
1f948745
...
@@ -836,14 +836,14 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -836,14 +836,14 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
if
(
v
->
interlace
)
{
if
(
v
->
interlace
)
{
v
->
fcm
=
decode012
(
gb
);
v
->
fcm
=
decode012
(
gb
);
if
(
v
->
fcm
)
{
if
(
v
->
fcm
)
{
if
(
v
->
fcm
==
2
)
if
(
v
->
fcm
==
ILACE_FIELD
)
v
->
field_mode
=
1
;
v
->
field_mode
=
1
;
if
(
!
v
->
warn_interlaced
++
)
if
(
!
v
->
warn_interlaced
++
)
av_log
(
v
->
s
.
avctx
,
AV_LOG_ERROR
,
av_log
(
v
->
s
.
avctx
,
AV_LOG_ERROR
,
"Interlaced frames/fields support is incomplete
\n
"
);
"Interlaced frames/fields support is incomplete
\n
"
);
}
}
}
else
{
}
else
{
v
->
fcm
=
0
;
v
->
fcm
=
PROGRESSIVE
;
}
}
if
(
v
->
field_mode
)
{
if
(
v
->
field_mode
)
{
...
@@ -957,7 +957,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -957,7 +957,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
switch
(
v
->
s
.
pict_type
)
{
switch
(
v
->
s
.
pict_type
)
{
case
AV_PICTURE_TYPE_I
:
case
AV_PICTURE_TYPE_I
:
case
AV_PICTURE_TYPE_BI
:
case
AV_PICTURE_TYPE_BI
:
if
(
v
->
fcm
==
1
)
{
//interlace frame picture
if
(
v
->
fcm
==
ILACE_FRAME
)
{
//interlace frame picture
status
=
bitplane_decoding
(
v
->
fieldtx_plane
,
&
v
->
fieldtx_is_raw
,
v
);
status
=
bitplane_decoding
(
v
->
fieldtx_plane
,
&
v
->
fieldtx_is_raw
,
v
);
if
(
status
<
0
)
if
(
status
<
0
)
return
-
1
;
return
-
1
;
...
@@ -998,7 +998,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -998,7 +998,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
v
->
dmvrange
=
get_unary
(
gb
,
0
,
3
);
v
->
dmvrange
=
get_unary
(
gb
,
0
,
3
);
else
else
v
->
dmvrange
=
0
;
v
->
dmvrange
=
0
;
if
(
v
->
fcm
==
1
)
{
// interlaced frame picture
if
(
v
->
fcm
==
ILACE_FRAME
)
{
// interlaced frame picture
v
->
fourmvswitch
=
get_bits1
(
gb
);
v
->
fourmvswitch
=
get_bits1
(
gb
);
v
->
intcomp
=
get_bits1
(
gb
);
v
->
intcomp
=
get_bits1
(
gb
);
if
(
v
->
intcomp
)
{
if
(
v
->
intcomp
)
{
...
@@ -1038,7 +1038,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -1038,7 +1038,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
v
->
tt_index
=
1
;
v
->
tt_index
=
1
;
else
else
v
->
tt_index
=
2
;
v
->
tt_index
=
2
;
if
(
v
->
fcm
!=
1
)
{
if
(
v
->
fcm
!=
ILACE_FRAME
)
{
int
mvmode
;
int
mvmode
;
mvmode
=
get_unary
(
gb
,
1
,
4
);
mvmode
=
get_unary
(
gb
,
1
,
4
);
lowquant
=
(
v
->
pq
>
12
)
?
0
:
1
;
lowquant
=
(
v
->
pq
>
12
)
?
0
:
1
;
...
@@ -1073,7 +1073,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -1073,7 +1073,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
||
(
v
->
mv_mode
==
MV_PMODE_INTENSITY_COMP
||
(
v
->
mv_mode
==
MV_PMODE_INTENSITY_COMP
&&
v
->
mv_mode2
==
MV_PMODE_1MV_HPEL_BILIN
));
&&
v
->
mv_mode2
==
MV_PMODE_1MV_HPEL_BILIN
));
}
}
if
(
v
->
fcm
==
0
)
{
// progressive
if
(
v
->
fcm
==
PROGRESSIVE
)
{
// progressive
if
((
v
->
mv_mode
==
MV_PMODE_INTENSITY_COMP
&&
if
((
v
->
mv_mode
==
MV_PMODE_INTENSITY_COMP
&&
v
->
mv_mode2
==
MV_PMODE_MIXED_MV
)
v
->
mv_mode2
==
MV_PMODE_MIXED_MV
)
||
v
->
mv_mode
==
MV_PMODE_MIXED_MV
)
{
||
v
->
mv_mode
==
MV_PMODE_MIXED_MV
)
{
...
@@ -1095,7 +1095,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -1095,7 +1095,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
/* Hopefully this is correct for P frames */
/* Hopefully this is correct for P frames */
v
->
s
.
mv_table_index
=
get_bits
(
gb
,
2
);
//but using ff_vc1_ tables
v
->
s
.
mv_table_index
=
get_bits
(
gb
,
2
);
//but using ff_vc1_ tables
v
->
cbpcy_vlc
=
&
ff_vc1_cbpcy_p_vlc
[
get_bits
(
gb
,
2
)];
v
->
cbpcy_vlc
=
&
ff_vc1_cbpcy_p_vlc
[
get_bits
(
gb
,
2
)];
}
else
if
(
v
->
fcm
==
1
)
{
// frame interlaced
}
else
if
(
v
->
fcm
==
ILACE_FRAME
)
{
// frame interlaced
v
->
qs_last
=
v
->
s
.
quarter_sample
;
v
->
qs_last
=
v
->
s
.
quarter_sample
;
v
->
s
.
quarter_sample
=
1
;
v
->
s
.
quarter_sample
=
1
;
v
->
s
.
mspel
=
1
;
v
->
s
.
mspel
=
1
;
...
@@ -1135,7 +1135,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
...
@@ -1135,7 +1135,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
break
;
break
;
case
AV_PICTURE_TYPE_B
:
case
AV_PICTURE_TYPE_B
:
// TODO: implement interlaced frame B picture decoding
// TODO: implement interlaced frame B picture decoding
if
(
v
->
fcm
==
1
)
if
(
v
->
fcm
==
ILACE_FRAME
)
return
-
1
;
return
-
1
;
if
(
v
->
extended_mv
)
if
(
v
->
extended_mv
)
v
->
mvrange
=
get_unary
(
gb
,
0
,
3
);
v
->
mvrange
=
get_unary
(
gb
,
0
,
3
);
...
...
libavcodec/vc1.h
View file @
1f948745
...
@@ -161,6 +161,16 @@ enum COTypes {
...
@@ -161,6 +161,16 @@ enum COTypes {
};
};
//@}
//@}
/**
* FCM Frame Coding Mode
* @note some content might be marked interlaced
* but have fcm set to 0 as well (e.g. HD-DVD)
*/
enum
FrameCodingMode
{
PROGRESSIVE
=
0
,
///< in the bitstream is reported as 00b
ILACE_FRAME
,
///< in the bitstream is reported as 10b
ILACE_FIELD
///< in the bitstream is reported as 11b
};
/** The VC1 Context
/** The VC1 Context
* @todo Change size wherever another size is more efficient
* @todo Change size wherever another size is more efficient
...
@@ -296,7 +306,7 @@ typedef struct VC1Context{
...
@@ -296,7 +306,7 @@ typedef struct VC1Context{
/** Frame decoding info for Advanced profile */
/** Frame decoding info for Advanced profile */
//@{
//@{
uint8_t
fcm
;
///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
enum
FrameCodingMode
fcm
;
uint8_t
numpanscanwin
;
uint8_t
numpanscanwin
;
uint8_t
tfcntr
;
uint8_t
tfcntr
;
uint8_t
rptfrm
,
tff
,
rff
;
uint8_t
rptfrm
,
tff
,
rff
;
...
...
libavcodec/vc1dec.c
View file @
1f948745
...
@@ -501,7 +501,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
...
@@ -501,7 +501,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
uvmy
=
uvmy
-
2
+
4
*
v
->
cur_field_type
;
uvmy
=
uvmy
-
2
+
4
*
v
->
cur_field_type
;
}
}
if
(
v
->
fastuvmc
&&
(
v
->
fcm
!=
1
))
{
// fastuvmc shall be ignored for interlaced frame picture
// fastuvmc shall be ignored for interlaced frame picture
if
(
v
->
fastuvmc
&&
(
v
->
fcm
!=
ILACE_FRAME
))
{
uvmx
=
uvmx
+
((
uvmx
<
0
)
?
(
uvmx
&
1
)
:
-
(
uvmx
&
1
));
uvmx
=
uvmx
+
((
uvmx
<
0
)
?
(
uvmx
&
1
)
:
-
(
uvmx
&
1
));
uvmy
=
uvmy
+
((
uvmy
<
0
)
?
(
uvmy
&
1
)
:
-
(
uvmy
&
1
));
uvmy
=
uvmy
+
((
uvmy
<
0
)
?
(
uvmy
&
1
)
:
-
(
uvmy
&
1
));
}
}
...
@@ -685,7 +686,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
...
@@ -685,7 +686,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
uint8_t
*
srcY
;
uint8_t
*
srcY
;
int
dxy
,
mx
,
my
,
src_x
,
src_y
;
int
dxy
,
mx
,
my
,
src_x
,
src_y
;
int
off
;
int
off
;
int
fieldmv
=
(
v
->
fcm
==
1
)
?
v
->
blk_mv_type
[
s
->
block_index
[
n
]]
:
0
;
int
fieldmv
=
(
v
->
fcm
==
ILACE_FRAME
)
?
v
->
blk_mv_type
[
s
->
block_index
[
n
]]
:
0
;
int
v_edge_pos
=
s
->
v_edge_pos
>>
v
->
field_mode
;
int
v_edge_pos
=
s
->
v_edge_pos
>>
v
->
field_mode
;
if
(
!
v
->
field_mode
&&
!
v
->
s
.
last_picture
.
f
.
data
[
0
])
if
(
!
v
->
field_mode
&&
!
v
->
s
.
last_picture
.
f
.
data
[
0
])
...
@@ -744,7 +745,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
...
@@ -744,7 +745,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
v
->
mv_f
[
1
][
s
->
block_index
[
k
]
+
v
->
blocks_off
]
=
f
;
v
->
mv_f
[
1
][
s
->
block_index
[
k
]
+
v
->
blocks_off
]
=
f
;
}
}
if
(
v
->
fcm
==
1
)
{
// not sure if needed for other types of picture
if
(
v
->
fcm
==
ILACE_FRAME
)
{
// not sure if needed for other types of picture
int
qx
,
qy
;
int
qx
,
qy
;
int
width
=
s
->
avctx
->
coded_width
;
int
width
=
s
->
avctx
->
coded_width
;
int
height
=
s
->
avctx
->
coded_height
>>
1
;
int
height
=
s
->
avctx
->
coded_height
>>
1
;
...
@@ -761,7 +762,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
...
@@ -761,7 +762,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
my
-=
8
*
(
qy
-
height
-
1
);
my
-=
8
*
(
qy
-
height
-
1
);
}
}
if
((
v
->
fcm
==
1
)
&&
fieldmv
)
if
((
v
->
fcm
==
ILACE_FRAME
)
&&
fieldmv
)
off
=
((
n
>
1
)
?
s
->
linesize
:
0
)
+
(
n
&
1
)
*
8
;
off
=
((
n
>
1
)
?
s
->
linesize
:
0
)
+
(
n
&
1
)
*
8
;
else
else
off
=
s
->
linesize
*
4
*
(
n
&
2
)
+
(
n
&
1
)
*
8
;
off
=
s
->
linesize
*
4
*
(
n
&
2
)
+
(
n
&
1
)
*
8
;
...
@@ -779,7 +780,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
...
@@ -779,7 +780,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
src_y
=
av_clip
(
src_y
,
-
16
,
s
->
mb_height
*
16
);
src_y
=
av_clip
(
src_y
,
-
16
,
s
->
mb_height
*
16
);
}
else
{
}
else
{
src_x
=
av_clip
(
src_x
,
-
17
,
s
->
avctx
->
coded_width
);
src_x
=
av_clip
(
src_x
,
-
17
,
s
->
avctx
->
coded_width
);
if
(
v
->
fcm
==
1
)
{
if
(
v
->
fcm
==
ILACE_FRAME
)
{
if
(
src_y
&
1
)
if
(
src_y
&
1
)
src_y
=
av_clip
(
src_y
,
-
17
,
s
->
avctx
->
coded_height
+
1
);
src_y
=
av_clip
(
src_y
,
-
17
,
s
->
avctx
->
coded_height
+
1
);
else
else
...
@@ -2917,7 +2918,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
...
@@ -2917,7 +2918,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
int
k
;
int
k
;
if
(
v
->
s
.
ac_pred
)
{
if
(
v
->
s
.
ac_pred
)
{
if
(
!
use_pred
&&
v
->
fcm
==
1
)
{
if
(
!
use_pred
&&
v
->
fcm
==
ILACE_FRAME
)
{
zz_table
=
v
->
zzi_8x8
;
zz_table
=
v
->
zzi_8x8
;
}
else
{
}
else
{
if
(
!
dc_pred_dir
)
// top
if
(
!
dc_pred_dir
)
// top
...
@@ -2926,7 +2927,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
...
@@ -2926,7 +2927,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
zz_table
=
v
->
zz_8x8
[
3
];
zz_table
=
v
->
zz_8x8
[
3
];
}
}
}
else
{
}
else
{
if
(
v
->
fcm
!=
1
)
if
(
v
->
fcm
!=
ILACE_FRAME
)
zz_table
=
v
->
zz_8x8
[
1
];
zz_table
=
v
->
zz_8x8
[
1
];
else
else
zz_table
=
v
->
zzi_8x8
;
zz_table
=
v
->
zzi_8x8
;
...
@@ -3136,10 +3137,10 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
...
@@ -3136,10 +3137,10 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
i
+=
skip
;
i
+=
skip
;
if
(
i
>
63
)
if
(
i
>
63
)
break
;
break
;
if
(
v
->
fcm
==
0
)
if
(
v
->
fcm
==
PROGRESSIVE
)
block
[
v
->
zz_8x8
[
0
][
i
++
]]
=
value
;
block
[
v
->
zz_8x8
[
0
][
i
++
]]
=
value
;
else
{
else
{
if
(
use_pred
&&
(
v
->
fcm
==
1
))
{
if
(
use_pred
&&
(
v
->
fcm
==
ILACE_FRAME
))
{
if
(
!
dc_pred_dir
)
// top
if
(
!
dc_pred_dir
)
// top
block
[
v
->
zz_8x8
[
2
][
i
++
]]
=
value
;
block
[
v
->
zz_8x8
[
2
][
i
++
]]
=
value
;
else
// left
else
// left
...
@@ -4739,12 +4740,12 @@ static void vc1_decode_p_blocks(VC1Context *v)
...
@@ -4739,12 +4740,12 @@ static void vc1_decode_p_blocks(VC1Context *v)
for
(;
s
->
mb_x
<
s
->
mb_width
;
s
->
mb_x
++
)
{
for
(;
s
->
mb_x
<
s
->
mb_width
;
s
->
mb_x
++
)
{
ff_update_block_index
(
s
);
ff_update_block_index
(
s
);
if
(
v
->
fcm
==
2
)
if
(
v
->
fcm
==
ILACE_FIELD
)
vc1_decode_p_mb_intfi
(
v
);
vc1_decode_p_mb_intfi
(
v
);
else
if
(
v
->
fcm
==
1
)
else
if
(
v
->
fcm
==
ILACE_FRAME
)
vc1_decode_p_mb_intfr
(
v
);
vc1_decode_p_mb_intfr
(
v
);
else
vc1_decode_p_mb
(
v
);
else
vc1_decode_p_mb
(
v
);
if
(
s
->
mb_y
!=
s
->
start_mb_y
&&
apply_loop_filter
&&
v
->
fcm
==
0
)
if
(
s
->
mb_y
!=
s
->
start_mb_y
&&
apply_loop_filter
&&
v
->
fcm
==
PROGRESSIVE
)
vc1_apply_p_loop_filter
(
v
);
vc1_apply_p_loop_filter
(
v
);
if
(
get_bits_count
(
&
s
->
gb
)
>
v
->
bits
||
get_bits_count
(
&
s
->
gb
)
<
0
)
{
if
(
get_bits_count
(
&
s
->
gb
)
>
v
->
bits
||
get_bits_count
(
&
s
->
gb
)
<
0
)
{
// TODO: may need modification to handle slice coding
// TODO: may need modification to handle slice coding
...
@@ -4811,7 +4812,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
...
@@ -4811,7 +4812,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
for
(;
s
->
mb_x
<
s
->
mb_width
;
s
->
mb_x
++
)
{
for
(;
s
->
mb_x
<
s
->
mb_width
;
s
->
mb_x
++
)
{
ff_update_block_index
(
s
);
ff_update_block_index
(
s
);
if
(
v
->
fcm
==
2
)
if
(
v
->
fcm
==
ILACE_FIELD
)
vc1_decode_b_mb_intfi
(
v
);
vc1_decode_b_mb_intfi
(
v
);
else
else
vc1_decode_b_mb
(
v
);
vc1_decode_b_mb
(
v
);
...
...
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