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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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