BITSTREAM: Handle transform size and motion vectors more logically for non-420.
This breaks the profile 1 bitstream. Don't force non420 uv transform size to 1/4 y size. In the 4:2:0 case the chroma corresponding to a luma block is 1/4 its size. In the 4:4:4 case chroma and luma planes are the same size. Disallowing larger transforms can result in a loss of compression efficiency and is inconsistent. For sub-8x8 blocks only average corresponding motion vectors. 4:2:0 and profile 0 behavior remains unchanged. Change-Id: I560ae07183012c6734dd1860ea54ed6f62f3cae8
This commit is contained in:
parent
74ec6fbeba
commit
7557a65d16
@ -529,8 +529,6 @@ b6524e4084d15b5d0caaa3d3d1368db30cbee69c vp90-2-03-deltaq.webm
|
|||||||
7f6d8879336239a43dbb6c9f13178cb11cf7ed09 vp90-2-05-resize.ivf.md5
|
7f6d8879336239a43dbb6c9f13178cb11cf7ed09 vp90-2-05-resize.ivf.md5
|
||||||
bf61ddc1f716eba58d4c9837d4e91031d9ce4ffe vp90-2-06-bilinear.webm
|
bf61ddc1f716eba58d4c9837d4e91031d9ce4ffe vp90-2-06-bilinear.webm
|
||||||
f6235f937552e11d8eb331ec55da6b3aa596b9ac vp90-2-06-bilinear.webm.md5
|
f6235f937552e11d8eb331ec55da6b3aa596b9ac vp90-2-06-bilinear.webm.md5
|
||||||
495256cfd123fe777b2c0406862ed8468a1f4677 vp91-2-04-yv444.webm
|
|
||||||
65e3a7ffef61ab340d9140f335ecc49125970c2c vp91-2-04-yv444.webm.md5
|
|
||||||
0c83a1e414fde3bccd6dc451bbaee68e59974c76 vp90-2-07-frame_parallel.webm
|
0c83a1e414fde3bccd6dc451bbaee68e59974c76 vp90-2-07-frame_parallel.webm
|
||||||
e5c2c9fb383e5bf3b563480adaeba5b7e3475ecd vp90-2-07-frame_parallel.webm.md5
|
e5c2c9fb383e5bf3b563480adaeba5b7e3475ecd vp90-2-07-frame_parallel.webm.md5
|
||||||
086c7edcffd699ae7d99d710fd7e53b18910ca5b vp90-2-08-tile_1x2_frame_parallel.webm
|
086c7edcffd699ae7d99d710fd7e53b18910ca5b vp90-2-08-tile_1x2_frame_parallel.webm
|
||||||
|
@ -704,8 +704,6 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-12-droppable_3.ivf
|
|||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-12-droppable_3.ivf.md5
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-12-droppable_3.ivf.md5
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-13-largescaling.webm
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-13-largescaling.webm
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-13-largescaling.webm.md5
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-13-largescaling.webm.md5
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp91-2-04-yv444.webm
|
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp91-2-04-yv444.webm.md5
|
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-2.webm
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-2.webm
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-2.webm.md5
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-2.webm.md5
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-4.webm
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-14-resize-fp-tiles-1-4.webm
|
||||||
|
@ -164,7 +164,7 @@ const char *const kVP9TestVectors[] = {
|
|||||||
"vp90-2-11-size-351x287.webm", "vp90-2-11-size-351x288.webm",
|
"vp90-2-11-size-351x287.webm", "vp90-2-11-size-351x288.webm",
|
||||||
"vp90-2-11-size-352x287.webm", "vp90-2-12-droppable_1.ivf",
|
"vp90-2-11-size-352x287.webm", "vp90-2-12-droppable_1.ivf",
|
||||||
"vp90-2-12-droppable_2.ivf", "vp90-2-12-droppable_3.ivf",
|
"vp90-2-12-droppable_2.ivf", "vp90-2-12-droppable_3.ivf",
|
||||||
"vp90-2-13-largescaling.webm", "vp91-2-04-yv444.webm",
|
"vp90-2-13-largescaling.webm",
|
||||||
"vp90-2-14-resize-fp-tiles-1-16.webm",
|
"vp90-2-14-resize-fp-tiles-1-16.webm",
|
||||||
"vp90-2-14-resize-fp-tiles-1-2-4-8-16.webm",
|
"vp90-2-14-resize-fp-tiles-1-2-4-8-16.webm",
|
||||||
"vp90-2-14-resize-fp-tiles-1-2.webm", "vp90-2-14-resize-fp-tiles-1-4.webm",
|
"vp90-2-14-resize-fp-tiles-1-2.webm", "vp90-2-14-resize-fp-tiles-1-4.webm",
|
||||||
|
@ -44,7 +44,7 @@ void vp9_foreach_transformed_block_in_plane(
|
|||||||
// block and transform sizes, in number of 4x4 blocks log 2 ("*_b")
|
// block and transform sizes, in number of 4x4 blocks log 2 ("*_b")
|
||||||
// 4x4=0, 8x8=2, 16x16=4, 32x32=6, 64x64=8
|
// 4x4=0, 8x8=2, 16x16=4, 32x32=6, 64x64=8
|
||||||
// transform size varies per plane, look it up in a common way.
|
// transform size varies per plane, look it up in a common way.
|
||||||
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi)
|
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd)
|
||||||
: mbmi->tx_size;
|
: mbmi->tx_size;
|
||||||
const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
|
const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
|
||||||
const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
|
const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
|
||||||
|
@ -270,18 +270,20 @@ static INLINE TX_TYPE get_tx_type_4x4(PLANE_TYPE plane_type,
|
|||||||
|
|
||||||
void vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y);
|
void vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y);
|
||||||
|
|
||||||
static INLINE TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize) {
|
static INLINE TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize,
|
||||||
|
int xss, int yss) {
|
||||||
if (bsize < BLOCK_8X8) {
|
if (bsize < BLOCK_8X8) {
|
||||||
return TX_4X4;
|
return TX_4X4;
|
||||||
} else {
|
} else {
|
||||||
// TODO(dkovalev): Assuming YUV420 (ss_x == 1, ss_y == 1)
|
const BLOCK_SIZE plane_bsize = ss_size_lookup[bsize][xss][yss];
|
||||||
const BLOCK_SIZE plane_bsize = ss_size_lookup[bsize][1][1];
|
|
||||||
return MIN(y_tx_size, max_txsize_lookup[plane_bsize]);
|
return MIN(y_tx_size, max_txsize_lookup[plane_bsize]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE TX_SIZE get_uv_tx_size(const MB_MODE_INFO *mbmi) {
|
static INLINE TX_SIZE get_uv_tx_size(const MB_MODE_INFO *mbmi,
|
||||||
return get_uv_tx_size_impl(mbmi->tx_size, mbmi->sb_type);
|
const struct macroblockd_plane *pd) {
|
||||||
|
return get_uv_tx_size_impl(mbmi->tx_size, mbmi->sb_type, pd->subsampling_x,
|
||||||
|
pd->subsampling_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE BLOCK_SIZE get_plane_block_size(BLOCK_SIZE bsize,
|
static INLINE BLOCK_SIZE get_plane_block_size(BLOCK_SIZE bsize,
|
||||||
|
@ -502,7 +502,7 @@ static void build_masks(const loop_filter_info_n *const lfi_n,
|
|||||||
const MB_MODE_INFO *mbmi = &mi->mbmi;
|
const MB_MODE_INFO *mbmi = &mi->mbmi;
|
||||||
const BLOCK_SIZE block_size = mbmi->sb_type;
|
const BLOCK_SIZE block_size = mbmi->sb_type;
|
||||||
const TX_SIZE tx_size_y = mbmi->tx_size;
|
const TX_SIZE tx_size_y = mbmi->tx_size;
|
||||||
const TX_SIZE tx_size_uv = get_uv_tx_size(mbmi);
|
const TX_SIZE tx_size_uv = get_uv_tx_size_impl(tx_size_y, block_size, 1, 1);
|
||||||
const int filter_level = get_filter_level(lfi_n, mbmi);
|
const int filter_level = get_filter_level(lfi_n, mbmi);
|
||||||
uint64_t *const left_y = &lfm->left_y[tx_size_y];
|
uint64_t *const left_y = &lfm->left_y[tx_size_y];
|
||||||
uint64_t *const above_y = &lfm->above_y[tx_size_y];
|
uint64_t *const above_y = &lfm->above_y[tx_size_y];
|
||||||
@ -939,7 +939,7 @@ static void filter_block_plane_non420(VP9_COMMON *cm,
|
|||||||
!(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1;
|
!(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1;
|
||||||
const int skip_this_r = skip_this && !block_edge_above;
|
const int skip_this_r = skip_this && !block_edge_above;
|
||||||
const TX_SIZE tx_size = (plane->plane_type == PLANE_TYPE_UV)
|
const TX_SIZE tx_size = (plane->plane_type == PLANE_TYPE_UV)
|
||||||
? get_uv_tx_size(&mi[0].mbmi)
|
? get_uv_tx_size(&mi[0].mbmi, plane)
|
||||||
: mi[0].mbmi.tx_size;
|
: mi[0].mbmi.tx_size;
|
||||||
const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1;
|
const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1;
|
||||||
const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1;
|
const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1;
|
||||||
|
@ -113,6 +113,18 @@ static MV mi_mv_pred_q4(const MODE_INFO *mi, int idx) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INLINE int round_mv_comp_q2(int value) {
|
||||||
|
return (value < 0 ? value - 1 : value + 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MV mi_mv_pred_q2(const MODE_INFO *mi, int idx, int block0, int block1) {
|
||||||
|
MV res = { round_mv_comp_q2(mi->bmi[block0].as_mv[idx].as_mv.row +
|
||||||
|
mi->bmi[block1].as_mv[idx].as_mv.row),
|
||||||
|
round_mv_comp_q2(mi->bmi[block0].as_mv[idx].as_mv.col +
|
||||||
|
mi->bmi[block1].as_mv[idx].as_mv.col) };
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(jkoleszar): yet another mv clamping function :-(
|
// TODO(jkoleszar): yet another mv clamping function :-(
|
||||||
MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd, const MV *src_mv,
|
MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd, const MV *src_mv,
|
||||||
int bw, int bh, int ss_x, int ss_y) {
|
int bw, int bh, int ss_x, int ss_y) {
|
||||||
@ -139,6 +151,29 @@ MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd, const MV *src_mv,
|
|||||||
return clamped_mv;
|
return clamped_mv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MV average_split_mvs(const struct macroblockd_plane *pd, int plane,
|
||||||
|
const MODE_INFO *mi, int ref, int block) {
|
||||||
|
const int ss_idx = ((pd->subsampling_x > 0) << 1) | (pd->subsampling_y > 0);
|
||||||
|
MV res = {0, 0};
|
||||||
|
switch (ss_idx) {
|
||||||
|
case 0:
|
||||||
|
res = mi->bmi[block].as_mv[ref].as_mv;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
res = mi_mv_pred_q2(mi, ref, block, block + 2);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
res = mi_mv_pred_q2(mi, ref, block, block + 1);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
res = mi_mv_pred_q4(mi, ref);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(ss_idx <= 3 || ss_idx >= 0);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static void build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
|
static void build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
|
||||||
int bw, int bh,
|
int bw, int bh,
|
||||||
int x, int y, int w, int h,
|
int x, int y, int w, int h,
|
||||||
@ -154,14 +189,8 @@ static void build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
|
|||||||
struct buf_2d *const pre_buf = &pd->pre[ref];
|
struct buf_2d *const pre_buf = &pd->pre[ref];
|
||||||
struct buf_2d *const dst_buf = &pd->dst;
|
struct buf_2d *const dst_buf = &pd->dst;
|
||||||
uint8_t *const dst = dst_buf->buf + dst_buf->stride * y + x;
|
uint8_t *const dst = dst_buf->buf + dst_buf->stride * y + x;
|
||||||
|
|
||||||
// TODO(jkoleszar): All chroma MVs in SPLITMV mode are taken as the
|
|
||||||
// same MV (the average of the 4 luma MVs) but we could do something
|
|
||||||
// smarter for non-4:2:0. Just punt for now, pending the changes to get
|
|
||||||
// rid of SPLITMV mode entirely.
|
|
||||||
const MV mv = mi->mbmi.sb_type < BLOCK_8X8
|
const MV mv = mi->mbmi.sb_type < BLOCK_8X8
|
||||||
? (plane == 0 ? mi->bmi[block].as_mv[ref].as_mv
|
? average_split_mvs(pd, plane, mi, ref, block)
|
||||||
: mi_mv_pred_q4(mi, ref))
|
|
||||||
: mi->mbmi.mv[ref].as_mv;
|
: mi->mbmi.mv[ref].as_mv;
|
||||||
|
|
||||||
// TODO(jkoleszar): This clamping is done in the incorrect place for the
|
// TODO(jkoleszar): This clamping is done in the incorrect place for the
|
||||||
@ -258,16 +287,11 @@ static void dec_build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
|
|||||||
struct buf_2d *const pre_buf = &pd->pre[ref];
|
struct buf_2d *const pre_buf = &pd->pre[ref];
|
||||||
struct buf_2d *const dst_buf = &pd->dst;
|
struct buf_2d *const dst_buf = &pd->dst;
|
||||||
uint8_t *const dst = dst_buf->buf + dst_buf->stride * y + x;
|
uint8_t *const dst = dst_buf->buf + dst_buf->stride * y + x;
|
||||||
|
|
||||||
// TODO(jkoleszar): All chroma MVs in SPLITMV mode are taken as the
|
|
||||||
// same MV (the average of the 4 luma MVs) but we could do something
|
|
||||||
// smarter for non-4:2:0. Just punt for now, pending the changes to get
|
|
||||||
// rid of SPLITMV mode entirely.
|
|
||||||
const MV mv = mi->mbmi.sb_type < BLOCK_8X8
|
const MV mv = mi->mbmi.sb_type < BLOCK_8X8
|
||||||
? (plane == 0 ? mi->bmi[block].as_mv[ref].as_mv
|
? average_split_mvs(pd, plane, mi, ref, block)
|
||||||
: mi_mv_pred_q4(mi, ref))
|
|
||||||
: mi->mbmi.mv[ref].as_mv;
|
: mi->mbmi.mv[ref].as_mv;
|
||||||
|
|
||||||
|
|
||||||
// TODO(jkoleszar): This clamping is done in the incorrect place for the
|
// TODO(jkoleszar): This clamping is done in the incorrect place for the
|
||||||
// scaling case. It needs to be done on the scaled MV, not the pre-scaling
|
// scaling case. It needs to be done on the scaled MV, not the pre-scaling
|
||||||
// MV. Note however that it performs the subsampling aware scaling so
|
// MV. Note however that it performs the subsampling aware scaling so
|
||||||
|
@ -507,7 +507,7 @@ void vp9_encode_sb(MACROBLOCK *x, BLOCK_SIZE bsize) {
|
|||||||
|
|
||||||
if (x->optimize && (!x->skip_recode || !x->skip_optimize)) {
|
if (x->optimize && (!x->skip_recode || !x->skip_optimize)) {
|
||||||
const struct macroblockd_plane* const pd = &xd->plane[plane];
|
const struct macroblockd_plane* const pd = &xd->plane[plane];
|
||||||
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi) : mbmi->tx_size;
|
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd) : mbmi->tx_size;
|
||||||
vp9_get_entropy_contexts(bsize, tx_size, pd,
|
vp9_get_entropy_contexts(bsize, tx_size, pd,
|
||||||
ctx.ta[plane], ctx.tl[plane]);
|
ctx.ta[plane], ctx.tl[plane]);
|
||||||
}
|
}
|
||||||
|
@ -595,7 +595,7 @@ static INLINE int cost_coeffs(MACROBLOCK *x,
|
|||||||
int c, cost;
|
int c, cost;
|
||||||
// Check for consistency of tx_size with mode info
|
// Check for consistency of tx_size with mode info
|
||||||
assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size
|
assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size
|
||||||
: get_uv_tx_size(mbmi) == tx_size);
|
: get_uv_tx_size(mbmi, pd) == tx_size);
|
||||||
|
|
||||||
if (eob == 0) {
|
if (eob == 0) {
|
||||||
// single eob token
|
// single eob token
|
||||||
@ -1330,7 +1330,7 @@ static void super_block_uvrd(const VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
int64_t ref_best_rd) {
|
int64_t ref_best_rd) {
|
||||||
MACROBLOCKD *const xd = &x->e_mbd;
|
MACROBLOCKD *const xd = &x->e_mbd;
|
||||||
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
||||||
const TX_SIZE uv_tx_size = get_uv_tx_size(mbmi);
|
const TX_SIZE uv_tx_size = get_uv_tx_size(mbmi, &xd->plane[1]);
|
||||||
int plane;
|
int plane;
|
||||||
int pnrate = 0, pnskip = 1;
|
int pnrate = 0, pnskip = 1;
|
||||||
int64_t pndist = 0, pnsse = 0;
|
int64_t pndist = 0, pnsse = 0;
|
||||||
@ -2928,6 +2928,7 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
PICK_MODE_CONTEXT *ctx, int64_t best_rd) {
|
PICK_MODE_CONTEXT *ctx, int64_t best_rd) {
|
||||||
VP9_COMMON *const cm = &cpi->common;
|
VP9_COMMON *const cm = &cpi->common;
|
||||||
MACROBLOCKD *const xd = &x->e_mbd;
|
MACROBLOCKD *const xd = &x->e_mbd;
|
||||||
|
struct macroblockd_plane *const pd = xd->plane;
|
||||||
int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0;
|
int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0;
|
||||||
int y_skip = 0, uv_skip = 0;
|
int y_skip = 0, uv_skip = 0;
|
||||||
int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 };
|
int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 };
|
||||||
@ -2943,7 +2944,9 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
*returnrate = INT_MAX;
|
*returnrate = INT_MAX;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize);
|
max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize,
|
||||||
|
pd[1].subsampling_x,
|
||||||
|
pd[1].subsampling_y);
|
||||||
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
||||||
&dist_uv, &uv_skip, bsize, max_uv_tx_size);
|
&dist_uv, &uv_skip, bsize, max_uv_tx_size);
|
||||||
} else {
|
} else {
|
||||||
@ -2953,7 +2956,9 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
*returnrate = INT_MAX;
|
*returnrate = INT_MAX;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize);
|
max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize,
|
||||||
|
pd[1].subsampling_x,
|
||||||
|
pd[1].subsampling_y);
|
||||||
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
||||||
&dist_uv, &uv_skip, BLOCK_8X8, max_uv_tx_size);
|
&dist_uv, &uv_skip, BLOCK_8X8, max_uv_tx_size);
|
||||||
}
|
}
|
||||||
@ -3015,6 +3020,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
MACROBLOCKD *const xd = &x->e_mbd;
|
MACROBLOCKD *const xd = &x->e_mbd;
|
||||||
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
||||||
const struct segmentation *const seg = &cm->seg;
|
const struct segmentation *const seg = &cm->seg;
|
||||||
|
struct macroblockd_plane *const pd = xd->plane;
|
||||||
PREDICTION_MODE this_mode;
|
PREDICTION_MODE this_mode;
|
||||||
MV_REFERENCE_FRAME ref_frame, second_ref_frame;
|
MV_REFERENCE_FRAME ref_frame, second_ref_frame;
|
||||||
unsigned char segment_id = mbmi->segment_id;
|
unsigned char segment_id = mbmi->segment_id;
|
||||||
@ -3304,7 +3310,8 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
if (rate_y == INT_MAX)
|
if (rate_y == INT_MAX)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
uv_tx = get_uv_tx_size_impl(mbmi->tx_size, bsize);
|
uv_tx = get_uv_tx_size_impl(mbmi->tx_size, bsize, pd[1].subsampling_x,
|
||||||
|
pd[1].subsampling_y);
|
||||||
if (rate_uv_intra[uv_tx] == INT_MAX) {
|
if (rate_uv_intra[uv_tx] == INT_MAX) {
|
||||||
choose_intra_uv_mode(cpi, ctx, bsize, uv_tx,
|
choose_intra_uv_mode(cpi, ctx, bsize, uv_tx,
|
||||||
&rate_uv_intra[uv_tx], &rate_uv_tokenonly[uv_tx],
|
&rate_uv_intra[uv_tx], &rate_uv_tokenonly[uv_tx],
|
||||||
@ -3549,7 +3556,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
if (vp9_mode_order[best_mode_index].ref_frame[0] == INTRA_FRAME) {
|
if (vp9_mode_order[best_mode_index].ref_frame[0] == INTRA_FRAME) {
|
||||||
TX_SIZE uv_tx_size;
|
TX_SIZE uv_tx_size;
|
||||||
*mbmi = best_mbmode;
|
*mbmi = best_mbmode;
|
||||||
uv_tx_size = get_uv_tx_size(mbmi);
|
uv_tx_size = get_uv_tx_size(mbmi, &xd->plane[1]);
|
||||||
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size],
|
rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size],
|
||||||
&rate_uv_tokenonly[uv_tx_size],
|
&rate_uv_tokenonly[uv_tx_size],
|
||||||
&dist_uv[uv_tx_size],
|
&dist_uv[uv_tx_size],
|
||||||
|
Loading…
Reference in New Issue
Block a user