OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 * | 9 * |
10 * This code was originally written by: Nathan E. Egge, at the Daala | 10 * This code was originally written by: Nathan E. Egge, at the Daala |
11 * project. | 11 * project. |
12 */ | 12 */ |
13 #include <math.h> | 13 #include <math.h> |
| 14 #include <stdlib.h> |
14 #include <string.h> | 15 #include <string.h> |
15 #include "./vpx_config.h" | 16 #include "./vpx_config.h" |
16 #include "./vp9_rtcd.h" | 17 #include "./vpx_dsp_rtcd.h" |
17 #include "vp9/encoder/vp9_ssim.h" | 18 #include "vpx_dsp/ssim.h" |
| 19 #include "vpx_ports/system_state.h" |
18 /* TODO(jbb): High bit depth version of this code needed */ | 20 /* TODO(jbb): High bit depth version of this code needed */ |
19 typedef struct fs_level fs_level; | 21 typedef struct fs_level fs_level; |
20 typedef struct fs_ctx fs_ctx; | 22 typedef struct fs_ctx fs_ctx; |
21 | 23 |
22 #define SSIM_C1 (255 * 255 * 0.01 * 0.01) | 24 #define SSIM_C1 (255 * 255 * 0.01 * 0.01) |
23 #define SSIM_C2 (255 * 255 * 0.03 * 0.03) | 25 #define SSIM_C2 (255 * 255 * 0.03 * 0.03) |
24 | 26 |
25 #define FS_MINI(_a, _b) ((_a) < (_b) ? (_a) : (_b)) | 27 #define FS_MINI(_a, _b) ((_a) < (_b) ? (_a) : (_b)) |
26 #define FS_MAXI(_a, _b) ((_a) > (_b) ? (_a) : (_b)) | 28 #define FS_MAXI(_a, _b) ((_a) > (_b) ? (_a) : (_b)) |
27 | 29 |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 fs_apply_luminance(&ctx, l); | 438 fs_apply_luminance(&ctx, l); |
437 ret *= fs_average(&ctx, l); | 439 ret *= fs_average(&ctx, l); |
438 fs_ctx_clear(&ctx); | 440 fs_ctx_clear(&ctx); |
439 return ret; | 441 return ret; |
440 } | 442 } |
441 | 443 |
442 static double convert_ssim_db(double _ssim, double _weight) { | 444 static double convert_ssim_db(double _ssim, double _weight) { |
443 return 10 * (log10(_weight) - log10(_weight - _ssim)); | 445 return 10 * (log10(_weight) - log10(_weight - _ssim)); |
444 } | 446 } |
445 | 447 |
446 double vp9_calc_fastssim(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, | 448 double vpx_calc_fastssim(const YV12_BUFFER_CONFIG *source, |
| 449 const YV12_BUFFER_CONFIG *dest, |
447 double *ssim_y, double *ssim_u, double *ssim_v) { | 450 double *ssim_y, double *ssim_u, double *ssim_v) { |
448 double ssimv; | 451 double ssimv; |
449 vp9_clear_system_state(); | 452 vpx_clear_system_state(); |
450 | 453 |
451 *ssim_y = calc_ssim(source->y_buffer, source->y_stride, dest->y_buffer, | 454 *ssim_y = calc_ssim(source->y_buffer, source->y_stride, dest->y_buffer, |
452 dest->y_stride, source->y_crop_width, | 455 dest->y_stride, source->y_crop_width, |
453 source->y_crop_height); | 456 source->y_crop_height); |
454 | 457 |
455 *ssim_u = calc_ssim(source->u_buffer, source->uv_stride, dest->u_buffer, | 458 *ssim_u = calc_ssim(source->u_buffer, source->uv_stride, dest->u_buffer, |
456 dest->uv_stride, source->uv_crop_width, | 459 dest->uv_stride, source->uv_crop_width, |
457 source->uv_crop_height); | 460 source->uv_crop_height); |
458 | 461 |
459 *ssim_v = calc_ssim(source->v_buffer, source->uv_stride, dest->v_buffer, | 462 *ssim_v = calc_ssim(source->v_buffer, source->uv_stride, dest->v_buffer, |
460 dest->uv_stride, source->uv_crop_width, | 463 dest->uv_stride, source->uv_crop_width, |
461 source->uv_crop_height); | 464 source->uv_crop_height); |
462 ssimv = (*ssim_y) * .8 + .1 * ((*ssim_u) + (*ssim_v)); | 465 ssimv = (*ssim_y) * .8 + .1 * ((*ssim_u) + (*ssim_v)); |
463 | 466 |
464 return convert_ssim_db(ssimv, 1.0); | 467 return convert_ssim_db(ssimv, 1.0); |
465 } | 468 } |
OLD | NEW |