1 /************************************************************************** 2 * 3 * Copyright 2010 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20 * USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * The above copyright notice and this permission notice (including the 23 * next paragraph) shall be included in all copies or substantial portions 24 * of the Software. 25 * 26 **************************************************************************/ 27 28 29 /** 30 * @file 31 * YUV and RGB subsampled formats conversion. 32 * 33 * @author Jose Fonseca <jfonseca (at) vmware.com> 34 */ 35 36 37 #include "util/u_format_yuv.h" 38 39 40 void 41 util_format_r8g8_b8g8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 42 const uint8_t *src_row, unsigned src_stride, 43 unsigned width, unsigned height) 44 { 45 unsigned x, y; 46 47 for (y = 0; y < height; y += 1) { 48 float *dst = dst_row; 49 const uint32_t *src = (const uint32_t *)src_row; 50 uint32_t value; 51 float r, g0, g1, b; 52 53 for (x = 0; x + 1 < width; x += 2) { 54 value = *src++; 55 56 #ifdef PIPE_ARCH_BIG_ENDIAN 57 value = util_bswap32(value); 58 #endif 59 60 r = ubyte_to_float((value >> 0) & 0xff); 61 g0 = ubyte_to_float((value >> 8) & 0xff); 62 b = ubyte_to_float((value >> 16) & 0xff); 63 g1 = ubyte_to_float((value >> 24) & 0xff); 64 65 dst[0] = r; /* r */ 66 dst[1] = g0; /* g */ 67 dst[2] = b; /* b */ 68 dst[3] = 1.0f; /* a */ 69 dst += 4; 70 71 dst[0] = r; /* r */ 72 dst[1] = g1; /* g */ 73 dst[2] = b; /* b */ 74 dst[3] = 1.0f; /* a */ 75 dst += 4; 76 } 77 78 if (x < width) { 79 value = *src; 80 81 #ifdef PIPE_ARCH_BIG_ENDIAN 82 value = util_bswap32(value); 83 #endif 84 85 r = ubyte_to_float((value >> 0) & 0xff); 86 g0 = ubyte_to_float((value >> 8) & 0xff); 87 b = ubyte_to_float((value >> 16) & 0xff); 88 g1 = ubyte_to_float((value >> 24) & 0xff); 89 90 dst[0] = r; /* r */ 91 dst[1] = g0; /* g */ 92 dst[2] = b; /* b */ 93 dst[3] = 1.0f; /* a */ 94 } 95 96 src_row += src_stride/sizeof(*src_row); 97 dst_row += dst_stride/sizeof(*dst_row); 98 } 99 } 100 101 102 void 103 util_format_r8g8_b8g8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 104 const uint8_t *src_row, unsigned src_stride, 105 unsigned width, unsigned height) 106 { 107 unsigned x, y; 108 109 for (y = 0; y < height; y += 1) { 110 uint8_t *dst = dst_row; 111 const uint32_t *src = (const uint32_t *)src_row; 112 uint32_t value; 113 uint8_t r, g0, g1, b; 114 115 for (x = 0; x + 1 < width; x += 2) { 116 value = *src++; 117 118 #ifdef PIPE_ARCH_BIG_ENDIAN 119 value = util_bswap32(value); 120 #endif 121 122 r = (value >> 0) & 0xff; 123 g0 = (value >> 8) & 0xff; 124 b = (value >> 16) & 0xff; 125 g1 = (value >> 24) & 0xff; 126 127 dst[0] = r; /* r */ 128 dst[1] = g0; /* g */ 129 dst[2] = b; /* b */ 130 dst[3] = 0xff; /* a */ 131 dst += 4; 132 133 dst[0] = r; /* r */ 134 dst[1] = g1; /* g */ 135 dst[2] = b; /* b */ 136 dst[3] = 0xff; /* a */ 137 dst += 4; 138 } 139 140 if (x < width) { 141 value = *src; 142 143 #ifdef PIPE_ARCH_BIG_ENDIAN 144 value = util_bswap32(value); 145 #endif 146 147 r = (value >> 0) & 0xff; 148 g0 = (value >> 8) & 0xff; 149 b = (value >> 16) & 0xff; 150 g1 = (value >> 24) & 0xff; 151 152 dst[0] = r; /* r */ 153 dst[1] = g0; /* g */ 154 dst[2] = b; /* b */ 155 dst[3] = 0xff; /* a */ 156 } 157 158 src_row += src_stride/sizeof(*src_row); 159 dst_row += dst_stride/sizeof(*dst_row); 160 } 161 } 162 163 164 void 165 util_format_r8g8_b8g8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 166 const float *src_row, unsigned src_stride, 167 unsigned width, unsigned height) 168 { 169 unsigned x, y; 170 171 for (y = 0; y < height; y += 1) { 172 const float *src = src_row; 173 uint32_t *dst = (uint32_t *)dst_row; 174 float r, g0, g1, b; 175 uint32_t value; 176 177 for (x = 0; x + 1 < width; x += 2) { 178 r = 0.5f*(src[0] + src[4]); 179 g0 = src[1]; 180 g1 = src[5]; 181 b = 0.5f*(src[2] + src[6]); 182 183 value = float_to_ubyte(r); 184 value |= float_to_ubyte(g0) << 8; 185 value |= float_to_ubyte(b) << 16; 186 value |= float_to_ubyte(g1) << 24; 187 188 #ifdef PIPE_ARCH_BIG_ENDIAN 189 value = util_bswap32(value); 190 #endif 191 192 *dst++ = value; 193 194 src += 8; 195 } 196 197 if (x < width) { 198 r = src[0]; 199 g0 = src[1]; 200 g1 = 0; 201 b = src[2]; 202 203 value = float_to_ubyte(r); 204 value |= float_to_ubyte(g0) << 8; 205 value |= float_to_ubyte(b) << 16; 206 value |= float_to_ubyte(g1) << 24; 207 208 #ifdef PIPE_ARCH_BIG_ENDIAN 209 value = util_bswap32(value); 210 #endif 211 212 *dst = value; 213 } 214 215 dst_row += dst_stride/sizeof(*dst_row); 216 src_row += src_stride/sizeof(*src_row); 217 } 218 } 219 220 221 void 222 util_format_r8g8_b8g8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 223 const uint8_t *src_row, unsigned src_stride, 224 unsigned width, unsigned height) 225 { 226 unsigned x, y; 227 228 for (y = 0; y < height; y += 1) { 229 const uint8_t *src = src_row; 230 uint32_t *dst = (uint32_t *)dst_row; 231 uint32_t r, g0, g1, b; 232 uint32_t value; 233 234 for (x = 0; x + 1 < width; x += 2) { 235 r = (src[0] + src[4] + 1) >> 1; 236 g0 = src[1]; 237 g1 = src[5]; 238 b = (src[2] + src[6] + 1) >> 1; 239 240 value = r; 241 value |= g0 << 8; 242 value |= b << 16; 243 value |= g1 << 24; 244 245 #ifdef PIPE_ARCH_BIG_ENDIAN 246 value = util_bswap32(value); 247 #endif 248 249 *dst++ = value; 250 251 src += 8; 252 } 253 254 if (x < width) { 255 r = src[0]; 256 g0 = src[1]; 257 g1 = 0; 258 b = src[2]; 259 260 value = r; 261 value |= g0 << 8; 262 value |= b << 16; 263 value |= g1 << 24; 264 265 #ifdef PIPE_ARCH_BIG_ENDIAN 266 value = util_bswap32(value); 267 #endif 268 269 *dst = value; 270 } 271 272 dst_row += dst_stride/sizeof(*dst_row); 273 src_row += src_stride/sizeof(*src_row); 274 } 275 } 276 277 278 void 279 util_format_r8g8_b8g8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 280 unsigned i, unsigned j) 281 { 282 assert(i < 2); 283 assert(j < 1); 284 285 dst[0] = ubyte_to_float(src[0]); /* r */ 286 dst[1] = ubyte_to_float(src[1 + 2*i]); /* g */ 287 dst[2] = ubyte_to_float(src[2]); /* b */ 288 dst[3] = 1.0f; /* a */ 289 } 290 291 292 void 293 util_format_g8r8_g8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 294 const uint8_t *src_row, unsigned src_stride, 295 unsigned width, unsigned height) 296 { 297 unsigned x, y; 298 299 for (y = 0; y < height; y += 1) { 300 float *dst = dst_row; 301 const uint32_t *src = (const uint32_t *)src_row; 302 uint32_t value; 303 float r, g0, g1, b; 304 305 for (x = 0; x + 1 < width; x += 2) { 306 value = *src++; 307 308 #ifdef PIPE_ARCH_BIG_ENDIAN 309 value = util_bswap32(value); 310 #endif 311 312 g0 = ubyte_to_float((value >> 0) & 0xff); 313 r = ubyte_to_float((value >> 8) & 0xff); 314 g1 = ubyte_to_float((value >> 16) & 0xff); 315 b = ubyte_to_float((value >> 24) & 0xff); 316 317 dst[0] = r; /* r */ 318 dst[1] = g0; /* g */ 319 dst[2] = b; /* b */ 320 dst[3] = 1.0f; /* a */ 321 dst += 4; 322 323 dst[0] = r; /* r */ 324 dst[1] = g1; /* g */ 325 dst[2] = b; /* b */ 326 dst[3] = 1.0f; /* a */ 327 dst += 4; 328 } 329 330 if (x < width) { 331 value = *src; 332 333 #ifdef PIPE_ARCH_BIG_ENDIAN 334 value = util_bswap32(value); 335 #endif 336 337 g0 = ubyte_to_float((value >> 0) & 0xff); 338 r = ubyte_to_float((value >> 8) & 0xff); 339 g1 = ubyte_to_float((value >> 16) & 0xff); 340 b = ubyte_to_float((value >> 24) & 0xff); 341 342 dst[0] = r; /* r */ 343 dst[1] = g0; /* g */ 344 dst[2] = b; /* b */ 345 dst[3] = 1.0f; /* a */ 346 } 347 348 src_row += src_stride/sizeof(*src_row); 349 dst_row += dst_stride/sizeof(*dst_row); 350 } 351 } 352 353 354 void 355 util_format_g8r8_g8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 356 const uint8_t *src_row, unsigned src_stride, 357 unsigned width, unsigned height) 358 { 359 unsigned x, y; 360 361 for (y = 0; y < height; y += 1) { 362 uint8_t *dst = dst_row; 363 const uint32_t *src = (const uint32_t *)src_row; 364 uint32_t value; 365 uint8_t r, g0, g1, b; 366 367 for (x = 0; x + 1 < width; x += 2) { 368 value = *src++; 369 370 #ifdef PIPE_ARCH_BIG_ENDIAN 371 value = util_bswap32(value); 372 #endif 373 374 g0 = (value >> 0) & 0xff; 375 r = (value >> 8) & 0xff; 376 g1 = (value >> 16) & 0xff; 377 b = (value >> 24) & 0xff; 378 379 dst[0] = r; /* r */ 380 dst[1] = g0; /* g */ 381 dst[2] = b; /* b */ 382 dst[3] = 0xff; /* a */ 383 dst += 4; 384 385 dst[0] = r; /* r */ 386 dst[1] = g1; /* g */ 387 dst[2] = b; /* b */ 388 dst[3] = 0xff; /* a */ 389 dst += 4; 390 } 391 392 if (x < width) { 393 value = *src; 394 395 #ifdef PIPE_ARCH_BIG_ENDIAN 396 value = util_bswap32(value); 397 #endif 398 399 g0 = (value >> 0) & 0xff; 400 r = (value >> 8) & 0xff; 401 g1 = (value >> 16) & 0xff; 402 b = (value >> 24) & 0xff; 403 404 dst[0] = r; /* r */ 405 dst[1] = g0; /* g */ 406 dst[2] = b; /* b */ 407 dst[3] = 0xff; /* a */ 408 } 409 410 src_row += src_stride/sizeof(*src_row); 411 dst_row += dst_stride/sizeof(*dst_row); 412 } 413 } 414 415 416 void 417 util_format_g8r8_g8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 418 const float *src_row, unsigned src_stride, 419 unsigned width, unsigned height) 420 { 421 unsigned x, y; 422 423 for (y = 0; y < height; y += 1) { 424 const float *src = src_row; 425 uint32_t *dst = (uint32_t *)dst_row; 426 float r, g0, g1, b; 427 uint32_t value; 428 429 for (x = 0; x + 1 < width; x += 2) { 430 r = 0.5f*(src[0] + src[4]); 431 g0 = src[1]; 432 g1 = src[5]; 433 b = 0.5f*(src[2] + src[6]); 434 435 value = float_to_ubyte(g0); 436 value |= float_to_ubyte(r) << 8; 437 value |= float_to_ubyte(g1) << 16; 438 value |= float_to_ubyte(b) << 24; 439 440 #ifdef PIPE_ARCH_BIG_ENDIAN 441 value = util_bswap32(value); 442 #endif 443 444 *dst++ = value; 445 446 src += 8; 447 } 448 449 if (x < width) { 450 r = src[0]; 451 g0 = src[1]; 452 g1 = 0; 453 b = src[2]; 454 455 value = float_to_ubyte(g0); 456 value |= float_to_ubyte(r) << 8; 457 value |= float_to_ubyte(g1) << 16; 458 value |= float_to_ubyte(b) << 24; 459 460 #ifdef PIPE_ARCH_BIG_ENDIAN 461 value = util_bswap32(value); 462 #endif 463 464 *dst = value; 465 } 466 467 dst_row += dst_stride/sizeof(*dst_row); 468 src_row += src_stride/sizeof(*src_row); 469 } 470 } 471 472 473 void 474 util_format_g8r8_g8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 475 const uint8_t *src_row, unsigned src_stride, 476 unsigned width, unsigned height) 477 { 478 unsigned x, y; 479 480 for (y = 0; y < height; y += 1) { 481 const uint8_t *src = src_row; 482 uint32_t *dst = (uint32_t *)dst_row; 483 uint32_t r, g0, g1, b; 484 uint32_t value; 485 486 for (x = 0; x + 1 < width; x += 2) { 487 r = (src[0] + src[4] + 1) >> 1; 488 g0 = src[1]; 489 g1 = src[5]; 490 b = (src[2] + src[6] + 1) >> 1; 491 492 value = g0; 493 value |= r << 8; 494 value |= g1 << 16; 495 value |= b << 24; 496 497 #ifdef PIPE_ARCH_BIG_ENDIAN 498 value = util_bswap32(value); 499 #endif 500 501 *dst++ = value; 502 503 src += 8; 504 } 505 506 if (x < width) { 507 r = src[0]; 508 g0 = src[1]; 509 g1 = 0; 510 b = src[2]; 511 512 value = g0; 513 value |= r << 8; 514 value |= g1 << 16; 515 value |= b << 24; 516 517 #ifdef PIPE_ARCH_BIG_ENDIAN 518 value = util_bswap32(value); 519 #endif 520 521 *dst = value; 522 } 523 524 dst_row += dst_stride/sizeof(*dst_row); 525 src_row += src_stride/sizeof(*src_row); 526 } 527 } 528 529 530 void 531 util_format_g8r8_g8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 532 unsigned i, unsigned j) 533 { 534 assert(i < 2); 535 assert(j < 1); 536 537 dst[0] = ubyte_to_float(src[1]); /* r */ 538 dst[1] = ubyte_to_float(src[0 + 2*i]); /* g */ 539 dst[2] = ubyte_to_float(src[3]); /* b */ 540 dst[3] = 1.0f; /* a */ 541 } 542 543 544 void 545 util_format_uyvy_unpack_rgba_float(float *dst_row, unsigned dst_stride, 546 const uint8_t *src_row, unsigned src_stride, 547 unsigned width, unsigned height) 548 { 549 unsigned x, y; 550 551 for (y = 0; y < height; y += 1) { 552 float *dst = dst_row; 553 const uint32_t *src = (const uint32_t *)src_row; 554 uint32_t value; 555 uint8_t y0, y1, u, v; 556 557 for (x = 0; x + 1 < width; x += 2) { 558 value = *src++; 559 560 #ifdef PIPE_ARCH_BIG_ENDIAN 561 value = util_bswap32(value); 562 #endif 563 564 u = (value >> 0) & 0xff; 565 y0 = (value >> 8) & 0xff; 566 v = (value >> 16) & 0xff; 567 y1 = (value >> 24) & 0xff; 568 569 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 570 dst[3] = 1.0f; /* a */ 571 dst += 4; 572 573 util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); 574 dst[3] = 1.0f; /* a */ 575 dst += 4; 576 } 577 578 if (x < width) { 579 value = *src; 580 581 #ifdef PIPE_ARCH_BIG_ENDIAN 582 value = util_bswap32(value); 583 #endif 584 585 u = (value >> 0) & 0xff; 586 y0 = (value >> 8) & 0xff; 587 v = (value >> 16) & 0xff; 588 y1 = (value >> 24) & 0xff; 589 590 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 591 dst[3] = 1.0f; /* a */ 592 } 593 594 src_row += src_stride/sizeof(*src_row); 595 dst_row += dst_stride/sizeof(*dst_row); 596 } 597 } 598 599 600 void 601 util_format_uyvy_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 602 const uint8_t *src_row, unsigned src_stride, 603 unsigned width, unsigned height) 604 { 605 unsigned x, y; 606 607 for (y = 0; y < height; y += 1) { 608 uint8_t *dst = dst_row; 609 const uint32_t *src = (const uint32_t *)src_row; 610 uint32_t value; 611 uint8_t y0, y1, u, v; 612 613 for (x = 0; x + 1 < width; x += 2) { 614 value = *src++; 615 616 #ifdef PIPE_ARCH_BIG_ENDIAN 617 value = util_bswap32(value); 618 #endif 619 620 u = (value >> 0) & 0xff; 621 y0 = (value >> 8) & 0xff; 622 v = (value >> 16) & 0xff; 623 y1 = (value >> 24) & 0xff; 624 625 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 626 dst[3] = 0xff; /* a */ 627 dst += 4; 628 629 util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); 630 dst[3] = 0xff; /* a */ 631 dst += 4; 632 } 633 634 if (x < width) { 635 value = *src; 636 637 #ifdef PIPE_ARCH_BIG_ENDIAN 638 value = util_bswap32(value); 639 #endif 640 641 u = (value >> 0) & 0xff; 642 y0 = (value >> 8) & 0xff; 643 v = (value >> 16) & 0xff; 644 y1 = (value >> 24) & 0xff; 645 646 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 647 dst[3] = 0xff; /* a */ 648 } 649 650 src_row += src_stride/sizeof(*src_row); 651 dst_row += dst_stride/sizeof(*dst_row); 652 } 653 } 654 655 656 void 657 util_format_uyvy_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 658 const float *src_row, unsigned src_stride, 659 unsigned width, unsigned height) 660 { 661 unsigned x, y; 662 663 for (y = 0; y < height; y += 1) { 664 const float *src = src_row; 665 uint32_t *dst = (uint32_t *)dst_row; 666 uint8_t y0, y1, u, v; 667 uint32_t value; 668 669 for (x = 0; x + 1 < width; x += 2) { 670 uint8_t y0, y1, u0, u1, v0, v1, u, v; 671 672 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 673 &y0, &u0, &v0); 674 util_format_rgb_float_to_yuv(src[4], src[5], src[6], 675 &y1, &u1, &v1); 676 677 u = (u0 + u1 + 1) >> 1; 678 v = (v0 + v1 + 1) >> 1; 679 680 value = u; 681 value |= y0 << 8; 682 value |= v << 16; 683 value |= y1 << 24; 684 685 #ifdef PIPE_ARCH_BIG_ENDIAN 686 value = util_bswap32(value); 687 #endif 688 689 *dst++ = value; 690 691 src += 8; 692 } 693 694 if (x < width) { 695 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 696 &y0, &u, &v); 697 y1 = 0; 698 699 value = u; 700 value |= y0 << 8; 701 value |= v << 16; 702 value |= y1 << 24; 703 704 #ifdef PIPE_ARCH_BIG_ENDIAN 705 value = util_bswap32(value); 706 #endif 707 708 *dst = value; 709 } 710 711 dst_row += dst_stride/sizeof(*dst_row); 712 src_row += src_stride/sizeof(*src_row); 713 } 714 } 715 716 717 void 718 util_format_uyvy_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 719 const uint8_t *src_row, unsigned src_stride, 720 unsigned width, unsigned height) 721 { 722 unsigned x, y; 723 724 for (y = 0; y < height; y += 1) { 725 const uint8_t *src = src_row; 726 uint32_t *dst = (uint32_t *)dst_row; 727 uint8_t y0, y1, u, v; 728 uint32_t value; 729 730 for (x = 0; x + 1 < width; x += 2) { 731 uint8_t y0, y1, u0, u1, v0, v1, u, v; 732 733 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 734 &y0, &u0, &v0); 735 util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], 736 &y1, &u1, &v1); 737 738 u = (u0 + u1 + 1) >> 1; 739 v = (v0 + v1 + 1) >> 1; 740 741 value = u; 742 value |= y0 << 8; 743 value |= v << 16; 744 value |= y1 << 24; 745 746 #ifdef PIPE_ARCH_BIG_ENDIAN 747 value = util_bswap32(value); 748 #endif 749 750 *dst++ = value; 751 752 src += 8; 753 } 754 755 if (x < width) { 756 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 757 &y0, &u, &v); 758 y1 = 0; 759 760 value = u; 761 value |= y0 << 8; 762 value |= v << 16; 763 value |= y1 << 24; 764 765 #ifdef PIPE_ARCH_BIG_ENDIAN 766 value = util_bswap32(value); 767 #endif 768 769 *dst = value; 770 } 771 772 dst_row += dst_stride/sizeof(*dst_row); 773 src_row += src_stride/sizeof(*src_row); 774 } 775 } 776 777 778 void 779 util_format_uyvy_fetch_rgba_float(float *dst, const uint8_t *src, 780 unsigned i, unsigned j) 781 { 782 uint8_t y, u, v; 783 784 assert(i < 2); 785 assert(j < 1); 786 787 y = src[1 + i*2]; 788 u = src[0]; 789 v = src[2]; 790 791 util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); 792 793 dst[3] = 1.0f; 794 } 795 796 797 void 798 util_format_yuyv_unpack_rgba_float(float *dst_row, unsigned dst_stride, 799 const uint8_t *src_row, unsigned src_stride, 800 unsigned width, unsigned height) 801 { 802 unsigned x, y; 803 804 for (y = 0; y < height; y += 1) { 805 float *dst = dst_row; 806 const uint32_t *src = (const uint32_t *)src_row; 807 uint32_t value; 808 uint8_t y0, y1, u, v; 809 810 for (x = 0; x + 1 < width; x += 2) { 811 value = *src++; 812 813 #ifdef PIPE_ARCH_BIG_ENDIAN 814 value = util_bswap32(value); 815 #endif 816 817 y0 = (value >> 0) & 0xff; 818 u = (value >> 8) & 0xff; 819 y1 = (value >> 16) & 0xff; 820 v = (value >> 24) & 0xff; 821 822 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 823 dst[3] = 1.0f; /* a */ 824 dst += 4; 825 826 util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); 827 dst[3] = 1.0f; /* a */ 828 dst += 4; 829 } 830 831 if (x < width) { 832 value = *src; 833 834 #ifdef PIPE_ARCH_BIG_ENDIAN 835 value = util_bswap32(value); 836 #endif 837 838 y0 = (value >> 0) & 0xff; 839 u = (value >> 8) & 0xff; 840 y1 = (value >> 16) & 0xff; 841 v = (value >> 24) & 0xff; 842 843 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 844 dst[3] = 1.0f; /* a */ 845 } 846 847 src_row += src_stride/sizeof(*src_row); 848 dst_row += dst_stride/sizeof(*dst_row); 849 } 850 } 851 852 853 void 854 util_format_yuyv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 855 const uint8_t *src_row, unsigned src_stride, 856 unsigned width, unsigned height) 857 { 858 unsigned x, y; 859 860 for (y = 0; y < height; y += 1) { 861 uint8_t *dst = dst_row; 862 const uint32_t *src = (const uint32_t *)src_row; 863 uint32_t value; 864 uint8_t y0, y1, u, v; 865 866 for (x = 0; x + 1 < width; x += 2) { 867 value = *src++; 868 869 #ifdef PIPE_ARCH_BIG_ENDIAN 870 value = util_bswap32(value); 871 #endif 872 873 y0 = (value >> 0) & 0xff; 874 u = (value >> 8) & 0xff; 875 y1 = (value >> 16) & 0xff; 876 v = (value >> 24) & 0xff; 877 878 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 879 dst[3] = 0xff; /* a */ 880 dst += 4; 881 882 util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); 883 dst[3] = 0xff; /* a */ 884 dst += 4; 885 } 886 887 if (x < width) { 888 value = *src; 889 890 #ifdef PIPE_ARCH_BIG_ENDIAN 891 value = util_bswap32(value); 892 #endif 893 894 y0 = (value >> 0) & 0xff; 895 u = (value >> 8) & 0xff; 896 y1 = (value >> 16) & 0xff; 897 v = (value >> 24) & 0xff; 898 899 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 900 dst[3] = 0xff; /* a */ 901 } 902 903 src_row += src_stride/sizeof(*src_row); 904 dst_row += dst_stride/sizeof(*dst_row); 905 } 906 } 907 908 909 void 910 util_format_yuyv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 911 const float *src_row, unsigned src_stride, 912 unsigned width, unsigned height) 913 { 914 unsigned x, y; 915 916 for (y = 0; y < height; y += 1) { 917 const float *src = src_row; 918 uint32_t *dst = (uint32_t *)dst_row; 919 uint8_t y0, y1, u, v; 920 uint32_t value; 921 922 for (x = 0; x + 1 < width; x += 2) { 923 uint8_t y0, y1, u0, u1, v0, v1, u, v; 924 925 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 926 &y0, &u0, &v0); 927 util_format_rgb_float_to_yuv(src[4], src[5], src[6], 928 &y1, &u1, &v1); 929 930 u = (u0 + u1 + 1) >> 1; 931 v = (v0 + v1 + 1) >> 1; 932 933 value = y0; 934 value |= u << 8; 935 value |= y1 << 16; 936 value |= v << 24; 937 938 #ifdef PIPE_ARCH_BIG_ENDIAN 939 value = util_bswap32(value); 940 #endif 941 942 *dst++ = value; 943 944 src += 8; 945 } 946 947 if (x < width) { 948 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 949 &y0, &u, &v); 950 y1 = 0; 951 952 value = y0; 953 value |= u << 8; 954 value |= y1 << 16; 955 value |= v << 24; 956 957 #ifdef PIPE_ARCH_BIG_ENDIAN 958 value = util_bswap32(value); 959 #endif 960 961 *dst = value; 962 } 963 964 dst_row += dst_stride/sizeof(*dst_row); 965 src_row += src_stride/sizeof(*src_row); 966 } 967 } 968 969 970 void 971 util_format_yuyv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 972 const uint8_t *src_row, unsigned src_stride, 973 unsigned width, unsigned height) 974 { 975 unsigned x, y; 976 977 for (y = 0; y < height; y += 1) { 978 const uint8_t *src = src_row; 979 uint32_t *dst = (uint32_t *)dst_row; 980 uint8_t y0, y1, u, v; 981 uint32_t value; 982 983 for (x = 0; x + 1 < width; x += 2) { 984 uint8_t y0, y1, u0, u1, v0, v1, u, v; 985 986 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 987 &y0, &u0, &v0); 988 util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], 989 &y1, &u1, &v1); 990 991 u = (u0 + u1 + 1) >> 1; 992 v = (v0 + v1 + 1) >> 1; 993 994 value = y0; 995 value |= u << 8; 996 value |= y1 << 16; 997 value |= v << 24; 998 999 #ifdef PIPE_ARCH_BIG_ENDIAN 1000 value = util_bswap32(value); 1001 #endif 1002 1003 *dst++ = value; 1004 1005 src += 8; 1006 } 1007 1008 if (x < width) { 1009 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 1010 &y0, &u, &v); 1011 y1 = 0; 1012 1013 value = y0; 1014 value |= u << 8; 1015 value |= y1 << 16; 1016 value |= v << 24; 1017 1018 #ifdef PIPE_ARCH_BIG_ENDIAN 1019 value = util_bswap32(value); 1020 #endif 1021 1022 *dst = value; 1023 } 1024 1025 dst_row += dst_stride/sizeof(*dst_row); 1026 src_row += src_stride/sizeof(*src_row); 1027 } 1028 } 1029 1030 1031 void 1032 util_format_yuyv_fetch_rgba_float(float *dst, const uint8_t *src, 1033 unsigned i, unsigned j) 1034 { 1035 uint8_t y, u, v; 1036 1037 assert(i < 2); 1038 assert(j < 1); 1039 1040 y = src[0 + i*2]; 1041 u = src[1]; 1042 v = src[3]; 1043 1044 util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); 1045 1046 dst[3] = 1.0f; 1047 } 1048 1049 /* XXX: Stubbed for now */ 1050 void 1051 util_format_yv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1052 const uint8_t *src_row, unsigned src_stride, 1053 unsigned width, unsigned height) {} 1054 void 1055 util_format_yv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1056 const uint8_t *src_row, unsigned src_stride, 1057 unsigned width, unsigned height) {} 1058 void 1059 util_format_yv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1060 const uint8_t *src_row, unsigned src_stride, 1061 unsigned width, unsigned height) {} 1062 void 1063 util_format_yv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1064 const float *src_row, unsigned src_stride, 1065 unsigned width, unsigned height) {} 1066 void 1067 util_format_yv12_fetch_rgba_float(float *dst, const uint8_t *src, 1068 unsigned i, unsigned j) {} 1069 void 1070 util_format_yv16_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1071 const uint8_t *src_row, unsigned src_stride, 1072 unsigned width, unsigned height) {} 1073 void 1074 util_format_yv16_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1075 const uint8_t *src_row, unsigned src_stride, 1076 unsigned width, unsigned height) {} 1077 void 1078 util_format_yv16_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1079 const uint8_t *src_row, unsigned src_stride, 1080 unsigned width, unsigned height) {} 1081 void 1082 util_format_yv16_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1083 const float *src_row, unsigned src_stride, 1084 unsigned width, unsigned height) {} 1085 void 1086 util_format_yv16_fetch_rgba_float(float *dst, const uint8_t *src, 1087 unsigned i, unsigned j) {} 1088 void 1089 util_format_iyuv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1090 const uint8_t *src_row, unsigned src_stride, 1091 unsigned width, unsigned height) {} 1092 void 1093 util_format_iyuv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1094 const uint8_t *src_row, unsigned src_stride, 1095 unsigned width, unsigned height) {} 1096 void 1097 util_format_iyuv_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1098 const uint8_t *src_row, unsigned src_stride, 1099 unsigned width, unsigned height) {} 1100 void 1101 util_format_iyuv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1102 const float *src_row, unsigned src_stride, 1103 unsigned width, unsigned height) {} 1104 void 1105 util_format_iyuv_fetch_rgba_float(float *dst, const uint8_t *src, 1106 unsigned i, unsigned j) {} 1107 void 1108 util_format_nv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1109 const uint8_t *src_row, unsigned src_stride, 1110 unsigned width, unsigned height) {} 1111 void 1112 util_format_nv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1113 const uint8_t *src_row, unsigned src_stride, 1114 unsigned width, unsigned height) {} 1115 void 1116 util_format_nv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1117 const uint8_t *src_row, unsigned src_stride, 1118 unsigned width, unsigned height) {} 1119 void 1120 util_format_nv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1121 const float *src_row, unsigned src_stride, 1122 unsigned width, unsigned height) {} 1123 void 1124 util_format_nv12_fetch_rgba_float(float *dst, const uint8_t *src, 1125 unsigned i, unsigned j) {} 1126 void 1127 util_format_nv21_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1128 const uint8_t *src_row, unsigned src_stride, 1129 unsigned width, unsigned height) {} 1130 void 1131 util_format_nv21_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1132 const uint8_t *src_row, unsigned src_stride, 1133 unsigned width, unsigned height) {} 1134 void 1135 util_format_nv21_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1136 const uint8_t *src_row, unsigned src_stride, 1137 unsigned width, unsigned height) {} 1138 void 1139 util_format_nv21_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1140 const float *src_row, unsigned src_stride, 1141 unsigned width, unsigned height) {} 1142 void 1143 util_format_nv21_fetch_rgba_float(float *dst, const uint8_t *src, 1144 unsigned i, unsigned j) {} 1145 1146 void 1147 util_format_r8g8_r8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1148 const uint8_t *src_row, unsigned src_stride, 1149 unsigned width, unsigned height) {} 1150 1151 void 1152 util_format_r8g8_r8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1153 const uint8_t *src_row, unsigned src_stride, 1154 unsigned width, unsigned height) {} 1155 1156 void 1157 util_format_r8g8_r8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1158 const float *src_row, unsigned src_stride, 1159 unsigned width, unsigned height) {} 1160 1161 void 1162 util_format_r8g8_r8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1163 const uint8_t *src_row, unsigned src_stride, 1164 unsigned width, unsigned height) {} 1165 1166 void 1167 util_format_r8g8_r8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 1168 unsigned i, unsigned j) {} 1169 1170 void 1171 util_format_g8r8_b8r8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1172 const uint8_t *src_row, unsigned src_stride, 1173 unsigned width, unsigned height) {} 1174 1175 void 1176 util_format_g8r8_b8r8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1177 const uint8_t *src_row, unsigned src_stride, 1178 unsigned width, unsigned height) {} 1179 1180 void 1181 util_format_g8r8_b8r8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1182 const float *src_row, unsigned src_stride, 1183 unsigned width, unsigned height) {} 1184 1185 void 1186 util_format_g8r8_b8r8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1187 const uint8_t *src_row, unsigned src_stride, 1188 unsigned width, unsigned height) {} 1189 1190 void 1191 util_format_g8r8_b8r8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 1192 unsigned i, unsigned j) {} 1193