YuvToRgb.cpp
上传用户:panstart
上传日期:2022-04-12
资源大小:199k
文件大小:5k
源码类别:

IP电话/视频会议

开发平台:

C++ Builder

  1. /************************************************************************
  2.  *
  3.  *  yuvrgb24.c, colour space conversion for tmndecode (H.263 decoder)
  4.  *  Copyright (C) 1996  Telenor R&D, Norway
  5.  *        Karl Olav Lillevold <Karl.Lillevold@nta.no>
  6.  *
  7.  *  This program is free software; you can redistribute it and/or modify
  8.  *  it under the terms of the GNU General Public License as published by
  9.  *  the Free Software Foundation; either version 2 of the License, or
  10.  *  (at your option) any later version.
  11.  *
  12.  *  This program is distributed in the hope that it will be useful,
  13.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *  GNU General Public License for more details.
  16.  *
  17.  *  You should have received a copy of the GNU General Public License
  18.  *  along with this program; if not, write to the Free Software
  19.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *  Karl Olav Lillevold               <Karl.Lillevold@nta.no>
  22.  *  Telenor Research and Development
  23.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  24.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  25.  *
  26.  *  Robert Danielsen                  e-mail: Robert.Danielsen@nta.no
  27.  *  Telenor Research and Development  www:    http://www.nta.no/brukere/DVC/
  28.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  29.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  30.  *  
  31.  ************************************************************************/
  32. #include "DGlobal.h"
  33. /* Data for ConvertYUVtoRGB*/
  34. long int crv_tab[256];
  35. long int cbu_tab[256];
  36. long int cgu_tab[256];
  37. long int cgv_tab[256];
  38. long int tab_76309[256];
  39. /**
  40. *   Init Routine...
  41. *   This must be invoked only once before calling conversion routine
  42. */
  43. void init_dither_tab()
  44. {
  45.   long int crv,cbu,cgu,cgv;
  46.   int i;   
  47.   
  48.   crv = 104597; cbu = 132201;  /* fra matrise i global.h */
  49.   cgu = 25675;  cgv = 53279;
  50.   
  51.   for (i = 0; i < 256; i++) {
  52.     crv_tab[i] = (i-128) * crv;
  53.     cbu_tab[i] = (i-128) * cbu;
  54.     cgu_tab[i] = (i-128) * cgu;
  55.     cgv_tab[i] = (i-128) * cgv;
  56.     tab_76309[i] = 76309*(i-16);
  57.   }
  58. }
  59.             
  60. /**********************************************************************
  61.  *
  62.  * Name:          ConvertYUVtoRGB
  63.  * Description:     Converts YUV image to RGB (packed mode)
  64.  *
  65.  * Input:          pointer to source luma, Cr, Cb, destination,
  66.  *                       image width and height
  67.  * Returns:       
  68.  * Side effects:
  69.  *
  70.  * Date: 951208 Author: Karl.Lillevold@nta.no
  71.  *
  72.  ***********************************************************************/
  73. void ConvertYUVtoRGB(unsigned char *src0,unsigned char *src1,unsigned char *src2,unsigned char *dst_ori,int width,int height)
  74. {       
  75.   extern long int crv_tab[];
  76.   extern long int cbu_tab[];
  77.   extern long int cgu_tab[];
  78.   extern long int cgv_tab[];
  79.   extern long int tab_76309[];
  80.   int y11,y21;
  81. int y12,y22;
  82.   int y13,y23;
  83. int y14,y24;
  84.   int u,v; 
  85.   int i,j;
  86. int c11, c21, c31, c41;
  87. int c12, c22, c32, c42;
  88. unsigned int DW;
  89. unsigned int *id1, *id2;
  90.   unsigned char *py1,*py2,*pu,*pv;
  91.   unsigned char *d1, *d2;
  92.   
  93.   d1 = dst_ori;
  94.   d1 += width*height*3 - width*3;
  95. d2 = d1 - width*3;
  96.   
  97.   py1 = src0; pu = src1; pv = src2;
  98. py2 = py1 + width;
  99.  
  100. id1 = (unsigned int *)d1;
  101. id2 = (unsigned int *)d2;
  102.   for (j = 0; j < height; j += 2) { 
  103.     /* line j + 0 */
  104.     for (i = 0; i < width; i += 4) {
  105.       u = *pu++;
  106.       v = *pv++;
  107.       c11 = crv_tab[v];
  108.       c21 = cgu_tab[u];
  109.       c31 = cgv_tab[v];
  110.       c41 = cbu_tab[u];
  111.       u = *pu++;
  112.       v = *pv++;
  113.       c12 = crv_tab[v];
  114.       c22 = cgu_tab[u];
  115.       c32 = cgv_tab[v];
  116.       c42 = cbu_tab[u];
  117.       y11 = tab_76309[*py1++]; /* (255/219)*65536 */
  118.       y12 = tab_76309[*py1++];
  119.       y13 = tab_76309[*py1++]; /* (255/219)*65536 */
  120.       y14 = tab_76309[*py1++];
  121.       y21 = tab_76309[*py2++];
  122.       y22 = tab_76309[*py2++];
  123.       y23 = tab_76309[*py2++];
  124.       y24 = tab_76309[*py2++];
  125.       /* RGBR*/
  126.       DW = ((clp[(y11 + c41)>>16])) |
  127.            ((clp[(y11 - c21 - c31)>>16])<<8) |
  128.            ((clp[(y11 + c11)>>16])<<16) |  
  129.            ((clp[(y12 + c41)>>16])<<24);
  130.       *id1++ = DW;
  131.       /* GBRG*/
  132.       DW = ((clp[(y12 - c21 - c31)>>16])) |
  133.            ((clp[(y12 + c11)>>16])<<8) |  
  134.            ((clp[(y13 + c42)>>16])<<16) |
  135.            ((clp[(y13 - c22 - c32)>>16])<<24);
  136.       *id1++ = DW;
  137.       /* BRGB*/
  138.       DW = ((clp[(y13 + c12)>>16])) |  
  139.            ((clp[(y14 + c42)>>16])<<8) |
  140.            ((clp[(y14 - c22 - c32)>>16])<<16) |
  141.            ((clp[(y14 + c12)>>16])<<24);  
  142.       *id1++ = DW;
  143.       /* RGBR*/
  144.       DW = ((clp[(y21 + c41)>>16])) |
  145.            ((clp[(y21 - c21 - c31)>>16])<<8) |
  146.            ((clp[(y21 + c11)>>16])<<16) |  
  147.            ((clp[(y22 + c41)>>16])<<24);
  148.       *id2++ = DW;
  149.       /* GBRG*/
  150.       DW = ((clp[(y22 - c21 - c31)>>16])) |
  151.            ((clp[(y22 + c11)>>16])<<8) |  
  152.            ((clp[(y23 + c42)>>16])<<16) |
  153.            ((clp[(y23 - c22 - c32)>>16])<<24);
  154.       *id2++ = DW;
  155.       /* BRGB*/
  156.       DW = ((clp[(y23 + c12)>>16])) |  
  157.            ((clp[(y24 + c42)>>16])<<8) |
  158.            ((clp[(y24 - c22 - c32)>>16])<<16) |
  159.            ((clp[(y24 + c12)>>16])<<24);  
  160.       *id2++ = DW;
  161.     }
  162.     id1 -= (9 * width)>>2;
  163.     id2 -= (9 * width)>>2;
  164.     py1 += width;
  165.     py2 += width;
  166.   }           
  167. }