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
c3941665
Commit
c3941665
authored
Jan 05, 2013
by
Ronald S. Bultje
Browse files
64x64 blocksize support.
3.2% gains on std/hd, 1.0% gains on hd. Change-Id: I481d5df23d8a4fc650a5bcba956554490b2bd200
parent
81d1171f
Changes
27
Expand all
Hide whitespace changes
Inline
Side-by-side
configure
View file @
c3941665
...
...
@@ -240,6 +240,7 @@ EXPERIMENT_LIST="
csm
comp_intra_pred
superblocks
superblocks64
pred_filter
lossless
subpelrefmv
...
...
vp9/common/vp9_blockd.h
View file @
c3941665
...
...
@@ -226,6 +226,16 @@ typedef enum {
MAX_REF_FRAMES
=
4
}
MV_REFERENCE_FRAME
;
#if CONFIG_SUPERBLOCKS
typedef
enum
{
BLOCK_SIZE_MB16X16
=
0
,
BLOCK_SIZE_SB32X32
=
1
,
#if CONFIG_SUPERBLOCKS64
BLOCK_SIZE_SB64X64
=
2
,
#endif
}
BLOCK_SIZE_TYPE
;
#endif
typedef
struct
{
MB_PREDICTION_MODE
mode
,
uv_mode
;
#if CONFIG_COMP_INTRA_PRED
...
...
@@ -268,8 +278,8 @@ typedef struct {
#if CONFIG_SUPERBLOCKS
// FIXME need a SB array of 4 MB_MODE_INFOs that
// only needs one
encoded_as_sb
.
unsigned
char
encoded_as_sb
;
// only needs one
sb_type
.
BLOCK_SIZE_TYPE
sb_type
;
#endif
}
MB_MODE_INFO
;
...
...
@@ -415,6 +425,7 @@ typedef struct macroblockd {
DECLARE_ALIGNED
(
32
,
uint8_t
,
y_buf
[
22
*
32
]);
#endif
int
sb_index
;
int
mb_index
;
// Index of the MB in the SB (0..3)
int
q_index
;
...
...
@@ -519,7 +530,7 @@ static TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, const BLOCKD *b) {
return
tx_type
;
#if CONFIG_SUPERBLOCKS
// TODO(rbultje, debargha): Explore ADST usage for superblocks
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
return
tx_type
;
#endif
if
(
xd
->
mode_info_context
->
mbmi
.
mode
==
B_PRED
&&
...
...
@@ -576,7 +587,7 @@ static TX_TYPE get_tx_type_8x8(const MACROBLOCKD *xd, const BLOCKD *b) {
return
tx_type
;
#if CONFIG_SUPERBLOCKS
// TODO(rbultje, debargha): Explore ADST usage for superblocks
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
return
tx_type
;
#endif
if
(
xd
->
mode_info_context
->
mbmi
.
mode
==
I8X8_PRED
&&
...
...
@@ -611,7 +622,7 @@ static TX_TYPE get_tx_type_16x16(const MACROBLOCKD *xd, const BLOCKD *b) {
return
tx_type
;
#if CONFIG_SUPERBLOCKS
// TODO(rbultje, debargha): Explore ADST usage for superblocks
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
return
tx_type
;
#endif
if
(
xd
->
mode_info_context
->
mbmi
.
mode
<
I8X8_PRED
&&
...
...
vp9/common/vp9_common.h
View file @
c3941665
...
...
@@ -21,6 +21,9 @@
#define TRUE 1
#define FALSE 0
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
/* Only need this for fixed-size arrays, for structs just assign. */
#define vp9_copy(Dest, Src) { \
...
...
vp9/common/vp9_findnearmv.c
View file @
c3941665
...
...
@@ -191,7 +191,7 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
above_src
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB32X32
)
{
vp9_sub_pixel_variance16x2_c
(
above_ref
+
offset
+
16
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
...
...
@@ -199,6 +199,22 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
above_src
+
16
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
}
#if CONFIG_SUPERBLOCKS64
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB64X64
)
{
vp9_sub_pixel_variance16x2_c
(
above_ref
+
offset
+
32
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
SP
(
this_mv
.
as_mv
.
row
),
above_src
+
32
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
vp9_sub_pixel_variance16x2_c
(
above_ref
+
offset
+
48
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
SP
(
this_mv
.
as_mv
.
row
),
above_src
+
48
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
}
#endif
#endif
}
if
(
xd
->
left_available
)
{
...
...
@@ -208,7 +224,7 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
left_src
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB32X32
)
{
vp9_sub_pixel_variance2x16_c
(
left_ref
+
offset
+
ref_y_stride
*
16
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
...
...
@@ -217,6 +233,24 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
}
#if CONFIG_SUPERBLOCKS64
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB64X64
)
{
vp9_sub_pixel_variance2x16_c
(
left_ref
+
offset
+
ref_y_stride
*
32
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
SP
(
this_mv
.
as_mv
.
row
),
left_src
+
xd
->
dst
.
y_stride
*
32
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
vp9_sub_pixel_variance2x16_c
(
left_ref
+
offset
+
ref_y_stride
*
48
,
ref_y_stride
,
SP
(
this_mv
.
as_mv
.
col
),
SP
(
this_mv
.
as_mv
.
row
),
left_src
+
xd
->
dst
.
y_stride
*
48
,
xd
->
dst
.
y_stride
,
&
sse
);
score
+=
sse
;
}
#endif
#endif
}
#else
...
...
@@ -230,22 +264,42 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
score
+=
vp9_sad16x3
(
above_src
,
xd
->
dst
.
y_stride
,
above_ref
+
offset
,
ref_y_stride
);
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB32X32
)
{
score
+=
vp9_sad16x3
(
above_src
+
16
,
xd
->
dst
.
y_stride
,
above_ref
+
offset
+
16
,
ref_y_stride
);
}
#if CONFIG_SUPERBLOCKS64
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB64X64
)
{
score
+=
vp9_sad16x3
(
above_src
+
32
,
xd
->
dst
.
y_stride
,
above_ref
+
offset
+
32
,
ref_y_stride
);
score
+=
vp9_sad16x3
(
above_src
+
48
,
xd
->
dst
.
y_stride
,
above_ref
+
offset
+
48
,
ref_y_stride
);
}
#endif
#endif
}
if
(
xd
->
left_available
)
{
score
+=
vp9_sad3x16
(
left_src
,
xd
->
dst
.
y_stride
,
left_ref
+
offset
,
ref_y_stride
);
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB32X32
)
{
score
+=
vp9_sad3x16
(
left_src
+
xd
->
dst
.
y_stride
*
16
,
xd
->
dst
.
y_stride
,
left_ref
+
offset
+
ref_y_stride
*
16
,
ref_y_stride
);
}
#if CONFIG_SUPERBLOCKS64
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
>=
BLOCK_SIZE_SB64X64
)
{
score
+=
vp9_sad3x16
(
left_src
+
xd
->
dst
.
y_stride
*
32
,
xd
->
dst
.
y_stride
,
left_ref
+
offset
+
ref_y_stride
*
32
,
ref_y_stride
);
score
+=
vp9_sad3x16
(
left_src
+
xd
->
dst
.
y_stride
*
48
,
xd
->
dst
.
y_stride
,
left_ref
+
offset
+
ref_y_stride
*
48
,
ref_y_stride
);
}
#endif
#endif
}
#endif
...
...
vp9/common/vp9_loopfilter.c
View file @
c3941665
...
...
@@ -228,7 +228,7 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, MACROBLOCKD *xd) {
if
(
mb_col
>
0
#if CONFIG_SUPERBLOCKS
&&
!
((
mb_col
&
1
)
&&
mode_info_context
->
mbmi
.
encoded_as_sb
&&
&&
!
((
mb_col
&
1
)
&&
mode_info_context
->
mbmi
.
sb_type
&&
((
mode_info_context
[
0
].
mbmi
.
mb_skip_coeff
&&
mode_info_context
[
-
1
].
mbmi
.
mb_skip_coeff
)
#if CONFIG_TX32X32
...
...
@@ -253,7 +253,7 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, MACROBLOCKD *xd) {
/* don't apply across umv border */
if
(
mb_row
>
0
#if CONFIG_SUPERBLOCKS
&&
!
((
mb_row
&
1
)
&&
mode_info_context
->
mbmi
.
encoded_as_sb
&&
&&
!
((
mb_row
&
1
)
&&
mode_info_context
->
mbmi
.
sb_type
&&
((
mode_info_context
[
0
].
mbmi
.
mb_skip_coeff
&&
mode_info_context
[
-
mis
].
mbmi
.
mb_skip_coeff
)
#if CONFIG_TX32X32
...
...
@@ -277,7 +277,7 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, MACROBLOCKD *xd) {
// FIXME: Not 8x8 aware
if
(
mb_col
>
0
#if CONFIG_SUPERBLOCKS
&&
!
((
mb_col
&
1
)
&&
mode_info_context
->
mbmi
.
encoded_as_sb
&&
&&
!
((
mb_col
&
1
)
&&
mode_info_context
->
mbmi
.
sb_type
&&
mode_info_context
[
0
].
mbmi
.
mb_skip_coeff
&&
mode_info_context
[
-
1
].
mbmi
.
mb_skip_coeff
)
#endif
...
...
@@ -292,7 +292,7 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, MACROBLOCKD *xd) {
/* don't apply across umv border */
if
(
mb_row
>
0
#if CONFIG_SUPERBLOCKS
&&
!
((
mb_row
&
1
)
&&
mode_info_context
->
mbmi
.
encoded_as_sb
&&
&&
!
((
mb_row
&
1
)
&&
mode_info_context
->
mbmi
.
sb_type
&&
mode_info_context
[
0
].
mbmi
.
mb_skip_coeff
&&
mode_info_context
[
-
cm
->
mode_info_stride
].
mbmi
.
mb_skip_coeff
)
#endif
...
...
vp9/common/vp9_mvref_common.c
View file @
c3941665
...
...
@@ -237,7 +237,7 @@ void vp9_find_mv_refs(
vpx_memset
(
candidate_scores
,
0
,
sizeof
(
candidate_scores
));
#if CONFIG_SUPERBLOCKS
if
(
mbmi
->
encoded_as_sb
)
{
if
(
mbmi
->
sb_type
)
{
mv_ref_search
=
sb_mv_ref_search
;
ref_distance_weight
=
sb_ref_distance_weight
;
}
else
{
...
...
vp9/common/vp9_onyxc_int.h
View file @
c3941665
...
...
@@ -229,7 +229,7 @@ typedef struct VP9Common {
/* Y,U,V,Y2 */
ENTROPY_CONTEXT_PLANES
*
above_context
;
/* row of context for each plane */
ENTROPY_CONTEXT_PLANES
left_context
[
2
];
/* (up to) 4 contexts "" */
ENTROPY_CONTEXT_PLANES
left_context
[
4
];
/* (up to) 4 contexts "" */
/* keyframe block modes are predicted by their above, left neighbors */
...
...
@@ -248,7 +248,10 @@ typedef struct VP9Common {
vp9_prob
prob_last_coded
;
vp9_prob
prob_gf_coded
;
#if CONFIG_SUPERBLOCKS
vp9_prob
sb_coded
;
vp9_prob
sb32_coded
;
#if CONFIG_SUPERBLOCKS64
vp9_prob
sb64_coded
;
#endif // CONFIG_SUPERBLOCKS64
#endif
// Context probabilities when using predictive coding of segment id
...
...
vp9/common/vp9_pred_common.c
View file @
c3941665
...
...
@@ -9,6 +9,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include "vp9/common/vp9_common.h"
#include "vp9/common/vp9_pred_common.h"
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_treecoder.h"
...
...
@@ -230,13 +231,18 @@ void vp9_set_pred_flag(MACROBLOCKD *const xd,
case
PRED_SEG_ID
:
xd
->
mode_info_context
->
mbmi
.
seg_id_predicted
=
pred_flag
;
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
1
].
mbmi
.
seg_id_predicted
=
pred_flag
;
if
(
xd
->
mb_to_bottom_edge
>=
0
)
{
xd
->
mode_info_context
[
mis
].
mbmi
.
seg_id_predicted
=
pred_flag
;
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
mis
+
1
].
mbmi
.
seg_id_predicted
=
pred_flag
;
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
{
#define sub(a, b) (b) < 0 ? (a) + (b) : (a)
const
int
n_mbs
=
1
<<
xd
->
mode_info_context
->
mbmi
.
sb_type
;
const
int
x_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_right_edge
>>
7
);
const
int
y_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_bottom_edge
>>
7
);
int
x
,
y
;
for
(
y
=
0
;
y
<
y_mbs
;
y
++
)
{
for
(
x
=
!
y
;
x
<
x_mbs
;
x
++
)
{
xd
->
mode_info_context
[
y
*
mis
+
x
].
mbmi
.
seg_id_predicted
=
pred_flag
;
}
}
}
#endif
...
...
@@ -245,13 +251,16 @@ void vp9_set_pred_flag(MACROBLOCKD *const xd,
case
PRED_REF
:
xd
->
mode_info_context
->
mbmi
.
ref_predicted
=
pred_flag
;
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
1
].
mbmi
.
ref_predicted
=
pred_flag
;
if
(
xd
->
mb_to_bottom_edge
>=
0
)
{
xd
->
mode_info_context
[
mis
].
mbmi
.
ref_predicted
=
pred_flag
;
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
mis
+
1
].
mbmi
.
ref_predicted
=
pred_flag
;
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
{
const
int
n_mbs
=
1
<<
xd
->
mode_info_context
->
mbmi
.
sb_type
;
const
int
x_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_right_edge
>>
7
);
const
int
y_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_bottom_edge
>>
7
);
int
x
,
y
;
for
(
y
=
0
;
y
<
y_mbs
;
y
++
)
{
for
(
x
=
!
y
;
x
<
x_mbs
;
x
++
)
{
xd
->
mode_info_context
[
y
*
mis
+
x
].
mbmi
.
ref_predicted
=
pred_flag
;
}
}
}
#endif
...
...
@@ -260,13 +269,16 @@ void vp9_set_pred_flag(MACROBLOCKD *const xd,
case
PRED_MBSKIP
:
xd
->
mode_info_context
->
mbmi
.
mb_skip_coeff
=
pred_flag
;
#if CONFIG_SUPERBLOCKS
if
(
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
1
].
mbmi
.
mb_skip_coeff
=
pred_flag
;
if
(
xd
->
mb_to_bottom_edge
>=
0
)
{
xd
->
mode_info_context
[
mis
].
mbmi
.
mb_skip_coeff
=
pred_flag
;
if
(
xd
->
mb_to_right_edge
>=
0
)
xd
->
mode_info_context
[
mis
+
1
].
mbmi
.
mb_skip_coeff
=
pred_flag
;
if
(
xd
->
mode_info_context
->
mbmi
.
sb_type
)
{
const
int
n_mbs
=
1
<<
xd
->
mode_info_context
->
mbmi
.
sb_type
;
const
int
x_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_right_edge
>>
7
);
const
int
y_mbs
=
sub
(
n_mbs
,
xd
->
mb_to_bottom_edge
>>
7
);
int
x
,
y
;
for
(
y
=
0
;
y
<
y_mbs
;
y
++
)
{
for
(
x
=
!
y
;
x
<
x_mbs
;
x
++
)
{
xd
->
mode_info_context
[
y
*
mis
+
x
].
mbmi
.
mb_skip_coeff
=
pred_flag
;
}
}
}
#endif
...
...
@@ -288,21 +300,25 @@ unsigned char vp9_get_pred_mb_segid(const VP9_COMMON *const cm,
// Currently the prediction for the macroblock segment ID is
// the value stored for this macroblock in the previous frame.
#if CONFIG_SUPERBLOCKS
if
(
!
xd
->
mode_info_context
->
mbmi
.
encoded_as_sb
)
{
if
(
!
xd
->
mode_info_context
->
mbmi
.
sb_type
)
{
#endif
return
cm
->
last_frame_seg_map
[
MbIndex
];
#if CONFIG_SUPERBLOCKS
}
else
{
int
seg_id
=
cm
->
last_frame_seg_map
[
MbIndex
];
int
mb_col
=
MbIndex
%
cm
->
mb_cols
;
int
mb_row
=
MbIndex
/
cm
->
mb_cols
;
if
(
mb_col
+
1
<
cm
->
mb_cols
)
seg_id
=
seg_id
&&
cm
->
last_frame_seg_map
[
MbIndex
+
1
];
if
(
mb_row
+
1
<
cm
->
mb_rows
)
{
seg_id
=
seg_id
&&
cm
->
last_frame_seg_map
[
MbIndex
+
cm
->
mb_cols
];
if
(
mb_col
+
1
<
cm
->
mb_cols
)
seg_id
=
seg_id
&&
cm
->
last_frame_seg_map
[
MbIndex
+
cm
->
mb_cols
+
1
];
const
int
n_mbs
=
1
<<
xd
->
mode_info_context
->
mbmi
.
sb_type
;
const
int
mb_col
=
MbIndex
%
cm
->
mb_cols
;
const
int
mb_row
=
MbIndex
/
cm
->
mb_cols
;
const
int
x_mbs
=
MIN
(
n_mbs
,
cm
->
mb_cols
-
mb_col
);
const
int
y_mbs
=
MIN
(
n_mbs
,
cm
->
mb_rows
-
mb_row
);
int
x
,
y
;
unsigned
seg_id
=
-
1
;
for
(
y
=
mb_row
;
y
<
mb_row
+
y_mbs
;
y
++
)
{
for
(
x
=
mb_col
;
x
<
mb_col
+
x_mbs
;
x
++
)
{
seg_id
=
MIN
(
seg_id
,
cm
->
last_frame_seg_map
[
cm
->
mb_cols
*
y
+
x
]);
}
}
return
seg_id
;
}
#endif
...
...
vp9/common/vp9_reconinter.c
View file @
c3941665
...
...
@@ -780,6 +780,70 @@ void vp9_build_inter32x32_predictors_sb(MACROBLOCKD *x,
}
#endif
}
void
vp9_build_inter64x64_predictors_sb
(
MACROBLOCKD
*
x
,
uint8_t
*
dst_y
,
uint8_t
*
dst_u
,
uint8_t
*
dst_v
,
int
dst_ystride
,
int
dst_uvstride
)
{
uint8_t
*
y1
=
x
->
pre
.
y_buffer
,
*
u1
=
x
->
pre
.
u_buffer
,
*
v1
=
x
->
pre
.
v_buffer
;
uint8_t
*
y2
=
x
->
second_pre
.
y_buffer
,
*
u2
=
x
->
second_pre
.
u_buffer
,
*
v2
=
x
->
second_pre
.
v_buffer
;
int
edge
[
4
],
n
;
edge
[
0
]
=
x
->
mb_to_top_edge
;
edge
[
1
]
=
x
->
mb_to_bottom_edge
;
edge
[
2
]
=
x
->
mb_to_left_edge
;
edge
[
3
]
=
x
->
mb_to_right_edge
;
for
(
n
=
0
;
n
<
4
;
n
++
)
{
const
int
x_idx
=
n
&
1
,
y_idx
=
n
>>
1
;
x
->
mb_to_top_edge
=
edge
[
0
]
-
((
y_idx
*
32
)
<<
3
);
x
->
mb_to_bottom_edge
=
edge
[
1
]
+
(((
1
-
y_idx
)
*
32
)
<<
3
);
x
->
mb_to_left_edge
=
edge
[
2
]
-
((
x_idx
*
32
)
<<
3
);
x
->
mb_to_right_edge
=
edge
[
3
]
+
(((
1
-
x_idx
)
*
32
)
<<
3
);
x
->
pre
.
y_buffer
=
y1
+
y_idx
*
32
*
x
->
pre
.
y_stride
+
x_idx
*
32
;
x
->
pre
.
u_buffer
=
u1
+
y_idx
*
16
*
x
->
pre
.
uv_stride
+
x_idx
*
16
;
x
->
pre
.
v_buffer
=
v1
+
y_idx
*
16
*
x
->
pre
.
uv_stride
+
x_idx
*
16
;
if
(
x
->
mode_info_context
->
mbmi
.
second_ref_frame
>
0
)
{
x
->
second_pre
.
y_buffer
=
y2
+
y_idx
*
32
*
x
->
pre
.
y_stride
+
x_idx
*
32
;
x
->
second_pre
.
u_buffer
=
u2
+
y_idx
*
16
*
x
->
pre
.
uv_stride
+
x_idx
*
16
;
x
->
second_pre
.
v_buffer
=
v2
+
y_idx
*
16
*
x
->
pre
.
uv_stride
+
x_idx
*
16
;
}
vp9_build_inter32x32_predictors_sb
(
x
,
dst_y
+
y_idx
*
32
*
dst_ystride
+
x_idx
*
32
,
dst_u
+
y_idx
*
16
*
dst_uvstride
+
x_idx
*
16
,
dst_v
+
y_idx
*
16
*
dst_uvstride
+
x_idx
*
16
,
dst_ystride
,
dst_uvstride
);
}
x
->
mb_to_top_edge
=
edge
[
0
];
x
->
mb_to_bottom_edge
=
edge
[
1
];
x
->
mb_to_left_edge
=
edge
[
2
];
x
->
mb_to_right_edge
=
edge
[
3
];
x
->
pre
.
y_buffer
=
y1
;
x
->
pre
.
u_buffer
=
u1
;
x
->
pre
.
v_buffer
=
v1
;
if
(
x
->
mode_info_context
->
mbmi
.
second_ref_frame
>
0
)
{
x
->
second_pre
.
y_buffer
=
y2
;
x
->
second_pre
.
u_buffer
=
u2
;
x
->
second_pre
.
v_buffer
=
v2
;
}
#if CONFIG_COMP_INTERINTRA_PRED
if
(
x
->
mode_info_context
->
mbmi
.
second_ref_frame
==
INTRA_FRAME
)
{
vp9_build_interintra_64x64_predictors_sb
(
x
,
dst_y
,
dst_u
,
dst_v
,
dst_ystride
,
dst_uvstride
);
}
#endif
}
#endif
/*
...
...
vp9/common/vp9_reconinter.h
View file @
c3941665
...
...
@@ -54,6 +54,13 @@ extern void vp9_build_inter32x32_predictors_sb(MACROBLOCKD *x,
uint8_t
*
dst_v
,
int
dst_ystride
,
int
dst_uvstride
);
extern
void
vp9_build_inter64x64_predictors_sb
(
MACROBLOCKD
*
x
,
uint8_t
*
dst_y
,
uint8_t
*
dst_u
,
uint8_t
*
dst_v
,
int
dst_ystride
,
int
dst_uvstride
);
#endif
extern
void
vp9_build_inter_predictors_mb
(
MACROBLOCKD
*
xd
);
...
...
vp9/common/vp9_reconintra.c
View file @
c3941665
...
...
@@ -254,7 +254,7 @@ void vp9_build_intra_predictors_internal(uint8_t *src, int src_stride,
int
up_available
,
int
left_available
)
{
uint8_t
*
yabove_row
=
src
-
src_stride
;
uint8_t
yleft_col
[
32
];
uint8_t
yleft_col
[
64
];
uint8_t
ytop_left
=
yabove_row
[
-
1
];
int
r
,
c
,
i
;
...
...
@@ -271,15 +271,19 @@ void vp9_build_intra_predictors_internal(uint8_t *src, int src_stride,
int
average
=
0
;
int
log2_bsize_minus_1
;
assert
(
bsize
==
4
||
bsize
==
8
||
bsize
==
16
||
bsize
==
32
);
assert
(
bsize
==
4
||
bsize
==
8
||
bsize
==
16
||
bsize
==
32
||
bsize
==
64
);
if
(
bsize
==
4
)
{
log2_bsize_minus_1
=
1
;
}
else
if
(
bsize
==
8
)
{
log2_bsize_minus_1
=
2
;
}
else
if
(
bsize
==
16
)
{
log2_bsize_minus_1
=
3
;
}
else
/*
bsize == 32
*/
{
}
else
if
(
bsize
==
32
)
{
log2_bsize_minus_1
=
4
;
}
else
{
assert
(
bsize
==
64
);
log2_bsize_minus_1
=
5
;
}
if
(
up_available
||
left_available
)
{
...
...
@@ -517,16 +521,17 @@ static void combine_interintra(MB_PREDICTION_MODE mode,
71
,
70
,
70
,
70
,
69
,
69
,
69
,
68
,
68
,
68
,
68
,
68
,
67
,
67
,
67
,
67
,
};
int
size_scale
=
(
size
=
=
32
?
1
:
int
size_scale
=
(
size
>
=
32
?
1
:
size
==
16
?
2
:
size
==
8
?
4
:
8
);
int
size_shift
=
size
==
64
?
1
:
0
;
int
i
,
j
;
switch
(
mode
)
{
case
V_PRED
:
for
(
i
=
0
;
i
<
size
;
++
i
)
{
for
(
j
=
0
;
j
<
size
;
++
j
)
{
int
k
=
i
*
interstride
+
j
;
int
scale
=
weights1d
[
i
*
size_scale
];
int
scale
=
weights1d
[
i
*
size_scale
>>
size_shift
];
interpred
[
k
]
=
((
scale_max
-
scale
)
*
interpred
[
k
]
+
scale
*
intrapred
[
i
*
intrastride
+
j
]
+
scale_round
)
...
...
@@ -539,7 +544,7 @@ static void combine_interintra(MB_PREDICTION_MODE mode,
for
(
i
=
0
;
i
<
size
;
++
i
)
{
for
(
j
=
0
;
j
<
size
;
++
j
)
{
int
k
=
i
*
interstride
+
j
;
int
scale
=
weights1d
[
j
*
size_scale
];
int
scale
=
weights1d
[
j
*
size_scale
>>
size_shift
];
interpred
[
k
]
=
((
scale_max
-
scale
)
*
interpred
[
k
]
+
scale
*
intrapred
[
i
*
intrastride
+
j
]
+
scale_round
)
...
...
@@ -553,8 +558,9 @@ static void combine_interintra(MB_PREDICTION_MODE mode,
for
(
i
=
0
;
i
<
size
;
++
i
)
{
for
(
j
=
0
;
j
<
size
;
++
j
)
{
int
k
=
i
*
interstride
+
j
;
int
scale
=
(
weights2d
[
i
*
size_scale
*
32
+
j
*
size_scale
]
+
weights1d
[
i
*
size_scale
])
>>
1
;
int
scale
=
(
weights2d
[(
i
*
size_scale
*
32
+
j
*
size_scale
)
>>
size_shift
]
+
weights1d
[
i
*
size_scale
>>
size_shift
])
>>
1
;
interpred
[
k
]
=
((
scale_max
-
scale
)
*
interpred
[
k
]
+
scale
*
intrapred
[
i
*
intrastride
+
j
]
+
scale_round
)
...
...
@@ -568,8 +574,9 @@ static void combine_interintra(MB_PREDICTION_MODE mode,
for
(
i
=
0
;
i
<
size
;
++
i
)
{
for
(
j
=
0
;
j
<
size
;
++
j
)
{
int
k
=
i
*
interstride
+
j
;
int
scale
=
(
weights2d
[
i
*
size_scale
*
32
+
j
*
size_scale
]
+
weights1d
[
j
*
size_scale
])
>>
1
;
int
scale
=
(
weights2d
[(
i
*
size_scale
*
32
+
j
*
size_scale
)
>>
size_shift
]
+
weights1d
[
j
*
size_scale
>>
size_shift
])
>>
1
;
interpred
[
k
]
=
((
scale_max
-
scale
)
*
interpred
[
k
]
+
scale
*
intrapred
[
i
*
intrastride
+
j
]
+
scale_round
)
...
...
@@ -582,7 +589,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode,
for
(
i
=
0
;
i
<
size
;
++
i
)
{
for
(
j
=
0
;
j
<
size
;
++
j
)
{
int
k
=
i
*
interstride
+
j
;
int
scale
=
weights2d
[
i
*
size_scale
*
32
+
j
*
size_scale
];
int
scale
=
weights2d
[(
i
*
size_scale
*
32
+
j
*
size_scale
)
>>
size_shift
];
interpred
[
k
]
=
((
scale_max
-
scale
)
*
interpred
[
k
]
+
scale
*
intrapred
[
i
*
intrastride
+
j
]
+
scale_round
)
...
...
@@ -695,6 +703,47 @@ void vp9_build_interintra_32x32_predictors_sb(MACROBLOCKD *xd,
vp9_build_interintra_32x32_predictors_sby
(
xd
,
ypred
,
ystride
);
vp9_build_interintra_32x32_predictors_sbuv
(
xd
,
upred
,
vpred
,
uvstride
);
}
void
vp9_build_interintra_64x64_predictors_sby
(
MACROBLOCKD
*
xd
,
uint8_t
*
ypred
,
int
ystride
)
{
uint8_t
intrapredictor
[
4096
];
const
int
mode
=
xd
->
mode_info_context
->
mbmi
.
interintra_mode
;
vp9_build_intra_predictors_internal
(
xd
->
dst
.
y_buffer
,
xd
->
dst
.
y_stride
,
intrapredictor
,
64
,
mode
,
64
,
xd
->
up_available
,
xd
->
left_available
);
combine_interintra
(
xd
->
mode_info_context
->
mbmi
.
interintra_mode
,
ypred
,
ystride
,
intrapredictor
,
64
,
64
);
}
void
vp9_build_interintra_64x64_predictors_sbuv
(
MACROBLOCKD
*
xd
,
uint8_t
*
upred
,
uint8_t
*
vpred
,
int
uvstride
)
{
uint8_t
uintrapredictor
[
1024
];
uint8_t
vintrapredictor
[
1024
];
const
int
mode
=
xd
->
mode_info_context
->
mbmi
.
interintra_uv_mode
;
vp9_build_intra_predictors_internal
(
xd
->
dst
.
u_buffer
,
xd
->
dst
.
uv_stride
,
uintrapredictor
,
32
,
mode
,
32
,
xd
->
up_available
,
xd
->
left_available
);
vp9_build_intra_predictors_internal
(
xd
->
dst
.
v_buffer
,
xd
->
dst
.
uv_stride
,
vintrapredictor
,
32
,
mode
,
32
,
xd
->
up_available
,
xd
->
left_available
);
combine_interintra
(
xd
->
mode_info_context
->
mbmi
.
interintra_uv_mode
,
upred
,
uvstride
,
uintrapredictor
,
32
,
32
);
combine_interintra
(
xd
->
mode_info_context
->
mbmi
.
interintra_uv_mode
,
vpred
,
uvstride
,
vintrapredictor
,
32
,
32
);
}
void
vp9_build_interintra_64x64_predictors_sb
(
MACROBLOCKD
*
xd
,
uint8_t
*
ypred
,
uint8_t
*
upred
,
uint8_t
*
vpred
,
int
ystride
,
int
uvstride
)
{