99 lines
2.7 KiB
C
99 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef VP10_ENCODER_VARIANCE_TREE_H_
|
|
#define VP10_ENCODER_VARIANCE_TREE_H_
|
|
|
|
#include <assert.h>
|
|
|
|
#include "./vpx_config.h"
|
|
|
|
#include "vpx/vpx_integer.h"
|
|
|
|
#include "vp10/common/enums.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct VP10Common;
|
|
struct ThreadData;
|
|
|
|
typedef struct {
|
|
int64_t sum_square_error;
|
|
int64_t sum_error;
|
|
int log2_count;
|
|
int variance;
|
|
} var;
|
|
|
|
typedef struct {
|
|
var none;
|
|
var horz[2];
|
|
var vert[2];
|
|
} partition_variance;
|
|
|
|
typedef struct VAR_TREE {
|
|
int force_split;
|
|
partition_variance variances;
|
|
struct VAR_TREE *split[4];
|
|
BLOCK_SIZE bsize;
|
|
const uint8_t *src;
|
|
const uint8_t *ref;
|
|
int src_stride;
|
|
int ref_stride;
|
|
int width;
|
|
int height;
|
|
#if CONFIG_VPX_HIGHBITDEPTH
|
|
int highbd;
|
|
#endif // CONFIG_VPX_HIGHBITDEPTH
|
|
} VAR_TREE;
|
|
|
|
void vp10_setup_var_tree(struct VP10Common *cm, struct ThreadData *td);
|
|
void vp10_free_var_tree(struct ThreadData *td);
|
|
|
|
// Set variance values given sum square error, sum error, count.
|
|
static INLINE void fill_variance(int64_t s2, int64_t s, int c, var *v) {
|
|
v->sum_square_error = s2;
|
|
v->sum_error = s;
|
|
v->log2_count = c;
|
|
v->variance = (int)(256 * (v->sum_square_error -
|
|
((v->sum_error * v->sum_error) >> v->log2_count)) >> v->log2_count);
|
|
}
|
|
|
|
static INLINE void sum_2_variances(const var *a, const var *b, var *r) {
|
|
assert(a->log2_count == b->log2_count);
|
|
fill_variance(a->sum_square_error + b->sum_square_error,
|
|
a->sum_error + b->sum_error, a->log2_count + 1, r);
|
|
}
|
|
|
|
static INLINE void fill_variance_node(VAR_TREE *vt) {
|
|
sum_2_variances(&vt->split[0]->variances.none,
|
|
&vt->split[1]->variances.none,
|
|
&vt->variances.horz[0]);
|
|
sum_2_variances(&vt->split[2]->variances.none,
|
|
&vt->split[3]->variances.none,
|
|
&vt->variances.horz[1]);
|
|
sum_2_variances(&vt->split[0]->variances.none,
|
|
&vt->split[2]->variances.none,
|
|
&vt->variances.vert[0]);
|
|
sum_2_variances(&vt->split[1]->variances.none,
|
|
&vt->split[3]->variances.none,
|
|
&vt->variances.vert[1]);
|
|
sum_2_variances(&vt->variances.vert[0],
|
|
&vt->variances.vert[1],
|
|
&vt->variances.none);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif /* VP10_ENCODER_VARIANCE_TREE_H_ */
|