yuv2rgb.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include <math.h>
  36. #include "nostatic/colorlib.h"
  37. #include "nostatic/yuv.h"
  38. /* macros to check big/little endiannes of the system: */
  39. //const static union {char c[4]; unsigned int l;} _1234 = {"01020304"};
  40. #if defined (_MACINTOSH) && defined (_DEBUG)
  41. #pragma global_optimizer on
  42. #endif
  43. /*
  44.  * Convert a value in the range of [-1,1],
  45.  * to a new range [l,h]; with a middle value equal to m.
  46.  */
  47. static double chrange (double x, double l, double m, double h)
  48. {
  49.     if (x >= 0.) {
  50.         if (x > 1.) x = 1.;
  51.         x = m + (h - m) * x;
  52.     } else {
  53.         if (x < -1.) x = -1.;
  54.         x = m + (m - l) * x;
  55.     }
  56.     return x;
  57. }
  58. /*
  59.  * Checks if variable is signicantly different from zero.
  60.  */
  61. static int is (double val)
  62. {
  63.     return fabs(val) > 0.01;   
  64. }
  65. /*
  66.  * Initializes "from/to I420" converters.
  67.  * Use:
  68.  *  void SetSrcI420Colors (float brightness, float contrast, float saturation, float hue);
  69.  *  void SetDestI420Colors (float brightness, float contrast, float saturation, float hue);
  70.  * Input:
  71.  *  brightness - brightness adjustment [-1,1], 0 - default;
  72.  *  contrast   - contrast adjustment   [-1,1], 0 - default;
  73.  *  saturation - saturation adjustment [-1,1], 0 - default;
  74.  *  hue        - hue adjustment        [-1,1], 0 - default;
  75.  * Returns:
  76.  *  none.
  77.  */
  78. void SetSrcI420Colors (float brightness, float contrast, float saturation, float hue,
  79.        color_data_t* pcd)
  80. {
  81.     /* check if we need to generate new color conversion tables: */
  82.     if (!pcd->color_conversion_tables_inited  ||
  83.         is (pcd->cur_brightness - brightness) ||
  84.         is (pcd->cur_contrast - contrast)     ||
  85.         is (pcd->cur_saturation - saturation) ||
  86.         is (pcd->cur_hue - hue)) {
  87.         double alpha, beta, gamma, kappa, lambda;
  88.         double cos_alpha, xi_sin_alpha, minus_zeta_sin_alpha;
  89.         register int i;
  90.         int default_palette_idx [RGB_MAX+1];
  91.         //Generate palette index.
  92.         for(i=0; i<=255; i++ )
  93.             default_palette_idx[i] = i;
  94.         /* hue: */
  95.         alpha = chrange (hue, ALPHA_MIN, ALPHA_MED, ALPHA_MAX);
  96.         cos_alpha = cos (alpha);
  97.         xi_sin_alpha = XI * sin (alpha);
  98.         minus_zeta_sin_alpha = -ZETA * sin (alpha);
  99. pcd->is_alpha = is (pcd->cur_hue = hue);
  100.         /* saturation: */
  101.         beta = chrange (saturation, BETA_MIN, BETA_MED, BETA_MAX);
  102.         pcd->is_beta = is (pcd->cur_saturation = saturation);
  103.         /* brightness: */
  104.         gamma = chrange (brightness, GAMMA_MIN, GAMMA_MED, GAMMA_MAX);
  105.         pcd->is_gamma = is (pcd->cur_brightness = brightness);
  106.         /* contrast: */
  107.         kappa = chrange (contrast, KAPPA_MIN, KAPPA_MED, KAPPA_MAX);
  108.         lambda = LAMBDA (kappa);
  109.         pcd->is_kappa = is (pcd->cur_contrast = contrast);
  110.         /*
  111.          * Check if we need to generate clip tables & default palette:
  112.          */
  113.         if (!pcd->color_conversion_tables_inited) {
  114.             /* Init clip tables. CLIP4/5/6 includes chop to 3/5/6 bits */
  115.             for (i = -CLIPNEG; i < CLIPRNG + CLIPPOS; i++) {
  116.                 if (i < 0)
  117.                 {
  118. #ifdef HELIX_FEATURE_CC_RGB444out                    
  119.                     CLIP4[i] = 0;
  120.                     CLIP8[i] = 0;
  121. #endif
  122. #ifdef HELIX_FEATURE_CC_RGB565out                    
  123.                     CLIP5[i] = 0;
  124.                     CLIP6[i] = 0;           /* clip */
  125. #endif                    
  126.                 }
  127.                 else if (i > 255)
  128.                 {
  129. #ifdef HELIX_FEATURE_CC_RGB444out                    
  130.                     CLIP4[i] = 255 >> 4;
  131.                     CLIP8[i] = /*JW255*/243;
  132. #endif                        
  133. #ifdef HELIX_FEATURE_CC_RGB565out
  134.                     CLIP5[i] = 255 >> 3;
  135.                     CLIP6[i] = 255 >> 2;    /* clip */
  136. #endif                    
  137.                 }
  138.                 else
  139.                 {
  140. #ifdef HELIX_FEATURE_CC_RGB444out                    
  141.                     CLIP4[i] = i >> 4;      /* chop to 4 bits */
  142.     if (i > 243)
  143.        CLIP8[i] = 243;
  144.     else
  145.        CLIP8[i] = i;        /* leave at 8 bits */
  146. #endif
  147. #ifdef HELIX_FEATURE_CC_RGB565out                    
  148.                     CLIP5[i] = i >> 3;      /* chop to 5 bits */
  149.                     CLIP6[i] = i >> 2;      /* chop to 6 bits */
  150. #endif                    
  151.                 }
  152.             }
  153.             /* set indicator: */
  154.             pcd->color_conversion_tables_inited ++;
  155.         }
  156.         /*
  157.          * Initialize color conversion tables.
  158.          */
  159.         for (i = 0; i < 256; i++) {
  160.             /* Y'Cr'Cb'->R'G'B' conversion tables: */
  161.             double y = lambda + (i - CCIR601_YOFFSET) * kappa; /* adjust contrast */
  162.             if (y < 0) y = 0; else if (y > CCIR601_YMAX) y = CCIR601_YMAX;
  163.             pcd->ytab  [i] = INT(y * YCOEF * gamma);
  164.             pcd->rvtab [i] = INT((i-CCIR601_VOFFSET) * cos_alpha * RVCOEF * beta * gamma);
  165.             pcd->gvtab [i] = INT((i-CCIR601_VOFFSET) * GVCOEF * beta * gamma);
  166.             pcd->bvtab [i] = INT((i-CCIR601_VOFFSET) * xi_sin_alpha * BUCOEF * beta * gamma);
  167.             pcd->rutab [i] = INT((i-CCIR601_UOFFSET) * minus_zeta_sin_alpha * RVCOEF * beta * gamma);
  168.             pcd->gutab [i] = INT((i-CCIR601_UOFFSET) * GUCOEF * beta * gamma);
  169.             pcd->butab [i] = INT((i-CCIR601_UOFFSET) * cos_alpha * BUCOEF * beta * gamma);
  170.         }
  171.     }
  172. }
  173. /*
  174.  * Checks format conversion parameters.
  175.  * Use:
  176.  *  int chk_args (unsigned char *dest_ptr, int dest_width, int dest_height,
  177.  *      int dest_pitch, int dest_x, int dest_y, int dest_dx, int dest_dy,
  178.  *      unsigned char *src_ptr, int src_width, int src_height,
  179.  *      int src_pitch, int src_x, int src_y, int src_dx, int src_dy,
  180.  *      int *p_scale_x, int *p_scale_y);
  181.  * Input:
  182.  *  dest_ptr - pointer to a destination buffer
  183.  *  dest_width, dest_height - width/height of the destination image (pixels)
  184.  *  dest_pitch - pitch of the dest. buffer (in bytes; <0 - if bottom up image)
  185.  *  dest_x, dest_y, dest_dx, dest_dy - destination rectangle (pixels)
  186.  *  src_ptr - pointer to an input image
  187.  *  src_width, src_height - width/height of the input image (pixels)
  188.  *  src_pitch - pitch of the source buffer (in bytes; <0 - if bottom up image)
  189.  *  src_x, src_y, src_dx, src_dy - source rectangle (pixels)
  190.  * Output:
  191.  *  p_scale_x, p_scale_y - scale factors for x,y axes
  192.  *      (currently only 1:1, and 2:1 scale factors are allowed)
  193.  * Returns:
  194.  *  0 - if success; -1 if failure.
  195.  */
  196. int
  197. chk_args (unsigned char *dest_ptr, int dest_width, int dest_height,
  198.     int dest_pitch, int dest_x, int dest_y, int dest_dx, int dest_dy,
  199.     unsigned char *src_ptr, int src_width, int src_height,
  200.     int src_pitch, int src_x, int src_y, int src_dx, int src_dy,
  201.     int *p_scale_x, int *p_scale_y)
  202. {
  203.     /* alignments: */
  204.     if (((unsigned)dest_ptr & 3) || (dest_pitch & 3) ||
  205.         ((unsigned)src_ptr  & 3) || (src_pitch  & 3) ||
  206.     /* image sizes: */
  207.         dest_width <= 0 || dest_height <= 0 ||
  208.         src_width  <= 0 || src_height  <= 0 ||
  209.     /* rectangles: */
  210.         dest_x < 0 || dest_y < 0 || dest_dx <= 0 || dest_dy <= 0 ||
  211.         src_x  < 0 || src_y  < 0 || src_dx  <= 0 || src_dy  <= 0 ||
  212.     /* overlaps: */
  213.         dest_width < dest_x + dest_dx || dest_height < dest_y + dest_dy ||
  214.         src_width  < src_x  + src_dx  || src_height  < src_y  + src_dy)
  215.         goto fail;
  216.     /* scale factors: */
  217.     if (dest_dx == src_dx)          *p_scale_x = 1; /* full res */
  218.     else if (dest_dx == 2 * src_dx) *p_scale_x = 2; /* double res */
  219.     else if (src_dx == 2 * dest_dx) *p_scale_x = 0; /* half res */
  220.     else goto fail;
  221.     if (dest_dy == src_dy)          *p_scale_y = 1; /* full res */
  222.     else if (dest_dy == 2 * src_dy) *p_scale_y = 2; /* double res */
  223.     else if (src_dx == 2 * dest_dx) *p_scale_y = 0; /* half res */
  224.     else goto fail;
  225.     /* success: */
  226.     return 1;
  227.     /* failure: */
  228. fail:
  229.     return 0;
  230. }
  231. int SetI420ChromaResamplingMode(int new_mode)
  232. {
  233.     return 0;
  234. }
  235. void InitColorData(color_data_t* pcd)
  236. {
  237.     pcd->color_conversion_tables_inited = 0;
  238.     pcd->is_alpha = 0;
  239.     pcd->is_beta  = 0;
  240.     pcd->is_gamma = 0;
  241.     pcd->is_kappa = 0;
  242.     
  243.     pcd->cur_brightness = 0;
  244.     pcd->cur_contrast   = 0;
  245.     pcd->cur_saturation = 0;
  246.     pcd->cur_hue        = 0;
  247. }