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
4306b6e5
Commit
4306b6e5
authored
Sep 27, 2016
by
Yaowu Xu
Committed by
Jingning Han
Sep 29, 2016
Browse files
more ref_mv changes from aom/master
Change-Id: I9152f898dfacdf3877ed719f193bb1e0dbee0a1a
parent
dc035da9
Changes
11
Hide whitespace changes
Inline
Side-by-side
av1/common/mv.h
View file @
4306b6e5
...
...
@@ -152,7 +152,7 @@ static INLINE GLOBAL_MOTION_TYPE get_gmtype(const Global_Motion_Params *gm) {
typedef
struct
candidate_mv
{
int_mv
this_mv
;
int_mv
comp_mv
;
int_mv
pred_mv
;
int_mv
pred_mv
[
2
]
;
int
weight
;
}
CANDIDATE_MV
;
#endif
...
...
av1/common/mvref_common.c
View file @
4306b6e5
...
...
@@ -35,7 +35,7 @@ static uint8_t add_ref_mv_candidate(
// Add a new item to the list.
if
(
index
==
*
refmv_count
)
{
ref_mv_stack
[
index
].
this_mv
=
this_refmv
;
ref_mv_stack
[
index
].
pred_mv
=
ref_mv_stack
[
index
].
pred_mv
[
0
]
=
get_sub_block_pred_mv
(
candidate_mi
,
ref
,
col
,
block
);
ref_mv_stack
[
index
].
weight
=
2
*
len
;
++
(
*
refmv_count
);
...
...
@@ -61,7 +61,7 @@ static uint8_t add_ref_mv_candidate(
// Add a new item to the list.
if
(
index
==
*
refmv_count
)
{
ref_mv_stack
[
index
].
this_mv
=
this_refmv
;
ref_mv_stack
[
index
].
pred_mv
=
ref_mv_stack
[
index
].
pred_mv
[
0
]
=
get_sub_block_pred_mv
(
candidate_mi
,
ref
,
col
,
alt_block
);
ref_mv_stack
[
index
].
weight
=
len
;
++
(
*
refmv_count
);
...
...
@@ -97,6 +97,10 @@ static uint8_t add_ref_mv_candidate(
if
(
index
==
*
refmv_count
)
{
ref_mv_stack
[
index
].
this_mv
=
this_refmv
[
0
];
ref_mv_stack
[
index
].
comp_mv
=
this_refmv
[
1
];
ref_mv_stack
[
index
].
pred_mv
[
0
]
=
get_sub_block_pred_mv
(
candidate_mi
,
0
,
col
,
block
);
ref_mv_stack
[
index
].
pred_mv
[
1
]
=
get_sub_block_pred_mv
(
candidate_mi
,
1
,
col
,
block
);
ref_mv_stack
[
index
].
weight
=
2
*
len
;
++
(
*
refmv_count
);
...
...
@@ -127,6 +131,10 @@ static uint8_t add_ref_mv_candidate(
if
(
index
==
*
refmv_count
)
{
ref_mv_stack
[
index
].
this_mv
=
this_refmv
[
0
];
ref_mv_stack
[
index
].
comp_mv
=
this_refmv
[
1
];
ref_mv_stack
[
index
].
pred_mv
[
0
]
=
get_sub_block_pred_mv
(
candidate_mi
,
0
,
col
,
block
);
ref_mv_stack
[
index
].
pred_mv
[
1
]
=
get_sub_block_pred_mv
(
candidate_mi
,
1
,
col
,
block
);
ref_mv_stack
[
index
].
weight
=
len
;
++
(
*
refmv_count
);
...
...
@@ -230,6 +238,7 @@ static uint8_t scan_blk_mbmi(const AV1_COMMON *cm, const MACROBLOCKD *xd,
candidate_mi
,
candidate
,
rf
,
refmv_count
,
ref_mv_stack
,
cm
->
allow_high_precision_mv
,
len
,
block
,
mi_pos
.
col
);
}
// Analyze a single 8x8 block motion information.
return
newmv_count
;
}
...
...
@@ -333,6 +342,7 @@ static int add_col_ref_mv(const AV1_COMMON *cm,
if
(
idx
==
*
refmv_count
&&
*
refmv_count
<
MAX_REF_MV_STACK_SIZE
)
{
ref_mv_stack
[
idx
].
this_mv
.
as_int
=
this_refmv
.
as_int
;
ref_mv_stack
[
idx
].
pred_mv
[
0
]
=
prev_frame_mvs
->
pred_mv
[
ref
];
ref_mv_stack
[
idx
].
weight
=
2
;
++
(
*
refmv_count
);
}
...
...
@@ -389,8 +399,8 @@ static void setup_ref_mv_list(const AV1_COMMON *cm, const MACROBLOCKD *xd,
int
blk_row
,
blk_col
;
int
coll_blk_count
=
0
;
for
(
blk_row
=
0
;
blk_row
<
xd
->
n8_h
;
blk_row
+=
2
)
{
for
(
blk_col
=
0
;
blk_col
<
xd
->
n8_w
;
blk_col
+=
2
)
{
for
(
blk_row
=
0
;
blk_row
<
xd
->
n8_h
;
++
blk_row
)
{
for
(
blk_col
=
0
;
blk_col
<
xd
->
n8_w
;
++
blk_col
)
{
coll_blk_count
+=
add_col_ref_mv
(
cm
,
prev_frame_mvs_base
,
xd
,
mi_row
,
mi_col
,
ref_frame
,
blk_row
,
blk_col
,
refmv_count
,
ref_mv_stack
,
mode_context
);
...
...
@@ -705,19 +715,30 @@ void av1_find_mv_refs(const AV1_COMMON *cm, const MACROBLOCKD *xd,
#else
mode_context
);
#endif // CONFIG_REF_MV
find_mv_refs_idx
(
cm
,
xd
,
mi
,
ref_frame
,
mv_ref_list
,
-
1
,
mi_row
,
mi_col
,
sync
,
data
,
NULL
);
#endif // CONFIG_EXT_INTER
#if CONFIG_REF_MV
if
(
ref_frame
<=
ALTREF_FRAME
)
find_mv_refs_idx
(
cm
,
xd
,
mi
,
ref_frame
,
mv_ref_list
,
-
1
,
mi_row
,
mi_col
,
sync
,
data
,
mode_context
);
#else
find_mv_refs_idx
(
cm
,
xd
,
mi
,
ref_frame
,
mv_ref_list
,
-
1
,
mi_row
,
mi_col
,
sync
,
data
,
mode_context
);
#endif // CONFIG_
EXT_INTER
#endif // CONFIG_
REF_MV
#if CONFIG_REF_MV
setup_ref_mv_list
(
cm
,
xd
,
ref_frame
,
ref_mv_count
,
ref_mv_stack
,
mv_ref_list
,
-
1
,
mi_row
,
mi_col
,
mode_context
);
for
(
idx
=
0
;
idx
<
MAX_MV_REF_CANDIDATES
;
++
idx
)
if
(
mv_ref_list
[
idx
].
as_int
!=
0
)
all_zero
=
0
;
if
(
*
ref_mv_count
>=
2
)
{
for
(
idx
=
0
;
idx
<
AOMMIN
(
3
,
*
ref_mv_count
);
++
idx
)
{
if
(
ref_mv_stack
[
idx
].
this_mv
.
as_int
!=
0
)
all_zero
=
0
;
if
(
ref_frame
>
ALTREF_FRAME
)
if
(
ref_mv_stack
[
idx
].
comp_mv
.
as_int
!=
0
)
all_zero
=
0
;
}
}
else
if
(
ref_frame
<=
ALTREF_FRAME
)
{
for
(
idx
=
0
;
idx
<
MAX_MV_REF_CANDIDATES
;
++
idx
)
if
(
mv_ref_list
[
idx
].
as_int
!=
0
)
all_zero
=
0
;
}
if
(
all_zero
)
mode_context
[
ref_frame
]
|=
(
1
<<
ALL_ZERO_FLAG_OFFSET
);
#endif
...
...
av1/common/mvref_common.h
View file @
4306b6e5
...
...
@@ -350,19 +350,24 @@ static INLINE void lower_mv_precision(MV *mv, int allow_hp) {
#if CONFIG_REF_MV
static
INLINE
int
av1_nmv_ctx
(
const
uint8_t
ref_mv_count
,
const
CANDIDATE_MV
*
ref_mv_stack
)
{
const
CANDIDATE_MV
*
ref_mv_stack
,
int
ref
,
int
ref_mv_idx
)
{
int_mv
this_mv
=
(
ref
==
0
)
?
ref_mv_stack
[
ref_mv_idx
].
this_mv
:
ref_mv_stack
[
ref_mv_idx
].
comp_mv
;
#if CONFIG_EXT_INTER
return
0
;
#endif
if
(
ref_mv_stack
[
0
].
weight
>
REF_CAT_LEVEL
&&
ref_mv_count
>
0
)
{
if
(
abs
(
ref_mv_stack
[
0
].
this_mv
.
as_mv
.
row
-
ref_mv_stack
[
0
].
pred_mv
.
as_mv
.
row
)
<=
4
&&
abs
(
ref_mv_stack
[
0
].
this_mv
.
as_mv
.
col
-
ref_mv_stack
[
0
].
pred_mv
.
as_mv
.
col
)
<=
4
)
if
(
ref_mv_stack
[
ref_mv_idx
].
weight
>=
REF_CAT_LEVEL
&&
ref_mv_count
>
0
)
{
if
(
abs
(
this_mv
.
as_mv
.
row
-
ref_mv_stack
[
ref_mv_idx
].
pred_mv
[
ref
].
as_mv
.
row
)
<=
4
&&
abs
(
this_mv
.
as_mv
.
col
-
ref_mv_stack
[
ref_mv_idx
].
pred_mv
[
ref
].
as_mv
.
col
)
<=
4
)
return
2
;
else
return
1
;
}
return
0
;
}
...
...
@@ -404,6 +409,8 @@ static INLINE int16_t av1_mode_context_analyzer(
const
int16_t
*
const
mode_context
,
const
MV_REFERENCE_FRAME
*
const
rf
,
BLOCK_SIZE
bsize
,
int
block
)
{
int16_t
mode_ctx
=
0
;
int8_t
ref_frame_type
=
av1_ref_frame_type
(
rf
);
if
(
block
>=
0
)
{
mode_ctx
=
mode_context
[
rf
[
0
]]
&
0x00ff
;
...
...
@@ -418,7 +425,7 @@ static INLINE int16_t av1_mode_context_analyzer(
else
if
(
rf
[
0
]
!=
ALTREF_FRAME
)
return
mode_context
[
rf
[
0
]]
&
~
(
mode_context
[
ALTREF_FRAME
]
&
0xfe00
);
else
return
mode_context
[
r
f
[
0
]
];
return
mode_context
[
r
ef_frame_type
];
}
static
INLINE
uint8_t
av1_drl_ctx
(
const
CANDIDATE_MV
*
ref_mv_stack
,
...
...
av1/common/onyxc_int.h
View file @
4306b6e5
...
...
@@ -82,6 +82,9 @@ typedef enum {
typedef
struct
{
int_mv
mv
[
2
];
#if CONFIG_REF_MV
int_mv
pred_mv
[
2
];
#endif
MV_REFERENCE_FRAME
ref_frame
[
2
];
}
MV_REF
;
...
...
av1/decoder/decodemv.c
View file @
4306b6e5
...
...
@@ -966,8 +966,10 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
#endif
for
(
i
=
0
;
i
<
1
+
is_compound
;
++
i
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
i
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
i
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
i
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
read_mv
(
r
,
&
mv
[
i
].
as_mv
,
&
ref_mv
[
i
].
as_mv
,
is_compound
,
...
...
@@ -1031,8 +1033,10 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
assert
(
is_compound
);
for
(
i
=
0
;
i
<
2
;
++
i
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
i
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
i
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
i
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
read_mv
(
r
,
&
mv
[
i
].
as_mv
,
&
ref_mv
[
i
].
as_mv
,
is_compound
,
...
...
@@ -1072,8 +1076,9 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
case
NEW_NEARESTMV
:
{
FRAME_COUNTS
*
counts
=
xd
->
counts
;
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
read_mv
(
r
,
&
mv
[
0
].
as_mv
,
&
ref_mv
[
0
].
as_mv
,
is_compound
,
...
...
@@ -1091,8 +1096,9 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
case
NEAREST_NEWMV
:
{
FRAME_COUNTS
*
counts
=
xd
->
counts
;
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
mv
[
0
].
as_int
=
nearest_mv
[
0
].
as_int
;
...
...
@@ -1111,8 +1117,9 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
case
NEAR_NEWMV
:
{
FRAME_COUNTS
*
counts
=
xd
->
counts
;
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
mv
[
0
].
as_int
=
near_mv
[
0
].
as_int
;
...
...
@@ -1132,8 +1139,9 @@ static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
case
NEW_NEARMV
:
{
FRAME_COUNTS
*
counts
=
xd
->
counts
;
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
xd
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
xd
->
ref_mv_count
[
rf_type
],
xd
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
const
mv_counts
=
counts
?
&
counts
->
mv
[
nmv_ctx
]
:
NULL
;
read_mv
(
r
,
&
mv
[
0
].
as_mv
,
&
ref_mv
[
0
].
as_mv
,
is_compound
,
...
...
@@ -1235,6 +1243,29 @@ static void read_inter_block_mode_info(AV1Decoder *const pbi,
}
#if CONFIG_REF_MV
for
(;
ref_frame
<
MODE_CTX_REF_FRAMES
;
++
ref_frame
)
{
av1_find_mv_refs
(
cm
,
xd
,
mi
,
ref_frame
,
&
xd
->
ref_mv_count
[
ref_frame
],
xd
->
ref_mv_stack
[
ref_frame
],
#if CONFIG_EXT_INTER
compound_inter_mode_ctx
,
#endif // CONFIG_EXT_INTER
ref_mvs
[
ref_frame
],
mi_row
,
mi_col
,
fpm_sync
,
(
void
*
)
pbi
,
inter_mode_ctx
);
if
(
xd
->
ref_mv_count
[
ref_frame
]
<
2
)
{
MV_REFERENCE_FRAME
rf
[
2
];
av1_set_ref_frame
(
rf
,
ref_frame
);
for
(
ref
=
0
;
ref
<
2
;
++
ref
)
{
lower_mv_precision
(
&
ref_mvs
[
rf
[
ref
]][
0
].
as_mv
,
allow_hp
);
lower_mv_precision
(
&
ref_mvs
[
rf
[
ref
]][
1
].
as_mv
,
allow_hp
);
}
if
(
ref_mvs
[
rf
[
0
]][
0
].
as_int
!=
0
||
ref_mvs
[
rf
[
0
]][
1
].
as_int
!=
0
||
ref_mvs
[
rf
[
1
]][
0
].
as_int
!=
0
||
ref_mvs
[
rf
[
1
]][
1
].
as_int
!=
0
)
inter_mode_ctx
[
ref_frame
]
&=
~
(
1
<<
ALL_ZERO_FLAG_OFFSET
);
}
}
#if CONFIG_EXT_INTER
if
(
is_compound
)
mode_ctx
=
compound_inter_mode_ctx
[
mbmi
->
ref_frame
[
0
]];
...
...
@@ -1802,6 +1833,10 @@ void av1_read_mode_info(AV1Decoder *const pbi, MACROBLOCKD *xd,
mv
->
ref_frame
[
1
]
=
mi
->
mbmi
.
ref_frame
[
1
];
mv
->
mv
[
0
].
as_int
=
mi
->
mbmi
.
mv
[
0
].
as_int
;
mv
->
mv
[
1
].
as_int
=
mi
->
mbmi
.
mv
[
1
].
as_int
;
#if CONFIG_REF_MV
mv
->
pred_mv
[
0
].
as_int
=
mi
->
mbmi
.
pred_mv
[
0
].
as_int
;
mv
->
pred_mv
[
1
].
as_int
=
mi
->
mbmi
.
pred_mv
[
1
].
as_int
;
#endif
}
}
}
...
...
av1/encoder/bitstream.c
View file @
4306b6e5
...
...
@@ -1256,9 +1256,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
#endif // CONFIG_EXT_INTER
for
(
ref
=
0
;
ref
<
1
+
is_compound
;
++
ref
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
ref
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
ref
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
ref
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
av1_encode_mv
(
cpi
,
w
,
&
mi
->
bmi
[
j
].
as_mv
[
ref
].
as_mv
,
...
...
@@ -1280,9 +1281,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
#if CONFIG_EXT_INTER
else
if
(
b_mode
==
NEAREST_NEWMV
||
b_mode
==
NEAR_NEWMV
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
av1_encode_mv
(
cpi
,
w
,
&
mi
->
bmi
[
j
].
as_mv
[
1
].
as_mv
,
...
...
@@ -1293,9 +1295,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
nmvc
,
allow_hp
);
}
else
if
(
b_mode
==
NEW_NEARESTMV
||
b_mode
==
NEW_NEARMV
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
av1_encode_mv
(
cpi
,
w
,
&
mi
->
bmi
[
j
].
as_mv
[
0
].
as_mv
,
...
...
@@ -1317,9 +1320,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
int_mv
ref_mv
;
for
(
ref
=
0
;
ref
<
1
+
is_compound
;
++
ref
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
ref
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
ref
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
ref
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
ref_mv
=
mbmi_ext
->
ref_mvs
[
mbmi
->
ref_frame
[
ref
]][
0
];
...
...
@@ -1342,8 +1346,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
#if CONFIG_EXT_INTER
}
else
if
(
mode
==
NEAREST_NEWMV
||
mode
==
NEAR_NEWMV
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
av1_encode_mv
(
cpi
,
w
,
&
mbmi
->
mv
[
1
].
as_mv
,
...
...
@@ -1354,8 +1360,10 @@ static void pack_inter_mode_mvs(AV1_COMP *cpi, const MODE_INFO *mi,
nmvc
,
allow_hp
);
}
else
if
(
mode
==
NEW_NEARESTMV
||
mode
==
NEW_NEARMV
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
const
nmv_context
*
nmvc
=
&
cm
->
fc
->
nmvc
[
nmv_ctx
];
#endif
av1_encode_mv
(
cpi
,
w
,
&
mbmi
->
mv
[
0
].
as_mv
,
...
...
av1/encoder/encodeframe.c
View file @
4306b6e5
...
...
@@ -1075,6 +1075,7 @@ static void update_state(AV1_COMP *cpi, ThreadData *td, PICK_MODE_CONTEXT *ctx,
clamp_mv_ref
(
&
this_mv
.
as_mv
,
xd
->
n8_w
<<
3
,
xd
->
n8_h
<<
3
,
xd
);
x
->
mbmi_ext
->
ref_mvs
[
mbmi
->
ref_frame
[
i
]][
0
]
=
this_mv
;
mbmi
->
pred_mv
[
i
]
=
this_mv
;
mi
->
mbmi
.
pred_mv
[
i
]
=
this_mv
;
}
}
#endif
...
...
av1/encoder/encodemv.c
View file @
4306b6e5
...
...
@@ -298,8 +298,10 @@ static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
const
MV
diff
=
{
mvs
[
i
].
as_mv
.
row
-
ref
->
row
,
mvs
[
i
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
i
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
i
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
i
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
(
void
)
pred_mvs
;
#endif
...
...
@@ -310,8 +312,10 @@ static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
const
MV
diff
=
{
mvs
[
1
].
as_mv
.
row
-
ref
->
row
,
mvs
[
1
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
#endif
av1_inc_mv
(
&
diff
,
counts
,
av1_use_mv_hp
(
ref
));
...
...
@@ -320,8 +324,10 @@ static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
const
MV
diff
=
{
mvs
[
0
].
as_mv
.
row
-
ref
->
row
,
mvs
[
0
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
#endif
av1_inc_mv
(
&
diff
,
counts
,
av1_use_mv_hp
(
ref
));
...
...
@@ -347,8 +353,10 @@ static void inc_mvs_sub8x8(const MODE_INFO *mi, int block, const int_mv mvs[2],
const
MV
diff
=
{
mvs
[
i
].
as_mv
.
row
-
ref
->
row
,
mvs
[
i
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
i
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
i
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
i
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
#endif
av1_inc_mv
(
&
diff
,
counts
,
av1_use_mv_hp
(
ref
));
...
...
@@ -358,8 +366,10 @@ static void inc_mvs_sub8x8(const MODE_INFO *mi, int block, const int_mv mvs[2],
const
MV
diff
=
{
mvs
[
1
].
as_mv
.
row
-
ref
->
row
,
mvs
[
1
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
1
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
1
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
1
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
#endif
av1_inc_mv
(
&
diff
,
counts
,
av1_use_mv_hp
(
ref
));
...
...
@@ -368,8 +378,10 @@ static void inc_mvs_sub8x8(const MODE_INFO *mi, int block, const int_mv mvs[2],
const
MV
diff
=
{
mvs
[
0
].
as_mv
.
row
-
ref
->
row
,
mvs
[
0
].
as_mv
.
col
-
ref
->
col
};
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
0
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
0
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
0
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
#endif
av1_inc_mv
(
&
diff
,
counts
,
av1_use_mv_hp
(
ref
));
...
...
@@ -389,8 +401,10 @@ static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
for
(
i
=
0
;
i
<
1
+
has_second_ref
(
mbmi
);
++
i
)
{
#if CONFIG_REF_MV
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
mbmi
->
ref_frame
[
i
]],
mbmi_ext
->
ref_mv_stack
[
mbmi
->
ref_frame
[
i
]]);
int8_t
rf_type
=
av1_ref_frame_type
(
mbmi
->
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
i
,
mbmi
->
ref_mv_idx
);
nmv_context_counts
*
counts
=
&
nmv_counts
[
nmv_ctx
];
const
MV
*
ref
=
&
pred_mvs
[
i
].
as_mv
;
#else
...
...
av1/encoder/rd.c
View file @
4306b6e5
...
...
@@ -335,10 +335,13 @@ static void set_block_thresholds(const AV1_COMMON *cm, RD_OPT *rd) {
}
#if CONFIG_REF_MV
void
av1_set_mvcost
(
MACROBLOCK
*
x
,
MV_REFERENCE_FRAME
ref_frame
)
{
void
av1_set_mvcost
(
MACROBLOCK
*
x
,
MV_REFERENCE_FRAME
ref_frame
,
int
ref
,
int
ref_mv_idx
)
{
MB_MODE_INFO_EXT
*
mbmi_ext
=
x
->
mbmi_ext
;
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
ref_frame
],
mbmi_ext
->
ref_mv_stack
[
ref_frame
]);
int8_t
rf_type
=
av1_ref_frame_type
(
x
->
e_mbd
.
mi
[
0
]
->
mbmi
.
ref_frame
);
int
nmv_ctx
=
av1_nmv_ctx
(
mbmi_ext
->
ref_mv_count
[
rf_type
],
mbmi_ext
->
ref_mv_stack
[
rf_type
],
ref
,
ref_mv_idx
);
(
void
)
ref_frame
;
x
->
mvcost
=
x
->
mv_cost_stack
[
nmv_ctx
];
x
->
nmvjointcost
=
x
->
nmv_vec_cost
[
nmv_ctx
];
x
->
mvsadcost
=
x
->
mvcost
;
...
...
av1/encoder/rd.h
View file @
4306b6e5
...
...
@@ -413,7 +413,8 @@ YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const struct AV1_COMP *cpi,
void
av1_init_me_luts
(
void
);
#if CONFIG_REF_MV
void
av1_set_mvcost
(
MACROBLOCK
*
x
,
MV_REFERENCE_FRAME
ref_frame
);
void
av1_set_mvcost
(
MACROBLOCK
*
x
,
MV_REFERENCE_FRAME
ref_frame
,
int
ref
,
int
ref_mv_idx
);
#endif
void
av1_get_entropy_contexts
(
BLOCK_SIZE
bsize
,
TX_SIZE
tx_size
,
...
...
av1/encoder/rdopt.c
View file @
4306b6e5
...
...
@@ -1664,7 +1664,7 @@ static void choose_tx_size_type_from_rd(AV1_COMP *cpi, MACROBLOCK *x, int *rate,
for (tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) {
#if CONFIG_REF_MV
if (
tx_type != DCT_DCT && is_inter && mbmi->ref_mv_idx > 0
) continue;
if (
mbmi->ref_mv_idx > 0 && tx_type != DCT_DCT
) continue;
#endif
rd = choose_tx_size_fix_type(cpi, bs, x, &r, &d, &s, &sse, ref_best_rd,
tx_type, prune);
...
...
@@ -4159,7 +4159,7 @@ static int set_and_cost_bmi_mvs(AV1_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd,
#if CONFIG_REF_MV
for (idx = 0; idx < 1 + is_compound; ++idx) {
this_mv[idx] = seg_mvs[mbmi->ref_frame[idx]];
av1_set_mvcost(x, mbmi->ref_frame[idx]);
av1_set_mvcost(x, mbmi->ref_frame[idx]
, idx, mbmi->ref_mv_idx
);
thismvcost +=
av1_mv_bit_cost(&this_mv[idx].as_mv, &best_ref_mv[idx]->as_mv,
x->nmvjointcost, x->mvcost, MV_COST_WEIGHT_SUB);
...
...
@@ -4264,8 +4264,11 @@ static int set_and_cost_bmi_mvs(AV1_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd,
#if CONFIG_REF_MV
if (mode == NEWMV) {
mic->bmi[i].pred_mv[0].as_int = best_ref_mv[0]->as_int;
if (is_compound) mic->bmi[i].pred_mv[1].as_int = best_ref_mv[1]->as_int;
mic->bmi[i].pred_mv[0].as_int =
mbmi_ext->ref_mvs[mbmi->ref_frame[0]][0].as_int;
if (is_compound)
mic->bmi[i].pred_mv[1].as_int =
mbmi_ext->ref_mvs[mbmi->ref_frame[1]][0].as_int;
} else {
mic->bmi[i].pred_mv[0].as_int = this_mv[0].as_int;
if (is_compound) mic->bmi[i].pred_mv[1].as_int = this_mv[1].as_int;
...
...
@@ -4703,7 +4706,7 @@ static void joint_motion_search(AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
best_mv->row >>= 3;
#if CONFIG_REF_MV
av1_set_mvcost(x, refs[id]);
av1_set_mvcost(x, refs[id]
, id, mbmi->ref_mv_idx
);
#endif
// Small-range full-pixel motion search.
...
...
@@ -4782,7 +4785,7 @@ static void joint_motion_search(AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
xd->plane[i].pre[ref] = backup_yv12[ref][i];
}
#if CONFIG_REF_MV
av1_set_mvcost(x, refs[ref]);
av1_set_mvcost(x, refs[ref]
, ref, mbmi->ref_mv_idx
);
#endif
#if CONFIG_EXT_INTER
if (bsize >= BLOCK_8X8)
...
...
@@ -5141,7 +5144,7 @@ static int64_t rd_pick_best_sub8x8_mode(
x->best_mv.as_int = x->second_best_mv.as_int = INVALID_MV;
#if CONFIG_REF_MV
av1_set_mvcost(x, mbmi->ref_frame[0]);
av1_set_mvcost(x, mbmi->ref_frame[0]
, 0, mbmi->ref_mv_idx
);
#endif
bestsme = av1_full_pixel_search(
cpi, x, bsize, &mvp_full, step_param, sadpb,
...
...
@@ -5820,10 +5823,6 @@ static void single_motion_search(AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
pred_mv[1] = x->mbmi_ext->ref_mvs[ref][1].as_mv;
pred_mv[2] = x->pred_mv[ref];
#if CONFIG_REF_MV
av1_set_mvcost(x, ref);
#endif
if (scaled_ref_frame) {
int i;
// Swap out the reference frame for a version that's been scaled to
...
...
@@ -5835,6 +5834,12 @@ static void single_motion_search(AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
av1_setup_pre_planes(xd, ref_idx, scaled_ref_frame, mi_row, mi_col, NULL);
}
av1_set_mv_search_range(x, &ref_mv);
#if CONFIG_REF_MV
av1_set_mvcost(x, ref, ref_idx, mbmi->ref_mv_idx);
#endif
// Work out the size of the first step in the mv step search.
// 0 here is maximum length first step. 1 is AOMMAX >> 1 etc.
if (cpi->sf.mv.auto_mv_step_size && cm->show_frame) {
...
...
@@ -6017,7 +6022,7 @@ static void single_motion_search_obmc(AV1_COMP *cpi, MACROBLOCK *x,
av1_get_scaled_ref_frame(cpi, ref);
#if CONFIG_REF_MV
av1_set_mvcost(x, ref);
av1_set_mvcost(x, ref
, ref_idx, mbmi->ref_mv_idx
);
#endif
if (scaled_ref_frame) {
...
...
@@ -6145,7 +6150,7 @@ static void do_masked_motion_search(AV1_COMP *cpi, MACROBLOCK *x,
pred_mv[2] = x->pred_mv[ref];
#if CONFIG_REF_MV
av1_set_mvcost(x, ref);
av1_set_mvcost(x, ref
, ref_idx, mbmi->ref_mv_idx
);
#endif
if (scaled_ref_frame) {
...
...
@@ -6791,13 +6796,13 @@ static int64_t handle_inter_mode(
single_newmv, &rate_mv, 0);
} else {
#if CONFIG_REF_MV
av1_set_mvcost(x, mbmi->ref_frame[0]);
av1_set_mvcost(x, mbmi->ref_frame[0]
, 0, mbmi->ref_mv_idx
);
#endif // CONFIG_REF_MV
rate_mv = av1_mv_bit_cost(&frame_mv[refs[0]].as_mv,
&x->mbmi_ext->ref_mvs[refs[0]][0].as_mv,
x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
#if CONFIG_REF_MV
av1_set_mvcost(x, mbmi->ref_frame[1]);
av1_set_mvcost(x, mbmi->ref_frame[1]
, 1, mbmi->ref_mv_idx
);
#endif // CONFIG_REF_MV
rate_mv += av1_mv_bit_cost(
&frame_mv[refs[1]].as_mv, &x->mbmi_ext->ref_mvs[refs[1]][0].as_mv,
...
...
@@ -6824,13 +6829,13 @@ static int64_t handle_inter_mode(
single_newmv, &rate_mv, 0);
} else {
#if CONFIG_REF_MV