/src/libhevc/common/ihevc_padding.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore |
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 | | /** |
19 | | ******************************************************************************* |
20 | | * @file |
21 | | * ihevc_padding.c |
22 | | * |
23 | | * @brief |
24 | | * Contains function definitions for Padding |
25 | | * |
26 | | * @author |
27 | | * Srinivas T |
28 | | * |
29 | | * @par List of Functions: |
30 | | * - ihevc_pad_horz_luma() |
31 | | * - ihevc_pad_horz_chroma() |
32 | | * - ihevc_pad_vert() |
33 | | * - ihevc_pad_left_luma() |
34 | | * - ihevc_pad_left_chroma() |
35 | | * - ihevc_pad_right_luma() |
36 | | * - ihevc_pad_right_chroma() |
37 | | * - ihevc_pad_top() |
38 | | * - ihevc_pad_bottom() |
39 | | * |
40 | | * @remarks |
41 | | * None |
42 | | * |
43 | | ******************************************************************************* |
44 | | */ |
45 | | |
46 | | #include <string.h> |
47 | | #include "ihevc_typedefs.h" |
48 | | #include "ihevc_func_selector.h" |
49 | | #include "ihevc_platform_macros.h" |
50 | | #include "ihevc_mem_fns.h" |
51 | | /** |
52 | | ******************************************************************************* |
53 | | * |
54 | | * @brief |
55 | | * Padding function for horizontal input variable |
56 | | * |
57 | | * @par Description: |
58 | | * |
59 | | * |
60 | | * @param[in] pu1_src |
61 | | * UWORD8 pointer to the source |
62 | | * |
63 | | * @param[in] src_strd |
64 | | * integer source stride |
65 | | * |
66 | | * @param[in] ht |
67 | | * integer height of the array |
68 | | * |
69 | | * @param[in] wd |
70 | | * integer width of the array |
71 | | * |
72 | | * @param[in] pad_size |
73 | | * integer -padding size of the array |
74 | | * |
75 | | * @param[in] ht |
76 | | * integer height of the array |
77 | | * |
78 | | * @param[in] wd |
79 | | * integer width of the array |
80 | | * |
81 | | * @returns |
82 | | * |
83 | | * @remarks |
84 | | * None |
85 | | * |
86 | | ******************************************************************************* |
87 | | */ |
88 | | |
89 | | void ihevc_pad_vert(UWORD8 *pu1_src, |
90 | | WORD32 src_strd, |
91 | | WORD32 ht, |
92 | | WORD32 wd, |
93 | | WORD32 pad_size) |
94 | 0 | { |
95 | 0 | WORD32 row; |
96 | |
|
97 | 0 | for(row = 1; row <= pad_size; row++) |
98 | 0 | { |
99 | 0 | memcpy(pu1_src - row * src_strd, pu1_src, wd); |
100 | 0 | memcpy(pu1_src + (ht + row - 1) * src_strd, |
101 | 0 | pu1_src + (ht - 1) * src_strd, wd); |
102 | 0 | } |
103 | 0 | } |
104 | | |
105 | | /** |
106 | | ******************************************************************************* |
107 | | * |
108 | | * @brief |
109 | | * Padding function for vertical input variable |
110 | | * |
111 | | * @par Description: |
112 | | * |
113 | | * |
114 | | * @param[in] pu1_src |
115 | | * UWORD8 pointer to the source |
116 | | * |
117 | | * @param[in] src_strd |
118 | | * integer source stride |
119 | | * |
120 | | * @param[in] ht |
121 | | * integer height of the array |
122 | | * |
123 | | * @param[in] wd |
124 | | * integer width of the array |
125 | | * |
126 | | * @param[in] pad_size |
127 | | * integer -padding size of the array |
128 | | * |
129 | | * @param[in] ht |
130 | | * integer height of the array |
131 | | * |
132 | | * @param[in] wd |
133 | | * integer width of the array |
134 | | * |
135 | | * @returns |
136 | | * |
137 | | * @remarks |
138 | | * None |
139 | | * |
140 | | ******************************************************************************* |
141 | | */ |
142 | | |
143 | | void ihevc_pad_horz_chroma(UWORD8 *pu1_src, |
144 | | WORD32 src_strd, |
145 | | WORD32 ht, |
146 | | WORD32 wd, |
147 | | WORD32 pad_size) |
148 | 0 | { |
149 | 0 | WORD32 row; |
150 | | //WORD32 col; |
151 | 0 | UWORD16 *pu2_src = (UWORD16 *)pu1_src; |
152 | |
|
153 | 0 | src_strd >>= 1; |
154 | 0 | wd >>= 1; |
155 | 0 | pad_size >>= 1; |
156 | |
|
157 | 0 | for(row = 0; row < ht; row++) |
158 | 0 | { |
159 | 0 | UWORD16 u2_uv_val; |
160 | |
|
161 | 0 | u2_uv_val = pu2_src[0]; |
162 | 0 | ihevc_memset_16bit(&pu2_src[-pad_size], u2_uv_val, pad_size); |
163 | |
|
164 | 0 | u2_uv_val = pu2_src[wd - 1]; |
165 | 0 | ihevc_memset_16bit(&pu2_src[wd], u2_uv_val, pad_size); |
166 | |
|
167 | 0 | pu2_src += src_strd; |
168 | 0 | } |
169 | 0 | } |
170 | | |
171 | | |
172 | | /** |
173 | | ******************************************************************************* |
174 | | * |
175 | | * @brief |
176 | | * Padding function for vertical input variable |
177 | | * |
178 | | * @par Description: |
179 | | * |
180 | | * |
181 | | * @param[in] pu1_src |
182 | | * UWORD8 pointer to the source |
183 | | * |
184 | | * @param[in] src_strd |
185 | | * integer source stride |
186 | | * |
187 | | * @param[in] ht |
188 | | * integer height of the array |
189 | | * |
190 | | * @param[in] wd |
191 | | * integer width of the array |
192 | | * |
193 | | * @param[in] pad_size |
194 | | * integer -padding size of the array |
195 | | * |
196 | | * @param[in] ht |
197 | | * integer height of the array |
198 | | * |
199 | | * @param[in] wd |
200 | | * integer width of the array |
201 | | * |
202 | | * @returns |
203 | | * |
204 | | * @remarks |
205 | | * None |
206 | | * |
207 | | ******************************************************************************* |
208 | | */ |
209 | | |
210 | | void ihevc_pad_horz_luma(UWORD8 *pu1_src, |
211 | | WORD32 src_strd, |
212 | | WORD32 ht, |
213 | | WORD32 wd, |
214 | | WORD32 pad_size) |
215 | 0 | { |
216 | 0 | WORD32 row; |
217 | |
|
218 | 0 | for(row = 0; row < ht; row++) |
219 | 0 | { |
220 | 0 | memset(pu1_src - pad_size, *pu1_src, pad_size); |
221 | 0 | memset(pu1_src + wd, *(pu1_src + wd - 1), pad_size); |
222 | |
|
223 | 0 | pu1_src += src_strd; |
224 | 0 | } |
225 | 0 | } |
226 | | |
227 | | |
228 | | |
229 | | /** |
230 | | ******************************************************************************* |
231 | | * |
232 | | * @brief |
233 | | * Padding at the top of a 2d array |
234 | | * |
235 | | * @par Description: |
236 | | * The top row of a 2d array is replicated for pad_size times at the top |
237 | | * |
238 | | * |
239 | | * @param[in] pu1_src |
240 | | * UWORD8 pointer to the source |
241 | | * |
242 | | * @param[in] src_strd |
243 | | * integer source stride |
244 | | * |
245 | | * @param[in] ht |
246 | | * integer height of the array |
247 | | * |
248 | | * @param[in] wd |
249 | | * integer width of the array |
250 | | * |
251 | | * @param[in] pad_size |
252 | | * integer -padding size of the array |
253 | | * |
254 | | * @param[in] ht |
255 | | * integer height of the array |
256 | | * |
257 | | * @param[in] wd |
258 | | * integer width of the array |
259 | | * |
260 | | * @returns |
261 | | * |
262 | | * @remarks |
263 | | * None |
264 | | * |
265 | | ******************************************************************************* |
266 | | */ |
267 | | |
268 | | void ihevc_pad_top(UWORD8 *pu1_src, |
269 | | WORD32 src_strd, |
270 | | WORD32 wd, |
271 | | WORD32 pad_size) |
272 | 872k | { |
273 | 872k | WORD32 row; |
274 | | |
275 | 59.5M | for(row = 1; row <= pad_size; row++) |
276 | 58.6M | { |
277 | 58.6M | memcpy(pu1_src - row * src_strd, pu1_src, wd); |
278 | 58.6M | } |
279 | 872k | } |
280 | | |
281 | | |
282 | | |
283 | | /** |
284 | | ******************************************************************************* |
285 | | * |
286 | | * @brief |
287 | | * Padding at the bottom of a 2d array |
288 | | * |
289 | | * @par Description: |
290 | | * The bottom row of a 2d array is replicated for pad_size times at the bottom |
291 | | * |
292 | | * |
293 | | * @param[in] pu1_src |
294 | | * UWORD8 pointer to the source |
295 | | * |
296 | | * @param[in] src_strd |
297 | | * integer source stride |
298 | | * |
299 | | * @param[in] ht |
300 | | * integer height of the array |
301 | | * |
302 | | * @param[in] wd |
303 | | * integer width of the array |
304 | | * |
305 | | * @param[in] pad_size |
306 | | * integer -padding size of the array |
307 | | * |
308 | | * @param[in] ht |
309 | | * integer height of the array |
310 | | * |
311 | | * @param[in] wd |
312 | | * integer width of the array |
313 | | * |
314 | | * @returns |
315 | | * |
316 | | * @remarks |
317 | | * None |
318 | | * |
319 | | ******************************************************************************* |
320 | | */ |
321 | | |
322 | | void ihevc_pad_bottom(UWORD8 *pu1_src, |
323 | | WORD32 src_strd, |
324 | | WORD32 wd, |
325 | | WORD32 pad_size) |
326 | 872k | { |
327 | 872k | WORD32 row; |
328 | | |
329 | 59.5M | for(row = 1; row <= pad_size; row++) |
330 | 58.6M | { |
331 | 58.6M | memcpy(pu1_src + (row - 1) * src_strd, |
332 | 58.6M | pu1_src - 1 * src_strd, wd); |
333 | 58.6M | } |
334 | 872k | } |
335 | | |
336 | | |
337 | | |
338 | | /** |
339 | | ******************************************************************************* |
340 | | * |
341 | | * @brief |
342 | | * Padding (luma block) at the left of a 2d array |
343 | | * |
344 | | * @par Description: |
345 | | * The left column of a 2d array is replicated for pad_size times at the left |
346 | | * |
347 | | * |
348 | | * @param[in] pu1_src |
349 | | * UWORD8 pointer to the source |
350 | | * |
351 | | * @param[in] src_strd |
352 | | * integer source stride |
353 | | * |
354 | | * @param[in] ht |
355 | | * integer height of the array |
356 | | * |
357 | | * @param[in] wd |
358 | | * integer width of the array |
359 | | * |
360 | | * @param[in] pad_size |
361 | | * integer -padding size of the array |
362 | | * |
363 | | * @param[in] ht |
364 | | * integer height of the array |
365 | | * |
366 | | * @param[in] wd |
367 | | * integer width of the array |
368 | | * |
369 | | * @returns |
370 | | * |
371 | | * @remarks |
372 | | * None |
373 | | * |
374 | | ******************************************************************************* |
375 | | */ |
376 | | |
377 | | void ihevc_pad_left_luma(UWORD8 *pu1_src, |
378 | | WORD32 src_strd, |
379 | | WORD32 ht, |
380 | | WORD32 pad_size) |
381 | 641k | { |
382 | 641k | WORD32 row; |
383 | | |
384 | 132M | for(row = 0; row < ht; row++) |
385 | 131M | { |
386 | 131M | memset(pu1_src - pad_size, *pu1_src, pad_size); |
387 | | |
388 | 131M | pu1_src += src_strd; |
389 | 131M | } |
390 | 641k | } |
391 | | |
392 | | |
393 | | |
394 | | /** |
395 | | ******************************************************************************* |
396 | | * |
397 | | * @brief |
398 | | * Padding (chroma block) at the left of a 2d array |
399 | | * |
400 | | * @par Description: |
401 | | * The left column of a 2d array is replicated for pad_size times at the left |
402 | | * |
403 | | * |
404 | | * @param[in] pu1_src |
405 | | * UWORD8 pointer to the source |
406 | | * |
407 | | * @param[in] src_strd |
408 | | * integer source stride |
409 | | * |
410 | | * @param[in] ht |
411 | | * integer height of the array |
412 | | * |
413 | | * @param[in] wd |
414 | | * integer width of the array (each colour component) |
415 | | * |
416 | | * @param[in] pad_size |
417 | | * integer -padding size of the array |
418 | | * |
419 | | * @param[in] ht |
420 | | * integer height of the array |
421 | | * |
422 | | * @param[in] wd |
423 | | * integer width of the array |
424 | | * |
425 | | * @returns |
426 | | * |
427 | | * @remarks |
428 | | * None |
429 | | * |
430 | | ******************************************************************************* |
431 | | */ |
432 | | |
433 | | void ihevc_pad_left_chroma(UWORD8 *pu1_src, |
434 | | WORD32 src_strd, |
435 | | WORD32 ht, |
436 | | WORD32 pad_size) |
437 | 160k | { |
438 | 160k | WORD32 row; |
439 | 160k | WORD32 col; |
440 | 160k | UWORD16 *pu2_src = (UWORD16 *)pu1_src; |
441 | | |
442 | 160k | src_strd >>= 1; |
443 | 160k | pad_size >>= 1; |
444 | | |
445 | 16.6M | for(row = 0; row < ht; row++) |
446 | 16.4M | { |
447 | 16.4M | UWORD16 u2_uv_val; |
448 | | |
449 | 16.4M | u2_uv_val = pu2_src[0]; |
450 | 676M | for(col = -pad_size; col < 0; col++) |
451 | 659M | pu2_src[col] = u2_uv_val; |
452 | | |
453 | 16.4M | pu2_src += src_strd; |
454 | 16.4M | } |
455 | 160k | } |
456 | | |
457 | | |
458 | | |
459 | | /** |
460 | | ******************************************************************************* |
461 | | * |
462 | | * @brief |
463 | | * Padding (luma block) at the right of a 2d array |
464 | | * |
465 | | * @par Description: |
466 | | * The right column of a 2d array is replicated for pad_size times at the right |
467 | | * |
468 | | * |
469 | | * @param[in] pu1_src |
470 | | * UWORD8 pointer to the source |
471 | | * |
472 | | * @param[in] src_strd |
473 | | * integer source stride |
474 | | * |
475 | | * @param[in] ht |
476 | | * integer height of the array |
477 | | * |
478 | | * @param[in] wd |
479 | | * integer width of the array |
480 | | * |
481 | | * @param[in] pad_size |
482 | | * integer -padding size of the array |
483 | | * |
484 | | * @param[in] ht |
485 | | * integer height of the array |
486 | | * |
487 | | * @param[in] wd |
488 | | * integer width of the array |
489 | | * |
490 | | * @returns |
491 | | * |
492 | | * @remarks |
493 | | * None |
494 | | * |
495 | | ******************************************************************************* |
496 | | */ |
497 | | |
498 | | void ihevc_pad_right_luma(UWORD8 *pu1_src, |
499 | | WORD32 src_strd, |
500 | | WORD32 ht, |
501 | | WORD32 pad_size) |
502 | 641k | { |
503 | 641k | WORD32 row; |
504 | | |
505 | 132M | for(row = 0; row < ht; row++) |
506 | 131M | { |
507 | 131M | memset(pu1_src, *(pu1_src - 1), pad_size); |
508 | | |
509 | 131M | pu1_src += src_strd; |
510 | 131M | } |
511 | 641k | } |
512 | | |
513 | | |
514 | | |
515 | | /** |
516 | | ******************************************************************************* |
517 | | * |
518 | | * @brief |
519 | | * Padding (chroma block) at the right of a 2d array |
520 | | * |
521 | | * @par Description: |
522 | | * The right column of a 2d array is replicated for pad_size times at the right |
523 | | * |
524 | | * |
525 | | * @param[in] pu1_src |
526 | | * UWORD8 pointer to the source |
527 | | * |
528 | | * @param[in] src_strd |
529 | | * integer source stride |
530 | | * |
531 | | * @param[in] ht |
532 | | * integer height of the array |
533 | | * |
534 | | * @param[in] wd |
535 | | * integer width of the array (each colour component) |
536 | | * |
537 | | * @param[in] pad_size |
538 | | * integer -padding size of the array |
539 | | * |
540 | | * @param[in] ht |
541 | | * integer height of the array |
542 | | * |
543 | | * @param[in] wd |
544 | | * integer width of the array |
545 | | * |
546 | | * @returns |
547 | | * |
548 | | * @remarks |
549 | | * None |
550 | | * |
551 | | ******************************************************************************* |
552 | | */ |
553 | | |
554 | | void ihevc_pad_right_chroma(UWORD8 *pu1_src, |
555 | | WORD32 src_strd, |
556 | | WORD32 ht, |
557 | | WORD32 pad_size) |
558 | 160k | { |
559 | 160k | WORD32 row; |
560 | 160k | WORD32 col; |
561 | 160k | UWORD16 *pu2_src = (UWORD16 *)pu1_src; |
562 | | |
563 | 160k | src_strd >>= 1; |
564 | 160k | pad_size >>= 1; |
565 | | |
566 | 16.6M | for(row = 0; row < ht; row++) |
567 | 16.4M | { |
568 | 16.4M | UWORD16 u2_uv_val; |
569 | | |
570 | 16.4M | u2_uv_val = pu2_src[-1]; |
571 | 676M | for(col = 0; col < pad_size; col++) |
572 | 659M | pu2_src[col] = u2_uv_val; |
573 | | |
574 | 16.4M | pu2_src += src_strd; |
575 | 16.4M | } |
576 | 160k | } |
577 | | |