Merge "Move PSNR related functions into vpx_dsp/psnr.c" into nextgenv2
This commit is contained in:
commit
7823fbb45c
@ -50,7 +50,7 @@
|
|||||||
#include "./vp10_rtcd.h"
|
#include "./vp10_rtcd.h"
|
||||||
#include "./vpx_dsp_rtcd.h"
|
#include "./vpx_dsp_rtcd.h"
|
||||||
#include "./vpx_scale_rtcd.h"
|
#include "./vpx_scale_rtcd.h"
|
||||||
#include "vpx/internal/vpx_psnr.h"
|
#include "vpx_dsp/psnr.h"
|
||||||
#if CONFIG_INTERNAL_STATS
|
#if CONFIG_INTERNAL_STATS
|
||||||
#include "vpx_dsp/ssim.h"
|
#include "vpx_dsp/ssim.h"
|
||||||
#endif
|
#endif
|
||||||
@ -2033,261 +2033,6 @@ void vp10_remove_compressor(VP10_COMP *cpi) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO(yaowu): The block_variance calls the unoptimized versions of variance()
|
|
||||||
* and highbd_8_variance(). It should not.
|
|
||||||
*/
|
|
||||||
static void encoder_variance(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int w, int h, unsigned int *sse, int *sum) {
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
*sum = 0;
|
|
||||||
*sse = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++) {
|
|
||||||
for (j = 0; j < w; j++) {
|
|
||||||
const int diff = a[j] - b[j];
|
|
||||||
*sum += diff;
|
|
||||||
*sse += diff * diff;
|
|
||||||
}
|
|
||||||
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static void encoder_highbd_variance64(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int w, int h, uint64_t *sse,
|
|
||||||
uint64_t *sum) {
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
|
||||||
uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
|
||||||
*sum = 0;
|
|
||||||
*sse = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++) {
|
|
||||||
for (j = 0; j < w; j++) {
|
|
||||||
const int diff = a[j] - b[j];
|
|
||||||
*sum += diff;
|
|
||||||
*sse += diff * diff;
|
|
||||||
}
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void encoder_highbd_8_variance(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int w, int h,
|
|
||||||
unsigned int *sse, int *sum) {
|
|
||||||
uint64_t sse_long = 0;
|
|
||||||
uint64_t sum_long = 0;
|
|
||||||
encoder_highbd_variance64(a8, a_stride, b8, b_stride, w, h,
|
|
||||||
&sse_long, &sum_long);
|
|
||||||
*sse = (unsigned int)sse_long;
|
|
||||||
*sum = (int)sum_long;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static int64_t get_sse(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int width, int height) {
|
|
||||||
const int dw = width % 16;
|
|
||||||
const int dh = height % 16;
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
unsigned int sse = 0;
|
|
||||||
int sum = 0;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (dw > 0) {
|
|
||||||
encoder_variance(&a[width - dw], a_stride, &b[width - dw], b_stride,
|
|
||||||
dw, height, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dh > 0) {
|
|
||||||
encoder_variance(&a[(height - dh) * a_stride], a_stride,
|
|
||||||
&b[(height - dh) * b_stride], b_stride,
|
|
||||||
width - dw, dh, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (y = 0; y < height / 16; ++y) {
|
|
||||||
const uint8_t *pa = a;
|
|
||||||
const uint8_t *pb = b;
|
|
||||||
for (x = 0; x < width / 16; ++x) {
|
|
||||||
vpx_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
|
||||||
total_sse += sse;
|
|
||||||
|
|
||||||
pa += 16;
|
|
||||||
pb += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
a += 16 * a_stride;
|
|
||||||
b += 16 * b_stride;
|
|
||||||
}
|
|
||||||
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int width, int height,
|
|
||||||
unsigned int input_shift) {
|
|
||||||
const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
|
||||||
const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
int x, y;
|
|
||||||
for (y = 0; y < height; ++y) {
|
|
||||||
for (x = 0; x < width; ++x) {
|
|
||||||
int64_t diff;
|
|
||||||
diff = (a[x] >> input_shift) - (b[x] >> input_shift);
|
|
||||||
total_sse += diff * diff;
|
|
||||||
}
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t highbd_get_sse(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int width, int height) {
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
int x, y;
|
|
||||||
const int dw = width % 16;
|
|
||||||
const int dh = height % 16;
|
|
||||||
unsigned int sse = 0;
|
|
||||||
int sum = 0;
|
|
||||||
if (dw > 0) {
|
|
||||||
encoder_highbd_8_variance(&a[width - dw], a_stride,
|
|
||||||
&b[width - dw], b_stride,
|
|
||||||
dw, height, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
if (dh > 0) {
|
|
||||||
encoder_highbd_8_variance(&a[(height - dh) * a_stride], a_stride,
|
|
||||||
&b[(height - dh) * b_stride], b_stride,
|
|
||||||
width - dw, dh, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
for (y = 0; y < height / 16; ++y) {
|
|
||||||
const uint8_t *pa = a;
|
|
||||||
const uint8_t *pb = b;
|
|
||||||
for (x = 0; x < width / 16; ++x) {
|
|
||||||
vpx_highbd_8_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
|
||||||
total_sse += sse;
|
|
||||||
pa += 16;
|
|
||||||
pb += 16;
|
|
||||||
}
|
|
||||||
a += 16 * a_stride;
|
|
||||||
b += 16 * b_stride;
|
|
||||||
}
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double psnr[4]; // total/y/u/v
|
|
||||||
uint64_t sse[4]; // total/y/u/v
|
|
||||||
uint32_t samples[4]; // total/y/u/v
|
|
||||||
} PSNR_STATS;
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b,
|
|
||||||
PSNR_STATS *psnr,
|
|
||||||
unsigned int bit_depth,
|
|
||||||
unsigned int in_bit_depth) {
|
|
||||||
const int widths[3] =
|
|
||||||
{a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
|
|
||||||
const int heights[3] =
|
|
||||||
{a->y_crop_height, a->uv_crop_height, a->uv_crop_height};
|
|
||||||
const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer };
|
|
||||||
const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride};
|
|
||||||
const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer };
|
|
||||||
const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride};
|
|
||||||
int i;
|
|
||||||
uint64_t total_sse = 0;
|
|
||||||
uint32_t total_samples = 0;
|
|
||||||
const double peak = (double)((1 << in_bit_depth) - 1);
|
|
||||||
const unsigned int input_shift = bit_depth - in_bit_depth;
|
|
||||||
|
|
||||||
for (i = 0; i < 3; ++i) {
|
|
||||||
const int w = widths[i];
|
|
||||||
const int h = heights[i];
|
|
||||||
const uint32_t samples = w * h;
|
|
||||||
uint64_t sse;
|
|
||||||
if (a->flags & YV12_FLAG_HIGHBITDEPTH) {
|
|
||||||
if (input_shift) {
|
|
||||||
sse = highbd_get_sse_shift(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i], w, h,
|
|
||||||
input_shift);
|
|
||||||
} else {
|
|
||||||
sse = highbd_get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i], w, h);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sse = get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i],
|
|
||||||
w, h);
|
|
||||||
}
|
|
||||||
psnr->sse[1 + i] = sse;
|
|
||||||
psnr->samples[1 + i] = samples;
|
|
||||||
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
|
||||||
|
|
||||||
total_sse += sse;
|
|
||||||
total_samples += samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
psnr->sse[0] = total_sse;
|
|
||||||
psnr->samples[0] = total_samples;
|
|
||||||
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
|
||||||
(double)total_sse);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // !CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
|
|
||||||
PSNR_STATS *psnr) {
|
|
||||||
static const double peak = 255.0;
|
|
||||||
const int widths[3] = {
|
|
||||||
a->y_crop_width, a->uv_crop_width, a->uv_crop_width};
|
|
||||||
const int heights[3] = {
|
|
||||||
a->y_crop_height, a->uv_crop_height, a->uv_crop_height};
|
|
||||||
const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer};
|
|
||||||
const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride};
|
|
||||||
const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer};
|
|
||||||
const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride};
|
|
||||||
int i;
|
|
||||||
uint64_t total_sse = 0;
|
|
||||||
uint32_t total_samples = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 3; ++i) {
|
|
||||||
const int w = widths[i];
|
|
||||||
const int h = heights[i];
|
|
||||||
const uint32_t samples = w * h;
|
|
||||||
const uint64_t sse = get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i],
|
|
||||||
w, h);
|
|
||||||
psnr->sse[1 + i] = sse;
|
|
||||||
psnr->samples[1 + i] = samples;
|
|
||||||
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
|
||||||
|
|
||||||
total_sse += sse;
|
|
||||||
total_samples += samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
psnr->sse[0] = total_sse;
|
|
||||||
psnr->samples[0] = total_samples;
|
|
||||||
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
|
||||||
(double)total_sse);
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static void generate_psnr_packet(VP10_COMP *cpi) {
|
static void generate_psnr_packet(VP10_COMP *cpi) {
|
||||||
struct vpx_codec_cx_pkt pkt;
|
struct vpx_codec_cx_pkt pkt;
|
||||||
@ -2955,7 +2700,7 @@ static void output_frame_level_debug_stats(VP10_COMP *cpi) {
|
|||||||
|
|
||||||
vpx_clear_system_state();
|
vpx_clear_system_state();
|
||||||
|
|
||||||
recon_err = vp10_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
|
|
||||||
if (cpi->twopass.total_left_stats.coded_error != 0.0)
|
if (cpi->twopass.total_left_stats.coded_error != 0.0)
|
||||||
fprintf(f, "%10u %dx%d %10d %10d %d %d %10d %10d %10d %10d"
|
fprintf(f, "%10u %dx%d %10d %10d %d %d %10d %10d %10d %10d"
|
||||||
@ -3380,12 +3125,12 @@ static void encode_with_recode_loop(VP10_COMP *cpi,
|
|||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
kf_err = vp10_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
} else {
|
} else {
|
||||||
kf_err = vp10_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
kf_err = vp10_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Prevent possible divide by zero error below for perfect KF
|
// Prevent possible divide by zero error below for perfect KF
|
||||||
@ -3804,13 +3549,13 @@ static void encode_frame_to_data_rate(VP10_COMP *cpi,
|
|||||||
if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
|
if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
cpi->ambient_err = vp10_highbd_get_y_sse(cpi->Source,
|
cpi->ambient_err = vpx_highbd_get_y_sse(cpi->Source,
|
||||||
get_frame_new_buffer(cm));
|
get_frame_new_buffer(cm));
|
||||||
} else {
|
} else {
|
||||||
cpi->ambient_err = vp10_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
cpi->ambient_err = vp10_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4557,28 +4302,6 @@ int vp10_set_size_literal(VP10_COMP *cpi, unsigned int width,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t vp10_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b) {
|
|
||||||
assert(a->y_crop_width == b->y_crop_width);
|
|
||||||
assert(a->y_crop_height == b->y_crop_height);
|
|
||||||
|
|
||||||
return get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
|
||||||
a->y_crop_width, a->y_crop_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
int64_t vp10_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b) {
|
|
||||||
assert(a->y_crop_width == b->y_crop_width);
|
|
||||||
assert(a->y_crop_height == b->y_crop_height);
|
|
||||||
assert((a->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
|
||||||
assert((b->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
|
||||||
|
|
||||||
return highbd_get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
|
||||||
a->y_crop_width, a->y_crop_height);
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
int vp10_get_quantizer(VP10_COMP *cpi) {
|
int vp10_get_quantizer(VP10_COMP *cpi) {
|
||||||
return cpi->common.base_qindex;
|
return cpi->common.base_qindex;
|
||||||
}
|
}
|
||||||
|
@ -633,12 +633,6 @@ static INLINE int allocated_tokens(TileInfo tile) {
|
|||||||
return get_token_alloc(tile_mb_rows, tile_mb_cols);
|
return get_token_alloc(tile_mb_rows, tile_mb_cols);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t vp10_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b);
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
int64_t vp10_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b);
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
void vp10_alloc_compressor_data(VP10_COMP *cpi);
|
void vp10_alloc_compressor_data(VP10_COMP *cpi);
|
||||||
|
|
||||||
void vp10_scale_references(VP10_COMP *cpi);
|
void vp10_scale_references(VP10_COMP *cpi);
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "./vpx_scale_rtcd.h"
|
#include "./vpx_scale_rtcd.h"
|
||||||
|
|
||||||
|
#include "vpx_dsp/psnr.h"
|
||||||
#include "vpx_dsp/vpx_dsp_common.h"
|
#include "vpx_dsp/vpx_dsp_common.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
@ -56,12 +57,12 @@ static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd,
|
|||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
filt_err = vp10_highbd_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_highbd_get_y_sse(sd, cm->frame_to_show);
|
||||||
} else {
|
} else {
|
||||||
filt_err = vp10_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
filt_err = vp10_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Re-instate the unfiltered frame
|
// Re-instate the unfiltered frame
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "./vpx_scale_rtcd.h"
|
#include "./vpx_scale_rtcd.h"
|
||||||
|
|
||||||
|
#include "vpx_dsp/psnr.h"
|
||||||
#include "vpx_dsp/vpx_dsp_common.h"
|
#include "vpx_dsp/vpx_dsp_common.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
@ -36,12 +37,12 @@ static int try_restoration_frame(const YV12_BUFFER_CONFIG *sd,
|
|||||||
rsi, 1, partial_frame);
|
rsi, 1, partial_frame);
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
filt_err = vp10_highbd_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_highbd_get_y_sse(sd, cm->frame_to_show);
|
||||||
} else {
|
} else {
|
||||||
filt_err = vp10_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
filt_err = vp10_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Re-instate the unfiltered frame
|
// Re-instate the unfiltered frame
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include "vp8/common/alloccommon.h"
|
#include "vp8/common/alloccommon.h"
|
||||||
#include "mcomp.h"
|
#include "mcomp.h"
|
||||||
#include "firstpass.h"
|
#include "firstpass.h"
|
||||||
#include "vpx/internal/vpx_psnr.h"
|
#include "vpx_dsp/psnr.h"
|
||||||
#include "vpx_scale/vpx_scale.h"
|
#include "vpx_scale/vpx_scale.h"
|
||||||
#include "vp8/common/extend.h"
|
#include "vp8/common/extend.h"
|
||||||
#include "ratectrl.h"
|
#include "ratectrl.h"
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "./vpx_config.h"
|
#include "./vpx_config.h"
|
||||||
#include "./vpx_dsp_rtcd.h"
|
#include "./vpx_dsp_rtcd.h"
|
||||||
#include "./vpx_scale_rtcd.h"
|
#include "./vpx_scale_rtcd.h"
|
||||||
#include "vpx/internal/vpx_psnr.h"
|
#include "vpx_dsp/psnr.h"
|
||||||
#include "vpx_dsp/vpx_dsp_common.h"
|
#include "vpx_dsp/vpx_dsp_common.h"
|
||||||
#include "vpx_dsp/vpx_filter.h"
|
#include "vpx_dsp/vpx_filter.h"
|
||||||
#if CONFIG_INTERNAL_STATS
|
#if CONFIG_INTERNAL_STATS
|
||||||
@ -2140,262 +2140,6 @@ void vp9_remove_compressor(VP9_COMP *cpi) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO(yaowu): The block_variance calls the unoptimized versions of variance()
|
|
||||||
* and highbd_8_variance(). It should not.
|
|
||||||
*/
|
|
||||||
static void encoder_variance(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int w, int h, unsigned int *sse, int *sum) {
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
*sum = 0;
|
|
||||||
*sse = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++) {
|
|
||||||
for (j = 0; j < w; j++) {
|
|
||||||
const int diff = a[j] - b[j];
|
|
||||||
*sum += diff;
|
|
||||||
*sse += diff * diff;
|
|
||||||
}
|
|
||||||
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static void encoder_highbd_variance64(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int w, int h, uint64_t *sse,
|
|
||||||
uint64_t *sum) {
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
|
||||||
uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
|
||||||
*sum = 0;
|
|
||||||
*sse = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < h; i++) {
|
|
||||||
for (j = 0; j < w; j++) {
|
|
||||||
const int diff = a[j] - b[j];
|
|
||||||
*sum += diff;
|
|
||||||
*sse += diff * diff;
|
|
||||||
}
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void encoder_highbd_8_variance(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int w, int h,
|
|
||||||
unsigned int *sse, int *sum) {
|
|
||||||
uint64_t sse_long = 0;
|
|
||||||
uint64_t sum_long = 0;
|
|
||||||
encoder_highbd_variance64(a8, a_stride, b8, b_stride, w, h,
|
|
||||||
&sse_long, &sum_long);
|
|
||||||
*sse = (unsigned int)sse_long;
|
|
||||||
*sum = (int)sum_long;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static int64_t get_sse(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int width, int height) {
|
|
||||||
const int dw = width % 16;
|
|
||||||
const int dh = height % 16;
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
unsigned int sse = 0;
|
|
||||||
int sum = 0;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (dw > 0) {
|
|
||||||
encoder_variance(&a[width - dw], a_stride, &b[width - dw], b_stride,
|
|
||||||
dw, height, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dh > 0) {
|
|
||||||
encoder_variance(&a[(height - dh) * a_stride], a_stride,
|
|
||||||
&b[(height - dh) * b_stride], b_stride,
|
|
||||||
width - dw, dh, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (y = 0; y < height / 16; ++y) {
|
|
||||||
const uint8_t *pa = a;
|
|
||||||
const uint8_t *pb = b;
|
|
||||||
for (x = 0; x < width / 16; ++x) {
|
|
||||||
vpx_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
|
||||||
total_sse += sse;
|
|
||||||
|
|
||||||
pa += 16;
|
|
||||||
pb += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
a += 16 * a_stride;
|
|
||||||
b += 16 * b_stride;
|
|
||||||
}
|
|
||||||
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride,
|
|
||||||
const uint8_t *b8, int b_stride,
|
|
||||||
int width, int height,
|
|
||||||
unsigned int input_shift) {
|
|
||||||
const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
|
||||||
const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
int x, y;
|
|
||||||
for (y = 0; y < height; ++y) {
|
|
||||||
for (x = 0; x < width; ++x) {
|
|
||||||
int64_t diff;
|
|
||||||
diff = (a[x] >> input_shift) - (b[x] >> input_shift);
|
|
||||||
total_sse += diff * diff;
|
|
||||||
}
|
|
||||||
a += a_stride;
|
|
||||||
b += b_stride;
|
|
||||||
}
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t highbd_get_sse(const uint8_t *a, int a_stride,
|
|
||||||
const uint8_t *b, int b_stride,
|
|
||||||
int width, int height) {
|
|
||||||
int64_t total_sse = 0;
|
|
||||||
int x, y;
|
|
||||||
const int dw = width % 16;
|
|
||||||
const int dh = height % 16;
|
|
||||||
unsigned int sse = 0;
|
|
||||||
int sum = 0;
|
|
||||||
if (dw > 0) {
|
|
||||||
encoder_highbd_8_variance(&a[width - dw], a_stride,
|
|
||||||
&b[width - dw], b_stride,
|
|
||||||
dw, height, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
if (dh > 0) {
|
|
||||||
encoder_highbd_8_variance(&a[(height - dh) * a_stride], a_stride,
|
|
||||||
&b[(height - dh) * b_stride], b_stride,
|
|
||||||
width - dw, dh, &sse, &sum);
|
|
||||||
total_sse += sse;
|
|
||||||
}
|
|
||||||
for (y = 0; y < height / 16; ++y) {
|
|
||||||
const uint8_t *pa = a;
|
|
||||||
const uint8_t *pb = b;
|
|
||||||
for (x = 0; x < width / 16; ++x) {
|
|
||||||
vpx_highbd_8_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
|
||||||
total_sse += sse;
|
|
||||||
pa += 16;
|
|
||||||
pb += 16;
|
|
||||||
}
|
|
||||||
a += 16 * a_stride;
|
|
||||||
b += 16 * b_stride;
|
|
||||||
}
|
|
||||||
return total_sse;
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double psnr[4]; // total/y/u/v
|
|
||||||
uint64_t sse[4]; // total/y/u/v
|
|
||||||
uint32_t samples[4]; // total/y/u/v
|
|
||||||
} PSNR_STATS;
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
static void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b,
|
|
||||||
PSNR_STATS *psnr,
|
|
||||||
unsigned int bit_depth,
|
|
||||||
unsigned int in_bit_depth) {
|
|
||||||
const int widths[3] =
|
|
||||||
{a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
|
|
||||||
const int heights[3] =
|
|
||||||
{a->y_crop_height, a->uv_crop_height, a->uv_crop_height};
|
|
||||||
const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer };
|
|
||||||
const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride};
|
|
||||||
const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer };
|
|
||||||
const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride};
|
|
||||||
int i;
|
|
||||||
uint64_t total_sse = 0;
|
|
||||||
uint32_t total_samples = 0;
|
|
||||||
const double peak = (double)((1 << in_bit_depth) - 1);
|
|
||||||
const unsigned int input_shift = bit_depth - in_bit_depth;
|
|
||||||
|
|
||||||
for (i = 0; i < 3; ++i) {
|
|
||||||
const int w = widths[i];
|
|
||||||
const int h = heights[i];
|
|
||||||
const uint32_t samples = w * h;
|
|
||||||
uint64_t sse;
|
|
||||||
if (a->flags & YV12_FLAG_HIGHBITDEPTH) {
|
|
||||||
if (input_shift) {
|
|
||||||
sse = highbd_get_sse_shift(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i], w, h,
|
|
||||||
input_shift);
|
|
||||||
} else {
|
|
||||||
sse = highbd_get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i], w, h);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sse = get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i],
|
|
||||||
w, h);
|
|
||||||
}
|
|
||||||
psnr->sse[1 + i] = sse;
|
|
||||||
psnr->samples[1 + i] = samples;
|
|
||||||
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
|
||||||
|
|
||||||
total_sse += sse;
|
|
||||||
total_samples += samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
psnr->sse[0] = total_sse;
|
|
||||||
psnr->samples[0] = total_samples;
|
|
||||||
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
|
||||||
(double)total_sse);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // !CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
|
|
||||||
PSNR_STATS *psnr) {
|
|
||||||
static const double peak = 255.0;
|
|
||||||
const int widths[3] = {
|
|
||||||
a->y_crop_width, a->uv_crop_width, a->uv_crop_width};
|
|
||||||
const int heights[3] = {
|
|
||||||
a->y_crop_height, a->uv_crop_height, a->uv_crop_height};
|
|
||||||
const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer};
|
|
||||||
const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride};
|
|
||||||
const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer};
|
|
||||||
const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride};
|
|
||||||
int i;
|
|
||||||
uint64_t total_sse = 0;
|
|
||||||
uint32_t total_samples = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 3; ++i) {
|
|
||||||
const int w = widths[i];
|
|
||||||
const int h = heights[i];
|
|
||||||
const uint32_t samples = w * h;
|
|
||||||
const uint64_t sse = get_sse(a_planes[i], a_strides[i],
|
|
||||||
b_planes[i], b_strides[i],
|
|
||||||
w, h);
|
|
||||||
psnr->sse[1 + i] = sse;
|
|
||||||
psnr->samples[1 + i] = samples;
|
|
||||||
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
|
||||||
|
|
||||||
total_sse += sse;
|
|
||||||
total_samples += samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
psnr->sse[0] = total_sse;
|
|
||||||
psnr->samples[0] = total_samples;
|
|
||||||
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
|
||||||
(double)total_sse);
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
static void generate_psnr_packet(VP9_COMP *cpi) {
|
static void generate_psnr_packet(VP9_COMP *cpi) {
|
||||||
struct vpx_codec_cx_pkt pkt;
|
struct vpx_codec_cx_pkt pkt;
|
||||||
int i;
|
int i;
|
||||||
@ -3061,7 +2805,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
|
|||||||
|
|
||||||
vpx_clear_system_state();
|
vpx_clear_system_state();
|
||||||
|
|
||||||
recon_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
|
|
||||||
if (cpi->twopass.total_left_stats.coded_error != 0.0)
|
if (cpi->twopass.total_left_stats.coded_error != 0.0)
|
||||||
fprintf(f, "%10u %dx%d %10d %10d %d %d %10d %10d %10d %10d"
|
fprintf(f, "%10u %dx%d %10d %10d %d %d %10d %10d %10d %10d"
|
||||||
@ -3571,12 +3315,12 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
|
|||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
kf_err = vp9_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
} else {
|
} else {
|
||||||
kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
kf_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Prevent possible divide by zero error below for perfect KF
|
// Prevent possible divide by zero error below for perfect KF
|
||||||
@ -3967,13 +3711,13 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
|||||||
if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
|
if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
cpi->ambient_err = vp9_highbd_get_y_sse(cpi->Source,
|
cpi->ambient_err = vpx_highbd_get_y_sse(cpi->Source,
|
||||||
get_frame_new_buffer(cm));
|
get_frame_new_buffer(cm));
|
||||||
} else {
|
} else {
|
||||||
cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
cpi->ambient_err = vp9_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4844,28 +4588,6 @@ void vp9_set_svc(VP9_COMP *cpi, int use_svc) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t vp9_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b) {
|
|
||||||
assert(a->y_crop_width == b->y_crop_width);
|
|
||||||
assert(a->y_crop_height == b->y_crop_height);
|
|
||||||
|
|
||||||
return get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
|
||||||
a->y_crop_width, a->y_crop_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
int64_t vp9_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b) {
|
|
||||||
assert(a->y_crop_width == b->y_crop_width);
|
|
||||||
assert(a->y_crop_height == b->y_crop_height);
|
|
||||||
assert((a->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
|
||||||
assert((b->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
|
||||||
|
|
||||||
return highbd_get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
|
||||||
a->y_crop_width, a->y_crop_height);
|
|
||||||
}
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
int vp9_get_quantizer(VP9_COMP *cpi) {
|
int vp9_get_quantizer(VP9_COMP *cpi) {
|
||||||
return cpi->common.base_qindex;
|
return cpi->common.base_qindex;
|
||||||
}
|
}
|
||||||
|
@ -608,12 +608,6 @@ static INLINE int allocated_tokens(TileInfo tile) {
|
|||||||
return get_token_alloc(tile_mb_rows, tile_mb_cols);
|
return get_token_alloc(tile_mb_rows, tile_mb_cols);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t vp9_get_y_sse(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b);
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
int64_t vp9_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
|
||||||
const YV12_BUFFER_CONFIG *b);
|
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
||||||
|
|
||||||
void vp9_scale_references(VP9_COMP *cpi);
|
void vp9_scale_references(VP9_COMP *cpi);
|
||||||
|
|
||||||
void vp9_update_reference_frames(VP9_COMP *cpi);
|
void vp9_update_reference_frames(VP9_COMP *cpi);
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include "./vpx_scale_rtcd.h"
|
#include "./vpx_scale_rtcd.h"
|
||||||
|
#include "vpx_dsp/psnr.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
@ -52,12 +52,12 @@ static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd,
|
|||||||
|
|
||||||
#if CONFIG_VP9_HIGHBITDEPTH
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
if (cm->use_highbitdepth) {
|
if (cm->use_highbitdepth) {
|
||||||
filt_err = vp9_highbd_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_highbd_get_y_sse(sd, cm->frame_to_show);
|
||||||
} else {
|
} else {
|
||||||
filt_err = vp9_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
filt_err = vp9_get_y_sse(sd, cm->frame_to_show);
|
filt_err = vpx_get_y_sse(sd, cm->frame_to_show);
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Re-instate the unfiltered frame
|
// Re-instate the unfiltered frame
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2014 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 VPX_INTERNAL_VPX_PSNR_H_
|
|
||||||
#define VPX_INTERNAL_VPX_PSNR_H_
|
|
||||||
|
|
||||||
#define MAX_PSNR 100.0
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO(dkovalev) change vpx_sse_to_psnr signature: double -> int64_t
|
|
||||||
|
|
||||||
/*!\brief Converts SSE to PSNR
|
|
||||||
*
|
|
||||||
* Converts sum of squared errros (SSE) to peak signal-to-noise ratio (PNSR).
|
|
||||||
*
|
|
||||||
* \param[in] samples Number of samples
|
|
||||||
* \param[in] peak Max sample value
|
|
||||||
* \param[in] sse Sum of squared errors
|
|
||||||
*/
|
|
||||||
double vpx_sse_to_psnr(double samples, double peak, double sse);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // VPX_INTERNAL_VPX_PSNR_H_
|
|
@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2014 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "vpx/internal/vpx_psnr.h"
|
|
||||||
|
|
||||||
|
|
||||||
double vpx_sse_to_psnr(double samples, double peak, double sse) {
|
|
||||||
if (sse > 0.0) {
|
|
||||||
const double psnr = 10.0 * log10(samples * peak * peak / sse);
|
|
||||||
return psnr > MAX_PSNR ? MAX_PSNR : psnr;
|
|
||||||
} else {
|
|
||||||
return MAX_PSNR;
|
|
||||||
}
|
|
||||||
}
|
|
@ -36,10 +36,8 @@ API_SRCS-yes += vpx_decoder.h
|
|||||||
API_SRCS-yes += src/vpx_encoder.c
|
API_SRCS-yes += src/vpx_encoder.c
|
||||||
API_SRCS-yes += vpx_encoder.h
|
API_SRCS-yes += vpx_encoder.h
|
||||||
API_SRCS-yes += internal/vpx_codec_internal.h
|
API_SRCS-yes += internal/vpx_codec_internal.h
|
||||||
API_SRCS-yes += internal/vpx_psnr.h
|
|
||||||
API_SRCS-yes += src/vpx_codec.c
|
API_SRCS-yes += src/vpx_codec.c
|
||||||
API_SRCS-yes += src/vpx_image.c
|
API_SRCS-yes += src/vpx_image.c
|
||||||
API_SRCS-yes += src/vpx_psnr.c
|
|
||||||
API_SRCS-yes += vpx_codec.h
|
API_SRCS-yes += vpx_codec.h
|
||||||
API_SRCS-yes += vpx_codec.mk
|
API_SRCS-yes += vpx_codec.mk
|
||||||
API_SRCS-yes += vpx_frame_buffer.h
|
API_SRCS-yes += vpx_frame_buffer.h
|
||||||
|
298
vpx_dsp/psnr.c
Normal file
298
vpx_dsp/psnr.c
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "./vpx_dsp_rtcd.h"
|
||||||
|
#include "vpx_dsp/psnr.h"
|
||||||
|
#include "vpx_scale/yv12config.h"
|
||||||
|
|
||||||
|
|
||||||
|
double vpx_sse_to_psnr(double samples, double peak, double sse) {
|
||||||
|
if (sse > 0.0) {
|
||||||
|
const double psnr = 10.0 * log10(samples * peak * peak / sse);
|
||||||
|
return psnr > MAX_PSNR ? MAX_PSNR : psnr;
|
||||||
|
} else {
|
||||||
|
return MAX_PSNR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO(yaowu): The block_variance calls the unoptimized versions of variance()
|
||||||
|
* and highbd_8_variance(). It should not.
|
||||||
|
*/
|
||||||
|
static void encoder_variance(const uint8_t *a, int a_stride,
|
||||||
|
const uint8_t *b, int b_stride,
|
||||||
|
int w, int h, unsigned int *sse, int *sum) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
*sum = 0;
|
||||||
|
*sse = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < h; i++) {
|
||||||
|
for (j = 0; j < w; j++) {
|
||||||
|
const int diff = a[j] - b[j];
|
||||||
|
*sum += diff;
|
||||||
|
*sse += diff * diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += a_stride;
|
||||||
|
b += b_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
static void encoder_highbd_variance64(const uint8_t *a8, int a_stride,
|
||||||
|
const uint8_t *b8, int b_stride,
|
||||||
|
int w, int h, uint64_t *sse,
|
||||||
|
uint64_t *sum) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
||||||
|
uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
||||||
|
*sum = 0;
|
||||||
|
*sse = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < h; i++) {
|
||||||
|
for (j = 0; j < w; j++) {
|
||||||
|
const int diff = a[j] - b[j];
|
||||||
|
*sum += diff;
|
||||||
|
*sse += diff * diff;
|
||||||
|
}
|
||||||
|
a += a_stride;
|
||||||
|
b += b_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void encoder_highbd_8_variance(const uint8_t *a8, int a_stride,
|
||||||
|
const uint8_t *b8, int b_stride,
|
||||||
|
int w, int h,
|
||||||
|
unsigned int *sse, int *sum) {
|
||||||
|
uint64_t sse_long = 0;
|
||||||
|
uint64_t sum_long = 0;
|
||||||
|
encoder_highbd_variance64(a8, a_stride, b8, b_stride, w, h,
|
||||||
|
&sse_long, &sum_long);
|
||||||
|
*sse = (unsigned int)sse_long;
|
||||||
|
*sum = (int)sum_long;
|
||||||
|
}
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
|
static int64_t get_sse(const uint8_t *a, int a_stride,
|
||||||
|
const uint8_t *b, int b_stride,
|
||||||
|
int width, int height) {
|
||||||
|
const int dw = width % 16;
|
||||||
|
const int dh = height % 16;
|
||||||
|
int64_t total_sse = 0;
|
||||||
|
unsigned int sse = 0;
|
||||||
|
int sum = 0;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (dw > 0) {
|
||||||
|
encoder_variance(&a[width - dw], a_stride, &b[width - dw], b_stride,
|
||||||
|
dw, height, &sse, &sum);
|
||||||
|
total_sse += sse;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dh > 0) {
|
||||||
|
encoder_variance(&a[(height - dh) * a_stride], a_stride,
|
||||||
|
&b[(height - dh) * b_stride], b_stride,
|
||||||
|
width - dw, dh, &sse, &sum);
|
||||||
|
total_sse += sse;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (y = 0; y < height / 16; ++y) {
|
||||||
|
const uint8_t *pa = a;
|
||||||
|
const uint8_t *pb = b;
|
||||||
|
for (x = 0; x < width / 16; ++x) {
|
||||||
|
vpx_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
||||||
|
total_sse += sse;
|
||||||
|
|
||||||
|
pa += 16;
|
||||||
|
pb += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += 16 * a_stride;
|
||||||
|
b += 16 * b_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total_sse;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride,
|
||||||
|
const uint8_t *b8, int b_stride,
|
||||||
|
int width, int height,
|
||||||
|
unsigned int input_shift) {
|
||||||
|
const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
|
||||||
|
const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
|
||||||
|
int64_t total_sse = 0;
|
||||||
|
int x, y;
|
||||||
|
for (y = 0; y < height; ++y) {
|
||||||
|
for (x = 0; x < width; ++x) {
|
||||||
|
int64_t diff;
|
||||||
|
diff = (a[x] >> input_shift) - (b[x] >> input_shift);
|
||||||
|
total_sse += diff * diff;
|
||||||
|
}
|
||||||
|
a += a_stride;
|
||||||
|
b += b_stride;
|
||||||
|
}
|
||||||
|
return total_sse;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t highbd_get_sse(const uint8_t *a, int a_stride,
|
||||||
|
const uint8_t *b, int b_stride,
|
||||||
|
int width, int height) {
|
||||||
|
int64_t total_sse = 0;
|
||||||
|
int x, y;
|
||||||
|
const int dw = width % 16;
|
||||||
|
const int dh = height % 16;
|
||||||
|
unsigned int sse = 0;
|
||||||
|
int sum = 0;
|
||||||
|
if (dw > 0) {
|
||||||
|
encoder_highbd_8_variance(&a[width - dw], a_stride,
|
||||||
|
&b[width - dw], b_stride,
|
||||||
|
dw, height, &sse, &sum);
|
||||||
|
total_sse += sse;
|
||||||
|
}
|
||||||
|
if (dh > 0) {
|
||||||
|
encoder_highbd_8_variance(&a[(height - dh) * a_stride], a_stride,
|
||||||
|
&b[(height - dh) * b_stride], b_stride,
|
||||||
|
width - dw, dh, &sse, &sum);
|
||||||
|
total_sse += sse;
|
||||||
|
}
|
||||||
|
for (y = 0; y < height / 16; ++y) {
|
||||||
|
const uint8_t *pa = a;
|
||||||
|
const uint8_t *pb = b;
|
||||||
|
for (x = 0; x < width / 16; ++x) {
|
||||||
|
vpx_highbd_8_mse16x16(pa, a_stride, pb, b_stride, &sse);
|
||||||
|
total_sse += sse;
|
||||||
|
pa += 16;
|
||||||
|
pb += 16;
|
||||||
|
}
|
||||||
|
a += 16 * a_stride;
|
||||||
|
b += 16 * b_stride;
|
||||||
|
}
|
||||||
|
return total_sse;
|
||||||
|
}
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
|
|
||||||
|
int64_t vpx_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b) {
|
||||||
|
assert(a->y_crop_width == b->y_crop_width);
|
||||||
|
assert(a->y_crop_height == b->y_crop_height);
|
||||||
|
|
||||||
|
return get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
||||||
|
a->y_crop_width, a->y_crop_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
int64_t vpx_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b) {
|
||||||
|
assert(a->y_crop_width == b->y_crop_width);
|
||||||
|
assert(a->y_crop_height == b->y_crop_height);
|
||||||
|
assert((a->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
||||||
|
assert((b->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
|
||||||
|
|
||||||
|
return highbd_get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
|
||||||
|
a->y_crop_width, a->y_crop_height);
|
||||||
|
}
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b,
|
||||||
|
PSNR_STATS *psnr,
|
||||||
|
unsigned int bit_depth,
|
||||||
|
unsigned int in_bit_depth) {
|
||||||
|
const int widths[3] =
|
||||||
|
{ a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
|
||||||
|
const int heights[3] =
|
||||||
|
{ a->y_crop_height, a->uv_crop_height, a->uv_crop_height };
|
||||||
|
const uint8_t *a_planes[3] = { a->y_buffer, a->u_buffer, a->v_buffer };
|
||||||
|
const int a_strides[3] = { a->y_stride, a->uv_stride, a->uv_stride };
|
||||||
|
const uint8_t *b_planes[3] = { b->y_buffer, b->u_buffer, b->v_buffer };
|
||||||
|
const int b_strides[3] = { b->y_stride, b->uv_stride, b->uv_stride };
|
||||||
|
int i;
|
||||||
|
uint64_t total_sse = 0;
|
||||||
|
uint32_t total_samples = 0;
|
||||||
|
const double peak = (double)((1 << in_bit_depth) - 1);
|
||||||
|
const unsigned int input_shift = bit_depth - in_bit_depth;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
const int w = widths[i];
|
||||||
|
const int h = heights[i];
|
||||||
|
const uint32_t samples = w * h;
|
||||||
|
uint64_t sse;
|
||||||
|
if (a->flags & YV12_FLAG_HIGHBITDEPTH) {
|
||||||
|
if (input_shift) {
|
||||||
|
sse = highbd_get_sse_shift(a_planes[i], a_strides[i],
|
||||||
|
b_planes[i], b_strides[i], w, h,
|
||||||
|
input_shift);
|
||||||
|
} else {
|
||||||
|
sse = highbd_get_sse(a_planes[i], a_strides[i],
|
||||||
|
b_planes[i], b_strides[i], w, h);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sse = get_sse(a_planes[i], a_strides[i],
|
||||||
|
b_planes[i], b_strides[i],
|
||||||
|
w, h);
|
||||||
|
}
|
||||||
|
psnr->sse[1 + i] = sse;
|
||||||
|
psnr->samples[1 + i] = samples;
|
||||||
|
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
||||||
|
|
||||||
|
total_sse += sse;
|
||||||
|
total_samples += samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
psnr->sse[0] = total_sse;
|
||||||
|
psnr->samples[0] = total_samples;
|
||||||
|
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
||||||
|
(double)total_sse);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
|
void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
|
||||||
|
PSNR_STATS *psnr) {
|
||||||
|
static const double peak = 255.0;
|
||||||
|
const int widths[3] = {
|
||||||
|
a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
|
||||||
|
const int heights[3] = {
|
||||||
|
a->y_crop_height, a->uv_crop_height, a->uv_crop_height };
|
||||||
|
const uint8_t *a_planes[3] = { a->y_buffer, a->u_buffer, a->v_buffer };
|
||||||
|
const int a_strides[3] = { a->y_stride, a->uv_stride, a->uv_stride };
|
||||||
|
const uint8_t *b_planes[3] = { b->y_buffer, b->u_buffer, b->v_buffer };
|
||||||
|
const int b_strides[3] = { b->y_stride, b->uv_stride, b->uv_stride };
|
||||||
|
int i;
|
||||||
|
uint64_t total_sse = 0;
|
||||||
|
uint32_t total_samples = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
const int w = widths[i];
|
||||||
|
const int h = heights[i];
|
||||||
|
const uint32_t samples = w * h;
|
||||||
|
const uint64_t sse = get_sse(a_planes[i], a_strides[i],
|
||||||
|
b_planes[i], b_strides[i],
|
||||||
|
w, h);
|
||||||
|
psnr->sse[1 + i] = sse;
|
||||||
|
psnr->samples[1 + i] = samples;
|
||||||
|
psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
|
||||||
|
|
||||||
|
total_sse += sse;
|
||||||
|
total_samples += samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
psnr->sse[0] = total_sse;
|
||||||
|
psnr->samples[0] = total_samples;
|
||||||
|
psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak,
|
||||||
|
(double)total_sse);
|
||||||
|
}
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
65
vpx_dsp/psnr.h
Normal file
65
vpx_dsp/psnr.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* 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 VPX_DSP_PSNR_H_
|
||||||
|
#define VPX_DSP_PSNR_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "vpx_scale/yv12config.h"
|
||||||
|
|
||||||
|
#define MAX_PSNR 100.0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double psnr[4]; // total/y/u/v
|
||||||
|
uint64_t sse[4]; // total/y/u/v
|
||||||
|
uint32_t samples[4]; // total/y/u/v
|
||||||
|
} PSNR_STATS;
|
||||||
|
|
||||||
|
// TODO(dkovalev) change vpx_sse_to_psnr signature: double -> int64_t
|
||||||
|
|
||||||
|
/*!\brief Converts SSE to PSNR
|
||||||
|
*
|
||||||
|
* Converts sum of squared errros (SSE) to peak signal-to-noise ratio (PNSR).
|
||||||
|
*
|
||||||
|
* \param[in] samples Number of samples
|
||||||
|
* \param[in] peak Max sample value
|
||||||
|
* \param[in] sse Sum of squared errors
|
||||||
|
*/
|
||||||
|
double vpx_sse_to_psnr(double samples, double peak, double sse);
|
||||||
|
int64_t vpx_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b);
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
int64_t vpx_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b);
|
||||||
|
void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b,
|
||||||
|
PSNR_STATS *psnr,
|
||||||
|
unsigned int bit_depth,
|
||||||
|
unsigned int in_bit_depth);
|
||||||
|
int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride,
|
||||||
|
const uint8_t *b8, int b_stride,
|
||||||
|
int width, int height,
|
||||||
|
unsigned int input_shift);
|
||||||
|
#else
|
||||||
|
void calc_psnr(const YV12_BUFFER_CONFIG *a,
|
||||||
|
const YV12_BUFFER_CONFIG *b,
|
||||||
|
PSNR_STATS *psnr);
|
||||||
|
#endif
|
||||||
|
int64_t highbd_get_sse(const uint8_t *a, int a_stride,
|
||||||
|
const uint8_t *b, int b_stride,
|
||||||
|
int width, int height);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
#endif // VPX_DSP_PSNR_H_
|
@ -19,7 +19,7 @@
|
|||||||
#include "./vpx_dsp_rtcd.h"
|
#include "./vpx_dsp_rtcd.h"
|
||||||
#include "vpx_dsp/ssim.h"
|
#include "vpx_dsp/ssim.h"
|
||||||
#include "vpx_ports/system_state.h"
|
#include "vpx_ports/system_state.h"
|
||||||
#include "vpx/internal/vpx_psnr.h"
|
#include "vpx_dsp/psnr.h"
|
||||||
|
|
||||||
#if !defined(M_PI)
|
#if !defined(M_PI)
|
||||||
# define M_PI (3.141592653589793238462643)
|
# define M_PI (3.141592653589793238462643)
|
||||||
|
@ -22,6 +22,8 @@ DSP_SRCS-yes += bitwriter.h
|
|||||||
DSP_SRCS-yes += bitwriter.c
|
DSP_SRCS-yes += bitwriter.c
|
||||||
DSP_SRCS-yes += bitwriter_buffer.c
|
DSP_SRCS-yes += bitwriter_buffer.c
|
||||||
DSP_SRCS-yes += bitwriter_buffer.h
|
DSP_SRCS-yes += bitwriter_buffer.h
|
||||||
|
DSP_SRCS-yes += psnr.c
|
||||||
|
DSP_SRCS-yes += psnr.h
|
||||||
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.c
|
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.c
|
||||||
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.h
|
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.h
|
||||||
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += psnrhvs.c
|
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += psnrhvs.c
|
||||||
|
Loading…
x
Reference in New Issue
Block a user