yuvrgb24.c
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:6k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /************************************************************************
  2.  *
  3.  *  yuvrgb24.c, colour space conversion for tmndecode (H.263 decoder)
  4.  *  Copyright (C) 1995, 1996  Telenor R&D, Norway
  5.  *
  6.  *  Contacts:
  7.  *  Robert Danielsen                  <Robert.Danielsen@nta.no>
  8.  *
  9.  *  Telenor Research and Development  http://www.nta.no/brukere/DVC/
  10.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  11.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  12.  *
  13.  *  Copyright (C) 1997  University of BC, Canada
  14.  *  Modified by: Michael Gallant <mikeg@ee.ubc.ca>
  15.  *               Guy Cote <guyc@ee.ubc.ca>
  16.  *               Berna Erol <bernae@ee.ubc.ca>
  17.  *
  18.  *  Contacts:
  19.  *  Michael Gallant                   <mikeg@ee.ubc.ca>
  20.  *
  21.  *  UBC Image Processing Laboratory   http://www.ee.ubc.ca/image
  22.  *  2356 Main Mall                    tel.: +1 604 822 4051
  23.  *  Vancouver BC Canada V6T1Z4        fax.: +1 604 822 5949
  24.  *
  25.  ************************************************************************/
  26. /* Disclaimer of Warranty
  27.  * 
  28.  * These software programs are available to the user without any license fee
  29.  * or royalty on an "as is" basis. The University of British Columbia
  30.  * disclaims any and all warranties, whether express, implied, or
  31.  * statuary, including any implied warranties or merchantability or of
  32.  * fitness for a particular purpose.  In no event shall the
  33.  * copyright-holder be liable for any incidental, punitive, or
  34.  * consequential damages of any kind whatsoever arising from the use of
  35.  * these programs.
  36.  * 
  37.  * This disclaimer of warranty extends to the user of these programs and
  38.  * user's customers, employees, agents, transferees, successors, and
  39.  * assigns.
  40.  * 
  41.  * The University of British Columbia does not represent or warrant that the
  42.  * programs furnished hereunder are free of infringement of any
  43.  * third-party patents.
  44.  * 
  45.  * Commercial implementations of H.263, including shareware, are subject to
  46.  * royalty fees to patent holders.  Many of these patents are general
  47.  * enough such that they are unavoidable regardless of implementation
  48.  * design.
  49.  * 
  50.  */
  51. #ifdef __GCC__
  52. #include "display.h"
  53. #endif
  54. #include <stdio.h>
  55. #include <malloc.h>
  56. /* Data for ConvertYUVtoRGB */
  57. extern unsigned char *clp;
  58. extern unsigned char *clp1;
  59. #ifdef __cplusplus
  60. extern "C"
  61. {
  62. #endif
  63. long int crv_tab[256];
  64. long int cbu_tab[256];
  65. long int cgu_tab[256];
  66. long int cgv_tab[256];
  67. long int tab_76309[256];
  68. void init_dither_tab ()
  69. {
  70.   long int crv, cbu, cgu, cgv;
  71.   int i;
  72.   crv = 104597;
  73.   cbu = 132201;                 /* fra matrise i global.h */
  74.   cgu = 25675;
  75.   cgv = 53279;
  76.   for (i = 0; i < 256; i++)
  77.   {
  78.     crv_tab[i] = (i - 128) * crv;
  79.     cbu_tab[i] = (i - 128) * cbu;
  80.     cgu_tab[i] = (i - 128) * cgu;
  81.     cgv_tab[i] = (i - 128) * cgv;
  82.     tab_76309[i] = 76309 * (i - 16);
  83.   }
  84.   if (!(clp = (unsigned char *)malloc(sizeof(unsigned char)*1024)))
  85.     printf("malloc failedn");
  86.   clp1 = clp;
  87.   clp += 384;
  88.   for (i = -384; i < 640; i++)
  89.     clp[i] = (i < 0) ? 0 : ((i > 255) ? 255 : i);
  90. }
  91. /**********************************************************************
  92.  *
  93.  * Name:          ConvertYUVtoRGB
  94.  * Description:     Converts YUV image to RGB (packed mode)
  95.  *
  96.  * Input:          pointer to source luma, Cr, Cb, destination,
  97.  *                       image width and height
  98.  * Returns:
  99.  * Side effects:
  100.  *
  101.  * Date: 951208 Author: Karl.Lillevold@nta.no
  102.  *
  103.  ***********************************************************************/
  104. void ConvertYUVtoRGB (unsigned char *src0, unsigned char *src1, unsigned char *src2,
  105.                       unsigned char *dst_ori,int width,int height)
  106. {
  107.   extern long int crv_tab[];
  108.   extern long int cbu_tab[];
  109.   extern long int cgu_tab[];
  110.   extern long int cgv_tab[];
  111.   extern long int tab_76309[];
  112.   int y11, y21;
  113.   int y12, y22;
  114.   int y13, y23;
  115.   int y14, y24;
  116.   int u, v;
  117.   int i, j;
  118.   int c11, c21, c31, c41;
  119.   int c12, c22, c32, c42;
  120.   unsigned int DW;
  121.   unsigned int *id1, *id2;
  122.   unsigned char *py1, *py2, *pu, *pv;
  123.   unsigned char *d1, *d2;
  124.   d1 = dst_ori;
  125.   d1 += width * height * 3 - width * 3;
  126.   d2 = d1 - width * 3;
  127.   py1 = src0;
  128.   pu = src1;
  129.   pv = src2;
  130.   py2 = py1 + width;
  131.   id1 = (unsigned int *) d1;
  132.   id2 = (unsigned int *) d2;
  133.   for (j = 0; j < height; j += 2)
  134.   {
  135.     /* line j + 0 */
  136.     for (i = 0; i < width; i += 4)
  137.     {
  138.       u = *pu++;
  139.       v = *pv++;
  140.       c11 = crv_tab[v];
  141.       c21 = cgu_tab[u];
  142.       c31 = cgv_tab[v];
  143.       c41 = cbu_tab[u];
  144.       u = *pu++;
  145.       v = *pv++;
  146.       c12 = crv_tab[v];
  147.       c22 = cgu_tab[u];
  148.       c32 = cgv_tab[v];
  149.       c42 = cbu_tab[u];
  150.       y11 = tab_76309[*py1++];  /* (255/219)*65536 */
  151.       y12 = tab_76309[*py1++];
  152.       y13 = tab_76309[*py1++];  /* (255/219)*65536 */
  153.       y14 = tab_76309[*py1++];
  154.       y21 = tab_76309[*py2++];
  155.       y22 = tab_76309[*py2++];
  156.       y23 = tab_76309[*py2++];
  157.       y24 = tab_76309[*py2++];
  158.       /* RGBR */
  159.       DW = ((clp[(y11 + c41) >> 16])) |
  160.         ((clp[(y11 - c21 - c31) >> 16]) << 8) |
  161.         ((clp[(y11 + c11) >> 16]) << 16) |
  162.         ((clp[(y12 + c41) >> 16]) << 24);
  163.       *id1++ = DW;
  164.       /* GBRG */
  165.       DW = ((clp[(y12 - c21 - c31) >> 16])) |
  166.         ((clp[(y12 + c11) >> 16]) << 8) |
  167.         ((clp[(y13 + c42) >> 16]) << 16) |
  168.         ((clp[(y13 - c22 - c32) >> 16]) << 24);
  169.       *id1++ = DW;
  170.       /* BRGB */
  171.       DW = ((clp[(y13 + c12) >> 16])) |
  172.         ((clp[(y14 + c42) >> 16]) << 8) |
  173.         ((clp[(y14 - c22 - c32) >> 16]) << 16) |
  174.         ((clp[(y14 + c12) >> 16]) << 24);
  175.       *id1++ = DW;
  176.       /* RGBR */
  177.       DW = ((clp[(y21 + c41) >> 16])) |
  178.         ((clp[(y21 - c21 - c31) >> 16]) << 8) |
  179.         ((clp[(y21 + c11) >> 16]) << 16) |
  180.         ((clp[(y22 + c41) >> 16]) << 24);
  181.       *id2++ = DW;
  182.       /* GBRG */
  183.       DW = ((clp[(y22 - c21 - c31) >> 16])) |
  184.         ((clp[(y22 + c11) >> 16]) << 8) |
  185.         ((clp[(y23 + c42) >> 16]) << 16) |
  186.         ((clp[(y23 - c22 - c32) >> 16]) << 24);
  187.       *id2++ = DW;
  188.       /* BRGB */
  189.       DW = ((clp[(y23 + c12) >> 16])) |
  190.         ((clp[(y24 + c42) >> 16]) << 8) |
  191.         ((clp[(y24 - c22 - c32) >> 16]) << 16) |
  192.         ((clp[(y24 + c12) >> 16]) << 24);
  193.       *id2++ = DW;
  194.     }
  195.     id1 -= (9 * width) >> 2;
  196.     id2 -= (9 * width) >> 2;
  197.     py1 += width;
  198.     py2 += width;
  199.   }
  200. }
  201. #ifdef __cplusplus
  202. }
  203. #endif