1 /******************************************************************************
2 *
3 * Copyright (C) 2022 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /**
21 *******************************************************************************
22 * @file
23 * isvc_mem_fns.c
24 *
25 * @brief
26 * Functions used for memory operations
27 *
28 * @author
29 * Ittiam
30 *
31 * @par List of Functions:
32 * isvc_memcpy()
33 * isvc_memcpy_mul_8()
34 * isvc_memset()
35 * isvc_memset_mul_8()
36 * isvc_memset_16bit()
37 * isvc_memset_16bit_mul_8()
38 * isvc_memory_alloc()
39 * isvc_memory_free()
40 *
41 * @remarks
42 * None
43 *
44 ******************************************************************************
45 */
46
47 /*****************************************************************************/
48 /* File Includes */
49 /*****************************************************************************/
50 /* System include files */
51 #include <stdio.h>
52 #include <stddef.h>
53 #include <stdlib.h>
54 #include <string.h>
55 #include <assert.h>
56
57 /* User include files */
58 #include "ih264_typedefs.h"
59 #include "isvc_mem_fns.h"
60
61 /**
62 ********************************************************************************
63 * @brief copies a 2d blk from one location to another
64 *
65 * @param[out] pu1_dst : dst pointer
66 *
67 * @param[in] i4_dst_stride: stride of destination
68 *
69 * @param[in] pu1_src : src ptr
70 *
71 * @param[in] i4_src_stride: stride of src
72 *
73 * @param[in] i4_blk_wd : blk width
74 *
75 * @param[in] i4_blk_ht : blk height
76 *
77 * @return void
78 ********************************************************************************
79 */
80
isvc_copy_2d(UWORD8 * pu1_dst,WORD32 i4_dst_stride,UWORD8 * pu1_src,WORD32 i4_src_stride,WORD32 i4_blk_wd,WORD32 i4_blk_ht)81 void isvc_copy_2d(UWORD8 *pu1_dst, WORD32 i4_dst_stride, UWORD8 *pu1_src, WORD32 i4_src_stride,
82 WORD32 i4_blk_wd, WORD32 i4_blk_ht)
83 {
84 WORD32 i;
85
86 for(i = 0; i < i4_blk_ht; i++)
87 {
88 memmove(pu1_dst, pu1_src, i4_blk_wd * sizeof(pu1_dst[0]));
89
90 pu1_dst += i4_dst_stride;
91 pu1_src += i4_src_stride;
92 }
93 }
94
95 /**
96 ********************************************************************************
97 * @brief memsets a 2d blk
98 *
99 * @param[out] pu1_dst : dst pointer
100 *
101 * @param[in] i4_dst_stride: stride of destination
102 *
103 * @param[in] i4_blk_wd : blk width
104 *
105 * @param[in] i4_blk_ht : blk height
106 *
107 * @return void
108 ********************************************************************************
109 */
isvc_memset_2d(UWORD8 * pu1_dst,WORD32 i4_dst_stride,UWORD8 u1_val,WORD32 i4_blk_wd,WORD32 i4_blk_ht)110 void isvc_memset_2d(UWORD8 *pu1_dst, WORD32 i4_dst_stride, UWORD8 u1_val, WORD32 i4_blk_wd,
111 WORD32 i4_blk_ht)
112 {
113 WORD32 i;
114
115 for(i = 0; i < i4_blk_ht; i++)
116 {
117 memset(pu1_dst, u1_val, i4_blk_wd);
118
119 pu1_dst += i4_dst_stride;
120 }
121 }
122
123 /**
124 *******************************************************************************
125 *
126 * @brief
127 * Checks if any pixel in a block is non-zero
128 *
129 * @param[in] pu1_data
130 * UWORD8 pointer to the block to be checked
131 *
132 * @param[in] i4_data_strd
133 * Stride of data buffer
134 *
135 * @param[in] u4_wd
136 * Width of the block
137 *
138 * @param[in] u4_ht
139 * Height of the block
140 *
141 *******************************************************************************
142 */
isvc_is_nonzero_blk(UWORD8 * pu1_data,WORD32 i4_data_strd,UWORD32 u4_wd,UWORD32 u4_ht)143 UWORD8 isvc_is_nonzero_blk(UWORD8 *pu1_data, WORD32 i4_data_strd, UWORD32 u4_wd, UWORD32 u4_ht)
144 {
145 UWORD32 i, j;
146
147 for(i = 0; i < u4_ht; i++)
148 {
149 for(j = 0; j < u4_wd; j++)
150 {
151 if(pu1_data[j + i * i4_data_strd])
152 {
153 return 1;
154 }
155 }
156 }
157
158 return 0;
159 }
160