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