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