1 /*
2 * Copyright(c) 2019 Intel Corporation
3 *
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at https://www.aomedia.org/license/software-license. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at https://www.aomedia.org/license/patent-license.
10 */
11
12 #include "EbPictureOperators_C.h"
13 #include "EbUtility.h"
14 #include "common_dsp_rtcd.h"
15 /*********************************
16 * Picture Average
17 *********************************/
svt_picture_average_kernel_c(EbByte src0,uint32_t src0_stride,EbByte src1,uint32_t src1_stride,EbByte dst,uint32_t dst_stride,uint32_t area_width,uint32_t area_height)18 void svt_picture_average_kernel_c(EbByte src0, uint32_t src0_stride, EbByte src1,
19 uint32_t src1_stride, EbByte dst, uint32_t dst_stride,
20 uint32_t area_width, uint32_t area_height) {
21 uint32_t x, y;
22
23 for (y = 0; y < area_height; y++) {
24 for (x = 0; x < area_width; x++) { dst[x] = (src0[x] + src1[x] + 1) >> 1; }
25 src0 += src0_stride;
26 src1 += src1_stride;
27 dst += dst_stride;
28 }
29 }
30
svt_picture_average_kernel1_line_c(EbByte src0,EbByte src1,EbByte dst,uint32_t areaWidth)31 void svt_picture_average_kernel1_line_c(EbByte src0, EbByte src1, EbByte dst, uint32_t areaWidth) {
32 uint32_t i;
33 for (i = 0; i < areaWidth; i++) dst[i] = (src0[i] + src1[i] + 1) / 2;
34 }
35
36 /*********************************
37 * Picture Copy Kernel
38 *********************************/
svt_memcpy_c(void * dst_ptr,void const * src_ptr,size_t size)39 void svt_memcpy_c(void *dst_ptr, void const *src_ptr, size_t size) {
40 memcpy(dst_ptr, src_ptr, size);
41 }
picture_copy_kernel(EbByte src,uint32_t src_stride,EbByte dst,uint32_t dst_stride,uint32_t area_width,uint32_t area_height,uint32_t bytes_per_sample)42 void picture_copy_kernel(EbByte src, uint32_t src_stride, EbByte dst, uint32_t dst_stride,
43 uint32_t area_width, uint32_t area_height,
44 uint32_t bytes_per_sample) //=1 always)
45 {
46 uint32_t sample_count = 0;
47 const uint32_t sample_total_count = area_width * area_height;
48 const uint32_t copy_length = area_width * bytes_per_sample;
49
50 src_stride *= bytes_per_sample;
51 dst_stride *= bytes_per_sample;
52
53 while (sample_count < sample_total_count) {
54 svt_memcpy_c(dst, src, copy_length);
55 src += src_stride;
56 dst += dst_stride;
57 sample_count += area_width;
58 }
59
60 return;
61 }
62
63 // C equivalents
64
svt_spatial_full_distortion_kernel_c(uint8_t * input,uint32_t input_offset,uint32_t input_stride,uint8_t * recon,int32_t recon_offset,uint32_t recon_stride,uint32_t area_width,uint32_t area_height)65 uint64_t svt_spatial_full_distortion_kernel_c(uint8_t *input, uint32_t input_offset,
66 uint32_t input_stride, uint8_t *recon,
67 int32_t recon_offset, uint32_t recon_stride,
68 uint32_t area_width, uint32_t area_height) {
69 uint64_t spatial_distortion = 0;
70 input += input_offset;
71 recon += recon_offset;
72
73 for (uint32_t row_index = 0; row_index < area_height; ++row_index) {
74 uint32_t column_index = 0;
75 while (column_index < area_width) {
76 spatial_distortion += (int64_t)SQR((int64_t)(input[column_index]) -
77 (recon[column_index]));
78 ++column_index;
79 }
80
81 input += input_stride;
82 recon += recon_stride;
83 }
84 return spatial_distortion;
85 }
86