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_debug.h" 38 #include "util/u_format_yuv.h" 39 40 41 void 42 util_format_r8g8_b8g8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 43 const uint8_t *src_row, unsigned src_stride, 44 unsigned width, unsigned height) 45 { 46 unsigned x, y; 47 48 for (y = 0; y < height; y += 1) { 49 float *dst = dst_row; 50 const uint32_t *src = (const uint32_t *)src_row; 51 uint32_t value; 52 float r, g0, g1, b; 53 54 for (x = 0; x + 1 < width; x += 2) { 55 value = util_cpu_to_le32(*src++); 56 57 r = ubyte_to_float((value >> 0) & 0xff); 58 g0 = ubyte_to_float((value >> 8) & 0xff); 59 b = ubyte_to_float((value >> 16) & 0xff); 60 g1 = ubyte_to_float((value >> 24) & 0xff); 61 62 dst[0] = r; /* r */ 63 dst[1] = g0; /* g */ 64 dst[2] = b; /* b */ 65 dst[3] = 1.0f; /* a */ 66 dst += 4; 67 68 dst[0] = r; /* r */ 69 dst[1] = g1; /* g */ 70 dst[2] = b; /* b */ 71 dst[3] = 1.0f; /* a */ 72 dst += 4; 73 } 74 75 if (x < width) { 76 value = util_cpu_to_le32(*src); 77 78 r = ubyte_to_float((value >> 0) & 0xff); 79 g0 = ubyte_to_float((value >> 8) & 0xff); 80 b = ubyte_to_float((value >> 16) & 0xff); 81 g1 = ubyte_to_float((value >> 24) & 0xff); 82 83 dst[0] = r; /* r */ 84 dst[1] = g0; /* g */ 85 dst[2] = b; /* b */ 86 dst[3] = 1.0f; /* a */ 87 } 88 89 src_row += src_stride/sizeof(*src_row); 90 dst_row += dst_stride/sizeof(*dst_row); 91 } 92 } 93 94 95 void 96 util_format_r8g8_b8g8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 97 const uint8_t *src_row, unsigned src_stride, 98 unsigned width, unsigned height) 99 { 100 unsigned x, y; 101 102 for (y = 0; y < height; y += 1) { 103 uint8_t *dst = dst_row; 104 const uint32_t *src = (const uint32_t *)src_row; 105 uint32_t value; 106 uint8_t r, g0, g1, b; 107 108 for (x = 0; x + 1 < width; x += 2) { 109 value = util_cpu_to_le32(*src++); 110 111 r = (value >> 0) & 0xff; 112 g0 = (value >> 8) & 0xff; 113 b = (value >> 16) & 0xff; 114 g1 = (value >> 24) & 0xff; 115 116 dst[0] = r; /* r */ 117 dst[1] = g0; /* g */ 118 dst[2] = b; /* b */ 119 dst[3] = 0xff; /* a */ 120 dst += 4; 121 122 dst[0] = r; /* r */ 123 dst[1] = g1; /* g */ 124 dst[2] = b; /* b */ 125 dst[3] = 0xff; /* a */ 126 dst += 4; 127 } 128 129 if (x < width) { 130 value = util_cpu_to_le32(*src); 131 132 r = (value >> 0) & 0xff; 133 g0 = (value >> 8) & 0xff; 134 b = (value >> 16) & 0xff; 135 g1 = (value >> 24) & 0xff; 136 137 dst[0] = r; /* r */ 138 dst[1] = g0; /* g */ 139 dst[2] = b; /* b */ 140 dst[3] = 0xff; /* a */ 141 } 142 143 src_row += src_stride/sizeof(*src_row); 144 dst_row += dst_stride/sizeof(*dst_row); 145 } 146 } 147 148 149 void 150 util_format_r8g8_b8g8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 151 const float *src_row, unsigned src_stride, 152 unsigned width, unsigned height) 153 { 154 unsigned x, y; 155 156 for (y = 0; y < height; y += 1) { 157 const float *src = src_row; 158 uint32_t *dst = (uint32_t *)dst_row; 159 float r, g0, g1, b; 160 uint32_t value; 161 162 for (x = 0; x + 1 < width; x += 2) { 163 r = 0.5f*(src[0] + src[4]); 164 g0 = src[1]; 165 g1 = src[5]; 166 b = 0.5f*(src[2] + src[6]); 167 168 value = float_to_ubyte(r); 169 value |= float_to_ubyte(g0) << 8; 170 value |= float_to_ubyte(b) << 16; 171 value |= float_to_ubyte(g1) << 24; 172 173 *dst++ = util_le32_to_cpu(value); 174 175 src += 8; 176 } 177 178 if (x < width) { 179 r = src[0]; 180 g0 = src[1]; 181 g1 = 0; 182 b = src[2]; 183 184 value = float_to_ubyte(r); 185 value |= float_to_ubyte(g0) << 8; 186 value |= float_to_ubyte(b) << 16; 187 value |= float_to_ubyte(g1) << 24; 188 189 *dst = util_le32_to_cpu(value); 190 } 191 192 dst_row += dst_stride/sizeof(*dst_row); 193 src_row += src_stride/sizeof(*src_row); 194 } 195 } 196 197 198 void 199 util_format_r8g8_b8g8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 200 const uint8_t *src_row, unsigned src_stride, 201 unsigned width, unsigned height) 202 { 203 unsigned x, y; 204 205 for (y = 0; y < height; y += 1) { 206 const uint8_t *src = src_row; 207 uint32_t *dst = (uint32_t *)dst_row; 208 uint32_t r, g0, g1, b; 209 uint32_t value; 210 211 for (x = 0; x + 1 < width; x += 2) { 212 r = (src[0] + src[4] + 1) >> 1; 213 g0 = src[1]; 214 g1 = src[5]; 215 b = (src[2] + src[6] + 1) >> 1; 216 217 value = r; 218 value |= g0 << 8; 219 value |= b << 16; 220 value |= g1 << 24; 221 222 *dst++ = util_le32_to_cpu(value); 223 224 src += 8; 225 } 226 227 if (x < width) { 228 r = src[0]; 229 g0 = src[1]; 230 g1 = 0; 231 b = src[2]; 232 233 value = r; 234 value |= g0 << 8; 235 value |= b << 16; 236 value |= g1 << 24; 237 238 *dst = util_le32_to_cpu(value); 239 } 240 241 dst_row += dst_stride/sizeof(*dst_row); 242 src_row += src_stride/sizeof(*src_row); 243 } 244 } 245 246 247 void 248 util_format_r8g8_b8g8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 249 unsigned i, unsigned j) 250 { 251 assert(i < 2); 252 assert(j < 1); 253 254 dst[0] = ubyte_to_float(src[0]); /* r */ 255 dst[1] = ubyte_to_float(src[1 + 2*i]); /* g */ 256 dst[2] = ubyte_to_float(src[2]); /* b */ 257 dst[3] = 1.0f; /* a */ 258 } 259 260 261 void 262 util_format_g8r8_g8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 263 const uint8_t *src_row, unsigned src_stride, 264 unsigned width, unsigned height) 265 { 266 unsigned x, y; 267 268 for (y = 0; y < height; y += 1) { 269 float *dst = dst_row; 270 const uint32_t *src = (const uint32_t *)src_row; 271 uint32_t value; 272 float r, g0, g1, b; 273 274 for (x = 0; x + 1 < width; x += 2) { 275 value = util_cpu_to_le32(*src++); 276 277 g0 = ubyte_to_float((value >> 0) & 0xff); 278 r = ubyte_to_float((value >> 8) & 0xff); 279 g1 = ubyte_to_float((value >> 16) & 0xff); 280 b = ubyte_to_float((value >> 24) & 0xff); 281 282 dst[0] = r; /* r */ 283 dst[1] = g0; /* g */ 284 dst[2] = b; /* b */ 285 dst[3] = 1.0f; /* a */ 286 dst += 4; 287 288 dst[0] = r; /* r */ 289 dst[1] = g1; /* g */ 290 dst[2] = b; /* b */ 291 dst[3] = 1.0f; /* a */ 292 dst += 4; 293 } 294 295 if (x < width) { 296 value = util_cpu_to_le32(*src); 297 298 g0 = ubyte_to_float((value >> 0) & 0xff); 299 r = ubyte_to_float((value >> 8) & 0xff); 300 g1 = ubyte_to_float((value >> 16) & 0xff); 301 b = ubyte_to_float((value >> 24) & 0xff); 302 303 dst[0] = r; /* r */ 304 dst[1] = g0; /* g */ 305 dst[2] = b; /* b */ 306 dst[3] = 1.0f; /* a */ 307 } 308 309 src_row += src_stride/sizeof(*src_row); 310 dst_row += dst_stride/sizeof(*dst_row); 311 } 312 } 313 314 315 void 316 util_format_g8r8_g8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 317 const uint8_t *src_row, unsigned src_stride, 318 unsigned width, unsigned height) 319 { 320 unsigned x, y; 321 322 for (y = 0; y < height; y += 1) { 323 uint8_t *dst = dst_row; 324 const uint32_t *src = (const uint32_t *)src_row; 325 uint32_t value; 326 uint8_t r, g0, g1, b; 327 328 for (x = 0; x + 1 < width; x += 2) { 329 value = util_cpu_to_le32(*src++); 330 331 g0 = (value >> 0) & 0xff; 332 r = (value >> 8) & 0xff; 333 g1 = (value >> 16) & 0xff; 334 b = (value >> 24) & 0xff; 335 336 dst[0] = r; /* r */ 337 dst[1] = g0; /* g */ 338 dst[2] = b; /* b */ 339 dst[3] = 0xff; /* a */ 340 dst += 4; 341 342 dst[0] = r; /* r */ 343 dst[1] = g1; /* g */ 344 dst[2] = b; /* b */ 345 dst[3] = 0xff; /* a */ 346 dst += 4; 347 } 348 349 if (x < width) { 350 value = util_cpu_to_le32(*src); 351 352 g0 = (value >> 0) & 0xff; 353 r = (value >> 8) & 0xff; 354 g1 = (value >> 16) & 0xff; 355 b = (value >> 24) & 0xff; 356 357 dst[0] = r; /* r */ 358 dst[1] = g0; /* g */ 359 dst[2] = b; /* b */ 360 dst[3] = 0xff; /* a */ 361 } 362 363 src_row += src_stride/sizeof(*src_row); 364 dst_row += dst_stride/sizeof(*dst_row); 365 } 366 } 367 368 369 void 370 util_format_g8r8_g8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 371 const float *src_row, unsigned src_stride, 372 unsigned width, unsigned height) 373 { 374 unsigned x, y; 375 376 for (y = 0; y < height; y += 1) { 377 const float *src = src_row; 378 uint32_t *dst = (uint32_t *)dst_row; 379 float r, g0, g1, b; 380 uint32_t value; 381 382 for (x = 0; x + 1 < width; x += 2) { 383 r = 0.5f*(src[0] + src[4]); 384 g0 = src[1]; 385 g1 = src[5]; 386 b = 0.5f*(src[2] + src[6]); 387 388 value = float_to_ubyte(g0); 389 value |= float_to_ubyte(r) << 8; 390 value |= float_to_ubyte(g1) << 16; 391 value |= float_to_ubyte(b) << 24; 392 393 *dst++ = util_le32_to_cpu(value); 394 395 src += 8; 396 } 397 398 if (x < width) { 399 r = src[0]; 400 g0 = src[1]; 401 g1 = 0; 402 b = src[2]; 403 404 value = float_to_ubyte(g0); 405 value |= float_to_ubyte(r) << 8; 406 value |= float_to_ubyte(g1) << 16; 407 value |= float_to_ubyte(b) << 24; 408 409 *dst = util_le32_to_cpu(value); 410 } 411 412 dst_row += dst_stride/sizeof(*dst_row); 413 src_row += src_stride/sizeof(*src_row); 414 } 415 } 416 417 418 void 419 util_format_g8r8_g8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 420 const uint8_t *src_row, unsigned src_stride, 421 unsigned width, unsigned height) 422 { 423 unsigned x, y; 424 425 for (y = 0; y < height; y += 1) { 426 const uint8_t *src = src_row; 427 uint32_t *dst = (uint32_t *)dst_row; 428 uint32_t r, g0, g1, b; 429 uint32_t value; 430 431 for (x = 0; x + 1 < width; x += 2) { 432 r = (src[0] + src[4] + 1) >> 1; 433 g0 = src[1]; 434 g1 = src[5]; 435 b = (src[2] + src[6] + 1) >> 1; 436 437 value = g0; 438 value |= r << 8; 439 value |= g1 << 16; 440 value |= b << 24; 441 442 *dst++ = util_le32_to_cpu(value); 443 444 src += 8; 445 } 446 447 if (x < width) { 448 r = src[0]; 449 g0 = src[1]; 450 g1 = 0; 451 b = src[2]; 452 453 value = g0; 454 value |= r << 8; 455 value |= g1 << 16; 456 value |= b << 24; 457 458 *dst = util_le32_to_cpu(value); 459 } 460 461 dst_row += dst_stride/sizeof(*dst_row); 462 src_row += src_stride/sizeof(*src_row); 463 } 464 } 465 466 467 void 468 util_format_g8r8_g8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 469 unsigned i, unsigned j) 470 { 471 assert(i < 2); 472 assert(j < 1); 473 474 dst[0] = ubyte_to_float(src[1]); /* r */ 475 dst[1] = ubyte_to_float(src[0 + 2*i]); /* g */ 476 dst[2] = ubyte_to_float(src[3]); /* b */ 477 dst[3] = 1.0f; /* a */ 478 } 479 480 481 void 482 util_format_uyvy_unpack_rgba_float(float *dst_row, unsigned dst_stride, 483 const uint8_t *src_row, unsigned src_stride, 484 unsigned width, unsigned height) 485 { 486 unsigned x, y; 487 488 for (y = 0; y < height; y += 1) { 489 float *dst = dst_row; 490 const uint32_t *src = (const uint32_t *)src_row; 491 uint32_t value; 492 uint8_t y0, y1, u, v; 493 494 for (x = 0; x + 1 < width; x += 2) { 495 value = util_cpu_to_le32(*src++); 496 497 u = (value >> 0) & 0xff; 498 y0 = (value >> 8) & 0xff; 499 v = (value >> 16) & 0xff; 500 y1 = (value >> 24) & 0xff; 501 502 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 503 dst[3] = 1.0f; /* a */ 504 dst += 4; 505 506 util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); 507 dst[3] = 1.0f; /* a */ 508 dst += 4; 509 } 510 511 if (x < width) { 512 value = util_cpu_to_le32(*src); 513 514 u = (value >> 0) & 0xff; 515 y0 = (value >> 8) & 0xff; 516 v = (value >> 16) & 0xff; 517 y1 = (value >> 24) & 0xff; 518 519 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 520 dst[3] = 1.0f; /* a */ 521 } 522 523 src_row += src_stride/sizeof(*src_row); 524 dst_row += dst_stride/sizeof(*dst_row); 525 } 526 } 527 528 529 void 530 util_format_uyvy_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 531 const uint8_t *src_row, unsigned src_stride, 532 unsigned width, unsigned height) 533 { 534 unsigned x, y; 535 536 for (y = 0; y < height; y += 1) { 537 uint8_t *dst = dst_row; 538 const uint32_t *src = (const uint32_t *)src_row; 539 uint32_t value; 540 uint8_t y0, y1, u, v; 541 542 for (x = 0; x + 1 < width; x += 2) { 543 value = util_cpu_to_le32(*src++); 544 545 u = (value >> 0) & 0xff; 546 y0 = (value >> 8) & 0xff; 547 v = (value >> 16) & 0xff; 548 y1 = (value >> 24) & 0xff; 549 550 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 551 dst[3] = 0xff; /* a */ 552 dst += 4; 553 554 util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); 555 dst[3] = 0xff; /* a */ 556 dst += 4; 557 } 558 559 if (x < width) { 560 value = util_cpu_to_le32(*src); 561 562 u = (value >> 0) & 0xff; 563 y0 = (value >> 8) & 0xff; 564 v = (value >> 16) & 0xff; 565 y1 = (value >> 24) & 0xff; 566 567 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 568 dst[3] = 0xff; /* a */ 569 } 570 571 src_row += src_stride/sizeof(*src_row); 572 dst_row += dst_stride/sizeof(*dst_row); 573 } 574 } 575 576 577 void 578 util_format_uyvy_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 579 const float *src_row, unsigned src_stride, 580 unsigned width, unsigned height) 581 { 582 unsigned x, y; 583 584 for (y = 0; y < height; y += 1) { 585 const float *src = src_row; 586 uint32_t *dst = (uint32_t *)dst_row; 587 uint8_t y0, y1, u, v; 588 uint32_t value; 589 590 for (x = 0; x + 1 < width; x += 2) { 591 uint8_t y0, y1, u0, u1, v0, v1, u, v; 592 593 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 594 &y0, &u0, &v0); 595 util_format_rgb_float_to_yuv(src[4], src[5], src[6], 596 &y1, &u1, &v1); 597 598 u = (u0 + u1 + 1) >> 1; 599 v = (v0 + v1 + 1) >> 1; 600 601 value = u; 602 value |= y0 << 8; 603 value |= v << 16; 604 value |= y1 << 24; 605 606 *dst++ = util_le32_to_cpu(value); 607 608 src += 8; 609 } 610 611 if (x < width) { 612 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 613 &y0, &u, &v); 614 y1 = 0; 615 616 value = u; 617 value |= y0 << 8; 618 value |= v << 16; 619 value |= y1 << 24; 620 621 *dst = util_le32_to_cpu(value); 622 } 623 624 dst_row += dst_stride/sizeof(*dst_row); 625 src_row += src_stride/sizeof(*src_row); 626 } 627 } 628 629 630 void 631 util_format_uyvy_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 632 const uint8_t *src_row, unsigned src_stride, 633 unsigned width, unsigned height) 634 { 635 unsigned x, y; 636 637 for (y = 0; y < height; y += 1) { 638 const uint8_t *src = src_row; 639 uint32_t *dst = (uint32_t *)dst_row; 640 uint8_t y0, y1, u, v; 641 uint32_t value; 642 643 for (x = 0; x + 1 < width; x += 2) { 644 uint8_t y0, y1, u0, u1, v0, v1, u, v; 645 646 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 647 &y0, &u0, &v0); 648 util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], 649 &y1, &u1, &v1); 650 651 u = (u0 + u1 + 1) >> 1; 652 v = (v0 + v1 + 1) >> 1; 653 654 value = u; 655 value |= y0 << 8; 656 value |= v << 16; 657 value |= y1 << 24; 658 659 *dst++ = util_le32_to_cpu(value); 660 661 src += 8; 662 } 663 664 if (x < width) { 665 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 666 &y0, &u, &v); 667 y1 = 0; 668 669 value = u; 670 value |= y0 << 8; 671 value |= v << 16; 672 value |= y1 << 24; 673 674 *dst = util_le32_to_cpu(value); 675 } 676 677 dst_row += dst_stride/sizeof(*dst_row); 678 src_row += src_stride/sizeof(*src_row); 679 } 680 } 681 682 683 void 684 util_format_uyvy_fetch_rgba_float(float *dst, const uint8_t *src, 685 unsigned i, unsigned j) 686 { 687 uint8_t y, u, v; 688 689 assert(i < 2); 690 assert(j < 1); 691 692 y = src[1 + i*2]; 693 u = src[0]; 694 v = src[2]; 695 696 util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); 697 698 dst[3] = 1.0f; 699 } 700 701 702 void 703 util_format_yuyv_unpack_rgba_float(float *dst_row, unsigned dst_stride, 704 const uint8_t *src_row, unsigned src_stride, 705 unsigned width, unsigned height) 706 { 707 unsigned x, y; 708 709 for (y = 0; y < height; y += 1) { 710 float *dst = dst_row; 711 const uint32_t *src = (const uint32_t *)src_row; 712 uint32_t value; 713 uint8_t y0, y1, u, v; 714 715 for (x = 0; x + 1 < width; x += 2) { 716 value = util_cpu_to_le32(*src++); 717 718 y0 = (value >> 0) & 0xff; 719 u = (value >> 8) & 0xff; 720 y1 = (value >> 16) & 0xff; 721 v = (value >> 24) & 0xff; 722 723 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 724 dst[3] = 1.0f; /* a */ 725 dst += 4; 726 727 util_format_yuv_to_rgb_float(y1, u, v, &dst[0], &dst[1], &dst[2]); 728 dst[3] = 1.0f; /* a */ 729 dst += 4; 730 } 731 732 if (x < width) { 733 value = util_cpu_to_le32(*src); 734 735 y0 = (value >> 0) & 0xff; 736 u = (value >> 8) & 0xff; 737 y1 = (value >> 16) & 0xff; 738 v = (value >> 24) & 0xff; 739 740 util_format_yuv_to_rgb_float(y0, u, v, &dst[0], &dst[1], &dst[2]); 741 dst[3] = 1.0f; /* a */ 742 } 743 744 src_row += src_stride/sizeof(*src_row); 745 dst_row += dst_stride/sizeof(*dst_row); 746 } 747 } 748 749 750 void 751 util_format_yuyv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 752 const uint8_t *src_row, unsigned src_stride, 753 unsigned width, unsigned height) 754 { 755 unsigned x, y; 756 757 for (y = 0; y < height; y += 1) { 758 uint8_t *dst = dst_row; 759 const uint32_t *src = (const uint32_t *)src_row; 760 uint32_t value; 761 uint8_t y0, y1, u, v; 762 763 for (x = 0; x + 1 < width; x += 2) { 764 value = util_cpu_to_le32(*src++); 765 766 y0 = (value >> 0) & 0xff; 767 u = (value >> 8) & 0xff; 768 y1 = (value >> 16) & 0xff; 769 v = (value >> 24) & 0xff; 770 771 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 772 dst[3] = 0xff; /* a */ 773 dst += 4; 774 775 util_format_yuv_to_rgb_8unorm(y1, u, v, &dst[0], &dst[1], &dst[2]); 776 dst[3] = 0xff; /* a */ 777 dst += 4; 778 } 779 780 if (x < width) { 781 value = util_cpu_to_le32(*src); 782 783 y0 = (value >> 0) & 0xff; 784 u = (value >> 8) & 0xff; 785 y1 = (value >> 16) & 0xff; 786 v = (value >> 24) & 0xff; 787 788 util_format_yuv_to_rgb_8unorm(y0, u, v, &dst[0], &dst[1], &dst[2]); 789 dst[3] = 0xff; /* a */ 790 } 791 792 src_row += src_stride/sizeof(*src_row); 793 dst_row += dst_stride/sizeof(*dst_row); 794 } 795 } 796 797 798 void 799 util_format_yuyv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 800 const float *src_row, unsigned src_stride, 801 unsigned width, unsigned height) 802 { 803 unsigned x, y; 804 805 for (y = 0; y < height; y += 1) { 806 const float *src = src_row; 807 uint32_t *dst = (uint32_t *)dst_row; 808 uint8_t y0, y1, u, v; 809 uint32_t value; 810 811 for (x = 0; x + 1 < width; x += 2) { 812 uint8_t y0, y1, u0, u1, v0, v1, u, v; 813 814 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 815 &y0, &u0, &v0); 816 util_format_rgb_float_to_yuv(src[4], src[5], src[6], 817 &y1, &u1, &v1); 818 819 u = (u0 + u1 + 1) >> 1; 820 v = (v0 + v1 + 1) >> 1; 821 822 value = y0; 823 value |= u << 8; 824 value |= y1 << 16; 825 value |= v << 24; 826 827 *dst++ = util_le32_to_cpu(value); 828 829 src += 8; 830 } 831 832 if (x < width) { 833 util_format_rgb_float_to_yuv(src[0], src[1], src[2], 834 &y0, &u, &v); 835 y1 = 0; 836 837 value = y0; 838 value |= u << 8; 839 value |= y1 << 16; 840 value |= v << 24; 841 842 *dst = util_le32_to_cpu(value); 843 } 844 845 dst_row += dst_stride/sizeof(*dst_row); 846 src_row += src_stride/sizeof(*src_row); 847 } 848 } 849 850 851 void 852 util_format_yuyv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 853 const uint8_t *src_row, unsigned src_stride, 854 unsigned width, unsigned height) 855 { 856 unsigned x, y; 857 858 for (y = 0; y < height; y += 1) { 859 const uint8_t *src = src_row; 860 uint32_t *dst = (uint32_t *)dst_row; 861 uint8_t y0, y1, u, v; 862 uint32_t value; 863 864 for (x = 0; x + 1 < width; x += 2) { 865 uint8_t y0, y1, u0, u1, v0, v1, u, v; 866 867 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 868 &y0, &u0, &v0); 869 util_format_rgb_8unorm_to_yuv(src[4], src[5], src[6], 870 &y1, &u1, &v1); 871 872 u = (u0 + u1 + 1) >> 1; 873 v = (v0 + v1 + 1) >> 1; 874 875 value = y0; 876 value |= u << 8; 877 value |= y1 << 16; 878 value |= v << 24; 879 880 *dst++ = util_le32_to_cpu(value); 881 882 src += 8; 883 } 884 885 if (x < width) { 886 util_format_rgb_8unorm_to_yuv(src[0], src[1], src[2], 887 &y0, &u, &v); 888 y1 = 0; 889 890 value = y0; 891 value |= u << 8; 892 value |= y1 << 16; 893 value |= v << 24; 894 895 *dst = util_le32_to_cpu(value); 896 } 897 898 dst_row += dst_stride/sizeof(*dst_row); 899 src_row += src_stride/sizeof(*src_row); 900 } 901 } 902 903 904 void 905 util_format_yuyv_fetch_rgba_float(float *dst, const uint8_t *src, 906 unsigned i, unsigned j) 907 { 908 uint8_t y, u, v; 909 910 assert(i < 2); 911 assert(j < 1); 912 913 y = src[0 + i*2]; 914 u = src[1]; 915 v = src[3]; 916 917 util_format_yuv_to_rgb_float(y, u, v, &dst[0], &dst[1], &dst[2]); 918 919 dst[3] = 1.0f; 920 } 921 922 /* XXX: Stubbed for now */ 923 void 924 util_format_yv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 925 const uint8_t *src_row, unsigned src_stride, 926 unsigned width, unsigned height) {} 927 void 928 util_format_yv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 929 const uint8_t *src_row, unsigned src_stride, 930 unsigned width, unsigned height) {} 931 void 932 util_format_yv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, 933 const uint8_t *src_row, unsigned src_stride, 934 unsigned width, unsigned height) {} 935 void 936 util_format_yv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 937 const float *src_row, unsigned src_stride, 938 unsigned width, unsigned height) {} 939 void 940 util_format_yv12_fetch_rgba_float(float *dst, const uint8_t *src, 941 unsigned i, unsigned j) {} 942 void 943 util_format_yv16_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 944 const uint8_t *src_row, unsigned src_stride, 945 unsigned width, unsigned height) {} 946 void 947 util_format_yv16_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 948 const uint8_t *src_row, unsigned src_stride, 949 unsigned width, unsigned height) {} 950 void 951 util_format_yv16_unpack_rgba_float(float *dst_row, unsigned dst_stride, 952 const uint8_t *src_row, unsigned src_stride, 953 unsigned width, unsigned height) {} 954 void 955 util_format_yv16_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 956 const float *src_row, unsigned src_stride, 957 unsigned width, unsigned height) {} 958 void 959 util_format_yv16_fetch_rgba_float(float *dst, const uint8_t *src, 960 unsigned i, unsigned j) {} 961 void 962 util_format_iyuv_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 963 const uint8_t *src_row, unsigned src_stride, 964 unsigned width, unsigned height) {} 965 void 966 util_format_iyuv_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 967 const uint8_t *src_row, unsigned src_stride, 968 unsigned width, unsigned height) {} 969 void 970 util_format_iyuv_unpack_rgba_float(float *dst_row, unsigned dst_stride, 971 const uint8_t *src_row, unsigned src_stride, 972 unsigned width, unsigned height) {} 973 void 974 util_format_iyuv_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 975 const float *src_row, unsigned src_stride, 976 unsigned width, unsigned height) {} 977 void 978 util_format_iyuv_fetch_rgba_float(float *dst, const uint8_t *src, 979 unsigned i, unsigned j) {} 980 void 981 util_format_nv12_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 982 const uint8_t *src_row, unsigned src_stride, 983 unsigned width, unsigned height) {} 984 void 985 util_format_nv12_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 986 const uint8_t *src_row, unsigned src_stride, 987 unsigned width, unsigned height) {} 988 void 989 util_format_nv12_unpack_rgba_float(float *dst_row, unsigned dst_stride, 990 const uint8_t *src_row, unsigned src_stride, 991 unsigned width, unsigned height) {} 992 void 993 util_format_nv12_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 994 const float *src_row, unsigned src_stride, 995 unsigned width, unsigned height) {} 996 void 997 util_format_nv12_fetch_rgba_float(float *dst, const uint8_t *src, 998 unsigned i, unsigned j) {} 999 void 1000 util_format_nv21_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1001 const uint8_t *src_row, unsigned src_stride, 1002 unsigned width, unsigned height) {} 1003 void 1004 util_format_nv21_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1005 const uint8_t *src_row, unsigned src_stride, 1006 unsigned width, unsigned height) {} 1007 void 1008 util_format_nv21_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1009 const uint8_t *src_row, unsigned src_stride, 1010 unsigned width, unsigned height) {} 1011 void 1012 util_format_nv21_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1013 const float *src_row, unsigned src_stride, 1014 unsigned width, unsigned height) {} 1015 void 1016 util_format_nv21_fetch_rgba_float(float *dst, const uint8_t *src, 1017 unsigned i, unsigned j) {} 1018 1019 void 1020 util_format_r8g8_r8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1021 const uint8_t *src_row, unsigned src_stride, 1022 unsigned width, unsigned height) {} 1023 1024 void 1025 util_format_r8g8_r8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1026 const uint8_t *src_row, unsigned src_stride, 1027 unsigned width, unsigned height) {} 1028 1029 void 1030 util_format_r8g8_r8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1031 const float *src_row, unsigned src_stride, 1032 unsigned width, unsigned height) {} 1033 1034 void 1035 util_format_r8g8_r8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1036 const uint8_t *src_row, unsigned src_stride, 1037 unsigned width, unsigned height) {} 1038 1039 void 1040 util_format_r8g8_r8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 1041 unsigned i, unsigned j) {} 1042 1043 void 1044 util_format_g8r8_b8r8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 1045 const uint8_t *src_row, unsigned src_stride, 1046 unsigned width, unsigned height) {} 1047 1048 void 1049 util_format_g8r8_b8r8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1050 const uint8_t *src_row, unsigned src_stride, 1051 unsigned width, unsigned height) {} 1052 1053 void 1054 util_format_g8r8_b8r8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 1055 const float *src_row, unsigned src_stride, 1056 unsigned width, unsigned height) {} 1057 1058 void 1059 util_format_g8r8_b8r8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 1060 const uint8_t *src_row, unsigned src_stride, 1061 unsigned width, unsigned height) {} 1062 1063 void 1064 util_format_g8r8_b8r8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 1065 unsigned i, unsigned j) {} 1066