1 /* 2 * Copyright (c) 2015 Manojkumar Bhosale (Manojkumar.Bhosale@imgtec.com) 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef AVCODEC_MIPS_HEVCDSP_MIPS_H 22 #define AVCODEC_MIPS_HEVCDSP_MIPS_H 23 24 #include "libavcodec/hevcdsp.h" 25 26 #define MC(PEL, DIR, WIDTH) \ 27 void ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_msa(int16_t *dst, \ 28 uint8_t *src, \ 29 ptrdiff_t src_stride, \ 30 int height, \ 31 intptr_t mx, \ 32 intptr_t my, \ 33 int width) 34 35 MC(pel, pixels, 4); 36 MC(pel, pixels, 6); 37 MC(pel, pixels, 8); 38 MC(pel, pixels, 12); 39 MC(pel, pixels, 16); 40 MC(pel, pixels, 24); 41 MC(pel, pixels, 32); 42 MC(pel, pixels, 48); 43 MC(pel, pixels, 64); 44 45 MC(qpel, h, 4); 46 MC(qpel, h, 8); 47 MC(qpel, h, 12); 48 MC(qpel, h, 16); 49 MC(qpel, h, 24); 50 MC(qpel, h, 32); 51 MC(qpel, h, 48); 52 MC(qpel, h, 64); 53 54 MC(qpel, v, 4); 55 MC(qpel, v, 8); 56 MC(qpel, v, 12); 57 MC(qpel, v, 16); 58 MC(qpel, v, 24); 59 MC(qpel, v, 32); 60 MC(qpel, v, 48); 61 MC(qpel, v, 64); 62 63 MC(qpel, hv, 4); 64 MC(qpel, hv, 8); 65 MC(qpel, hv, 12); 66 MC(qpel, hv, 16); 67 MC(qpel, hv, 24); 68 MC(qpel, hv, 32); 69 MC(qpel, hv, 48); 70 MC(qpel, hv, 64); 71 72 MC(epel, h, 4); 73 MC(epel, h, 6); 74 MC(epel, h, 8); 75 MC(epel, h, 12); 76 MC(epel, h, 16); 77 MC(epel, h, 24); 78 MC(epel, h, 32); 79 MC(epel, h, 48); 80 MC(epel, h, 64); 81 82 MC(epel, v, 4); 83 MC(epel, v, 6); 84 MC(epel, v, 8); 85 MC(epel, v, 12); 86 MC(epel, v, 16); 87 MC(epel, v, 24); 88 MC(epel, v, 32); 89 MC(epel, v, 48); 90 MC(epel, v, 64); 91 92 MC(epel, hv, 4); 93 MC(epel, hv, 6); 94 MC(epel, hv, 8); 95 MC(epel, hv, 12); 96 MC(epel, hv, 16); 97 MC(epel, hv, 24); 98 MC(epel, hv, 32); 99 MC(epel, hv, 48); 100 MC(epel, hv, 64); 101 102 #undef MC 103 104 #define UNI_MC(PEL, DIR, WIDTH) \ 105 void ff_hevc_put_hevc_uni_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \ 106 ptrdiff_t dst_stride, \ 107 uint8_t *src, \ 108 ptrdiff_t src_stride, \ 109 int height, \ 110 intptr_t mx, \ 111 intptr_t my, \ 112 int width) 113 114 UNI_MC(pel, pixels, 4); 115 UNI_MC(pel, pixels, 6); 116 UNI_MC(pel, pixels, 8); 117 UNI_MC(pel, pixels, 12); 118 UNI_MC(pel, pixels, 16); 119 UNI_MC(pel, pixels, 24); 120 UNI_MC(pel, pixels, 32); 121 UNI_MC(pel, pixels, 48); 122 UNI_MC(pel, pixels, 64); 123 124 UNI_MC(qpel, h, 4); 125 UNI_MC(qpel, h, 8); 126 UNI_MC(qpel, h, 12); 127 UNI_MC(qpel, h, 16); 128 UNI_MC(qpel, h, 24); 129 UNI_MC(qpel, h, 32); 130 UNI_MC(qpel, h, 48); 131 UNI_MC(qpel, h, 64); 132 133 UNI_MC(qpel, v, 4); 134 UNI_MC(qpel, v, 8); 135 UNI_MC(qpel, v, 12); 136 UNI_MC(qpel, v, 16); 137 UNI_MC(qpel, v, 24); 138 UNI_MC(qpel, v, 32); 139 UNI_MC(qpel, v, 48); 140 UNI_MC(qpel, v, 64); 141 142 UNI_MC(qpel, hv, 4); 143 UNI_MC(qpel, hv, 8); 144 UNI_MC(qpel, hv, 12); 145 UNI_MC(qpel, hv, 16); 146 UNI_MC(qpel, hv, 24); 147 UNI_MC(qpel, hv, 32); 148 UNI_MC(qpel, hv, 48); 149 UNI_MC(qpel, hv, 64); 150 151 UNI_MC(epel, h, 4); 152 UNI_MC(epel, h, 6); 153 UNI_MC(epel, h, 8); 154 UNI_MC(epel, h, 12); 155 UNI_MC(epel, h, 16); 156 UNI_MC(epel, h, 24); 157 UNI_MC(epel, h, 32); 158 UNI_MC(epel, h, 48); 159 UNI_MC(epel, h, 64); 160 161 UNI_MC(epel, v, 4); 162 UNI_MC(epel, v, 6); 163 UNI_MC(epel, v, 8); 164 UNI_MC(epel, v, 12); 165 UNI_MC(epel, v, 16); 166 UNI_MC(epel, v, 24); 167 UNI_MC(epel, v, 32); 168 UNI_MC(epel, v, 48); 169 UNI_MC(epel, v, 64); 170 171 UNI_MC(epel, hv, 4); 172 UNI_MC(epel, hv, 6); 173 UNI_MC(epel, hv, 8); 174 UNI_MC(epel, hv, 12); 175 UNI_MC(epel, hv, 16); 176 UNI_MC(epel, hv, 24); 177 UNI_MC(epel, hv, 32); 178 UNI_MC(epel, hv, 48); 179 UNI_MC(epel, hv, 64); 180 181 #undef UNI_MC 182 183 #define UNI_W_MC(PEL, DIR, WIDTH) \ 184 void ff_hevc_put_hevc_uni_w_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \ 185 ptrdiff_t \ 186 dst_stride, \ 187 uint8_t *src, \ 188 ptrdiff_t \ 189 src_stride, \ 190 int height, \ 191 int denom, \ 192 int weight, \ 193 int offset, \ 194 intptr_t mx, \ 195 intptr_t my, \ 196 int width) 197 198 UNI_W_MC(pel, pixels, 4); 199 UNI_W_MC(pel, pixels, 6); 200 UNI_W_MC(pel, pixels, 8); 201 UNI_W_MC(pel, pixels, 12); 202 UNI_W_MC(pel, pixels, 16); 203 UNI_W_MC(pel, pixels, 24); 204 UNI_W_MC(pel, pixels, 32); 205 UNI_W_MC(pel, pixels, 48); 206 UNI_W_MC(pel, pixels, 64); 207 208 UNI_W_MC(qpel, h, 4); 209 UNI_W_MC(qpel, h, 8); 210 UNI_W_MC(qpel, h, 12); 211 UNI_W_MC(qpel, h, 16); 212 UNI_W_MC(qpel, h, 24); 213 UNI_W_MC(qpel, h, 32); 214 UNI_W_MC(qpel, h, 48); 215 UNI_W_MC(qpel, h, 64); 216 217 UNI_W_MC(qpel, v, 4); 218 UNI_W_MC(qpel, v, 8); 219 UNI_W_MC(qpel, v, 12); 220 UNI_W_MC(qpel, v, 16); 221 UNI_W_MC(qpel, v, 24); 222 UNI_W_MC(qpel, v, 32); 223 UNI_W_MC(qpel, v, 48); 224 UNI_W_MC(qpel, v, 64); 225 226 UNI_W_MC(qpel, hv, 4); 227 UNI_W_MC(qpel, hv, 8); 228 UNI_W_MC(qpel, hv, 12); 229 UNI_W_MC(qpel, hv, 16); 230 UNI_W_MC(qpel, hv, 24); 231 UNI_W_MC(qpel, hv, 32); 232 UNI_W_MC(qpel, hv, 48); 233 UNI_W_MC(qpel, hv, 64); 234 235 UNI_W_MC(epel, h, 4); 236 UNI_W_MC(epel, h, 6); 237 UNI_W_MC(epel, h, 8); 238 UNI_W_MC(epel, h, 12); 239 UNI_W_MC(epel, h, 16); 240 UNI_W_MC(epel, h, 24); 241 UNI_W_MC(epel, h, 32); 242 UNI_W_MC(epel, h, 48); 243 UNI_W_MC(epel, h, 64); 244 245 UNI_W_MC(epel, v, 4); 246 UNI_W_MC(epel, v, 6); 247 UNI_W_MC(epel, v, 8); 248 UNI_W_MC(epel, v, 12); 249 UNI_W_MC(epel, v, 16); 250 UNI_W_MC(epel, v, 24); 251 UNI_W_MC(epel, v, 32); 252 UNI_W_MC(epel, v, 48); 253 UNI_W_MC(epel, v, 64); 254 255 UNI_W_MC(epel, hv, 4); 256 UNI_W_MC(epel, hv, 6); 257 UNI_W_MC(epel, hv, 8); 258 UNI_W_MC(epel, hv, 12); 259 UNI_W_MC(epel, hv, 16); 260 UNI_W_MC(epel, hv, 24); 261 UNI_W_MC(epel, hv, 32); 262 UNI_W_MC(epel, hv, 48); 263 UNI_W_MC(epel, hv, 64); 264 265 #undef UNI_W_MC 266 267 #define BI_MC(PEL, DIR, WIDTH) \ 268 void ff_hevc_put_hevc_bi_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \ 269 ptrdiff_t dst_stride, \ 270 uint8_t *src, \ 271 ptrdiff_t src_stride, \ 272 int16_t *src_16bit, \ 273 int height, \ 274 intptr_t mx, \ 275 intptr_t my, \ 276 int width) 277 278 BI_MC(pel, pixels, 4); 279 BI_MC(pel, pixels, 6); 280 BI_MC(pel, pixels, 8); 281 BI_MC(pel, pixels, 12); 282 BI_MC(pel, pixels, 16); 283 BI_MC(pel, pixels, 24); 284 BI_MC(pel, pixels, 32); 285 BI_MC(pel, pixels, 48); 286 BI_MC(pel, pixels, 64); 287 288 BI_MC(qpel, h, 4); 289 BI_MC(qpel, h, 8); 290 BI_MC(qpel, h, 12); 291 BI_MC(qpel, h, 16); 292 BI_MC(qpel, h, 24); 293 BI_MC(qpel, h, 32); 294 BI_MC(qpel, h, 48); 295 BI_MC(qpel, h, 64); 296 297 BI_MC(qpel, v, 4); 298 BI_MC(qpel, v, 8); 299 BI_MC(qpel, v, 12); 300 BI_MC(qpel, v, 16); 301 BI_MC(qpel, v, 24); 302 BI_MC(qpel, v, 32); 303 BI_MC(qpel, v, 48); 304 BI_MC(qpel, v, 64); 305 306 BI_MC(qpel, hv, 4); 307 BI_MC(qpel, hv, 8); 308 BI_MC(qpel, hv, 12); 309 BI_MC(qpel, hv, 16); 310 BI_MC(qpel, hv, 24); 311 BI_MC(qpel, hv, 32); 312 BI_MC(qpel, hv, 48); 313 BI_MC(qpel, hv, 64); 314 315 BI_MC(epel, h, 4); 316 BI_MC(epel, h, 6); 317 BI_MC(epel, h, 8); 318 BI_MC(epel, h, 12); 319 BI_MC(epel, h, 16); 320 BI_MC(epel, h, 24); 321 BI_MC(epel, h, 32); 322 BI_MC(epel, h, 48); 323 BI_MC(epel, h, 64); 324 325 BI_MC(epel, v, 4); 326 BI_MC(epel, v, 6); 327 BI_MC(epel, v, 8); 328 BI_MC(epel, v, 12); 329 BI_MC(epel, v, 16); 330 BI_MC(epel, v, 24); 331 BI_MC(epel, v, 32); 332 BI_MC(epel, v, 48); 333 BI_MC(epel, v, 64); 334 335 BI_MC(epel, hv, 4); 336 BI_MC(epel, hv, 6); 337 BI_MC(epel, hv, 8); 338 BI_MC(epel, hv, 12); 339 BI_MC(epel, hv, 16); 340 BI_MC(epel, hv, 24); 341 BI_MC(epel, hv, 32); 342 BI_MC(epel, hv, 48); 343 BI_MC(epel, hv, 64); 344 345 #undef BI_MC 346 347 #define BI_W_MC(PEL, DIR, WIDTH) \ 348 void ff_hevc_put_hevc_bi_w_##PEL##_##DIR##WIDTH##_8_msa(uint8_t *dst, \ 349 ptrdiff_t \ 350 dst_stride, \ 351 uint8_t *src, \ 352 ptrdiff_t \ 353 src_stride, \ 354 int16_t *src_16bit, \ 355 int height, \ 356 int denom, \ 357 int weight0, \ 358 int weight1, \ 359 int offset0, \ 360 int offset1, \ 361 intptr_t mx, \ 362 intptr_t my, \ 363 int width) 364 365 BI_W_MC(pel, pixels, 4); 366 BI_W_MC(pel, pixels, 6); 367 BI_W_MC(pel, pixels, 8); 368 BI_W_MC(pel, pixels, 12); 369 BI_W_MC(pel, pixels, 16); 370 BI_W_MC(pel, pixels, 24); 371 BI_W_MC(pel, pixels, 32); 372 BI_W_MC(pel, pixels, 48); 373 BI_W_MC(pel, pixels, 64); 374 375 BI_W_MC(qpel, h, 4); 376 BI_W_MC(qpel, h, 8); 377 BI_W_MC(qpel, h, 12); 378 BI_W_MC(qpel, h, 16); 379 BI_W_MC(qpel, h, 24); 380 BI_W_MC(qpel, h, 32); 381 BI_W_MC(qpel, h, 48); 382 BI_W_MC(qpel, h, 64); 383 384 BI_W_MC(qpel, v, 4); 385 BI_W_MC(qpel, v, 8); 386 BI_W_MC(qpel, v, 12); 387 BI_W_MC(qpel, v, 16); 388 BI_W_MC(qpel, v, 24); 389 BI_W_MC(qpel, v, 32); 390 BI_W_MC(qpel, v, 48); 391 BI_W_MC(qpel, v, 64); 392 393 BI_W_MC(qpel, hv, 4); 394 BI_W_MC(qpel, hv, 8); 395 BI_W_MC(qpel, hv, 12); 396 BI_W_MC(qpel, hv, 16); 397 BI_W_MC(qpel, hv, 24); 398 BI_W_MC(qpel, hv, 32); 399 BI_W_MC(qpel, hv, 48); 400 BI_W_MC(qpel, hv, 64); 401 402 BI_W_MC(epel, h, 4); 403 BI_W_MC(epel, h, 6); 404 BI_W_MC(epel, h, 8); 405 BI_W_MC(epel, h, 12); 406 BI_W_MC(epel, h, 16); 407 BI_W_MC(epel, h, 24); 408 BI_W_MC(epel, h, 32); 409 BI_W_MC(epel, h, 48); 410 BI_W_MC(epel, h, 64); 411 412 BI_W_MC(epel, v, 4); 413 BI_W_MC(epel, v, 6); 414 BI_W_MC(epel, v, 8); 415 BI_W_MC(epel, v, 12); 416 BI_W_MC(epel, v, 16); 417 BI_W_MC(epel, v, 24); 418 BI_W_MC(epel, v, 32); 419 BI_W_MC(epel, v, 48); 420 BI_W_MC(epel, v, 64); 421 422 BI_W_MC(epel, hv, 4); 423 BI_W_MC(epel, hv, 6); 424 BI_W_MC(epel, hv, 8); 425 BI_W_MC(epel, hv, 12); 426 BI_W_MC(epel, hv, 16); 427 BI_W_MC(epel, hv, 24); 428 BI_W_MC(epel, hv, 32); 429 BI_W_MC(epel, hv, 48); 430 BI_W_MC(epel, hv, 64); 431 432 #undef BI_W_MC 433 434 void ff_hevc_loop_filter_luma_h_8_msa(uint8_t *src, 435 ptrdiff_t src_stride, 436 int32_t beta, int32_t *tc, 437 uint8_t *no_p, uint8_t *no_q); 438 439 void ff_hevc_loop_filter_luma_v_8_msa(uint8_t *src, 440 ptrdiff_t src_stride, 441 int32_t beta, int32_t *tc, 442 uint8_t *no_p, uint8_t *no_q); 443 444 void ff_hevc_loop_filter_chroma_h_8_msa(uint8_t *src, 445 ptrdiff_t src_stride, 446 int32_t *tc, uint8_t *no_p, 447 uint8_t *no_q); 448 449 void ff_hevc_loop_filter_chroma_v_8_msa(uint8_t *src, 450 ptrdiff_t src_stride, 451 int32_t *tc, uint8_t *no_p, 452 uint8_t *no_q); 453 454 void ff_hevc_sao_band_filter_0_8_msa(uint8_t *dst, uint8_t *src, 455 ptrdiff_t stride_dst, ptrdiff_t stride_src, 456 int16_t *sao_offset_val, int sao_left_class, 457 int width, int height); 458 459 void ff_hevc_sao_edge_filter_8_msa(uint8_t *dst, uint8_t *src, 460 ptrdiff_t stride_dst, 461 int16_t *sao_offset_val, 462 int eo, int width, int height); 463 464 void ff_hevc_idct_4x4_msa(int16_t *coeffs, int col_limit); 465 void ff_hevc_idct_8x8_msa(int16_t *coeffs, int col_limit); 466 void ff_hevc_idct_16x16_msa(int16_t *coeffs, int col_limit); 467 void ff_hevc_idct_32x32_msa(int16_t *coeffs, int col_limit); 468 void ff_hevc_idct_dc_4x4_msa(int16_t *coeffs); 469 void ff_hevc_idct_dc_8x8_msa(int16_t *coeffs); 470 void ff_hevc_idct_dc_16x16_msa(int16_t *coeffs); 471 void ff_hevc_idct_dc_32x32_msa(int16_t *coeffs); 472 void ff_hevc_addblk_4x4_msa(uint8_t *dst, int16_t *pi16Coeffs, 473 ptrdiff_t stride); 474 void ff_hevc_addblk_8x8_msa(uint8_t *dst, int16_t *pi16Coeffs, 475 ptrdiff_t stride); 476 void ff_hevc_addblk_16x16_msa(uint8_t *dst, int16_t *pi16Coeffs, 477 ptrdiff_t stride); 478 void ff_hevc_addblk_32x32_msa(uint8_t *dst, int16_t *pi16Coeffs, 479 ptrdiff_t stride); 480 void ff_hevc_idct_luma_4x4_msa(int16_t *pi16Coeffs); 481 482 /* Loongson optimization */ 483 #define L_MC(PEL, DIR, WIDTH, TYPE) \ 484 void ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_##TYPE(int16_t *dst, \ 485 uint8_t *src, \ 486 ptrdiff_t src_stride, \ 487 int height, \ 488 intptr_t mx, \ 489 intptr_t my, \ 490 int width) 491 L_MC(qpel, h, 4, mmi); 492 L_MC(qpel, h, 8, mmi); 493 L_MC(qpel, h, 12, mmi); 494 L_MC(qpel, h, 16, mmi); 495 L_MC(qpel, h, 24, mmi); 496 L_MC(qpel, h, 32, mmi); 497 L_MC(qpel, h, 48, mmi); 498 L_MC(qpel, h, 64, mmi); 499 500 L_MC(qpel, hv, 4, mmi); 501 L_MC(qpel, hv, 8, mmi); 502 L_MC(qpel, hv, 12, mmi); 503 L_MC(qpel, hv, 16, mmi); 504 L_MC(qpel, hv, 24, mmi); 505 L_MC(qpel, hv, 32, mmi); 506 L_MC(qpel, hv, 48, mmi); 507 L_MC(qpel, hv, 64, mmi); 508 509 #define L_BI_MC(PEL, DIR, WIDTH, TYPE) \ 510 void ff_hevc_put_hevc_##PEL##_bi_##DIR##WIDTH##_8_##TYPE(uint8_t *dst, \ 511 ptrdiff_t dst_stride, \ 512 uint8_t *src, \ 513 ptrdiff_t src_stride, \ 514 int16_t *src2, \ 515 int height, \ 516 intptr_t mx, \ 517 intptr_t my, \ 518 int width) 519 520 L_BI_MC(pel, pixels, 8, mmi); 521 L_BI_MC(pel, pixels, 16, mmi); 522 L_BI_MC(pel, pixels, 24, mmi); 523 L_BI_MC(pel, pixels, 32, mmi); 524 L_BI_MC(pel, pixels, 48, mmi); 525 L_BI_MC(pel, pixels, 64, mmi); 526 527 L_BI_MC(qpel, hv, 4, mmi); 528 L_BI_MC(qpel, hv, 8, mmi); 529 L_BI_MC(qpel, hv, 12, mmi); 530 L_BI_MC(qpel, hv, 16, mmi); 531 L_BI_MC(qpel, hv, 24, mmi); 532 L_BI_MC(qpel, hv, 32, mmi); 533 L_BI_MC(qpel, hv, 48, mmi); 534 L_BI_MC(qpel, hv, 64, mmi); 535 536 L_BI_MC(qpel, h, 4, mmi); 537 L_BI_MC(qpel, h, 8, mmi); 538 L_BI_MC(qpel, h, 12, mmi); 539 L_BI_MC(qpel, h, 16, mmi); 540 L_BI_MC(qpel, h, 24, mmi); 541 L_BI_MC(qpel, h, 32, mmi); 542 L_BI_MC(qpel, h, 48, mmi); 543 L_BI_MC(qpel, h, 64, mmi); 544 545 L_BI_MC(epel, hv, 4, mmi); 546 L_BI_MC(epel, hv, 8, mmi); 547 L_BI_MC(epel, hv, 12, mmi); 548 L_BI_MC(epel, hv, 16, mmi); 549 L_BI_MC(epel, hv, 24, mmi); 550 L_BI_MC(epel, hv, 32, mmi); 551 #undef L_BI_MC 552 553 #define L_UNI_MC(PEL, DIR, WIDTH, TYPE) \ 554 void ff_hevc_put_hevc_##PEL##_uni_##DIR##WIDTH##_8_##TYPE(uint8_t *dst, \ 555 ptrdiff_t dst_stride, \ 556 uint8_t *src, \ 557 ptrdiff_t src_stride, \ 558 int height, \ 559 intptr_t mx, \ 560 intptr_t my, \ 561 int width) 562 563 L_UNI_MC(qpel, hv, 4, mmi); 564 L_UNI_MC(qpel, hv, 8, mmi); 565 L_UNI_MC(qpel, hv, 12, mmi); 566 L_UNI_MC(qpel, hv, 16, mmi); 567 L_UNI_MC(qpel, hv, 24, mmi); 568 L_UNI_MC(qpel, hv, 32, mmi); 569 L_UNI_MC(qpel, hv, 48, mmi); 570 L_UNI_MC(qpel, hv, 64, mmi); 571 #undef L_UNI_MC 572 573 #endif // #ifndef AVCODEC_MIPS_HEVCDSP_MIPS_H 574