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

mpeg/mp3

开发平台:

Visual C++

  1. /************************************************************************
  2.  *
  3.  *  yuv2rgb.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. /* Copyright (c) 1995 Erik Corry All rights reserved.
  52.  * 
  53.  * Permission to use, copy, modify, and distribute this software and its
  54.  * documentation for any purpose, without fee, and without written
  55.  * agreement is hereby granted, provided that the above copyright notice
  56.  * and the following two paragraphs appear in all copies of this software.
  57.  * 
  58.  * IN NO EVENT SHALL ERIK CORRY BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
  59.  * SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF
  60.  * THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF ERIK CORRY HAS BEEN
  61.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  62.  * 
  63.  * ERIK CORRY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
  64.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  65.  * PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
  66.  * BASIS, AND ERIK CORRY HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
  67.  * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */
  68. #include "display.h"
  69. #ifdef USE_DISPLAY
  70. #include <stdio.h>
  71. #include <stdlib.h>
  72. #include <math.h>
  73. #include <X11/Xlib.h>
  74. #include <X11/Xutil.h>
  75. #endif
  76. #ifdef USE_DISPLAY
  77. #undef INTERPOLATE
  78. #ifdef __cplusplus
  79. extern "C"
  80. {
  81. #endif
  82. EXTERN int horizontal_size, vertical_size, mb_width, mb_height;
  83. EXTERN int coded_picture_width, coded_picture_height;
  84. EXTERN int ref_coded_picture_width, ref_coded_picture_height;
  85. EXTERN int chrom_width, chrom_height, blk_cnt;
  86. EXTERN int ref_chrom_width, ref_chrom_height;
  87. extern int expand;
  88. /* Erik Corry's multi-byte dither routines.
  89.  * 
  90.  * The basic idea is that the Init generates all the necessary tables. The
  91.  * tables incorporate the information about the layout of pixels in the
  92.  * XImage, so that it should be able to cope with 15-bit, 16-bit 24-bit
  93.  * (non-packed) and 32-bit (10-11 bits per color!) screens. At present it
  94.  * cannot cope with 24-bit packed mode, since this involves getting down
  95.  * to byte level again. It is assumed that the bits for each color are
  96.  * contiguous in the longword.
  97.  * 
  98.  * Writing to memory is done in shorts or ints. (Unfortunately, short is not
  99.  * very fast on Alpha, so there is room for improvement here). There is no
  100.  * dither time check for overflow - instead the tables have slack at each
  101.  * end. This is likely to be faster than an 'if' test as many modern
  102.  * architectures are really bad at ifs. Potentially, each '&&' causes a
  103.  * pipeline flush!
  104.  * 
  105.  * There is no shifting and fixed point arithmetic, as I really doubt you can
  106.  * see the difference, and it costs. This may be just my bias, since I
  107.  * heard that Intel is really bad at shifting. */
  108. /* Gamma correction stuff */
  109. #define GAMMA_CORRECTION(x) ((int)(pow((x) / 255.0, 1.0 / gammaCorrect) * 255.0))
  110. #define CHROMA_CORRECTION256(x) ((x) >= 128 
  111.                     ? 128 + mmin(127, (int)(((x) - 128.0) * chromaCorrect)) 
  112.                     : 128 - mmin(128, (int)((128.0 - (x)) * chromaCorrect)))
  113. #define CHROMA_CORRECTION128(x) ((x) >= 0 
  114.                     ? mmin(127,  (int)(((x) * chromaCorrect))) 
  115.                     : mmax(-128, (int)(((x) * chromaCorrect))))
  116. #define CHROMA_CORRECTION256D(x) ((x) >= 128 
  117.                     ? 128.0 + mmin(127.0, (((x) - 128.0) * chromaCorrect)) 
  118.                     : 128.0 - mmin(128.0, (((128.0 - (x)) * chromaCorrect))))
  119. #define CHROMA_CORRECTION128D(x) ((x) >= 0 
  120.                     ? mmin(127.0,  ((x) * chromaCorrect)) 
  121.                     : mmax(-128.0, ((x) * chromaCorrect)))
  122. /* Flag for gamma correction */
  123. int gammaCorrectFlag = 0;
  124. double gammaCorrect = 1.0;
  125. /* Flag for chroma correction */
  126. int chromaCorrectFlag = 0;
  127. double chromaCorrect = 1.0;
  128. /* How many 1 bits are there in the longword. Low performance, do not call
  129.  * often. */
  130. static int
  131.  number_of_bits_set (a)
  132.   unsigned long a;
  133. {
  134.   if (!a)
  135.     return 0;
  136.   if (a & 1)
  137.     return 1 + number_of_bits_set (a >> 1);
  138.   return (number_of_bits_set (a >> 1));
  139. }
  140. /* Shift the 0s in the least significant end out of the longword. Low
  141.  * performance, do not call often. */
  142. static unsigned long
  143.  shifted_down (a)
  144.   unsigned long a;
  145. {
  146.   if (!a)
  147.     return 0;
  148.   if (a & 1)
  149.     return a;
  150.   return a >> 1;
  151. }
  152. /* How many 0 bits are there at most significant end of longword. Low
  153.  * performance, do not call often. */
  154. static int
  155.  free_bits_at_top (a)
  156.   unsigned long a;
  157. {
  158.   /* assume char is 8 bits */
  159.   if (!a)
  160.     return sizeof (unsigned long) * 8;
  161.   /* assume twos complement */
  162.   if (((long) a) < 0l)
  163.     return 0;
  164.   return 1 + free_bits_at_top (a << 1);
  165. }
  166. /* How many 0 bits are there at least significant end of longword. Low
  167.  * performance, do not call often. */
  168. static int
  169.  free_bits_at_bottom (a)
  170.   unsigned long a;
  171. {
  172.   /* assume char is 8 bits */
  173.   if (!a)
  174.     return sizeof (unsigned long) * 8;
  175.   if (((long) a) & 1l)
  176.     return 0;
  177.   return 1 + free_bits_at_bottom (a >> 1);
  178. }
  179. static int *L_tab, *Cr_r_tab, *Cr_g_tab, *Cb_g_tab, *Cb_b_tab;
  180. /* We define tables that convert a color value between -256 and 512 into
  181.  * the R, G and B parts of the pixel. The normal range is 0-255. */
  182. static long *r_2_pix;
  183. static long *g_2_pix;
  184. static long *b_2_pix;
  185. static long *r_2_pix_alloc;
  186. static long *g_2_pix_alloc;
  187. static long *b_2_pix_alloc;
  188. /* --------------------------------------------------------------
  189.  * 
  190.  * InitColor16Dither --
  191.  * 
  192.  * To get rid of the multiply and other conversions in color dither, we use a
  193.  * lookup table.
  194.  * 
  195.  * Results: None.
  196.  * 
  197.  * Side effects: The lookup tables are initialized.
  198.  * 
  199.  * -------------------------------------------------------------- */
  200. void
  201.  InitColorDither (thirty2)
  202.   int thirty2;
  203. {
  204.   extern XImage *ximage;
  205.   extern unsigned long wpixel[3];
  206.   /* misuse of the wpixel array for the pixel masks. Note that this
  207.    * implies that the window is created before this routine is called */
  208.   unsigned long red_mask = wpixel[0];
  209.   unsigned long green_mask = wpixel[1];
  210.   unsigned long blue_mask = wpixel[2];
  211.   int CR, CB, i;
  212.   if (ximage->bits_per_pixel == 24) /* not necessary in non-packed mode */
  213.     init_dither_tab ();
  214.   L_tab = (int *) malloc (256 * sizeof (int));
  215.   Cr_r_tab = (int *) malloc (256 * sizeof (int));
  216.   Cr_g_tab = (int *) malloc (256 * sizeof (int));
  217.   Cb_g_tab = (int *) malloc (256 * sizeof (int));
  218.   Cb_b_tab = (int *) malloc (256 * sizeof (int));
  219.   r_2_pix_alloc = (long *) malloc (768 * sizeof (long));
  220.   g_2_pix_alloc = (long *) malloc (768 * sizeof (long));
  221.   b_2_pix_alloc = (long *) malloc (768 * sizeof (long));
  222.   if (L_tab == NULL ||
  223.       Cr_r_tab == NULL ||
  224.       Cr_g_tab == NULL ||
  225.       Cb_g_tab == NULL ||
  226.       Cb_b_tab == NULL ||
  227.       r_2_pix_alloc == NULL ||
  228.       g_2_pix_alloc == NULL ||
  229.       b_2_pix_alloc == NULL)
  230.   {
  231.     perror("nerror: Could not get enough memory in InitColorDithern");
  232. //    AfxMessageBox("error: Could not get enough memory in InitColorDither nnForce out !! See trace out please"); AfxEndThread(-9);
  233.   }
  234.   for (i = 0; i < 256; i++)
  235.   {
  236.     L_tab[i] = i;
  237.     if (gammaCorrectFlag)
  238.     {
  239.       L_tab[i] = GAMMA_CORRECTION (i);
  240.     }
  241.     CB = CR = i;
  242.     if (chromaCorrectFlag)
  243.     {
  244.       CB -= 128;
  245.       CB = CHROMA_CORRECTION128 (CB);
  246.       CR -= 128;
  247.       CR = CHROMA_CORRECTION128 (CR);
  248.     } else
  249.     {
  250.       CB -= 128;
  251.       CR -= 128;
  252.     }
  253.     /* was Cr_r_tab[i] =  1.596 * CR; Cr_g_tab[i] = -0.813 * CR;
  254.      * Cb_g_tab[i] = -0.391 * CB;   Cb_b_tab[i] =  2.018 * CB; but they
  255.      * were just messed up. Then was (_Video Deymstified_): Cr_r_tab[i] =
  256.      * 1.366 * CR; Cr_g_tab[i] = -0.700 * CR; Cb_g_tab[i] = -0.334 * CB;
  257.      * Cb_b_tab[i] =  1.732 * CB; but really should be: (from ITU-R
  258.      * BT.470-2 System B, G and SMPTE 170M ) */
  259.     Cr_r_tab[i] = (0.419 / 0.299) * CR;
  260.     Cr_g_tab[i] = -(0.299 / 0.419) * CR;
  261.     Cb_g_tab[i] = -(0.114 / 0.331) * CB;
  262.     Cb_b_tab[i] = (0.587 / 0.331) * CB;
  263.     /* though you could argue for: SMPTE 240M Cr_r_tab[i] =  (0.445/0.212) *
  264.      * CR; Cr_g_tab[i] = -(0.212/0.445) * CR; Cb_g_tab[i] = -(0.087/0.384) *
  265.      * CB; Cb_b_tab[i] =  (0.701/0.384) * CB; FCC Cr_r_tab[i] =
  266.      * (0.421/0.30) * CR; Cr_g_tab[i] = -(0.30/0.421) * CR; Cb_g_tab[i] =
  267.      * -(0.11/0.331) * CB; Cb_b_tab[i] =  (0.59/0.331) * CB; ITU-R BT.709
  268.      * Cr_r_tab[i] =  (0.454/0.2125) * CR; Cr_g_tab[i] = -(0.2125/0.454) *
  269.      * CR; Cb_g_tab[i] = -(0.0721/0.386) * CB; Cb_b_tab[i] =
  270.      * (0.7154/0.386) * CB; */
  271.   }
  272.   /* Set up entries 0-255 in rgb-to-pixel value tables. */
  273.   for (i = 0; i < 256; i++)
  274.   {
  275.     r_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (red_mask));
  276.     r_2_pix_alloc[i + 256] <<= free_bits_at_bottom (red_mask);
  277.     g_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (green_mask));
  278.     g_2_pix_alloc[i + 256] <<= free_bits_at_bottom (green_mask);
  279.     b_2_pix_alloc[i + 256] = i >> (8 - number_of_bits_set (blue_mask));
  280.     b_2_pix_alloc[i + 256] <<= free_bits_at_bottom (blue_mask);
  281.     /* If we have 16-bit output depth, then we double the value in the top
  282.      * word. This means that we can write out both pixels in the pixel
  283.      * doubling mode with one op. It is harmless in the normal case as
  284.      * storing a 32-bit value through a short pointer will lose the top
  285.      * bits anyway. A similar optimisation for Alpha for 64 bit has been
  286.      * prepared for, but is not yet implemented. */
  287.     if (!thirty2)
  288.     {
  289.       r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 16;
  290.       g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 16;
  291.       b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 16;
  292.     }
  293. #ifdef SIXTYFOUR_BIT
  294.     if (thirty2)
  295.     {
  296.       r_2_pix_alloc[i + 256] |= (r_2_pix_alloc[i + 256]) << 32;
  297.       g_2_pix_alloc[i + 256] |= (g_2_pix_alloc[i + 256]) << 32;
  298.       b_2_pix_alloc[i + 256] |= (b_2_pix_alloc[i + 256]) << 32;
  299.     }
  300. #endif
  301.   }
  302.   /* Spread out the values we have to the rest of the array so that we do
  303.    * not need to check for overflow. */
  304.   for (i = 0; i < 256; i++)
  305.   {
  306.     r_2_pix_alloc[i] = r_2_pix_alloc[256];
  307.     r_2_pix_alloc[i + 512] = r_2_pix_alloc[511];
  308.     g_2_pix_alloc[i] = g_2_pix_alloc[256];
  309.     g_2_pix_alloc[i + 512] = g_2_pix_alloc[511];
  310.     b_2_pix_alloc[i] = b_2_pix_alloc[256];
  311.     b_2_pix_alloc[i + 512] = b_2_pix_alloc[511];
  312.   }
  313.   r_2_pix = r_2_pix_alloc + 256;
  314.   g_2_pix = g_2_pix_alloc + 256;
  315.   b_2_pix = b_2_pix_alloc + 256;
  316. }
  317. /* --------------------------------------------------------------
  318.  * 
  319.  * Color16DitherImage --
  320.  * 
  321.  * Converts image into 16 bit color.
  322.  * 
  323.  * Results: None.
  324.  * 
  325.  * Side effects: None.
  326.  * 
  327.  * -------------------------------------------------------------- */
  328. void
  329.  Color16DitherImage (src, out)
  330.   unsigned char *src[];
  331. unsigned char *out;
  332. {
  333.   unsigned char *lum = src[0];
  334.   unsigned char *cb = src[1];
  335.   unsigned char *cr = src[2];
  336.   int cols;
  337.   int rows;
  338.   int L, CR, CB;
  339.   unsigned short *row1, *row2;
  340.   unsigned char *lum2;
  341.   int x, y;
  342.   int cr_r;
  343.   int cr_g;
  344.   int cb_g;
  345.   int cb_b;
  346.   int cols_2;
  347.   cols = coded_picture_width;
  348.   rows = coded_picture_height;
  349.   if (expand)
  350.   {
  351.     cols *= 2;
  352.     rows *= 2;
  353.   }
  354.   cols_2 = cols / 2;
  355.   row1 = (unsigned short *) out;
  356.   row2 = row1 + cols_2 + cols_2;
  357.   lum2 = lum + cols_2 + cols_2;
  358.   for (y = 0; y < rows; y += 2)
  359.   {
  360.     for (x = 0; x < cols_2; x++)
  361.     {
  362.       int R, G, B;
  363.       CR = *cr++;
  364.       CB = *cb++;
  365.       cr_r = Cr_r_tab[CR];
  366.       cr_g = Cr_g_tab[CR];
  367.       cb_g = Cb_g_tab[CB];
  368.       cb_b = Cb_b_tab[CB];
  369.       L = L_tab[(int) *lum++];
  370.       R = L + cr_r;
  371.       G = L + cr_g + cb_g;
  372.       B = L + cb_b;
  373.       *row1++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  374. #ifdef INTERPOLATE
  375.       if (x != cols_2 - 1)
  376.       {
  377.         CR = (CR + *cr) >> 1;
  378.         CB = (CB + *cb) >> 1;
  379.         cr_r = Cr_r_tab[CR];
  380.         cr_g = Cr_g_tab[CR];
  381.         cb_g = Cb_g_tab[CB];
  382.         cb_b = Cb_b_tab[CB];
  383.       }
  384. #endif
  385.       L = L_tab[(int) *lum++];
  386.       R = L + cr_r;
  387.       G = L + cr_g + cb_g;
  388.       B = L + cb_b;
  389.       *row1++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  390.       /* Now, do second row. */
  391. #ifdef INTERPOLATE
  392.       if (y != rows - 2)
  393.       {
  394.         CR = (CR + *(cr + cols_2 - 1)) >> 1;
  395.         CB = (CB + *(cb + cols_2 - 1)) >> 1;
  396.         cr_r = Cr_r_tab[CR];
  397.         cr_g = Cr_g_tab[CR];
  398.         cb_g = Cb_g_tab[CB];
  399.         cb_b = Cb_b_tab[CB];
  400.       }
  401. #endif
  402.       L = L_tab[(int) *lum2++];
  403.       R = L + cr_r;
  404.       G = L + cr_g + cb_g;
  405.       B = L + cb_b;
  406.       *row2++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  407.       L = L_tab[(int) *lum2++];
  408.       R = L + cr_r;
  409.       G = L + cr_g + cb_g;
  410.       B = L + cb_b;
  411.       *row2++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  412.     }
  413.     /* These values are at the start of the next line, (due to the ++'s
  414.      * above),but they need to be at the start of the line after that. */
  415.     lum += cols_2 + cols_2;
  416.     lum2 += cols_2 + cols_2;
  417.     row1 += cols_2 + cols_2;
  418.     row2 += cols_2 + cols_2;
  419.   }
  420. }
  421. /* --------------------------------------------------------------
  422.  * 
  423.  * Color32DitherImage --
  424.  * 
  425.  * Converts image into 32 bit color (or 24-bit non-packed).
  426.  * 
  427.  * Results: None.
  428.  * 
  429.  * Side effects: None.
  430.  * 
  431.  * -------------------------------------------------------------- */
  432. /* This is a copysoft version of the function above with ints instead of
  433.  * shorts to cause a 4-byte pixel size */
  434. void
  435.  Color32DitherImage (src, out)
  436.   unsigned char *src[];
  437. unsigned char *out;
  438. {
  439.   unsigned char *lum = src[0];
  440.   unsigned char *cb = src[1];
  441.   unsigned char *cr = src[2];
  442.   int cols;
  443.   int rows;
  444.   int L, CR, CB;
  445.   unsigned int *row1, *row2;
  446.   unsigned char *lum2;
  447.   int x, y;
  448.   int cr_r;
  449.   int cr_g;
  450.   int cb_g;
  451.   int cb_b;
  452.   int cols_2;
  453.   cols = coded_picture_width;
  454.   rows = coded_picture_height;
  455.   if (expand)
  456.   {
  457.     cols *= 2;
  458.     rows *= 2;
  459.   }
  460.   cols_2 = cols / 2;
  461.   row1 = (unsigned int *) out;
  462.   row2 = row1 + cols_2 + cols_2;
  463.   lum2 = lum + cols_2 + cols_2;
  464.   for (y = 0; y < rows; y += 2)
  465.   {
  466.     for (x = 0; x < cols_2; x++)
  467.     {
  468.       int R, G, B;
  469.       CR = *cr++;
  470.       CB = *cb++;
  471.       cr_r = Cr_r_tab[CR];
  472.       cr_g = Cr_g_tab[CR];
  473.       cb_g = Cb_g_tab[CB];
  474.       cb_b = Cb_b_tab[CB];
  475.       L = L_tab[(int) *lum++];
  476.       R = L + cr_r;
  477.       G = L + cr_g + cb_g;
  478.       B = L + cb_b;
  479.       *row1++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  480. #ifdef INTERPOLATE
  481.       if (x != cols_2 - 1)
  482.       {
  483.         CR = (CR + *cr) >> 1;
  484.         CB = (CB + *cb) >> 1;
  485.         cr_r = Cr_r_tab[CR];
  486.         cr_g = Cr_g_tab[CR];
  487.         cb_g = Cb_g_tab[CB];
  488.         cb_b = Cb_b_tab[CB];
  489.       }
  490. #endif
  491.       L = L_tab[(int) *lum++];
  492.       R = L + cr_r;
  493.       G = L + cr_g + cb_g;
  494.       B = L + cb_b;
  495.       *row1++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  496.       /* Now, do second row. */
  497. #ifdef INTERPOLATE
  498.       if (y != rows - 2)
  499.       {
  500.         CR = (CR + *(cr + cols_2 - 1)) >> 1;
  501.         CB = (CB + *(cb + cols_2 - 1)) >> 1;
  502.         cr_r = Cr_r_tab[CR];
  503.         cr_g = Cr_g_tab[CR];
  504.         cb_g = Cb_g_tab[CB];
  505.         cb_b = Cb_b_tab[CB];
  506.       }
  507. #endif
  508.       L = L_tab[(int) *lum2++];
  509.       R = L + cr_r;
  510.       G = L + cr_g + cb_g;
  511.       B = L + cb_b;
  512.       *row2++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  513.       L = L_tab[(int) *lum2++];
  514.       R = L + cr_r;
  515.       G = L + cr_g + cb_g;
  516.       B = L + cb_b;
  517.       *row2++ = (r_2_pix[R] | g_2_pix[G] | b_2_pix[B]);
  518.     }
  519.     lum += cols_2 + cols_2;
  520.     lum2 += cols_2 + cols_2;
  521.     row1 += cols_2 + cols_2;
  522.     row2 += cols_2 + cols_2;
  523.   }
  524. }
  525. #ifdef __cplusplus
  526. }
  527. #endif
  528. #endif