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

mpeg/mp3

开发平台:

Visual C++

  1. /************************************************************************
  2.  *
  3.  *  dither.c, pseudo colour dithering 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. /* based on mpeg2decode, (C) 1994, MPEG Software Simulation Group and
  52.  * mpeg2play, (C) 1994 Stefan Eckart <stefan@lis.e-technik.tu-muenchen.de>
  53.  * 
  54.  */
  55. #include <stdio.h>
  56. #include <stdlib.h>
  57. #include <X11/Xlib.h>
  58. #include <X11/Xutil.h>
  59. #include "display.h"
  60. #ifdef USE_DISPLAY
  61. extern unsigned char pixel[256];
  62. EXTERN int horizontal_size, vertical_size, mb_width, mb_height;
  63. EXTERN int coded_picture_width, coded_picture_height;
  64. EXTERN int ref_coded_picture_width, ref_coded_picture_height;
  65. EXTERN int chrom_width, chrom_height, blk_cnt;
  66. EXTERN int ref_chrom_width, ref_chrom_height;
  67. extern int expand;
  68. static unsigned char ytab[16 * (256 + 16)];
  69. static unsigned char uvtab[256 * 269 + 270];
  70. /****************************************************************************
  71.   4x4 ordered dither
  72.   Threshold pattern:
  73.      0  8  2 10
  74.     12  4 14  6
  75.      3 11  1  9
  76.     15  7 13  5
  77.  ****************************************************************************/
  78. void
  79.  ord4x4_dither_init (void)
  80. {
  81.   int i, j, v;
  82.   unsigned char ctab[256 + 32];
  83.   for (i = 0; i < 256 + 16; i++)
  84.   {
  85.     v = (i - 8) >> 4;
  86.     if (v < 2)
  87.       v = 2;
  88.     else if (v > 14)
  89.       v = 14;
  90.     for (j = 0; j < 16; j++)
  91.       ytab[16 * i + j] = pixel[(v << 4) + j];
  92.   }
  93.   for (i = 0; i < 256 + 32; i++)
  94.   {
  95.     v = (i + 48 - 128) >> 5;
  96.     if (v < 0)
  97.       v = 0;
  98.     else if (v > 3)
  99.       v = 3;
  100.     ctab[i] = v;
  101.   }
  102.   for (i = 0; i < 255 + 15; i++)
  103.     for (j = 0; j < 255 + 15; j++)
  104.       uvtab[256 * i + j] = (ctab[i + 16] << 6) | (ctab[j + 16] << 4) | (ctab[i] << 2) | ctab[j];
  105. }
  106. void
  107.  ord4x4_dither_frame (unsigned char *src[], unsigned char *dst)
  108. {
  109.   int i, j;
  110.   unsigned char *py = src[0];
  111.   unsigned char *pu = src[1];
  112.   unsigned char *pv = src[2];
  113.   int width, height, cwidth;
  114.   if (expand)
  115.   {
  116.     width = 2 * ref_coded_picture_width;
  117.     height = 2 * ref_coded_picture_height;
  118.     cwidth = 2 * ref_chrom_width;
  119.   } else
  120.   {
  121.     width = ref_coded_picture_width;
  122.     height = ref_coded_picture_height;
  123.     cwidth = ref_chrom_width;
  124.   }
  125.   for (j = 0; j < height; j += 4)
  126.   {
  127.     register unsigned int uv;
  128.     /* line j + 0 */
  129.     for (i = 0; i < width; i += 8)
  130.     {
  131.       uv = uvtab[(*pu++ << 8) | *pv++];
  132.       *dst++ = ytab[((*py++) << 4) | (uv & 15)];
  133.       *dst++ = ytab[((*py++ + 8) << 4) | (uv >> 4)];
  134.       uv = uvtab[((*pu++ << 8) | *pv++) + 1028];
  135.       *dst++ = ytab[((*py++ + 2) << 4) | (uv & 15)];
  136.       *dst++ = ytab[((*py++ + 10) << 4) | (uv >> 4)];
  137.       uv = uvtab[(*pu++ << 8) | *pv++];
  138.       *dst++ = ytab[((*py++) << 4) | (uv & 15)];
  139.       *dst++ = ytab[((*py++ + 8) << 4) | (uv >> 4)];
  140.       uv = uvtab[((*pu++ << 8) | *pv++) + 1028];
  141.       *dst++ = ytab[((*py++ + 2) << 4) | (uv & 15)];
  142.       *dst++ = ytab[((*py++ + 10) << 4) | (uv >> 4)];
  143.     }
  144.     pu -= cwidth;
  145.     pv -= cwidth;
  146.     /* line j + 1 */
  147.     for (i = 0; i < width; i += 8)
  148.     {
  149.       uv = uvtab[((*pu++ << 8) | *pv++) + 2056];
  150.       *dst++ = ytab[((*py++ + 12) << 4) | (uv >> 4)];
  151.       *dst++ = ytab[((*py++ + 4) << 4) | (uv & 15)];
  152.       uv = uvtab[((*pu++ << 8) | *pv++) + 3084];
  153.       *dst++ = ytab[((*py++ + 14) << 4) | (uv >> 4)];
  154.       *dst++ = ytab[((*py++ + 6) << 4) | (uv & 15)];
  155.       uv = uvtab[((*pu++ << 8) | *pv++) + 2056];
  156.       *dst++ = ytab[((*py++ + 12) << 4) | (uv >> 4)];
  157.       *dst++ = ytab[((*py++ + 4) << 4) | (uv & 15)];
  158.       uv = uvtab[((*pu++ << 8) | *pv++) + 3084];
  159.       *dst++ = ytab[((*py++ + 14) << 4) | (uv >> 4)];
  160.       *dst++ = ytab[((*py++ + 6) << 4) | (uv & 15)];
  161.     }
  162.     /* line j + 2 */
  163.     for (i = 0; i < width; i += 8)
  164.     {
  165.       uv = uvtab[((*pu++ << 8) | *pv++) + 1542];
  166.       *dst++ = ytab[((*py++ + 3) << 4) | (uv & 15)];
  167.       *dst++ = ytab[((*py++ + 11) << 4) | (uv >> 4)];
  168.       uv = uvtab[((*pu++ << 8) | *pv++) + 514];
  169.       *dst++ = ytab[((*py++ + 1) << 4) | (uv & 15)];
  170.       *dst++ = ytab[((*py++ + 9) << 4) | (uv >> 4)];
  171.       uv = uvtab[((*pu++ << 8) | *pv++) + 1542];
  172.       *dst++ = ytab[((*py++ + 3) << 4) | (uv & 15)];
  173.       *dst++ = ytab[((*py++ + 11) << 4) | (uv >> 4)];
  174.       uv = uvtab[((*pu++ << 8) | *pv++) + 514];
  175.       *dst++ = ytab[((*py++ + 1) << 4) | (uv & 15)];
  176.       *dst++ = ytab[((*py++ + 9) << 4) | (uv >> 4)];
  177.     }
  178.     pu -= cwidth;
  179.     pv -= cwidth;
  180.     /* line j + 3 */
  181.     for (i = 0; i < width; i += 8)
  182.     {
  183.       uv = uvtab[((*pu++ << 8) | *pv++) + 3598];
  184.       *dst++ = ytab[((*py++ + 15) << 4) | (uv >> 4)];
  185.       *dst++ = ytab[((*py++ + 7) << 4) | (uv & 15)];
  186.       uv = uvtab[((*pu++ << 8) | *pv++) + 2570];
  187.       *dst++ = ytab[((*py++ + 13) << 4) | (uv >> 4)];
  188.       *dst++ = ytab[((*py++ + 5) << 4) | (uv & 15)];
  189.       uv = uvtab[((*pu++ << 8) | *pv++) + 3598];
  190.       *dst++ = ytab[((*py++ + 15) << 4) | (uv >> 4)];
  191.       *dst++ = ytab[((*py++ + 7) << 4) | (uv & 15)];
  192.       uv = uvtab[((*pu++ << 8) | *pv++) + 2570];
  193.       *dst++ = ytab[((*py++ + 13) << 4) | (uv >> 4)];
  194.       *dst++ = ytab[((*py++ + 5) << 4) | (uv & 15)];
  195.     }
  196.   }
  197. }
  198. #endif