1 /******************************************************************************
2 *
3 * Copyright (C) 2015 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 *******************************************************************************
23 * @file
24 * ih264_padding.c
25 *
26 * @brief
27 * Contains function definitions for Padding
28 *
29 * @author
30 * Ittiam
31 *
32 * @par List of Functions:
33 * - ih264_pad_top()
34 * - ih264_pad_bottom()
35 * - ih264_pad_left_luma()
36 * - ih264_pad_left_chroma()
37 * - ih264_pad_right_luma()
38 * - ih264_pad_right_chroma()
39 *
40 * @remarks
41 * None
42 *
43 *******************************************************************************
44 */
45
46 /*****************************************************************************/
47 /* File Includes */
48 /*****************************************************************************/
49
50 /* System include files */
51 #include <stddef.h>
52 #include <string.h>
53
54 /* User include files */
55 #include "ih264_typedefs.h"
56 #include "ih264_macros.h"
57 #include "ih264_padding.h"
58
59
60 /*****************************************************************************/
61 /* Function Definitions */
62 /*****************************************************************************/
63
64 /**
65 *******************************************************************************
66 *
67 * @brief pad at the top of a 2d array
68 *
69 * @par Description:
70 * The top row of a 2d array is replicated for pad_size times at the top
71 *
72 * @param[in] pu1_src
73 * UWORD8 pointer to the source
74 *
75 * @param[in] src_strd
76 * integer source stride
77 *
78 * @param[in] wd
79 * integer width of the array
80 *
81 * @param[in] pad_size
82 * integer -padding size of the array
83 *
84 * @returns none
85 *
86 * @remarks none
87 *
88 *******************************************************************************
89 */
ih264_pad_top(UWORD8 * pu1_src,WORD32 src_strd,WORD32 wd,WORD32 pad_size)90 void ih264_pad_top(UWORD8 *pu1_src,
91 WORD32 src_strd,
92 WORD32 wd,
93 WORD32 pad_size)
94 {
95 WORD32 row;
96
97 for(row = 1; row <= pad_size; row++)
98 {
99 memcpy(pu1_src - row * src_strd, pu1_src, wd);
100 }
101 }
102
103
104
105 /**
106 *******************************************************************************
107 *
108 * @brief pad at the bottom of a 2d array
109 *
110 * @par Description:
111 * The bottom row of a 2d array is replicated for pad_size times at the bottom
112 *
113 * @param[in] pu1_src
114 * UWORD8 pointer to the source
115 *
116 * @param[in] src_strd
117 * integer source stride
118 *
119 * @param[in] wd
120 * integer width of the array
121 *
122 * @param[in] pad_size
123 * integer -padding size of the array
124 *
125 * @returns none
126 *
127 * @remarks none
128 *
129 *******************************************************************************
130 */
ih264_pad_bottom(UWORD8 * pu1_src,WORD32 src_strd,WORD32 wd,WORD32 pad_size)131 void ih264_pad_bottom(UWORD8 *pu1_src,
132 WORD32 src_strd,
133 WORD32 wd,
134 WORD32 pad_size)
135 {
136 WORD32 row;
137
138 for(row = 1; row <= pad_size; row++)
139 {
140 memcpy(pu1_src + (row - 1) * src_strd, pu1_src - 1 * src_strd, wd);
141 }
142 }
143
144 /**
145 *******************************************************************************
146 *
147 * @brief pad (luma block) at the left of a 2d array
148 *
149 * @par Description:
150 * The left column of a 2d array is replicated for pad_size times to the left
151 *
152 * @param[in] pu1_src
153 * UWORD8 pointer to the source
154 *
155 * @param[in] src_strd
156 * integer source stride
157 *
158 * @param[in] ht
159 * integer height of the array
160 *
161 * @param[in] pad_size
162 * integer -padding size of the array
163 *
164 * @returns none
165 *
166 * @remarks none
167 *
168 *******************************************************************************
169 */
ih264_pad_left_luma(UWORD8 * pu1_src,WORD32 src_strd,WORD32 ht,WORD32 pad_size)170 void ih264_pad_left_luma(UWORD8 *pu1_src,
171 WORD32 src_strd,
172 WORD32 ht,
173 WORD32 pad_size)
174 {
175 WORD32 row;
176
177 for(row = 0; row < ht; row++)
178 {
179
180 memset(pu1_src - pad_size, *pu1_src, pad_size);
181
182 pu1_src += src_strd;
183 }
184 }
185
186 /**
187 *******************************************************************************
188 *
189 * @brief pad (chroma block) at the left of a 2d array
190 *
191 * @par Description:
192 * The left column of a 2d array is replicated for pad_size times to the left
193 *
194 * @param[in] pu1_src
195 * UWORD8 pointer to the source
196 *
197 * @param[in] src_strd
198 * integer source stride
199 *
200 * @param[in] ht
201 * integer height of the array
202 *
203 * @param[in] pad_size
204 * integer -padding size of the array
205 *
206 * @returns none
207 *
208 * @remarks none
209 *
210 *******************************************************************************
211 */
ih264_pad_left_chroma(UWORD8 * pu1_src,WORD32 src_strd,WORD32 ht,WORD32 pad_size)212 void ih264_pad_left_chroma(UWORD8 *pu1_src,
213 WORD32 src_strd,
214 WORD32 ht,
215 WORD32 pad_size)
216 {
217 /* temp var */
218 WORD32 row, col;
219 UWORD16 u2_uv_val;
220
221 /* pointer to src */
222 UWORD16 *pu2_src = (UWORD16 *)pu1_src;
223
224 src_strd >>= 1;
225 pad_size >>= 1;
226
227 for(row = 0; row < ht; row++)
228 {
229 u2_uv_val = pu2_src[0];
230
231 for (col = -pad_size; col < 0; col++)
232 {
233 pu2_src[col] = u2_uv_val;
234 }
235
236 pu2_src += src_strd;
237 }
238 }
239
240 /**
241 *******************************************************************************
242 *
243 * @brief pad (luma block) at the right of a 2d array
244 *
245 * @par Description:
246 * The right column of a 2d array is replicated for pad_size times at the right
247 *
248 * @param[in] pu1_src
249 * UWORD8 pointer to the source
250 *
251 * @param[in] src_strd
252 * integer source stride
253 *
254 * @param[in] ht
255 * integer height of the array
256 *
257 * @param[in] pad_size
258 * integer -padding size of the array
259 *
260 * @returns none
261 *
262 * @remarks none
263 *
264 *******************************************************************************
265 */
ih264_pad_right_luma(UWORD8 * pu1_src,WORD32 src_strd,WORD32 ht,WORD32 pad_size)266 void ih264_pad_right_luma(UWORD8 *pu1_src,
267 WORD32 src_strd,
268 WORD32 ht,
269 WORD32 pad_size)
270 {
271 WORD32 row;
272
273 for(row = 0; row < ht; row++)
274 {
275 memset(pu1_src, *(pu1_src -1), pad_size);
276
277 pu1_src += src_strd;
278 }
279 }
280
281 /**
282 *******************************************************************************
283 *
284 * @brief pad (chroma block) at the right of a 2d array
285 *
286 * @par Description:
287 * The right column of a 2d array is replicated for pad_size times at the right
288 *
289 * @param[in] pu1_src
290 * UWORD8 pointer to the source
291 *
292 * @param[in] src_strd
293 * integer source stride
294 *
295 * @param[in] ht
296 * integer height of the array
297 *
298 * @param[in] pad_size
299 * integer -padding size of the array
300 *
301 * @returns none
302 *
303 * @remarks none
304 *
305 *******************************************************************************
306 */
ih264_pad_right_chroma(UWORD8 * pu1_src,WORD32 src_strd,WORD32 ht,WORD32 pad_size)307 void ih264_pad_right_chroma(UWORD8 *pu1_src,
308 WORD32 src_strd,
309 WORD32 ht,
310 WORD32 pad_size)
311 {
312 WORD32 row, col;
313 UWORD16 u2_uv_val;
314 UWORD16 *pu2_src = (UWORD16 *)pu1_src;
315
316 src_strd >>= 1;
317 pad_size >>= 1;
318
319 for(row = 0; row < ht; row++)
320 {
321 u2_uv_val = pu2_src[-1];
322
323 for (col = 0; col < pad_size; col++)
324 {
325 pu2_src[col] = u2_uv_val;
326 }
327
328 pu2_src += src_strd;
329 }
330 }
331
332