github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/jxrlib/jxrtestlib/JXRTestYUV.c (about) 1 //*@@@+++@@@@****************************************************************** 2 // 3 // Copyright Microsoft Corp. 4 // All rights reserved. 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are met: 8 // 9 // Redistributions of source code must retain the above copyright notice, 10 // this list of conditions and the following disclaimer. 11 // Redistributions in binary form must reproduce the above copyright notice, 12 // this list of conditions and the following disclaimer in the documentation 13 // and/or other materials provided with the distribution. 14 // 15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 // POSSIBILITY OF SUCH DAMAGE. 26 // 27 //*@@@---@@@@****************************************************************** 28 29 #include <stdlib.h> 30 #include <string.h> 31 32 #include <JXRGlue.h> 33 34 #pragma pack(push, 1) 35 #pragma pack(pop) 36 37 //================================================================ 38 // PKImageEncode_Iyuv 39 //================================================================ 40 ERR WriteIYUVHeader( 41 PKImageEncode* pIE) 42 { 43 ERR err = WMP_errSuccess; 44 // struct WMPStream* pS = pIE->pStream; 45 46 pIE->offPixel = 0; 47 48 pIE->cbPixel = 3; 49 50 pIE->fHeaderDone = !FALSE; 51 52 return err; 53 } 54 55 //================================================================ 56 // PKImageEncode_Yuv422 57 //================================================================ 58 ERR WriteYUV422Header( 59 PKImageEncode* pIE) 60 { 61 ERR err = WMP_errSuccess; 62 // struct WMPStream* pS = pIE->pStream; 63 64 pIE->offPixel = 0; 65 66 pIE->cbPixel = 3; 67 68 pIE->fHeaderDone = !FALSE; 69 70 return err; 71 } 72 73 //================================================================ 74 // PKImageEncode_Yuv444 75 //================================================================ 76 ERR WriteYUV444Header( 77 PKImageEncode* pIE) 78 { 79 ERR err = WMP_errSuccess; 80 // struct WMPStream* pS = pIE->pStream; 81 82 pIE->offPixel = 0; 83 84 pIE->cbPixel = 3; 85 86 pIE->fHeaderDone = !FALSE; 87 88 return err; 89 } 90 91 ERR PKImageEncode_WritePixels_IYUV( 92 PKImageEncode* pIE, 93 U32 cLine, 94 U8* pbPixel, 95 U32 cbStride) 96 { 97 ERR err = WMP_errSuccess; 98 struct WMPStream* pS = pIE->pStream; 99 size_t iRow, iCol; 100 U32 uYSize, uUVSize; 101 U8 *pY; 102 U8 *pU; 103 U8 *pV; 104 105 UNREFERENCED_PARAMETER( cbStride ); 106 107 // header 108 if (!pIE->fHeaderDone) 109 { 110 Call(WriteIYUVHeader(pIE)); 111 } 112 113 //from packed to planar: 114 uYSize = cLine * pIE->uWidth; 115 uUVSize = (uYSize >> 2); 116 117 pY = (U8 *)malloc(uYSize); 118 pU = (U8 *)malloc(uUVSize); 119 pV = (U8 *)malloc(uUVSize); 120 121 if(pY == NULL || pU == NULL || pV == NULL) 122 { 123 return ICERR_ERROR; 124 } 125 126 for (iRow = 0; iRow < pIE->uHeight; iRow += 2, pY += pIE->uWidth) 127 { 128 for (iCol = 0; iCol < pIE->uWidth; iCol += 2, pY += 2) 129 { 130 131 *pY = *pbPixel; 132 pbPixel++; 133 *(pY + 1)= *pbPixel; 134 pbPixel++; 135 *(pY + pIE->uWidth) = *pbPixel; 136 pbPixel++; 137 *(pY + pIE->uWidth + 1) = *pbPixel; 138 pbPixel++; 139 140 *pU = *pbPixel; 141 pbPixel++; pU++; 142 *pV = *pbPixel; 143 pbPixel++; pV++; 144 } 145 } 146 147 pY-=uYSize; 148 pU-=uUVSize; 149 pV-=uUVSize; 150 151 Call(pS->Write(pS, pY, uYSize)); 152 Call(pS->Write(pS, pU, uUVSize)); 153 Call(pS->Write(pS, pV, uUVSize)); 154 155 if(pY!=NULL) 156 free(pY); 157 if(pU!=NULL) 158 free(pU); 159 if(pV!=NULL) 160 free(pV); 161 162 pIE->idxCurrentLine += cLine; 163 164 Cleanup: 165 return err; 166 } 167 168 169 ERR PKImageEncode_WritePixels_YUV422( 170 PKImageEncode* pIE, 171 U32 cLine, 172 U8* pbPixel, 173 U32 cbStride) 174 { 175 ERR err = WMP_errSuccess; 176 struct WMPStream* pS = pIE->pStream; 177 size_t iRow, iCol; 178 U32 uYSize, uUVSize; 179 U8 *pY; 180 U8 *pU; 181 U8 *pV; 182 183 UNREFERENCED_PARAMETER( cbStride ); 184 185 // header 186 if (!pIE->fHeaderDone) 187 { 188 Call(WriteIYUVHeader(pIE)); 189 } 190 191 //from packed to planar: 192 uYSize = cLine * pIE->uWidth; 193 uUVSize = (uYSize >> 1); 194 195 pY = (U8 *)malloc(uYSize); 196 pU = (U8 *)malloc(uUVSize); 197 pV = (U8 *)malloc(uUVSize); 198 199 if(pY == NULL || pU == NULL || pV == NULL) 200 { 201 return ICERR_ERROR; 202 } 203 //YYUV 204 for (iRow = 0; iRow < pIE->uHeight; iRow += 1) 205 { 206 for (iCol = 0; iCol < pIE->uWidth; iCol += 2) 207 { 208 *pU = *pbPixel; 209 pbPixel++; pU++; 210 211 *pY = *pbPixel; 212 pbPixel++; pY++; 213 214 *pV = *pbPixel; 215 pbPixel++; pV++; 216 217 *pY = *pbPixel; 218 pbPixel++; pY++; 219 } 220 } 221 222 pY-=uYSize; 223 pU-=uUVSize; 224 pV-=uUVSize; 225 226 Call(pS->Write(pS, pY, uYSize)); 227 Call(pS->Write(pS, pU, uUVSize)); 228 Call(pS->Write(pS, pV, uUVSize)); 229 230 if(pY!=NULL) 231 free(pY); 232 if(pU!=NULL) 233 free(pU); 234 if(pV!=NULL) 235 free(pV); 236 237 pIE->idxCurrentLine += cLine; 238 239 Cleanup: 240 return err; 241 } 242 243 244 ERR PKImageEncode_WritePixels_YUV444( 245 PKImageEncode* pIE, 246 U32 cLine, 247 U8* pbPixel, 248 U32 cbStride) 249 { 250 ERR err = WMP_errSuccess; 251 struct WMPStream* pS = pIE->pStream; 252 size_t iRow, iCol; 253 U32 uYSize, uUVSize; 254 U8 *pY; 255 U8 *pU; 256 U8 *pV; 257 258 UNREFERENCED_PARAMETER( cbStride ); 259 260 // header 261 if (!pIE->fHeaderDone) 262 { 263 Call(WriteIYUVHeader(pIE)); 264 } 265 266 //from packed to planar: 267 uYSize = cLine * pIE->uWidth; 268 uUVSize = uYSize; 269 270 pY = (U8 *)malloc(uYSize); 271 pU = (U8 *)malloc(uUVSize); 272 pV = (U8 *)malloc(uUVSize); 273 274 if(pY == NULL || pU == NULL || pV == NULL) 275 { 276 return ICERR_ERROR; 277 } 278 279 for (iRow = 0; iRow < pIE->uHeight; iRow += 1) 280 { 281 for (iCol = 0; iCol < pIE->uWidth; iCol += 1) 282 { 283 284 *pY = *pbPixel; 285 pbPixel++; pY++; 286 287 *pU = *pbPixel; 288 pbPixel++; pU++; 289 *pV = *pbPixel; 290 pbPixel++; pV++; 291 } 292 } 293 294 pY-=uYSize; 295 pU-=uUVSize; 296 pV-=uUVSize; 297 298 Call(pS->Write(pS, pY, uYSize)); 299 Call(pS->Write(pS, pU, uUVSize)); 300 Call(pS->Write(pS, pV, uUVSize)); 301 302 if(pY!=NULL) 303 free(pY); 304 if(pU!=NULL) 305 free(pU); 306 if(pV!=NULL) 307 free(pV); 308 309 pIE->idxCurrentLine += cLine; 310 311 Cleanup: 312 return err; 313 } 314 315 316 317 ERR PKImageEncode_Create_IYUV( 318 PKImageEncode** ppIE) 319 { 320 ERR err = WMP_errSuccess; 321 PKImageEncode* pIE = NULL; 322 323 Call(PKImageEncode_Create(ppIE)); 324 325 pIE = *ppIE; 326 pIE->WritePixels = PKImageEncode_WritePixels_IYUV; 327 328 Cleanup: 329 return err; 330 } 331 332 ERR PKImageEncode_Create_YUV422( 333 PKImageEncode** ppIE) 334 { 335 ERR err = WMP_errSuccess; 336 PKImageEncode* pIE = NULL; 337 338 Call(PKImageEncode_Create(ppIE)); 339 340 pIE = *ppIE; 341 pIE->WritePixels = PKImageEncode_WritePixels_YUV422; 342 343 Cleanup: 344 return err; 345 } 346 347 ERR PKImageEncode_Create_YUV444( 348 PKImageEncode** ppIE) 349 { 350 ERR err = WMP_errSuccess; 351 PKImageEncode* pIE = NULL; 352 353 Call(PKImageEncode_Create(ppIE)); 354 355 pIE = *ppIE; 356 pIE->WritePixels = PKImageEncode_WritePixels_YUV444; 357 358 Cleanup: 359 return err; 360 } 361 362 363 //================================================================ 364 // PKImageDecode_IYUV 365 //================================================================ 366 ERR ParseIYUVHeader( 367 PKImageDecode* pID, 368 struct WMPStream* pWS) 369 { 370 ERR err = WMP_errSuccess; 371 372 UNREFERENCED_PARAMETER( pWS ); 373 374 // Set header other header parameters 375 pID->guidPixFormat = GUID_PKPixelFormat12bppYUV420; 376 377 pID->uHeight = 144; 378 pID->uWidth = 176; 379 380 //I don't need offpixel for raw data! Call(pWS->GetPos(pWS, &pID->YUV420.offPixel)); 381 382 return err; 383 } 384 385 //================================================================ 386 // PKImageDecode_YUV422 387 //================================================================ 388 ERR ParseYUV422Header( 389 PKImageDecode* pID, 390 struct WMPStream* pWS) 391 { 392 ERR err = WMP_errSuccess; 393 394 UNREFERENCED_PARAMETER( pWS ); 395 396 // Set header other header parameters 397 pID->guidPixFormat = GUID_PKPixelFormat16bppYUV422; 398 399 pID->uHeight = 144; 400 pID->uWidth = 176; 401 402 return err; 403 } 404 405 //================================================================ 406 // PKImageDecode_YUV422 407 //================================================================ 408 ERR ParseYUV444Header( 409 PKImageDecode* pID, 410 struct WMPStream* pWS) 411 { 412 ERR err = WMP_errSuccess; 413 414 UNREFERENCED_PARAMETER( pWS ); 415 416 // Set header other header parameters 417 pID->guidPixFormat = GUID_PKPixelFormat24bppYUV444; 418 419 pID->uHeight = 144; 420 pID->uWidth = 176; 421 422 return err; 423 } 424 425 ERR PKImageDecode_Initialize_IYUV( 426 PKImageDecode* pID, 427 struct WMPStream* pWS) 428 { 429 ERR err = WMP_errSuccess; 430 431 Call(PKImageDecode_Initialize(pID, pWS)); 432 Call(ParseIYUVHeader(pID, pWS)); 433 434 Cleanup: 435 return err; 436 } 437 438 ERR PKImageDecode_Initialize_YUV422( 439 PKImageDecode* pID, 440 struct WMPStream* pWS) 441 { 442 ERR err = WMP_errSuccess; 443 444 Call(PKImageDecode_Initialize(pID, pWS)); 445 Call(ParseYUV422Header(pID, pWS)); 446 447 Cleanup: 448 return err; 449 } 450 451 ERR PKImageDecode_Initialize_YUV444( 452 PKImageDecode* pID, 453 struct WMPStream* pWS) 454 { 455 ERR err = WMP_errSuccess; 456 457 Call(PKImageDecode_Initialize(pID, pWS)); 458 Call(ParseYUV444Header(pID, pWS)); 459 460 Cleanup: 461 return err; 462 } 463 464 465 ERR PKImageDecode_Copy_IYUV( 466 PKImageDecode* pID, 467 const PKRect* pRect, 468 U8* pb, 469 U32 cbStride) 470 { 471 ERR err = WMP_errSuccess; 472 U32 uYSize, uUVSize; 473 U8 *pY; 474 U8 *pU; 475 U8 *pV; 476 477 struct WMPStream* pS = pID->pStream; 478 479 size_t iRow, iCol; 480 481 UNREFERENCED_PARAMETER( pRect ); 482 UNREFERENCED_PARAMETER( cbStride ); 483 484 //from planar to packed! YYYYUV YYYYUV 485 uYSize = pID->uWidth * pID->uHeight; 486 uUVSize = (uYSize >> 2); 487 488 pY = (U8 *)malloc(uYSize); 489 pU = (U8 *)malloc(uUVSize); 490 pV = (U8 *)malloc(uUVSize); 491 492 if(pY == NULL || pU == NULL || pV == NULL) 493 { 494 return ICERR_ERROR; 495 } 496 497 Call(pS->Read(pS, pY, uYSize)); 498 Call(pS->Read(pS, pU, uUVSize)); 499 Call(pS->Read(pS, pV, uUVSize)); 500 501 //re-organize it to Y0 Y1 502 // Y2 Y3 U V 503 504 for (iRow = 0; iRow < pID->uHeight; iRow += 2, pY += pID->uWidth) 505 { 506 for (iCol = 0; iCol < pID->uWidth; iCol += 2, pY += 2) 507 { 508 *pb = *pY; 509 pb++; 510 *pb = *(pY + 1); 511 pb++; 512 *pb = *(pY + pID->uWidth); 513 pb++; 514 *pb = *(pY + pID->uWidth + 1); 515 pb++; 516 517 *pb = *pU; 518 pb++; pU++; 519 *pb = *pV; 520 pb++; pV++; 521 } 522 } 523 524 pY-=uYSize; 525 pU-=uUVSize; 526 pV-=uUVSize; 527 if(pY!=NULL) 528 free(pY); 529 if(pU!=NULL) 530 free(pU); 531 if(pV!=NULL) 532 free(pV); 533 534 Cleanup: 535 return err; 536 } 537 538 539 ERR PKImageDecode_Copy_YUV422( 540 PKImageDecode* pID, 541 const PKRect* pRect, 542 U8* pb, 543 U32 cbStride) 544 { 545 ERR err = WMP_errSuccess; 546 U32 uYSize, uUVSize; 547 U8 *pY; 548 U8 *pU; 549 U8 *pV; 550 551 struct WMPStream* pS = pID->pStream; 552 553 size_t iRow, iCol; 554 555 UNREFERENCED_PARAMETER( pRect ); 556 UNREFERENCED_PARAMETER( cbStride ); 557 558 uYSize = pID->uWidth * pID->uHeight; 559 uUVSize = (uYSize >> 1); 560 561 pY = (U8 *)malloc(uYSize); 562 pU = (U8 *)malloc(uUVSize); 563 pV = (U8 *)malloc(uUVSize); 564 565 if(pY == NULL || pU == NULL || pV == NULL) 566 { 567 return ICERR_ERROR; 568 } 569 570 Call(pS->Read(pS, pY, uYSize)); 571 Call(pS->Read(pS, pU, uUVSize)); 572 Call(pS->Read(pS, pV, uUVSize)); 573 574 //re-organize to iMode 0 : YYUV 575 576 for (iRow = 0; iRow < pID->uHeight; iRow += 1) 577 { 578 for (iCol = 0; iCol < pID->uWidth; iCol += 2) 579 { 580 *pb = *pU; 581 pb++; pU++; 582 583 *pb = *pY; 584 pb++; pY++; 585 586 *pb = *pV; 587 pb++; pV++; 588 589 *pb = *pY; 590 pb++; pY++; 591 } 592 } 593 594 pY-=uYSize; 595 pU-=uUVSize; 596 pV-=uUVSize; 597 if(pY!=NULL) 598 free(pY); 599 if(pU!=NULL) 600 free(pU); 601 if(pV!=NULL) 602 free(pV); 603 604 Cleanup: 605 return err; 606 } 607 608 609 ERR PKImageDecode_Copy_YUV444( 610 PKImageDecode* pID, 611 const PKRect* pRect, 612 U8* pb, 613 U32 cbStride) 614 { 615 ERR err = WMP_errSuccess; 616 U32 uYSize, uUVSize; 617 U8 *pY; 618 U8 *pU; 619 U8 *pV; 620 621 struct WMPStream* pS = pID->pStream; 622 623 size_t iRow, iCol; 624 625 UNREFERENCED_PARAMETER( pRect ); 626 UNREFERENCED_PARAMETER( cbStride ); 627 628 //from planar to packed! YYYYUV YYYYUV 629 uYSize = pID->uWidth * pID->uHeight; 630 uUVSize = uYSize; 631 632 pY = (U8 *)malloc(uYSize); 633 pU = (U8 *)malloc(uUVSize); 634 pV = (U8 *)malloc(uUVSize); 635 636 if(pY == NULL || pU == NULL || pV == NULL) 637 { 638 return ICERR_ERROR; 639 } 640 641 Call(pS->Read(pS, pY, uYSize)); 642 Call(pS->Read(pS, pU, uUVSize)); 643 Call(pS->Read(pS, pV, uUVSize)); 644 645 //Organize it as YUVYUVYUV... 646 647 for (iRow = 0; iRow < pID->uHeight; iRow += 1) 648 { 649 for (iCol = 0; iCol < pID->uWidth; iCol += 1) 650 { 651 *pb = *pY; 652 pb++; pY++; 653 654 *pb = *pU; 655 pb++; pU++; 656 *pb = *pV; 657 pb++; pV++; 658 } 659 } 660 661 pY-=uYSize; 662 pU-=uUVSize; 663 pV-=uUVSize; 664 if(pY!=NULL) 665 free(pY); 666 if(pU!=NULL) 667 free(pU); 668 if(pV!=NULL) 669 free(pV); 670 671 Cleanup: 672 return err; 673 } 674 675 676 ERR PKImageDecode_Create_IYUV( 677 PKImageDecode** ppID) 678 { 679 ERR err = WMP_errSuccess; 680 PKImageDecode* pID = NULL; 681 682 Call(PKImageDecode_Create(ppID)); 683 684 pID = *ppID; 685 pID->Initialize = PKImageDecode_Initialize_IYUV; 686 pID->Copy = PKImageDecode_Copy_IYUV; 687 688 Cleanup: 689 return err; 690 } 691 692 ERR PKImageDecode_Create_YUV422( 693 PKImageDecode** ppID) 694 { 695 ERR err = WMP_errSuccess; 696 PKImageDecode* pID = NULL; 697 698 Call(PKImageDecode_Create(ppID)); 699 700 pID = *ppID; 701 pID->Initialize = PKImageDecode_Initialize_YUV422; 702 pID->Copy = PKImageDecode_Copy_YUV422; 703 704 Cleanup: 705 return err; 706 } 707 708 ERR PKImageDecode_Create_YUV444( 709 PKImageDecode** ppID) 710 { 711 ERR err = WMP_errSuccess; 712 PKImageDecode* pID = NULL; 713 714 Call(PKImageDecode_Create(ppID)); 715 716 pID = *ppID; 717 pID->Initialize = PKImageDecode_Initialize_YUV444; 718 pID->Copy = PKImageDecode_Copy_YUV444; 719 720 Cleanup: 721 return err; 722 } 723