Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
external
libvpx
Commits
e6c435b5
Commit
e6c435b5
authored
Aug 23, 2013
by
Dmitry Kovalev
Committed by
Gerrit Code Review
Aug 23, 2013
Browse files
Merge "Cleanup in mvref_common.{h, c}."
parents
7194da21
21d8e859
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
105 additions
and
131 deletions
+105
-131
vp9/common/vp9_findnearmv.c
vp9/common/vp9_findnearmv.c
+4
-9
vp9/common/vp9_mvref_common.c
vp9/common/vp9_mvref_common.c
+89
-100
vp9/common/vp9_mvref_common.h
vp9/common/vp9_mvref_common.h
+9
-16
vp9/decoder/vp9_decodemv.c
vp9/decoder/vp9_decodemv.c
+2
-4
vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_rdopt.c
+1
-2
No files found.
vp9/common/vp9_findnearmv.c
View file @
e6c435b5
...
...
@@ -8,8 +8,6 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <limits.h>
#include "vp9/common/vp9_findnearmv.h"
#include "vp9/common/vp9_mvref_common.h"
...
...
@@ -45,17 +43,14 @@ void vp9_append_sub8x8_mvs_for_idx(VP9_COMMON *cm, MACROBLOCKD *xd,
int
mi_row
,
int
mi_col
)
{
int_mv
dst_list
[
MAX_MV_REF_CANDIDATES
];
int_mv
mv_list
[
MAX_MV_REF_CANDIDATES
];
MODE_INFO
*
mi
=
xd
->
mode_info_context
;
MB_MODE_INFO
*
const
mbmi
=
&
mi
->
mbmi
;
MODE_INFO
*
const
mi
=
xd
->
mode_info_context
;
assert
(
ref_idx
==
0
||
ref_idx
==
1
);
assert
(
MAX_MV_REF_CANDIDATES
==
2
);
// makes code here slightly easier
vp9_find_mv_refs_idx
(
cm
,
xd
,
xd
->
mode_info_context
,
xd
->
prev_mode_info_context
,
mbmi
->
ref_frame
[
ref_idx
],
mv_list
,
cm
->
ref_frame_sign_bias
,
block_idx
,
mi_row
,
mi_col
);
vp9_find_mv_refs_idx
(
cm
,
xd
,
mi
,
xd
->
prev_mode_info_context
,
mi
->
mbmi
.
ref_frame
[
ref_idx
],
mv_list
,
block_idx
,
mi_row
,
mi_col
);
dst_list
[
1
].
as_int
=
0
;
if
(
block_idx
==
0
)
{
...
...
vp9/common/vp9_mvref_common.c
View file @
e6c435b5
...
...
@@ -121,10 +121,10 @@ static void clamp_mv_ref(MV *mv, const MACROBLOCKD *xd) {
static
INLINE
int_mv
get_sub_block_mv
(
const
MODE_INFO
*
candidate
,
int
check_sub_blocks
,
int
which_mv
,
int
search_col
,
int
block_idx
)
{
return
(
check_sub_blocks
&&
candidate
->
mbmi
.
sb_type
<
BLOCK_8X8
return
check_sub_blocks
&&
candidate
->
mbmi
.
sb_type
<
BLOCK_8X8
?
candidate
->
bmi
[
idx_n_column_to_subblock
[
block_idx
][
search_col
==
0
]]
.
as_mv
[
which_mv
]
:
candidate
->
mbmi
.
mv
[
which_mv
]
)
;
:
candidate
->
mbmi
.
mv
[
which_mv
];
}
...
...
@@ -144,54 +144,52 @@ static INLINE int_mv scale_mv(const MB_MODE_INFO *mbmi, int ref,
// already in the list. If it's the second motion vector it will also
// skip all additional processing and jump to done!
#define ADD_MV_REF_LIST(MV) \
if (refmv_count) { \
if ((MV).as_int != mv_ref_list[0].as_int) { \
mv_ref_list[refmv_count] = (MV); \
goto Done; \
do { \
if (refmv_count) { \
if ((MV).as_int != mv_ref_list[0].as_int) { \
mv_ref_list[refmv_count] = (MV); \
goto Done; \
} \
} else { \
mv_ref_list[refmv_count++] = (MV); \
} \
} else { \
mv_ref_list[refmv_count++] = (MV); \
}
} while (0)
// If either reference frame is different, not INTRA, and they
// are different from each other scale and add the mv to our list.
#define IF_DIFF_REF_FRAME_ADD_MV(CANDIDATE) \
if ((CANDIDATE)->ref_frame[0] != ref_frame) { \
ADD_MV_REF_LIST(scale_mv((CANDIDATE), 0, ref_frame, ref_sign_bias)); \
} \
if ((CANDIDATE)->ref_frame[1] != ref_frame && \
(CANDIDATE)->ref_frame[1] > INTRA_FRAME && \
(CANDIDATE)->mv[1].as_int != (CANDIDATE)->mv[0].as_int) { \
ADD_MV_REF_LIST(scale_mv((CANDIDATE), 1, ref_frame, ref_sign_bias)); \
}
do { \
if ((CANDIDATE)->ref_frame[0] != ref_frame) \
ADD_MV_REF_LIST(scale_mv((CANDIDATE), 0, ref_frame, ref_sign_bias)); \
if ((CANDIDATE)->ref_frame[1] != ref_frame && \
has_second_ref(CANDIDATE) && \
(CANDIDATE)->mv[1].as_int != (CANDIDATE)->mv[0].as_int) \
ADD_MV_REF_LIST(scale_mv((CANDIDATE), 1, ref_frame, ref_sign_bias)); \
} while (0)
// Checks that the given mi_row, mi_col and search point
// are inside the borders of the tile.
static
INLINE
int
is_inside
(
int
mi_col
,
int
mi_row
,
int
cur_tile_mi_col_start
,
int
cur_tile_mi_col_end
,
int
mi_rows
,
const
MV
*
mv_ref
)
{
return
!
(
mi_row
+
mv_ref
->
row
<
0
||
mi_col
+
mv_ref
->
col
<
cur_tile_mi_col_start
||
mi_row
+
mv_ref
->
row
>=
mi_rows
||
mi_col
+
mv_ref
->
col
>=
cur_tile_mi_col_end
);
static
INLINE
int
is_inside
(
const
VP9_COMMON
*
cm
,
int
mi_col
,
int
mi_row
,
const
MV
*
mv
)
{
return
!
(
mi_row
+
mv
->
row
<
0
||
mi_col
+
mv
->
col
<
cm
->
cur_tile_mi_col_start
||
mi_row
+
mv
->
row
>=
cm
->
mi_rows
||
mi_col
+
mv
->
col
>=
cm
->
cur_tile_mi_col_end
);
}
// This function searches the neighbourhood of a given MB/SB
// to try and find candidate reference vectors.
void
vp9_find_mv_refs_idx
(
VP9_COMMON
*
cm
,
MACROBLOCKD
*
xd
,
MODE_INFO
*
here
,
const
MODE_INFO
*
lf_here
,
const
MV_REFERENCE_FRAME
ref_frame
,
int_mv
*
mv_ref_list
,
const
int
*
ref_sign_bias
,
const
int
block_idx
,
const
int
mi_row
,
const
int
mi_col
)
{
int
idx
;
MB_MODE_INFO
*
mbmi
=
&
xd
->
mode_info_context
->
mbmi
;
int
refmv_count
=
0
;
const
MV
*
mv_ref_search
=
mv_ref_blocks
[
mbmi
->
sb_type
];
const
MODE_INFO
*
candidate
;
const
int
check_sub_blocks
=
block_idx
>=
0
;
void
vp9_find_mv_refs_idx
(
const
VP9_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
,
MODE_INFO
*
mi
,
const
MODE_INFO
*
prev_mi
,
MV_REFERENCE_FRAME
ref_frame
,
int_mv
*
mv_ref_list
,
int
block_idx
,
int
mi_row
,
int
mi_col
)
{
const
int
*
ref_sign_bias
=
cm
->
ref_frame_sign_bias
;
int
i
,
refmv_count
=
0
;
const
MV
*
const
mv_ref_search
=
mv_ref_blocks
[
mi
->
mbmi
.
sb_type
];
const
MB_MODE_INFO
*
const
prev_mbmi
=
prev_mi
?
&
prev_mi
->
mbmi
:
NULL
;
int
different_ref_found
=
0
;
int
context_counter
=
0
;
...
...
@@ -201,29 +199,27 @@ void vp9_find_mv_refs_idx(VP9_COMMON *cm, MACROBLOCKD *xd, MODE_INFO *here,
// The nearest 2 blocks are treated differently
// if the size < 8x8 we get the mv from the bmi substructure,
// and we also need to keep a mode count.
for
(
idx
=
0
;
idx
<
2
;
++
idx
)
{
const
MV
*
mv_ref
=
&
mv_ref_search
[
idx
];
if
(
!
is_inside
(
mi_col
,
mi_row
,
cm
->
cur_tile_mi_col_start
,
cm
->
cur_tile_mi_col_end
,
cm
->
mi_rows
,
mv_ref
))
continue
;
candidate
=
here
+
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
;
// Keep counts for entropy encoding.
context_counter
+=
mode_2_counter
[
candidate
->
mbmi
.
mode
];
// Check if the candidate comes from the same reference frame.
if
(
candidate
->
mbmi
.
ref_frame
[
0
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
get_sub_block_mv
(
candidate
,
check_sub_blocks
,
0
,
mv_ref
->
col
,
block_idx
));
different_ref_found
=
candidate
->
mbmi
.
ref_frame
[
1
]
!=
ref_frame
;
}
else
{
different_ref_found
=
1
;
if
(
candidate
->
mbmi
.
ref_frame
[
1
]
==
ref_frame
)
{
// Add second motion vector if it has the same ref_frame.
ADD_MV_REF_LIST
(
get_sub_block_mv
(
candidate
,
check_sub_blocks
,
1
,
for
(
i
=
0
;
i
<
2
;
++
i
)
{
const
MV
*
const
mv_ref
=
&
mv_ref_search
[
i
];
if
(
is_inside
(
cm
,
mi_col
,
mi_row
,
mv_ref
))
{
const
int
check_sub_blocks
=
block_idx
>=
0
;
const
MODE_INFO
*
const
candidate_mi
=
&
mi
[
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
];
const
MB_MODE_INFO
*
const
candidate
=
&
candidate_mi
->
mbmi
;
// Keep counts for entropy encoding.
context_counter
+=
mode_2_counter
[
candidate
->
mode
];
// Check if the candidate comes from the same reference frame.
if
(
candidate
->
ref_frame
[
0
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
get_sub_block_mv
(
candidate_mi
,
check_sub_blocks
,
0
,
mv_ref
->
col
,
block_idx
));
different_ref_found
=
candidate
->
ref_frame
[
1
]
!=
ref_frame
;
}
else
{
if
(
candidate
->
ref_frame
[
1
]
==
ref_frame
)
// Add second motion vector if it has the same ref_frame.
ADD_MV_REF_LIST
(
get_sub_block_mv
(
candidate_mi
,
check_sub_blocks
,
1
,
mv_ref
->
col
,
block_idx
));
different_ref_found
=
1
;
}
}
}
...
...
@@ -231,64 +227,57 @@ void vp9_find_mv_refs_idx(VP9_COMMON *cm, MACROBLOCKD *xd, MODE_INFO *here,
// Check the rest of the neighbors in much the same way
// as before except we don't need to keep track of sub blocks or
// mode counts.
for
(;
idx
<
MVREF_NEIGHBOURS
;
++
idx
)
{
const
MV
*
mv_ref
=
&
mv_ref_search
[
idx
];
if
(
!
is_inside
(
mi_col
,
mi_row
,
cm
->
cur_tile_mi_col_start
,
cm
->
cur_tile_mi_col_end
,
cm
->
mi_rows
,
mv_ref
))
continue
;
candidate
=
here
+
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
;
if
(
candidate
->
mbmi
.
ref_frame
[
0
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
candidate
->
mbmi
.
mv
[
0
]);
different_ref_found
=
candidate
->
mbmi
.
ref_frame
[
1
]
!=
ref_frame
;
}
else
{
different_ref_found
=
1
;
if
(
candidate
->
mbmi
.
ref_frame
[
1
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
candidate
->
mbmi
.
mv
[
1
]);
for
(;
i
<
MVREF_NEIGHBOURS
;
++
i
)
{
const
MV
*
const
mv_ref
=
&
mv_ref_search
[
i
];
if
(
is_inside
(
cm
,
mi_col
,
mi_row
,
mv_ref
))
{
const
MB_MODE_INFO
*
const
candidate
=
&
mi
[
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
].
mbmi
;
if
(
candidate
->
ref_frame
[
0
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
candidate
->
mv
[
0
]);
different_ref_found
=
candidate
->
ref_frame
[
1
]
!=
ref_frame
;
}
else
{
if
(
candidate
->
ref_frame
[
1
]
==
ref_frame
)
ADD_MV_REF_LIST
(
candidate
->
mv
[
1
]);
different_ref_found
=
1
;
}
}
}
// Check the last frame's mode and mv info.
if
(
lf_here
!=
NULL
)
{
if
(
lf_here
->
mbmi
.
ref_frame
[
0
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
lf_here
->
mbmi
.
mv
[
0
]);
}
else
if
(
lf_here
->
mbmi
.
ref_frame
[
1
]
==
ref_frame
)
{
ADD_MV_REF_LIST
(
lf_here
->
mbmi
.
mv
[
1
]);
}
if
(
prev_mbmi
)
{
if
(
prev_mbmi
->
ref_frame
[
0
]
==
ref_frame
)
ADD_MV_REF_LIST
(
prev_mbmi
->
mv
[
0
]);
else
if
(
prev_mbmi
->
ref_frame
[
1
]
==
ref_frame
)
ADD_MV_REF_LIST
(
prev_mbmi
->
mv
[
1
]);
}
// Since we couldn't find 2 mvs from the same reference frame
// go back through the neighbors and find motion vectors from
// different reference frames.
if
(
different_ref_found
)
{
for
(
idx
=
0
;
idx
<
MVREF_NEIGHBOURS
;
++
idx
)
{
const
MV
*
mv_ref
=
&
mv_ref_search
[
idx
];
if
(
!
is_inside
(
mi_col
,
mi_row
,
cm
->
cur_tile_mi_col_start
,
cm
->
cur_tile_mi_col_end
,
cm
->
mi_rows
,
mv_ref
))
continue
;
candidate
=
here
+
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
;
// If the candidate is INTRA we don't want to consider its mv.
if
(
!
is_inter_block
(
&
candidate
->
mbmi
))
continue
;
IF_DIFF_REF_FRAME_ADD_MV
(
&
candidate
->
mbmi
);
for
(
i
=
0
;
i
<
MVREF_NEIGHBOURS
;
++
i
)
{
const
MV
*
mv_ref
=
&
mv_ref_search
[
i
];
if
(
is_inside
(
cm
,
mi_col
,
mi_row
,
mv_ref
))
{
const
MB_MODE_INFO
*
const
candidate
=
&
mi
[
mv_ref
->
col
+
mv_ref
->
row
*
xd
->
mode_info_stride
].
mbmi
;
// If the candidate is INTRA we don't want to consider its mv.
if
(
is_inter_block
(
candidate
))
IF_DIFF_REF_FRAME_ADD_MV
(
candidate
);
}
}
}
// Since we still don't have a candidate we'll try the last frame.
if
(
lf_here
!=
NULL
&&
is_inter_block
(
&
lf_here
->
mbmi
))
{
IF_DIFF_REF_FRAME_ADD_MV
(
&
lf_here
->
mbmi
);
}
if
(
prev_mbmi
&&
is_inter_block
(
prev_mbmi
))
IF_DIFF_REF_FRAME_ADD_MV
(
prev_mbmi
);
Done:
mbmi
->
mode_context
[
ref_frame
]
=
counter_to_context
[
context_counter
];
mi
->
mbmi
.
mode_context
[
ref_frame
]
=
counter_to_context
[
context_counter
];
// Clamp vectors
for
(
i
dx
=
0
;
i
dx
<
MAX_MV_REF_CANDIDATES
;
++
i
dx
)
clamp_mv_ref
(
&
mv_ref_list
[
i
dx
].
as_mv
,
xd
);
for
(
i
=
0
;
i
<
MAX_MV_REF_CANDIDATES
;
++
i
)
clamp_mv_ref
(
&
mv_ref_list
[
i
].
as_mv
,
xd
);
}
vp9/common/vp9_mvref_common.h
View file @
e6c435b5
...
...
@@ -14,27 +14,20 @@
#ifndef VP9_COMMON_VP9_MVREF_COMMON_H_
#define VP9_COMMON_VP9_MVREF_COMMON_H_
void
vp9_find_mv_refs_idx
(
VP9_COMMON
*
cm
,
MACROBLOCKD
*
xd
,
MODE_INFO
*
here
,
const
MODE_INFO
*
lf_here
,
const
MV_REFERENCE_FRAME
ref_frame
,
void
vp9_find_mv_refs_idx
(
const
VP9_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
,
MODE_INFO
*
mi
,
const
MODE_INFO
*
prev_mi
,
MV_REFERENCE_FRAME
ref_frame
,
int_mv
*
mv_ref_list
,
const
int
*
ref_sign_bias
,
const
int
block_idx
,
const
int
mi_row
,
const
int
mi_col
);
int
block_idx
,
int
mi_row
,
int
mi_col
);
static
INLINE
void
vp9_find_mv_refs
(
VP9_COMMON
*
cm
,
MACROBLOCKD
*
xd
,
MODE_INFO
*
here
,
MODE_INFO
*
lf_here
,
static
INLINE
void
vp9_find_mv_refs
(
const
VP9_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
,
MODE_INFO
*
mi
,
const
MODE_INFO
*
prev_mi
,
MV_REFERENCE_FRAME
ref_frame
,
int_mv
*
mv_ref_list
,
int
*
ref_sign_bias
,
int
mi_row
,
int
mi_col
)
{
vp9_find_mv_refs_idx
(
cm
,
xd
,
here
,
lf_here
,
ref_frame
,
mv_ref_list
,
ref_sign_bias
,
-
1
,
mi_row
,
mi_col
);
vp9_find_mv_refs_idx
(
cm
,
xd
,
mi
,
prev_mi
,
ref_frame
,
mv_ref_list
,
-
1
,
mi_row
,
mi_col
);
}
#endif // VP9_COMMON_VP9_MVREF_COMMON_H_
vp9/decoder/vp9_decodemv.c
View file @
e6c435b5
...
...
@@ -454,8 +454,7 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi,
is_compound
=
ref1
>
INTRA_FRAME
;
vp9_find_mv_refs
(
cm
,
xd
,
mi
,
xd
->
prev_mode_info_context
,
ref0
,
mbmi
->
ref_mvs
[
ref0
],
cm
->
ref_frame_sign_bias
,
mi_row
,
mi_col
);
ref0
,
mbmi
->
ref_mvs
[
ref0
],
mi_row
,
mi_col
);
inter_mode_ctx
=
mbmi
->
mode_context
[
ref0
];
...
...
@@ -478,8 +477,7 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi,
if
(
is_compound
)
{
vp9_find_mv_refs
(
cm
,
xd
,
mi
,
xd
->
prev_mode_info_context
,
ref1
,
mbmi
->
ref_mvs
[
ref1
],
cm
->
ref_frame_sign_bias
,
mi_row
,
mi_col
);
ref1
,
mbmi
->
ref_mvs
[
ref1
],
mi_row
,
mi_col
);
if
(
bsize
<
BLOCK_8X8
||
mbmi
->
mode
!=
ZEROMV
)
{
vp9_find_best_ref_mvs
(
xd
,
mbmi
->
ref_mvs
[
ref1
],
...
...
vp9/encoder/vp9_rdopt.c
View file @
e6c435b5
...
...
@@ -2273,8 +2273,7 @@ static void setup_buffer_inter(VP9_COMP *cpi, MACROBLOCK *x,
vp9_find_mv_refs
(
&
cpi
->
common
,
xd
,
xd
->
mode_info_context
,
xd
->
prev_mode_info_context
,
frame_type
,
mbmi
->
ref_mvs
[
frame_type
],
cpi
->
common
.
ref_frame_sign_bias
,
mi_row
,
mi_col
);
mbmi
->
ref_mvs
[
frame_type
],
mi_row
,
mi_col
);
// Candidate refinement carried out at encoder and decoder
vp9_find_best_ref_mvs
(
xd
,
...
...
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