| Index: source/libvpx/vp9/common/vp9_thread_common.c
|
| diff --git a/source/libvpx/vp9/common/vp9_loopfilter_thread.c b/source/libvpx/vp9/common/vp9_thread_common.c
|
| similarity index 69%
|
| rename from source/libvpx/vp9/common/vp9_loopfilter_thread.c
|
| rename to source/libvpx/vp9/common/vp9_thread_common.c
|
| index 2d47daeaffaa6b5c69bc8cf4a708f618c7902af9..27a3212ca6da4e8af057b027d7ff2600045c450e 100644
|
| --- a/source/libvpx/vp9/common/vp9_loopfilter_thread.c
|
| +++ b/source/libvpx/vp9/common/vp9_thread_common.c
|
| @@ -10,7 +10,8 @@
|
|
|
| #include "./vpx_config.h"
|
| #include "vpx_mem/vpx_mem.h"
|
| -#include "vp9/common/vp9_loopfilter_thread.h"
|
| +#include "vp9/common/vp9_entropymode.h"
|
| +#include "vp9/common/vp9_thread_common.h"
|
| #include "vp9/common/vp9_reconinter.h"
|
|
|
| #if CONFIG_MULTITHREAD
|
| @@ -152,7 +153,7 @@ static void loop_filter_rows_mt(YV12_BUFFER_CONFIG *frame,
|
| const int num_workers = MIN(nworkers, tile_cols);
|
| int i;
|
|
|
| - if (!lf_sync->sync_range || cm->last_height != cm->height ||
|
| + if (!lf_sync->sync_range || sb_rows != lf_sync->rows ||
|
| num_workers > lf_sync->num_workers) {
|
| vp9_loop_filter_dealloc(lf_sync);
|
| vp9_loop_filter_alloc(lf_sync, cm, sb_rows, cm->width, num_workers);
|
| @@ -299,3 +300,119 @@ void vp9_loop_filter_dealloc(VP9LfSync *lf_sync) {
|
| vp9_zero(*lf_sync);
|
| }
|
| }
|
| +
|
| +// Accumulate frame counts.
|
| +void vp9_accumulate_frame_counts(VP9_COMMON *cm, FRAME_COUNTS *counts,
|
| + int is_dec) {
|
| + int i, j, k, l, m;
|
| +
|
| + for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
|
| + for (j = 0; j < INTRA_MODES; j++)
|
| + cm->counts.y_mode[i][j] += counts->y_mode[i][j];
|
| +
|
| + for (i = 0; i < INTRA_MODES; i++)
|
| + for (j = 0; j < INTRA_MODES; j++)
|
| + cm->counts.uv_mode[i][j] += counts->uv_mode[i][j];
|
| +
|
| + for (i = 0; i < PARTITION_CONTEXTS; i++)
|
| + for (j = 0; j < PARTITION_TYPES; j++)
|
| + cm->counts.partition[i][j] += counts->partition[i][j];
|
| +
|
| + if (is_dec) {
|
| + int n;
|
| + for (i = 0; i < TX_SIZES; i++)
|
| + for (j = 0; j < PLANE_TYPES; j++)
|
| + for (k = 0; k < REF_TYPES; k++)
|
| + for (l = 0; l < COEF_BANDS; l++)
|
| + for (m = 0; m < COEFF_CONTEXTS; m++) {
|
| + cm->counts.eob_branch[i][j][k][l][m] +=
|
| + counts->eob_branch[i][j][k][l][m];
|
| + for (n = 0; n < UNCONSTRAINED_NODES + 1; n++)
|
| + cm->counts.coef[i][j][k][l][m][n] +=
|
| + counts->coef[i][j][k][l][m][n];
|
| + }
|
| + } else {
|
| + for (i = 0; i < TX_SIZES; i++)
|
| + for (j = 0; j < PLANE_TYPES; j++)
|
| + for (k = 0; k < REF_TYPES; k++)
|
| + for (l = 0; l < COEF_BANDS; l++)
|
| + for (m = 0; m < COEFF_CONTEXTS; m++)
|
| + cm->counts.eob_branch[i][j][k][l][m] +=
|
| + counts->eob_branch[i][j][k][l][m];
|
| + // In the encoder, cm->counts.coef is only updated at frame
|
| + // level, so not need to accumulate it here.
|
| + // for (n = 0; n < UNCONSTRAINED_NODES + 1; n++)
|
| + // cm->counts.coef[i][j][k][l][m][n] +=
|
| + // counts->coef[i][j][k][l][m][n];
|
| + }
|
| +
|
| + for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
|
| + for (j = 0; j < SWITCHABLE_FILTERS; j++)
|
| + cm->counts.switchable_interp[i][j] += counts->switchable_interp[i][j];
|
| +
|
| + for (i = 0; i < INTER_MODE_CONTEXTS; i++)
|
| + for (j = 0; j < INTER_MODES; j++)
|
| + cm->counts.inter_mode[i][j] += counts->inter_mode[i][j];
|
| +
|
| + for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + cm->counts.intra_inter[i][j] += counts->intra_inter[i][j];
|
| +
|
| + for (i = 0; i < COMP_INTER_CONTEXTS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + cm->counts.comp_inter[i][j] += counts->comp_inter[i][j];
|
| +
|
| + for (i = 0; i < REF_CONTEXTS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + for (k = 0; k < 2; k++)
|
| + cm->counts.single_ref[i][j][k] += counts->single_ref[i][j][k];
|
| +
|
| + for (i = 0; i < REF_CONTEXTS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + cm->counts.comp_ref[i][j] += counts->comp_ref[i][j];
|
| +
|
| + for (i = 0; i < TX_SIZE_CONTEXTS; i++) {
|
| + for (j = 0; j < TX_SIZES; j++)
|
| + cm->counts.tx.p32x32[i][j] += counts->tx.p32x32[i][j];
|
| +
|
| + for (j = 0; j < TX_SIZES - 1; j++)
|
| + cm->counts.tx.p16x16[i][j] += counts->tx.p16x16[i][j];
|
| +
|
| + for (j = 0; j < TX_SIZES - 2; j++)
|
| + cm->counts.tx.p8x8[i][j] += counts->tx.p8x8[i][j];
|
| + }
|
| +
|
| + for (i = 0; i < SKIP_CONTEXTS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + cm->counts.skip[i][j] += counts->skip[i][j];
|
| +
|
| + for (i = 0; i < MV_JOINTS; i++)
|
| + cm->counts.mv.joints[i] += counts->mv.joints[i];
|
| +
|
| + for (k = 0; k < 2; k++) {
|
| + nmv_component_counts *comps = &cm->counts.mv.comps[k];
|
| + nmv_component_counts *comps_t = &counts->mv.comps[k];
|
| +
|
| + for (i = 0; i < 2; i++) {
|
| + comps->sign[i] += comps_t->sign[i];
|
| + comps->class0_hp[i] += comps_t->class0_hp[i];
|
| + comps->hp[i] += comps_t->hp[i];
|
| + }
|
| +
|
| + for (i = 0; i < MV_CLASSES; i++)
|
| + comps->classes[i] += comps_t->classes[i];
|
| +
|
| + for (i = 0; i < CLASS0_SIZE; i++) {
|
| + comps->class0[i] += comps_t->class0[i];
|
| + for (j = 0; j < MV_FP_SIZE; j++)
|
| + comps->class0_fp[i][j] += comps_t->class0_fp[i][j];
|
| + }
|
| +
|
| + for (i = 0; i < MV_OFFSET_BITS; i++)
|
| + for (j = 0; j < 2; j++)
|
| + comps->bits[i][j] += comps_t->bits[i][j];
|
| +
|
| + for (i = 0; i < MV_FP_SIZE; i++)
|
| + comps->fp[i] += comps_t->fp[i];
|
| + }
|
| +}
|
|
|