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

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 "dllindex.h"
  37. #include "h261defs.h"
  38. #include "h261func.h"
  39. #include "clip.h"
  40. #define FRACBITS        6   /* Fractional bits in IDCT computation */
  41. #define PIXEL_MIN       0
  42. #define PIXEL_MAX       255
  43. #define CLIPMARGIN      300
  44. #define CLIPMIN         (PIXEL_MIN - CLIPMARGIN)
  45. #define CLIPMAX         (PIXEL_MAX + CLIPMARGIN)
  46. extern PIXEL   clip[(CLIPMAX-CLIPMIN+1)];
  47. extern void idct2sum_clip(PIXEL x[], int xdim, S32 idct_out[8][4], int idct_class)
  48. {
  49. int i, temp;
  50. #ifdef LITTLE_ENDIAN
  51. int hi_clip0, hi_clip1, hi_clip2, hi_clip3;
  52. int lo_clip0, lo_clip1, lo_clip2, lo_clip3;
  53. switch (idct_class)
  54. // DC only case
  55. {
  56. case DC_ONLY:
  57. {
  58. temp = idct_out[0][0];
  59. lo_clip0 = -CLIPMIN + ((temp << 16) >> (FRACBITS + 16));
  60. hi_clip0 = -CLIPMIN + (temp >> (FRACBITS + 16));
  61.      for (i = 0; i < 8; i++) 
  62.      {
  63.         x[i*xdim] = clip[x[i*xdim]+lo_clip0];
  64.          x[i*xdim+1] = clip[x[i*xdim+1]+hi_clip0];
  65.          x[i*xdim+2] = clip[x[i*xdim+2]+lo_clip0];
  66.          x[i*xdim+3] = clip[x[i*xdim+3]+hi_clip0];
  67.          x[i*xdim+7] = clip[x[i*xdim+7]+lo_clip0];
  68.          x[i*xdim+6] = clip[x[i*xdim+6]+hi_clip0];
  69.          x[i*xdim+5] = clip[x[i*xdim+5]+lo_clip0];
  70.          x[i*xdim+4] = clip[x[i*xdim+4]+hi_clip0];
  71. }
  72. }
  73. break;  
  74. // DC + 1 horizontal AC case 
  75. case DC_AC_H:
  76. {
  77. temp = idct_out[0][0];
  78. lo_clip0 = -CLIPMIN + ((temp << 16) >> (FRACBITS + 16));
  79. hi_clip0 = -CLIPMIN + (temp >> (FRACBITS + 16));
  80. temp = idct_out[0][1];
  81. lo_clip1 = -CLIPMIN + ((temp << 16) >> (FRACBITS + 16));
  82. hi_clip1 = -CLIPMIN + (temp >> (FRACBITS + 16));
  83. temp = idct_out[0][2];
  84. lo_clip2 = -CLIPMIN + ((temp << 16) >> (FRACBITS + 16));
  85. hi_clip2 = -CLIPMIN + (temp >> (FRACBITS + 16));
  86. temp = idct_out[0][3];
  87. lo_clip3 = -CLIPMIN + ((temp << 16) >> (FRACBITS + 16));
  88. hi_clip3 = -CLIPMIN + (temp >> (FRACBITS + 16));
  89.      for (i = 0; i < 8; i++) 
  90.      {
  91.         x[i*xdim] = clip[x[i*xdim]+lo_clip0];
  92.          x[i*xdim+1] = clip[x[i*xdim+1]+hi_clip0];
  93.          x[i*xdim+2] = clip[x[i*xdim+2]+lo_clip1];
  94.          x[i*xdim+3] = clip[x[i*xdim+3]+hi_clip1];
  95.          x[i*xdim+7] = clip[x[i*xdim+7]+lo_clip2];
  96.          x[i*xdim+6] = clip[x[i*xdim+6]+hi_clip2];
  97.          x[i*xdim+5] = clip[x[i*xdim+5]+lo_clip3];
  98.          x[i*xdim+4] = clip[x[i*xdim+4]+hi_clip3];
  99. }
  100. }
  101. break;      
  102. case GENERAL:
  103. {
  104.      for (i = 0; i < 8; i++) 
  105.      {
  106.          temp = idct_out[i][0];
  107.          x[i*xdim] = clip[x[i*xdim] -CLIPMIN + ((temp << 16) >> (FRACBITS + 16))];
  108.          x[i*xdim+1] = clip[x[i*xdim+1] -CLIPMIN + (temp >> (FRACBITS + 16))];
  109.          temp = idct_out[i][1];
  110.          x[i*xdim+2] = clip[x[i*xdim+2] -CLIPMIN + ((temp << 16) >> (FRACBITS + 16))];
  111.          x[i*xdim+3] = clip[x[i*xdim+3] -CLIPMIN + (temp >> (FRACBITS + 16))];
  112.          temp = idct_out[i][2];
  113.          x[i*xdim+7] = clip[x[i*xdim+7] -CLIPMIN + ((temp << 16) >> (FRACBITS + 16))];
  114.          x[i*xdim+6] = clip[x[i*xdim+6] -CLIPMIN + (temp >> (FRACBITS + 16))];
  115.          temp = idct_out[i][3];
  116.           x[i*xdim+5] = clip[x[i*xdim+5] -CLIPMIN + ((temp << 16) >> (FRACBITS + 16))];
  117.          x[i*xdim+4] = clip[x[i*xdim+4] -CLIPMIN + (temp >> (FRACBITS + 16))];
  118. }
  119. }
  120. break;
  121. default:
  122. break;
  123. }
  124. #else
  125. for (i = 0; i < 8; i++)
  126.         {
  127.             int j;
  128.             // Notice the funky casts of idct_out, which needs to be treated
  129.             // as an S16 [8][8].
  130.             for (j = 0; j < 4; j++) {
  131.                 temp = ((S16 (*)[8]) idct_out)[i][j] >> FRACBITS;
  132.                 x[i*xdim+j] = clip[x[i*xdim+j] -CLIPMIN + temp];
  133.                 temp = ((S16 (*)[8]) idct_out)[i][j+4] >> FRACBITS;
  134.                 x[i*xdim+7-j] = clip[x[i*xdim+7-j] -CLIPMIN + temp];
  135.             }
  136.         }
  137. #endif
  138. }