Commit 3b1c7668 authored by hui su's avatar hui su

Add 8-tap interpolation filter options for intra prediction

BD-rate performance improvement (on top of ext-intra):
derflr  0.22%
hevclr  0.36%
hevcmr  0.48%
hevchr  0.37%
stdhd   0.19%

Average speed impact on some derf clips is about 40% slower (on
top of ext-intra). Speed improvment is a to-do.

Change-Id: I8fe3fe8c5e4f60d0462778adbcc15c84dfbe7a25
parent 392d577c
......@@ -8,6 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <math.h>
#include "vp10/common/blockd.h"
PREDICTION_MODE vp10_left_block_mode(const MODE_INFO *cur_mi,
......@@ -134,3 +135,23 @@ void vp10_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y) {
xd->plane[i].subsampling_y = i ? ss_y : 0;
}
}
#if CONFIG_EXT_INTRA
#define PI 3.14159265
// Returns whether filter selection is needed for a given
// intra prediction angle.
int pick_intra_filter(int angle) {
if (angle % 45 == 0)
return 0;
if (angle > 90 && angle < 180) {
return 1;
} else {
double t = tan(angle * PI / 180.0);
double n;
if (angle < 90)
t = 1 / t;
n = floor(t);
return (t - n) * 1024 > 1;
}
}
#endif // CONFIG_EXT_INTRA
......@@ -163,6 +163,8 @@ typedef struct {
#if CONFIG_EXT_INTRA
EXT_INTRA_MODE_INFO ext_intra_mode_info;
int8_t angle_delta[2];
// To-Do (huisu): this may be replaced by interp_filter
INTRA_FILTER intra_filter;
#endif // CONFIG_EXT_INTRA
int_mv mv[2];
......@@ -413,6 +415,8 @@ static const TX_TYPE filter_intra_mode_to_tx_type_lookup[FILTER_INTRA_MODES] = {
ADST_DCT, // FILTER_D63
ADST_ADST, // FILTER_TM
};
int pick_intra_filter(int angle);
#endif // CONFIG_EXT_INTRA
static INLINE TX_TYPE get_tx_type(PLANE_TYPE plane_type,
......
......@@ -1220,9 +1220,7 @@ default_intra_ext_tx_prob[EXT_TX_SETS_INTRA][EXT_TX_SIZES]
},
},
};
#else
const vpx_tree_index vp10_ext_tx_tree[TREE_SIZE(TX_TYPES)] = {
-DCT_DCT, 2,
-ADST_ADST, 4,
......@@ -1244,6 +1242,24 @@ static const vpx_prob default_inter_ext_tx_prob[EXT_TX_SIZES]
};
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
static const vpx_prob
default_intra_filter_probs[INTRA_FILTERS + 1][INTRA_FILTERS - 1] = {
{ 98, 63, 60, },
{ 98, 82, 80, },
{ 94, 65, 103, },
{ 49, 25, 24, },
{ 72, 38, 50, },
};
static const vpx_prob default_ext_intra_probs[2] = {230, 230};
const vpx_tree_index vp10_intra_filter_tree[TREE_SIZE(INTRA_FILTERS)] = {
-INTRA_FILTER_LINEAR, 2,
-INTRA_FILTER_8TAP, 4,
-INTRA_FILTER_8TAP_SHARP, -INTRA_FILTER_8TAP_SMOOTH,
};
#endif // CONFIG_EXT_INTRA
#if CONFIG_SUPERTX
static const vpx_prob default_supertx_prob[PARTITION_SUPERTX_CONTEXTS]
[TX_SIZES] = {
......@@ -1258,10 +1274,6 @@ static const struct segmentation_probs default_seg_probs = {
{ 128, 128, 128 },
};
#if CONFIG_EXT_INTRA
static const vpx_prob default_ext_intra_probs[2] = {230, 230};
#endif // CONFIG_EXT_INTRA
static void init_mode_probs(FRAME_CONTEXT *fc) {
vp10_copy(fc->uv_mode_prob, default_uv_probs);
vp10_copy(fc->y_mode_prob, default_if_y_probs);
......@@ -1295,6 +1307,7 @@ static void init_mode_probs(FRAME_CONTEXT *fc) {
vp10_copy(fc->seg.pred_probs, default_seg_probs.pred_probs);
#if CONFIG_EXT_INTRA
vp10_copy(fc->ext_intra_probs, default_ext_intra_probs);
vp10_copy(fc->intra_filter_probs, default_intra_filter_probs);
#endif // CONFIG_EXT_INTRA
vp10_copy(fc->inter_ext_tx_prob, default_inter_ext_tx_prob);
vp10_copy(fc->intra_ext_tx_prob, default_intra_ext_tx_prob);
......@@ -1494,6 +1507,10 @@ void vp10_adapt_intra_frame_probs(VP10_COMMON *cm) {
fc->ext_intra_probs[i] = mode_mv_merge_probs(
pre_fc->ext_intra_probs[i], counts->ext_intra[i]);
}
for (i = 0; i < INTRA_FILTERS + 1; ++i)
vpx_tree_merge_probs(vp10_intra_filter_tree, pre_fc->intra_filter_probs[i],
counts->intra_filter[i], fc->intra_filter_probs[i]);
#endif // CONFIG_EXT_INTRA
}
......
......@@ -103,6 +103,7 @@ typedef struct frame_contexts {
struct segmentation_probs seg;
#if CONFIG_EXT_INTRA
vpx_prob ext_intra_probs[PLANE_TYPES];
vpx_prob intra_filter_probs[INTRA_FILTERS + 1][INTRA_FILTERS - 1];
#endif // CONFIG_EXT_INTRA
} FRAME_CONTEXT;
......@@ -154,6 +155,7 @@ typedef struct FRAME_COUNTS {
struct seg_counts seg;
#if CONFIG_EXT_INTRA
unsigned int ext_intra[PLANE_TYPES][2];
unsigned int intra_filter[INTRA_FILTERS + 1][INTRA_FILTERS];
#endif // CONFIG_EXT_INTRA
} FRAME_COUNTS;
......@@ -182,7 +184,18 @@ extern const vpx_tree_index vp10_switchable_interp_tree
extern const vpx_tree_index vp10_palette_size_tree[TREE_SIZE(PALETTE_SIZES)];
extern const vpx_tree_index
vp10_palette_color_tree[PALETTE_MAX_SIZE - 1][TREE_SIZE(PALETTE_COLORS)];
#if CONFIG_EXT_INTRA
extern const vpx_tree_index vp10_intra_filter_tree[TREE_SIZE(INTRA_FILTERS)];
#endif // CONFIG_EXT_INTRA
#if CONFIG_EXT_TX
extern const vpx_tree_index
vp10_ext_tx_inter_tree[EXT_TX_SETS_INTER][TREE_SIZE(TX_TYPES)];
extern const vpx_tree_index
vp10_ext_tx_intra_tree[EXT_TX_SETS_INTRA][TREE_SIZE(TX_TYPES)];
#else
extern const vpx_tree_index
vp10_ext_tx_tree[TREE_SIZE(TX_TYPES)];
#endif // CONFIG_EXT_TX
void vp10_setup_past_independence(struct VP10Common *cm);
......@@ -196,16 +209,6 @@ void vp10_tx_counts_to_branch_counts_16x16(const unsigned int *tx_count_16x16p,
void vp10_tx_counts_to_branch_counts_8x8(const unsigned int *tx_count_8x8p,
unsigned int (*ct_8x8p)[2]);
#if CONFIG_EXT_TX
extern const vpx_tree_index
vp10_ext_tx_inter_tree[EXT_TX_SETS_INTER][TREE_SIZE(TX_TYPES)];
extern const vpx_tree_index
vp10_ext_tx_intra_tree[EXT_TX_SETS_INTRA][TREE_SIZE(TX_TYPES)];
#else
extern const vpx_tree_index
vp10_ext_tx_tree[TREE_SIZE(TX_TYPES)];
#endif // CONFIG_EXT_TX
static INLINE int vp10_ceil_log2(int n) {
int i = 1, p = 2;
while (p < n) {
......
......@@ -192,3 +192,12 @@ const InterpKernel *vp10_filter_kernels[SWITCHABLE_FILTERS + 1] = {
#endif
bilinear_filters
};
#if CONFIG_EXT_INTRA
const InterpKernel *vp10_intra_filter_kernels[INTRA_FILTERS] = {
NULL, // INTRA_FILTER_LINEAR
sub_pel_filters_8, // INTRA_FILTER_8TAP
sub_pel_filters_8sharp, // INTRA_FILTER_8TAP_SHARP
sub_pel_filters_8smooth, // INTRA_FILTER_8TAP_SMOOTH
};
#endif // CONFIG_EXT_INTRA
......@@ -43,6 +43,18 @@ typedef uint8_t INTERP_FILTER;
extern const InterpKernel *vp10_filter_kernels[SWITCHABLE_FILTERS + 1];
#if CONFIG_EXT_INTRA
typedef enum {
INTRA_FILTER_LINEAR,
INTRA_FILTER_8TAP,
INTRA_FILTER_8TAP_SHARP,
INTRA_FILTER_8TAP_SMOOTH,
INTRA_FILTERS,
} INTRA_FILTER;
extern const InterpKernel *vp10_intra_filter_kernels[INTRA_FILTERS];
#endif // CONFIG_EXT_INTRA
#ifdef __cplusplus
} // extern "C"
#endif
......
......@@ -21,10 +21,10 @@ int vp10_get_pred_context_switchable_interp(const MACROBLOCKD *xd) {
// The prediction flags in these dummy entries are initialized to 0.
const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
const int left_type = xd->left_available && is_inter_block(left_mbmi) ?
left_mbmi->interp_filter : SWITCHABLE_FILTERS;
left_mbmi->interp_filter : SWITCHABLE_FILTERS;
const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
const int above_type = xd->up_available && is_inter_block(above_mbmi) ?
above_mbmi->interp_filter : SWITCHABLE_FILTERS;
above_mbmi->interp_filter : SWITCHABLE_FILTERS;
if (left_type == above_type)
return left_type;
......@@ -36,6 +36,85 @@ int vp10_get_pred_context_switchable_interp(const MACROBLOCKD *xd) {
return SWITCHABLE_FILTERS;
}
#if CONFIG_EXT_INTRA
int vp10_get_pred_context_intra_interp(const MACROBLOCKD *xd) {
const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
int left_type = INTRA_FILTERS, above_type = INTRA_FILTERS;
if (xd->left_available && left_mbmi->sb_type >= BLOCK_8X8) {
PREDICTION_MODE mode = left_mbmi->mode;
if (is_inter_block(left_mbmi)) {
switch (left_mbmi->interp_filter) {
case EIGHTTAP:
left_type = INTRA_FILTER_8TAP;
break;
case EIGHTTAP_SMOOTH:
left_type = INTRA_FILTER_8TAP_SMOOTH;
break;
case EIGHTTAP_SHARP:
left_type = INTRA_FILTER_8TAP_SHARP;
break;
case BILINEAR:
left_type = INTRA_FILTERS;
break;
default:
break;
}
} else {
if (mode != DC_PRED && mode != TM_PRED) {
int p_angle;
p_angle = mode_to_angle_map[mode] +
left_mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
left_type = left_mbmi->intra_filter;
}
}
}
}
if (xd->up_available && above_mbmi->sb_type >= BLOCK_8X8) {
if (is_inter_block(above_mbmi)) {
switch (above_mbmi->interp_filter) {
case EIGHTTAP:
above_type = INTRA_FILTER_8TAP;
break;
case EIGHTTAP_SMOOTH:
above_type = INTRA_FILTER_8TAP_SMOOTH;
break;
case EIGHTTAP_SHARP:
above_type = INTRA_FILTER_8TAP_SHARP;
break;
case BILINEAR:
above_type = INTRA_FILTERS;
break;
default:
break;
}
} else {
PREDICTION_MODE mode = above_mbmi->mode;
if (mode != DC_PRED && mode != TM_PRED) {
int p_angle;
p_angle = mode_to_angle_map[mode] +
above_mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
above_type = above_mbmi->intra_filter;
}
}
}
}
if (left_type == above_type)
return left_type;
else if (left_type == INTRA_FILTERS && above_type != INTRA_FILTERS)
return above_type;
else if (left_type != INTRA_FILTERS && above_type == INTRA_FILTERS)
return left_type;
else
return INTRA_FILTERS;
}
#endif // CONFIG_EXT_INTRA
// The mode info data structure has a one element border above and to the
// left of the entries corresponding to real macroblocks.
// The prediction flags in these dummy entries are initialized to 0.
......
......@@ -68,6 +68,10 @@ static INLINE vpx_prob vp10_get_skip_prob(const VP10_COMMON *cm,
int vp10_get_pred_context_switchable_interp(const MACROBLOCKD *xd);
#if CONFIG_EXT_INTRA
int vp10_get_pred_context_intra_interp(const MACROBLOCKD *xd);
#endif // CONFIG_EXT_INTRA
int vp10_get_intra_inter_context(const MACROBLOCKD *xd);
static INLINE vpx_prob vp10_get_intra_inter_prob(const VP10_COMMON *cm,
......
This diff is collapsed.
......@@ -25,6 +25,9 @@ void vp10_predict_intra_block(const MACROBLOCKD *xd, int bwl_in, int bhl_in,
const uint8_t *ref, int ref_stride,
uint8_t *dst, int dst_stride,
int aoff, int loff, int plane);
#if CONFIG_EXT_INTRA
int pick_intra_filter(int angle);
#endif // CONFIG_EXT_INTRA
#ifdef __cplusplus
} // extern "C"
#endif
......
......@@ -520,7 +520,10 @@ void vp10_accumulate_frame_counts(VP10_COMMON *cm, FRAME_COUNTS *counts,
#if CONFIG_EXT_INTRA
for (i = 0; i < PLANE_TYPES; ++i)
for (j = 0; j < 2; j++)
for (j = 0; j < 2; ++j)
cm->counts.ext_intra[i][j] += counts->ext_intra[i][j];
for (i = 0; i < INTRA_FILTERS + 1; ++i)
for (j = 0; j < INTRA_FILTERS; ++j)
cm->counts.intra_filter[i][j] += counts->intra_filter[i][j];
#endif // CONFIG_EXT_INTRA
}
......@@ -3263,6 +3263,12 @@ static int read_compressed_header(VP10Decoder *pbi, const uint8_t *data,
for (i = 0; i < PARTITION_TYPES - 1; ++i)
vp10_diff_update_prob(&r, &fc->partition_prob[j][i]);
#if CONFIG_EXT_INTRA
for (i = 0; i < INTRA_FILTERS + 1; ++i)
for (j = 0; j < INTRA_FILTERS - 1; ++j)
vp10_diff_update_prob(&r, &fc->intra_filter_probs[i][j]);
#endif // CONFIG_EXT_INTRA
if (frame_is_intra_only(cm)) {
vp10_copy(cm->kf_y_prob, vp10_kf_y_mode_prob);
for (k = 0; k < INTRA_MODES; k++)
......
......@@ -491,9 +491,23 @@ static void read_intra_frame_mode_info(VP10_COMMON *const cm,
mbmi->mode = read_intra_mode(r,
get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#if CONFIG_EXT_INTRA
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED)
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) {
int p_angle;
const int ctx = vp10_get_pred_context_intra_interp(xd);
mbmi->angle_delta[0] =
read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS;
p_angle = mode_to_angle_map[mbmi->mode] +
mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
FRAME_COUNTS *counts = xd->counts;
mbmi->intra_filter = vpx_read_tree(r, vp10_intra_filter_tree,
cm->fc->intra_filter_probs[ctx]);
if (counts)
++counts->intra_filter[ctx][mbmi->intra_filter];
} else {
mbmi->intra_filter = INTRA_FILTER_LINEAR;
}
}
#endif // CONFIG_EXT_INTRA
}
......@@ -773,9 +787,23 @@ static void read_intra_block_mode_info(VP10_COMMON *const cm,
mbmi->mode = read_intra_mode_y(cm, xd, r, size_group_lookup[bsize]);
#if CONFIG_EXT_INTRA
mbmi->angle_delta[0] = 0;
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED)
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) {
int p_angle;
mbmi->angle_delta[0] =
read_uniform(r, 2 * MAX_ANGLE_DELTAS + 1) - MAX_ANGLE_DELTAS;
p_angle =
mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
FRAME_COUNTS *counts = xd->counts;
const int ctx = vp10_get_pred_context_intra_interp(xd);
mbmi->intra_filter = vpx_read_tree(r, vp10_intra_filter_tree,
cm->fc->intra_filter_probs[ctx]);
if (counts)
++counts->intra_filter[ctx][mbmi->intra_filter];
} else {
mbmi->intra_filter = INTRA_FILTER_LINEAR;
}
}
#endif // CONFIG_EXT_INTRA
}
......
......@@ -97,6 +97,9 @@ static struct vp10_token ext_tx_intra_encodings[EXT_TX_SETS_INTRA][TX_TYPES];
#else
static struct vp10_token ext_tx_encodings[TX_TYPES];
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
static struct vp10_token intra_filter_encodings[INTRA_FILTERS];
#endif // CONFIG_EXT_INTRA
void vp10_encode_token_init() {
#if CONFIG_EXT_TX
......@@ -110,6 +113,9 @@ void vp10_encode_token_init() {
#else
vp10_tokens_from_tree(ext_tx_encodings, vp10_ext_tx_tree);
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
vp10_tokens_from_tree(intra_filter_encodings, vp10_intra_filter_tree);
#endif // CONFIG_EXT_INTRA
}
#if CONFIG_SUPERTX
......@@ -936,8 +942,16 @@ static void pack_inter_mode_mvs(VP10_COMP *cpi, const MODE_INFO *mi,
write_intra_mode(w, mode, cm->fc->y_mode_prob[size_group_lookup[bsize]]);
#if CONFIG_EXT_INTRA
if (mode != DC_PRED && mode != TM_PRED) {
int p_angle;
const int intra_filter_ctx = vp10_get_pred_context_intra_interp(xd);
write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1,
MAX_ANGLE_DELTAS + mbmi->angle_delta[0]);
p_angle = mode_to_angle_map[mode] + mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
vp10_write_token(w, vp10_intra_filter_tree,
cm->fc->intra_filter_probs[intra_filter_ctx],
&intra_filter_encodings[mbmi->intra_filter]);
}
}
#endif // CONFIG_EXT_INTRA
} else {
......@@ -1188,9 +1202,19 @@ static void write_mb_modes_kf(const VP10_COMMON *cm, const MACROBLOCKD *xd,
write_intra_mode(w, mbmi->mode,
get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
#if CONFIG_EXT_INTRA
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED)
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) {
int p_angle;
const int intra_filter_ctx = vp10_get_pred_context_intra_interp(xd);
write_uniform(w, 2 * MAX_ANGLE_DELTAS + 1,
MAX_ANGLE_DELTAS + mbmi->angle_delta[0]);
p_angle =
mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle)) {
vp10_write_token(w, vp10_intra_filter_tree,
cm->fc->intra_filter_probs[intra_filter_ctx],
&intra_filter_encodings[mbmi->intra_filter]);
}
}
#endif // CONFIG_EXT_INTRA
} else {
const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
......@@ -2292,6 +2316,12 @@ static size_t write_compressed_header(VP10_COMP *cpi, uint8_t *data) {
prob_diff_update(vp10_partition_tree, fc->partition_prob[i],
counts->partition[i], PARTITION_TYPES, &header_bc);
#if CONFIG_EXT_INTRA
for (i = 0; i < INTRA_FILTERS + 1; ++i)
prob_diff_update(vp10_intra_filter_tree, fc->intra_filter_probs[i],
counts->intra_filter[i], INTRA_FILTERS, &header_bc);
#endif // CONFIG_EXT_INTRA
if (frame_is_intra_only(cm)) {
vp10_copy(cm->kf_y_prob, vp10_kf_y_mode_prob);
for (i = 0; i < INTRA_MODES; ++i)
......
......@@ -4344,6 +4344,24 @@ static void encode_superblock(VP10_COMP *cpi, ThreadData *td,
sum_intra_stats(td->counts, mi, xd->above_mi, xd->left_mi,
frame_is_intra_only(cm));
#if CONFIG_EXT_INTRA
if (output_enabled && bsize >= BLOCK_8X8) {
FRAME_COUNTS *counts = td->counts;
if (mbmi->mode == DC_PRED)
++counts->ext_intra[0][mbmi->ext_intra_mode_info.use_ext_intra_mode[0]];
if (mbmi->uv_mode == DC_PRED)
++counts->ext_intra[1][mbmi->ext_intra_mode_info.use_ext_intra_mode[1]];
if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) {
int p_angle;
const int intra_filter_ctx = vp10_get_pred_context_intra_interp(xd);
p_angle = mode_to_angle_map[mbmi->mode] +
mbmi->angle_delta[0] * ANGLE_STEP;
if (pick_intra_filter(p_angle))
++counts->intra_filter[intra_filter_ctx][mbmi->intra_filter];
}
}
#endif // CONFIG_EXT_INTRA
if (bsize >= BLOCK_8X8 && output_enabled) {
if (mbmi->palette_mode_info.palette_size[0] > 0) {
mbmi->palette_mode_info.palette_first_color_idx[0] =
......@@ -4436,16 +4454,6 @@ static void encode_superblock(VP10_COMP *cpi, ThreadData *td,
}
}
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
if (bsize >= BLOCK_8X8 && !is_inter_block(mbmi)) {
if (mbmi->mode == DC_PRED)
++td->counts->ext_intra[0]
[mbmi->ext_intra_mode_info.use_ext_intra_mode[0]];
if (mbmi->uv_mode == DC_PRED)
++td->counts->ext_intra[1]
[mbmi->ext_intra_mode_info.use_ext_intra_mode[1]];
}
#endif // CONFIG_EXT_INTRA
}
#if CONFIG_VAR_TX
......
......@@ -496,10 +496,6 @@ typedef struct VP10_COMP {
[PALETTE_COLORS];
int palette_uv_color_cost[PALETTE_MAX_SIZE - 1][PALETTE_COLOR_CONTEXTS]
[PALETTE_COLORS];
int multi_arf_allowed;
int multi_arf_enabled;
int multi_arf_last_grp_enabled;
#if CONFIG_EXT_TX
int inter_tx_type_costs[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
......@@ -508,6 +504,13 @@ typedef struct VP10_COMP {
int intra_tx_type_costs[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
int inter_tx_type_costs[EXT_TX_SIZES][TX_TYPES];
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
int intra_filter_cost[INTRA_FILTERS + 1][INTRA_FILTERS];
#endif // CONFIG_EXT_INTRA
int multi_arf_allowed;
int multi_arf_enabled;
int multi_arf_last_grp_enabled;
#if CONFIG_VP9_TEMPORAL_DENOISING
VP9_DENOISER denoiser;
#endif
......
......@@ -137,6 +137,11 @@ static void fill_mode_costs(VP10_COMP *cpi) {
vp10_ext_tx_tree);
}
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_INTRA
for (i = 0; i < INTRA_FILTERS + 1; ++i)
vp10_cost_tokens(cpi->intra_filter_cost[i], fc->intra_filter_probs[i],
vp10_intra_filter_tree);
#endif // CONFIG_EXT_INTRA
}
static void fill_token_costs(vp10_coeff_cost *c,
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment