Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
aom-rav1e
Commits
38897306
Commit
38897306
authored
Apr 27, 2017
by
Arild Fuldseth (arilfuld)
Committed by
Arild Fuldseth
Apr 28, 2017
Browse files
Enable low-latency (uni-directional) compound mode (normative)
Change-Id: Ie9cb6bb66c35eecd173532b3111b98a2aaf0d913
parent
e508db4e
Changes
5
Hide whitespace changes
Inline
Side-by-side
av1/common/pred_common.c
View file @
38897306
...
...
@@ -278,19 +278,29 @@ int av1_get_reference_mode_context(const AV1_COMMON *cm,
//
// NOTE(zoeliu): The probability of ref_frame[0] is either
// GOLDEN_FRAME or LAST3_FRAME.
#if CONFIG_LOWDELAY_COMPOUND
int
av1_get_pred_context_comp_ref_p
(
UNUSED
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#else
int
av1_get_pred_context_comp_ref_p
(
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#endif
int
pred_context
;
const
MB_MODE_INFO
*
const
above_mbmi
=
xd
->
above_mbmi
;
const
MB_MODE_INFO
*
const
left_mbmi
=
xd
->
left_mbmi
;
const
int
above_in_image
=
xd
->
up_available
;
const
int
left_in_image
=
xd
->
left_available
;
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
#if CONFIG_LOWDELAY_COMPOUND // No change to bitstream
// Code seems to assume that signbias of cm->comp_bwd_ref[0] is always 1
const
int
bwd_ref_sign_idx
=
1
;
#else
const
int
bwd_ref_sign_idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_bwd_ref
[
0
]];
#endif
const
int
fwd_ref_sign_idx
=
!
bwd_ref_sign_idx
;
if
(
above_in_image
&&
left_in_image
)
{
// both edges available
...
...
@@ -378,19 +388,29 @@ int av1_get_pred_context_comp_ref_p(const AV1_COMMON *cm,
//
// NOTE(zoeliu): The probability of ref_frame[0] is LAST_FRAME,
// conditioning on it is either LAST_FRAME or LAST2_FRAME.
#if CONFIG_LOWDELAY_COMPOUND
int
av1_get_pred_context_comp_ref_p1
(
UNUSED
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#else
int
av1_get_pred_context_comp_ref_p1
(
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#endif
int
pred_context
;
const
MB_MODE_INFO
*
const
above_mbmi
=
xd
->
above_mbmi
;
const
MB_MODE_INFO
*
const
left_mbmi
=
xd
->
left_mbmi
;
const
int
above_in_image
=
xd
->
up_available
;
const
int
left_in_image
=
xd
->
left_available
;
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
#if CONFIG_LOWDELAY_COMPOUND // No change to bitstream
// Code seems to assume that signbias of cm->comp_bwd_ref[0] is always 1
const
int
bwd_ref_sign_idx
=
1
;
#else
const
int
bwd_ref_sign_idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_bwd_ref
[
0
]];
#endif
const
int
fwd_ref_sign_idx
=
!
bwd_ref_sign_idx
;
if
(
above_in_image
&&
left_in_image
)
{
// both edges available
...
...
@@ -479,19 +499,29 @@ int av1_get_pred_context_comp_ref_p1(const AV1_COMMON *cm,
//
// NOTE(zoeliu): The probability of ref_frame[0] is GOLDEN_FRAME,
// conditioning on it is either GOLDEN or LAST3.
#if CONFIG_LOWDELAY_COMPOUND
int
av1_get_pred_context_comp_ref_p2
(
UNUSED
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#else
int
av1_get_pred_context_comp_ref_p2
(
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#endif
int
pred_context
;
const
MB_MODE_INFO
*
const
above_mbmi
=
xd
->
above_mbmi
;
const
MB_MODE_INFO
*
const
left_mbmi
=
xd
->
left_mbmi
;
const
int
above_in_image
=
xd
->
up_available
;
const
int
left_in_image
=
xd
->
left_available
;
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries correpsonding to real macroblocks.
// The prediction flags in these dummy entries are initialised to 0.
#if CONFIG_LOWDELAY_COMPOUND // No change to bitstream
// Code seems to assume that signbias of cm->comp_bwd_ref[0] is always 1
const
int
bwd_ref_sign_idx
=
1
;
#else
const
int
bwd_ref_sign_idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_bwd_ref
[
0
]];
#endif
const
int
fwd_ref_sign_idx
=
!
bwd_ref_sign_idx
;
if
(
above_in_image
&&
left_in_image
)
{
// both edges available
...
...
@@ -574,19 +604,29 @@ int av1_get_pred_context_comp_ref_p2(const AV1_COMMON *cm,
}
// Returns a context number for the given MB prediction signal
#if CONFIG_LOWDELAY_COMPOUND
int
av1_get_pred_context_comp_bwdref_p
(
UNUSED
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#else
int
av1_get_pred_context_comp_bwdref_p
(
const
AV1_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
)
{
#endif
int
pred_context
;
const
MB_MODE_INFO
*
const
above_mbmi
=
xd
->
above_mbmi
;
const
MB_MODE_INFO
*
const
left_mbmi
=
xd
->
left_mbmi
;
const
int
above_in_image
=
xd
->
up_available
;
const
int
left_in_image
=
xd
->
left_available
;
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries corresponding to real macroblocks.
// The prediction flags in these dummy entries are initialized to 0.
// Note:
// The mode info data structure has a one element border above and to the
// left of the entries corresponding to real macroblocks.
// The prediction flags in these dummy entries are initialized to 0.
#if CONFIG_LOWDELAY_COMPOUND // No change to bitstream
// Code seems to assume that signbias of cm->comp_bwd_ref[0] is always 1
const
int
bwd_ref_sign_idx
=
1
;
#else
const
int
bwd_ref_sign_idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_bwd_ref
[
0
]];
#endif
const
int
fwd_ref_sign_idx
=
!
bwd_ref_sign_idx
;
if
(
above_in_image
&&
left_in_image
)
{
// both edges available
...
...
av1/decoder/decodeframe.c
View file @
38897306
...
...
@@ -92,12 +92,16 @@ static size_t read_uncompressed_header(AV1Decoder *pbi,
struct
aom_read_bit_buffer
*
rb
);
static
int
is_compound_reference_allowed
(
const
AV1_COMMON
*
cm
)
{
#if CONFIG_LOWDELAY_COMPOUND // Normative in decoder
return
!
frame_is_intra_only
(
cm
);
#else
int
i
;
if
(
frame_is_intra_only
(
cm
))
return
0
;
for
(
i
=
1
;
i
<
INTER_REFS_PER_FRAME
;
++
i
)
if
(
cm
->
ref_frame_sign_bias
[
i
+
1
]
!=
cm
->
ref_frame_sign_bias
[
1
])
return
1
;
return
0
;
#endif
}
static
void
setup_compound_reference_mode
(
AV1_COMMON
*
cm
)
{
...
...
av1/decoder/decodemv.c
View file @
38897306
...
...
@@ -1238,11 +1238,15 @@ static void read_ref_frames(AV1_COMMON *const cm, MACROBLOCKD *const xd,
const
REFERENCE_MODE
mode
=
read_block_reference_mode
(
cm
,
xd
,
r
);
// FIXME(rbultje) I'm pretty sure this breaks segmentation ref frame coding
if
(
mode
==
COMPOUND_REFERENCE
)
{
#if CONFIG_LOWDELAY_COMPOUND // Normative in decoder (for low delay)
const
int
idx
=
1
;
#else
#if CONFIG_EXT_REFS
const
int
idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_bwd_ref
[
0
]];
#else
const
int
idx
=
cm
->
ref_frame_sign_bias
[
cm
->
comp_fixed_ref
];
#endif // CONFIG_EXT_REFS
#endif
const
int
ctx
=
av1_get_pred_context_comp_ref_p
(
cm
,
xd
);
const
int
bit
=
aom_read
(
r
,
fc
->
comp_ref_prob
[
ctx
][
0
],
ACCT_STR
);
...
...
av1/encoder/encodeframe.c
View file @
38897306
...
...
@@ -5428,6 +5428,21 @@ void av1_encode_frame(AV1_COMP *cpi) {
// side behavior is where the ALT ref buffer has opposite sign bias to
// the other two.
if
(
!
frame_is_intra_only
(
cm
))
{
#if CONFIG_LOWDELAY_COMPOUND // Normative in encoder
cpi
->
allow_comp_inter_inter
=
1
;
#if CONFIG_EXT_REFS
cm
->
comp_fwd_ref
[
0
]
=
LAST_FRAME
;
cm
->
comp_fwd_ref
[
1
]
=
LAST2_FRAME
;
cm
->
comp_fwd_ref
[
2
]
=
LAST3_FRAME
;
cm
->
comp_fwd_ref
[
3
]
=
GOLDEN_FRAME
;
cm
->
comp_bwd_ref
[
0
]
=
BWDREF_FRAME
;
cm
->
comp_bwd_ref
[
1
]
=
ALTREF_FRAME
;
#else
cm
->
comp_fixed_ref
=
ALTREF_FRAME
;
cm
->
comp_var_ref
[
0
]
=
LAST_FRAME
;
cm
->
comp_var_ref
[
1
]
=
GOLDEN_FRAME
;
#endif // CONFIG_EXT_REFS
#else
if
((
cm
->
ref_frame_sign_bias
[
ALTREF_FRAME
]
==
cm
->
ref_frame_sign_bias
[
GOLDEN_FRAME
])
||
(
cm
->
ref_frame_sign_bias
[
ALTREF_FRAME
]
==
...
...
@@ -5449,6 +5464,7 @@ void av1_encode_frame(AV1_COMP *cpi) {
cm
->
comp_var_ref
[
1
]
=
GOLDEN_FRAME
;
#endif // CONFIG_EXT_REFS
}
#endif
}
else
{
cpi
->
allow_comp_inter_inter
=
0
;
}
...
...
configure
View file @
38897306
...
...
@@ -323,6 +323,7 @@ EXPERIMENT_LIST="
new_multisymbol
compound_singleref
aom_qm
lowdelay_compound
"
CONFIG_LIST
=
"
dependency_tracking
...
...
Write
Preview
Supports
Markdown
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