summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp9/encoder/vp9_block.h2
-rw-r--r--vp9/encoder/vp9_encodeframe.c14
-rw-r--r--vp9/encoder/vp9_encodemb.c105
-rw-r--r--vp9/encoder/vp9_encodemb.h5
-rw-r--r--vp9/encoder/vp9_encoder.h19
-rw-r--r--vp9/encoder/vp9_rdopt.c37
-rw-r--r--vp9/encoder/vp9_speed_features.c15
-rw-r--r--vp9/encoder/vp9_speed_features.h19
8 files changed, 147 insertions, 69 deletions
diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h
index da01c346d..4d336f2a4 100644
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -79,7 +79,7 @@ struct macroblock {
int skip_recode;
int skip_optimize;
int q_index;
- int block_qcoeff_opt;
+ double log_block_src_var;
int block_tx_domain;
// The equivalent error at the current rdmult of one whole bit (not one
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 5b811016d..1d593cfc0 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -2021,20 +2021,20 @@ static void rd_pick_sb_modes(VP9_COMP *cpi, TileDataEnc *tile_data,
// Save rdmult before it might be changed, so it can be restored later.
orig_rdmult = x->rdmult;
- if ((cpi->sf.tx_domain_thresh > 0.0) || (cpi->sf.quant_opt_thresh > 0.0)) {
+ if ((cpi->sf.tx_domain_thresh > 0.0) ||
+ (cpi->sf.trellis_opt_tx_rd.thresh > 0.0)) {
double logvar = vp9_log_block_var(cpi, x, bsize);
- // Check block complexity as part of descision on using pixel or transform
+ // Check block complexity as part of decision on using pixel or transform
// domain distortion in rd tests.
x->block_tx_domain = cpi->sf.allow_txfm_domain_distortion &&
(logvar >= cpi->sf.tx_domain_thresh);
- // Check block complexity as part of descision on using quantized
- // coefficient optimisation inside the rd loop.
- x->block_qcoeff_opt =
- cpi->sf.allow_quant_coeff_opt && (logvar <= cpi->sf.quant_opt_thresh);
+ // Store block complexity to decide on using quantized coefficient
+ // optimization inside the rd loop.
+ x->log_block_src_var = logvar;
} else {
x->block_tx_domain = cpi->sf.allow_txfm_domain_distortion;
- x->block_qcoeff_opt = cpi->sf.allow_quant_coeff_opt;
+ x->log_block_src_var = 0.0;
}
set_segment_index(cpi, x, mi_row, mi_col, bsize, 0);
diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c
index 6a5f62880..b2cd3596f 100644
--- a/vp9/encoder/vp9_encodemb.c
+++ b/vp9/encoder/vp9_encodemb.c
@@ -26,6 +26,7 @@
#include "vp9/common/vp9_scan.h"
#include "vp9/encoder/vp9_encodemb.h"
+#include "vp9/encoder/vp9_encoder.h"
#include "vp9/encoder/vp9_rd.h"
#include "vp9/encoder/vp9_tokenize.h"
@@ -757,10 +758,19 @@ void vp9_encode_sb(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row, int mi_col,
MODE_INFO *mi = xd->mi[0];
int plane;
#if CONFIG_MISMATCH_DEBUG
- struct encode_b_args arg = { x, 1, NULL, NULL,
+ struct encode_b_args arg = { x,
+ 1, // enable_trellis_opt
+ 0.0, // trellis_opt_thresh
+ NULL, // above entropy context
+ NULL, // left entropy context
&mi->skip, mi_row, mi_col, output_enabled };
#else
- struct encode_b_args arg = { x, 1, NULL, NULL, &mi->skip };
+ struct encode_b_args arg = { x,
+ 1, // enable_trellis_opt
+ 0.0, // trellis_opt_thresh
+ NULL, // above entropy context
+ NULL, // left entropy context
+ &mi->skip };
(void)mi_row;
(void)mi_col;
(void)output_enabled;
@@ -778,9 +788,9 @@ void vp9_encode_sb(MACROBLOCK *x, BLOCK_SIZE bsize, int mi_row, int mi_col,
const TX_SIZE tx_size = plane ? get_uv_tx_size(mi, pd) : mi->tx_size;
vp9_get_entropy_contexts(bsize, tx_size, pd, ctx.ta[plane],
ctx.tl[plane]);
- arg.enable_coeff_opt = 1;
+ arg.enable_trellis_opt = 1;
} else {
- arg.enable_coeff_opt = 0;
+ arg.enable_trellis_opt = 0;
}
arg.ta = ctx.ta[plane];
arg.tl = ctx.tl[plane];
@@ -812,17 +822,13 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
uint16_t *eob = &p->eobs[block];
const int src_stride = p->src.stride;
const int dst_stride = pd->dst.stride;
+ int enable_trellis_opt = !x->skip_recode;
ENTROPY_CONTEXT *a = NULL;
ENTROPY_CONTEXT *l = NULL;
int entropy_ctx = 0;
dst = &pd->dst.buf[4 * (row * dst_stride + col)];
src = &p->src.buf[4 * (row * src_stride + col)];
src_diff = &p->src_diff[4 * (row * diff_stride + col)];
- if (args->enable_coeff_opt) {
- a = &args->ta[col];
- l = &args->tl[row];
- entropy_ctx = combine_entropy_contexts(*a, *l);
- }
if (tx_size == TX_4X4) {
tx_type = get_tx_type_4x4(get_plane_type(plane), xd, block);
@@ -846,19 +852,41 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
// skip block condition should be handled before this is called.
assert(!x->skip_block);
+ if (!x->skip_recode) {
+ const int tx_size_in_pixels = (1 << tx_size) << 2;
+#if CONFIG_VP9_HIGHBITDEPTH
+ if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
+ vpx_highbd_subtract_block(tx_size_in_pixels, tx_size_in_pixels, src_diff,
+ diff_stride, src, src_stride, dst, dst_stride,
+ xd->bd);
+ } else {
+ vpx_subtract_block(tx_size_in_pixels, tx_size_in_pixels, src_diff,
+ diff_stride, src, src_stride, dst, dst_stride);
+ }
+#else
+ vpx_subtract_block(tx_size_in_pixels, tx_size_in_pixels, src_diff,
+ diff_stride, src, src_stride, dst, dst_stride);
+#endif
+ enable_trellis_opt = do_trellis_opt(args);
+ }
+
+ if (enable_trellis_opt) {
+ a = &args->ta[col];
+ l = &args->tl[row];
+ entropy_ctx = combine_entropy_contexts(*a, *l);
+ }
+
#if CONFIG_VP9_HIGHBITDEPTH
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
uint16_t *const dst16 = CONVERT_TO_SHORTPTR(dst);
switch (tx_size) {
case TX_32X32:
if (!x->skip_recode) {
- vpx_highbd_subtract_block(32, 32, src_diff, diff_stride, src,
- src_stride, dst, dst_stride, xd->bd);
highbd_fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride);
vpx_highbd_quantize_b_32x32(coeff, p, qcoeff, dqcoeff, pd->dequant,
eob, scan_order->scan, scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob) {
@@ -867,8 +895,6 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
break;
case TX_16X16:
if (!x->skip_recode) {
- vpx_highbd_subtract_block(16, 16, src_diff, diff_stride, src,
- src_stride, dst, dst_stride, xd->bd);
if (tx_type == DCT_DCT)
vpx_highbd_fdct16x16(src_diff, coeff, diff_stride);
else
@@ -877,7 +903,7 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
p->quant_shift, qcoeff, dqcoeff, pd->dequant,
eob, scan_order->scan, scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob) {
@@ -887,8 +913,6 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
break;
case TX_8X8:
if (!x->skip_recode) {
- vpx_highbd_subtract_block(8, 8, src_diff, diff_stride, src,
- src_stride, dst, dst_stride, xd->bd);
if (tx_type == DCT_DCT)
vpx_highbd_fdct8x8(src_diff, coeff, diff_stride);
else
@@ -897,7 +921,7 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
p->quant_shift, qcoeff, dqcoeff, pd->dequant,
eob, scan_order->scan, scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob) {
@@ -908,8 +932,6 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
default:
assert(tx_size == TX_4X4);
if (!x->skip_recode) {
- vpx_highbd_subtract_block(4, 4, src_diff, diff_stride, src,
- src_stride, dst, dst_stride, xd->bd);
if (tx_type != DCT_DCT)
vp9_highbd_fht4x4(src_diff, coeff, diff_stride, tx_type);
else
@@ -918,7 +940,7 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
p->quant_shift, qcoeff, dqcoeff, pd->dequant,
eob, scan_order->scan, scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob) {
@@ -942,13 +964,11 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
switch (tx_size) {
case TX_32X32:
if (!x->skip_recode) {
- vpx_subtract_block(32, 32, src_diff, diff_stride, src, src_stride, dst,
- dst_stride);
fdct32x32(x->use_lp32x32fdct, src_diff, coeff, diff_stride);
vpx_quantize_b_32x32(coeff, p, qcoeff, dqcoeff, pd->dequant, eob,
scan_order->scan, scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob)
@@ -956,14 +976,12 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
break;
case TX_16X16:
if (!x->skip_recode) {
- vpx_subtract_block(16, 16, src_diff, diff_stride, src, src_stride, dst,
- dst_stride);
vp9_fht16x16(src_diff, coeff, diff_stride, tx_type);
vpx_quantize_b(coeff, 256, p->zbin, p->round, p->quant, p->quant_shift,
qcoeff, dqcoeff, pd->dequant, eob, scan_order->scan,
scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob)
@@ -971,14 +989,12 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
break;
case TX_8X8:
if (!x->skip_recode) {
- vpx_subtract_block(8, 8, src_diff, diff_stride, src, src_stride, dst,
- dst_stride);
vp9_fht8x8(src_diff, coeff, diff_stride, tx_type);
vpx_quantize_b(coeff, 64, p->zbin, p->round, p->quant, p->quant_shift,
qcoeff, dqcoeff, pd->dequant, eob, scan_order->scan,
scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob)
@@ -987,8 +1003,6 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
default:
assert(tx_size == TX_4X4);
if (!x->skip_recode) {
- vpx_subtract_block(4, 4, src_diff, diff_stride, src, src_stride, dst,
- dst_stride);
if (tx_type != DCT_DCT)
vp9_fht4x4(src_diff, coeff, diff_stride, tx_type);
else
@@ -997,7 +1011,7 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
qcoeff, dqcoeff, pd->dequant, eob, scan_order->scan,
scan_order->iscan);
}
- if (args->enable_coeff_opt && !x->skip_recode) {
+ if (enable_trellis_opt) {
*a = *l = vp9_optimize_b(x, plane, block, tx_size, entropy_ctx) > 0;
}
if (!x->skip_encode && *eob) {
@@ -1015,28 +1029,39 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
}
void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane,
- int enable_optimize_b) {
+ int enable_trellis_opt) {
const MACROBLOCKD *const xd = &x->e_mbd;
struct optimize_ctx ctx;
#if CONFIG_MISMATCH_DEBUG
// TODO(angiebird): make mismatch_debug support intra mode
struct encode_b_args arg = {
- x, enable_optimize_b, ctx.ta[plane], ctx.tl[plane], &xd->mi[0]->skip, 0, 0,
- 0
+ x,
+ enable_trellis_opt,
+ 0.0, // trellis_opt_thresh
+ ctx.ta[plane],
+ ctx.tl[plane],
+ &xd->mi[0]->skip,
+ 0, // mi_row
+ 0, // mi_col
+ 0 // output_enabled
};
#else
- struct encode_b_args arg = { x, enable_optimize_b, ctx.ta[plane],
- ctx.tl[plane], &xd->mi[0]->skip };
+ struct encode_b_args arg = { x,
+ enable_trellis_opt,
+ 0.0, // trellis_opt_thresh
+ ctx.ta[plane],
+ ctx.tl[plane],
+ &xd->mi[0]->skip };
#endif
- if (enable_optimize_b && x->optimize &&
+ if (enable_trellis_opt && x->optimize &&
(!x->skip_recode || !x->skip_optimize)) {
const struct macroblockd_plane *const pd = &xd->plane[plane];
const TX_SIZE tx_size =
plane ? get_uv_tx_size(xd->mi[0], pd) : xd->mi[0]->tx_size;
vp9_get_entropy_contexts(bsize, tx_size, pd, ctx.ta[plane], ctx.tl[plane]);
} else {
- arg.enable_coeff_opt = 0;
+ arg.enable_trellis_opt = 0;
}
vp9_foreach_transformed_block_in_plane(xd, bsize, plane,
diff --git a/vp9/encoder/vp9_encodemb.h b/vp9/encoder/vp9_encodemb.h
index 1975ee73a..4091b0214 100644
--- a/vp9/encoder/vp9_encodemb.h
+++ b/vp9/encoder/vp9_encodemb.h
@@ -20,7 +20,8 @@ extern "C" {
struct encode_b_args {
MACROBLOCK *x;
- int enable_coeff_opt;
+ int enable_trellis_opt;
+ double trellis_opt_thresh;
ENTROPY_CONTEXT *ta;
ENTROPY_CONTEXT *tl;
int8_t *skip;
@@ -48,7 +49,7 @@ void vp9_encode_block_intra(int plane, int block, int row, int col,
BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg);
void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane,
- int enable_optimize_b);
+ int enable_trellis_opt);
#ifdef __cplusplus
} // extern "C"
diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h
index 77de5c875..0e95037dc 100644
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -1478,6 +1478,25 @@ static INLINE void alloc_frame_mvs(VP9_COMMON *const cm, int buffer_idx) {
}
}
+// Check if trellis coefficient optimization of the transform block is enabled.
+static INLINE int do_trellis_opt(void *arg) {
+ const struct encode_b_args *const args = (struct encode_b_args *)arg;
+ const MACROBLOCK *const x = args->x;
+ const int enable_trellis_opt = args->enable_trellis_opt;
+ const double trellis_opt_thresh = args->trellis_opt_thresh;
+
+ switch (enable_trellis_opt) {
+ case DISABLE_TRELLIS_OPT: return 0;
+ case ENABLE_TRELLIS_OPT: return 1;
+ case ENABLE_TRELLIS_OPT_TX_RD_SRC_VAR: {
+ return (trellis_opt_thresh > 0.0)
+ ? (x->log_block_src_var <= trellis_opt_thresh)
+ : 1;
+ }
+ default: assert(0 && "Invalid trellis optimization method."); return 1;
+ }
+}
+
#if CONFIG_COLLECT_COMPONENT_TIMING
static INLINE void start_timing(VP9_COMP *cpi, int component) {
vpx_usec_timer_start(&cpi->component_timer[component]);
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index bcadd5777..19ee56223 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -563,7 +563,7 @@ static unsigned pixel_sse(const VP9_COMP *const cpi, const MACROBLOCKD *xd,
return sse;
}
-// Compute the squares sum squares on all visible 4x4s in the transform block.
+// Compute the sum of squares on all visible 4x4s in the transform block.
static int64_t sum_squares_visible(const MACROBLOCKD *xd,
const struct macroblockd_plane *const pd,
const int16_t *diff, const int diff_stride,
@@ -750,20 +750,34 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
const struct macroblockd_plane *const pd = &xd->plane[plane];
const int dst_stride = pd->dst.stride;
const uint8_t *dst = &pd->dst.buf[4 * (blk_row * dst_stride + blk_col)];
+ const int enable_trellis_opt = args->cpi->sf.trellis_opt_tx_rd.method;
+ const double trellis_opt_thresh = args->cpi->sf.trellis_opt_tx_rd.thresh;
+#if CONFIG_MISMATCH_DEBUG
+ struct encode_b_args encode_b_arg = {
+ x,
+ enable_trellis_opt,
+ trellis_opt_thresh,
+ args->t_above,
+ args->t_left,
+ &mi->skip,
+ 0, // mi_row
+ 0, // mi_col
+ 0 // output_enabled
+ };
+#else
+ struct encode_b_args encode_b_arg = { x,
+ enable_trellis_opt,
+ trellis_opt_thresh,
+ args->t_above,
+ args->t_left,
+ &mi->skip };
+#endif
if (args->exit_early) return;
if (!is_inter_block(mi)) {
-#if CONFIG_MISMATCH_DEBUG
- struct encode_b_args intra_arg = {
- x, x->block_qcoeff_opt, args->t_above, args->t_left, &mi->skip, 0, 0, 0
- };
-#else
- struct encode_b_args intra_arg = { x, x->block_qcoeff_opt, args->t_above,
- args->t_left, &mi->skip };
-#endif
vp9_encode_block_intra(plane, block, blk_row, blk_col, plane_bsize, tx_size,
- &intra_arg);
+ &encode_b_arg);
if (recon) {
uint8_t *rec_ptr = &recon->buf[4 * (blk_row * recon->stride + blk_col)];
copy_block_visible(xd, pd, dst, dst_stride, rec_ptr, recon->stride,
@@ -804,9 +818,10 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
if (skip_txfm_flag == SKIP_TXFM_NONE ||
(recon && skip_txfm_flag == SKIP_TXFM_AC_ONLY)) {
+ const int enable_trellis_opt = do_trellis_opt(&encode_b_arg);
// full forward transform and quantization
vp9_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, tx_size);
- if (x->block_qcoeff_opt)
+ if (enable_trellis_opt)
vp9_optimize_b(x, plane, block, tx_size, coeff_ctx);
dist_block(args->cpi, x, plane, plane_bsize, block, blk_row, blk_col,
tx_size, &dist, &sse, recon);
diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c
index f47e3d71c..d07bb34ae 100644
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -275,8 +275,10 @@ static void set_good_speed_feature_framesize_independent(VP9_COMP *cpi,
sf->allow_txfm_domain_distortion = 1;
sf->tx_domain_thresh = tx_dom_thresholds[(speed < 6) ? speed : 5];
- sf->allow_quant_coeff_opt = sf->optimize_coefficients;
- sf->quant_opt_thresh = qopt_thresholds[(speed < 6) ? speed : 5];
+ sf->trellis_opt_tx_rd.method = sf->optimize_coefficients
+ ? ENABLE_TRELLIS_OPT_TX_RD_SRC_VAR
+ : DISABLE_TRELLIS_OPT;
+ sf->trellis_opt_tx_rd.thresh = qopt_thresholds[(speed < 6) ? speed : 5];
sf->less_rectangular_check = 1;
sf->use_rd_breakout = 1;
sf->adaptive_motion_search = 1;
@@ -470,8 +472,8 @@ static void set_rt_speed_feature_framesize_independent(
if (speed >= 1) {
sf->allow_txfm_domain_distortion = 1;
sf->tx_domain_thresh = 0.0;
- sf->allow_quant_coeff_opt = 0;
- sf->quant_opt_thresh = 0.0;
+ sf->trellis_opt_tx_rd.method = DISABLE_TRELLIS_OPT;
+ sf->trellis_opt_tx_rd.thresh = 0.0;
sf->use_square_partition_only = !frame_is_intra_only(cm);
sf->less_rectangular_check = 1;
sf->tx_size_search_method =
@@ -946,8 +948,9 @@ void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi, int speed) {
sf->adaptive_interp_filter_search = 0;
sf->allow_txfm_domain_distortion = 0;
sf->tx_domain_thresh = 99.0;
- sf->allow_quant_coeff_opt = sf->optimize_coefficients;
- sf->quant_opt_thresh = 99.0;
+ sf->trellis_opt_tx_rd.method =
+ sf->optimize_coefficients ? ENABLE_TRELLIS_OPT : DISABLE_TRELLIS_OPT;
+ sf->trellis_opt_tx_rd.thresh = 99.0;
sf->allow_acl = 1;
sf->enable_tpl_model = oxcf->enable_tpl_model;
sf->prune_ref_frame_for_rect_partitions = 0;
diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h
index e30a26084..fceeb9402 100644
--- a/vp9/encoder/vp9_speed_features.h
+++ b/vp9/encoder/vp9_speed_features.h
@@ -246,6 +246,21 @@ typedef enum {
USE_8_TAPS_SHARP,
} SUBPEL_SEARCH_TYPE;
+typedef enum {
+ // Disable trellis coefficient optimization
+ DISABLE_TRELLIS_OPT,
+ // Enable trellis coefficient optimization
+ ENABLE_TRELLIS_OPT,
+ // Enable trellis coefficient optimization based on source variance of the
+ // prediction block during transform RD
+ ENABLE_TRELLIS_OPT_TX_RD_SRC_VAR,
+} ENABLE_TRELLIS_OPT_METHOD;
+
+typedef struct TRELLIS_OPT_CONTROL {
+ ENABLE_TRELLIS_OPT_METHOD method;
+ double thresh;
+} TRELLIS_OPT_CONTROL;
+
typedef struct SPEED_FEATURES {
MV_SPEED_FEATURES mv;
@@ -292,8 +307,8 @@ typedef struct SPEED_FEATURES {
int coeff_prob_appx_step;
// Enable uniform quantizer followed by trellis coefficient optimization
- int allow_quant_coeff_opt;
- double quant_opt_thresh;
+ // during transform RD
+ TRELLIS_OPT_CONTROL trellis_opt_tx_rd;
// Enable asymptotic closed-loop encoding decision for key frame and
// alternate reference frames.