Code cleanup in rdopt.c
Moved encode_breakout code out of handle_inter_mode(). Change-Id: Icd661136b05fdf163768c406f91e0c98a8df89eb
This commit is contained in:
@@ -1988,6 +1988,87 @@ static INLINE void restore_dst_buf(MACROBLOCKD *xd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rd_encode_breakout_test(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
|
BLOCK_SIZE bsize, int *rate2,
|
||||||
|
int64_t *distortion, int64_t *distortion_uv,
|
||||||
|
int *disable_skip, int64_t this_rd) {
|
||||||
|
VP9_COMMON *cm = &cpi->common;
|
||||||
|
MACROBLOCKD *xd = &x->e_mbd;
|
||||||
|
const BLOCK_SIZE y_size = get_plane_block_size(bsize, &xd->plane[0]);
|
||||||
|
const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]);
|
||||||
|
unsigned int var, sse;
|
||||||
|
// Skipping threshold for ac.
|
||||||
|
unsigned int thresh_ac;
|
||||||
|
// Skipping threshold for dc
|
||||||
|
unsigned int thresh_dc;
|
||||||
|
|
||||||
|
var = cpi->fn_ptr[y_size].vf(x->plane[0].src.buf, x->plane[0].src.stride,
|
||||||
|
xd->plane[0].dst.buf,
|
||||||
|
xd->plane[0].dst.stride, &sse);
|
||||||
|
|
||||||
|
if (x->encode_breakout > 0) {
|
||||||
|
// Set a maximum for threshold to avoid big PSNR loss in low bitrate
|
||||||
|
// case. Use extreme low threshold for static frames to limit skipping.
|
||||||
|
const unsigned int max_thresh = (cpi->allow_encode_breakout ==
|
||||||
|
ENCODE_BREAKOUT_LIMITED) ? 128 : 36000;
|
||||||
|
// The encode_breakout input
|
||||||
|
const unsigned int min_thresh =
|
||||||
|
MIN(((unsigned int)x->encode_breakout << 4), max_thresh);
|
||||||
|
|
||||||
|
// Calculate threshold according to dequant value.
|
||||||
|
thresh_ac = (xd->plane[0].dequant[1] * xd->plane[0].dequant[1]) / 9;
|
||||||
|
thresh_ac = clamp(thresh_ac, min_thresh, max_thresh);
|
||||||
|
|
||||||
|
// Adjust threshold according to partition size.
|
||||||
|
thresh_ac >>= 8 - (b_width_log2(bsize) +
|
||||||
|
b_height_log2(bsize));
|
||||||
|
thresh_dc = (xd->plane[0].dequant[0] * xd->plane[0].dequant[0] >> 6);
|
||||||
|
} else {
|
||||||
|
thresh_ac = 0;
|
||||||
|
thresh_dc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Y skipping condition checking
|
||||||
|
if (sse < thresh_ac || sse == 0) {
|
||||||
|
// dc skipping checking
|
||||||
|
if ((sse - var) < thresh_dc || sse == var) {
|
||||||
|
unsigned int sse_u, sse_v;
|
||||||
|
unsigned int var_u, var_v;
|
||||||
|
|
||||||
|
var_u = cpi->fn_ptr[uv_size].vf(x->plane[1].src.buf,
|
||||||
|
x->plane[1].src.stride,
|
||||||
|
xd->plane[1].dst.buf,
|
||||||
|
xd->plane[1].dst.stride, &sse_u);
|
||||||
|
|
||||||
|
// U skipping condition checking
|
||||||
|
if ((sse_u * 4 < thresh_ac || sse_u == 0) &&
|
||||||
|
(sse_u - var_u < thresh_dc || sse_u == var_u)) {
|
||||||
|
var_v = cpi->fn_ptr[uv_size].vf(x->plane[2].src.buf,
|
||||||
|
x->plane[2].src.stride,
|
||||||
|
xd->plane[2].dst.buf,
|
||||||
|
xd->plane[2].dst.stride, &sse_v);
|
||||||
|
|
||||||
|
// V skipping condition checking
|
||||||
|
if ((sse_v * 4 < thresh_ac || sse_v == 0) &&
|
||||||
|
(sse_v - var_v < thresh_dc || sse_v == var_v)) {
|
||||||
|
x->skip = 1;
|
||||||
|
|
||||||
|
// The cost of skip bit needs to be added.
|
||||||
|
*rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
||||||
|
|
||||||
|
// Scaling factor for SSE from spatial domain to frequency domain
|
||||||
|
// is 16. Adjust distortion accordingly.
|
||||||
|
*distortion_uv = (sse_u + sse_v) << 4;
|
||||||
|
*distortion = (sse << 4) + *distortion_uv;
|
||||||
|
|
||||||
|
*disable_skip = 1;
|
||||||
|
this_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
BLOCK_SIZE bsize,
|
BLOCK_SIZE bsize,
|
||||||
int64_t txfm_cache[],
|
int64_t txfm_cache[],
|
||||||
@@ -2230,81 +2311,9 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
*rate2 += vp9_get_switchable_rate(cpi);
|
*rate2 += vp9_get_switchable_rate(cpi);
|
||||||
|
|
||||||
if (!is_comp_pred) {
|
if (!is_comp_pred) {
|
||||||
if (cpi->allow_encode_breakout) {
|
if (cpi->allow_encode_breakout)
|
||||||
const BLOCK_SIZE y_size = get_plane_block_size(bsize, &xd->plane[0]);
|
rd_encode_breakout_test(cpi, x, bsize, rate2, distortion, distortion_uv,
|
||||||
const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]);
|
disable_skip, this_rd);
|
||||||
unsigned int var, sse;
|
|
||||||
// Skipping threshold for ac.
|
|
||||||
unsigned int thresh_ac;
|
|
||||||
// Skipping threshold for dc
|
|
||||||
unsigned int thresh_dc;
|
|
||||||
|
|
||||||
var = cpi->fn_ptr[y_size].vf(x->plane[0].src.buf, x->plane[0].src.stride,
|
|
||||||
xd->plane[0].dst.buf,
|
|
||||||
xd->plane[0].dst.stride, &sse);
|
|
||||||
|
|
||||||
if (x->encode_breakout > 0) {
|
|
||||||
// Set a maximum for threshold to avoid big PSNR loss in low bitrate
|
|
||||||
// case. Use extreme low threshold for static frames to limit skipping.
|
|
||||||
const unsigned int max_thresh = (cpi->allow_encode_breakout ==
|
|
||||||
ENCODE_BREAKOUT_LIMITED) ? 128 : 36000;
|
|
||||||
// The encode_breakout input
|
|
||||||
const unsigned int min_thresh =
|
|
||||||
MIN(((unsigned int)x->encode_breakout << 4), max_thresh);
|
|
||||||
|
|
||||||
// Calculate threshold according to dequant value.
|
|
||||||
thresh_ac = (xd->plane[0].dequant[1] * xd->plane[0].dequant[1]) / 9;
|
|
||||||
thresh_ac = clamp(thresh_ac, min_thresh, max_thresh);
|
|
||||||
|
|
||||||
// Adjust threshold according to partition size.
|
|
||||||
thresh_ac >>= 8 - (b_width_log2(bsize) +
|
|
||||||
b_height_log2(bsize));
|
|
||||||
thresh_dc = (xd->plane[0].dequant[0] * xd->plane[0].dequant[0] >> 6);
|
|
||||||
} else {
|
|
||||||
thresh_ac = 0;
|
|
||||||
thresh_dc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Y skipping condition checking
|
|
||||||
if (sse < thresh_ac || sse == 0) {
|
|
||||||
// dc skipping checking
|
|
||||||
if ((sse - var) < thresh_dc || sse == var) {
|
|
||||||
unsigned int sse_u, sse_v;
|
|
||||||
unsigned int var_u, var_v;
|
|
||||||
|
|
||||||
var_u = cpi->fn_ptr[uv_size].vf(x->plane[1].src.buf,
|
|
||||||
x->plane[1].src.stride,
|
|
||||||
xd->plane[1].dst.buf,
|
|
||||||
xd->plane[1].dst.stride, &sse_u);
|
|
||||||
|
|
||||||
// U skipping condition checking
|
|
||||||
if ((sse_u * 4 < thresh_ac || sse_u == 0) &&
|
|
||||||
(sse_u - var_u < thresh_dc || sse_u == var_u)) {
|
|
||||||
var_v = cpi->fn_ptr[uv_size].vf(x->plane[2].src.buf,
|
|
||||||
x->plane[2].src.stride,
|
|
||||||
xd->plane[2].dst.buf,
|
|
||||||
xd->plane[2].dst.stride, &sse_v);
|
|
||||||
|
|
||||||
// V skipping condition checking
|
|
||||||
if ((sse_v * 4 < thresh_ac || sse_v == 0) &&
|
|
||||||
(sse_v - var_v < thresh_dc || sse_v == var_v)) {
|
|
||||||
x->skip = 1;
|
|
||||||
|
|
||||||
// The cost of skip bit needs to be added.
|
|
||||||
*rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
|
||||||
|
|
||||||
// Scaling factor for SSE from spatial domain to frequency domain
|
|
||||||
// is 16. Adjust distortion accordingly.
|
|
||||||
*distortion_uv = (sse_u + sse_v) << 4;
|
|
||||||
*distortion = (sse << 4) + *distortion_uv;
|
|
||||||
|
|
||||||
*disable_skip = 1;
|
|
||||||
this_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!x->skip) {
|
if (!x->skip) {
|
||||||
|
Reference in New Issue
Block a user