transfrm.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:7k
开发平台:

C/C++

  1. /* transfrm.c,  forward / inverse transformation                            */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include <math.h>
  29. #include "config.h"
  30. #include "global.h"
  31. /* private prototypes*/
  32. static void add_pred _ANSI_ARGS_((unsigned char *pred, unsigned char *cur,
  33.   int lx, short *blk));
  34. static void sub_pred _ANSI_ARGS_((unsigned char *pred, unsigned char *cur,
  35.   int lx, short *blk));
  36. /* subtract prediction and transform prediction error */
  37. void transform(pred,cur,mbi,blocks)
  38. unsigned char *pred[], *cur[];
  39. struct mbinfo *mbi;
  40. short blocks[][64];
  41. {
  42.   int i, j, i1, j1, k, n, cc, offs, lx;
  43.   k = 0;
  44.   for (j=0; j<height2; j+=16)
  45.     for (i=0; i<width; i+=16)
  46.     {
  47.       for (n=0; n<block_count; n++)
  48.       {
  49.         cc = (n<4) ? 0 : (n&1)+1; /* color component index */
  50.         if (cc==0)
  51.         {
  52.           /* luminance */
  53.           if ((pict_struct==FRAME_PICTURE) && mbi[k].dct_type)
  54.           {
  55.             /* field DCT */
  56.             offs = i + ((n&1)<<3) + width*(j+((n&2)>>1));
  57.             lx = width<<1;
  58.           }
  59.           else
  60.           {
  61.             /* frame DCT */
  62.             offs = i + ((n&1)<<3) + width2*(j+((n&2)<<2));
  63.             lx = width2;
  64.           }
  65.           if (pict_struct==BOTTOM_FIELD)
  66.             offs += width;
  67.         }
  68.         else
  69.         {
  70.           /* chrominance */
  71.           /* scale coordinates */
  72.           i1 = (chroma_format==CHROMA444) ? i : i>>1;
  73.           j1 = (chroma_format!=CHROMA420) ? j : j>>1;
  74.           if ((pict_struct==FRAME_PICTURE) && mbi[k].dct_type
  75.               && (chroma_format!=CHROMA420))
  76.           {
  77.             /* field DCT */
  78.             offs = i1 + (n&8) + chrom_width*(j1+((n&2)>>1));
  79.             lx = chrom_width<<1;
  80.           }
  81.           else
  82.           {
  83.             /* frame DCT */
  84.             offs = i1 + (n&8) + chrom_width2*(j1+((n&2)<<2));
  85.             lx = chrom_width2;
  86.           }
  87.           if (pict_struct==BOTTOM_FIELD)
  88.             offs += chrom_width;
  89.         }
  90.         sub_pred(pred[cc]+offs,cur[cc]+offs,lx,blocks[k*block_count+n]);
  91.         fdct(blocks[k*block_count+n]);
  92.       }
  93.       k++;
  94.     }
  95. }
  96. /* inverse transform prediction error and add prediction */
  97. void itransform(pred,cur,mbi,blocks)
  98. unsigned char *pred[],*cur[];
  99. struct mbinfo *mbi;
  100. short blocks[][64];
  101. {
  102.   int i, j, i1, j1, k, n, cc, offs, lx;
  103.   k = 0;
  104.   for (j=0; j<height2; j+=16)
  105.     for (i=0; i<width; i+=16)
  106.     {
  107.       for (n=0; n<block_count; n++)
  108.       {
  109.         cc = (n<4) ? 0 : (n&1)+1; /* color component index */
  110.         if (cc==0)
  111.         {
  112.           /* luminance */
  113.           if ((pict_struct==FRAME_PICTURE) && mbi[k].dct_type)
  114.           {
  115.             /* field DCT */
  116.             offs = i + ((n&1)<<3) + width*(j+((n&2)>>1));
  117.             lx = width<<1;
  118.           }
  119.           else
  120.           {
  121.             /* frame DCT */
  122.             offs = i + ((n&1)<<3) + width2*(j+((n&2)<<2));
  123.             lx = width2;
  124.           }
  125.           if (pict_struct==BOTTOM_FIELD)
  126.             offs += width;
  127.         }
  128.         else
  129.         {
  130.           /* chrominance */
  131.           /* scale coordinates */
  132.           i1 = (chroma_format==CHROMA444) ? i : i>>1;
  133.           j1 = (chroma_format!=CHROMA420) ? j : j>>1;
  134.           if ((pict_struct==FRAME_PICTURE) && mbi[k].dct_type
  135.               && (chroma_format!=CHROMA420))
  136.           {
  137.             /* field DCT */
  138.             offs = i1 + (n&8) + chrom_width*(j1+((n&2)>>1));
  139.             lx = chrom_width<<1;
  140.           }
  141.           else
  142.           {
  143.             /* frame DCT */
  144.             offs = i1 + (n&8) + chrom_width2*(j1+((n&2)<<2));
  145.             lx = chrom_width2;
  146.           }
  147.           if (pict_struct==BOTTOM_FIELD)
  148.             offs += chrom_width;
  149.         }
  150.         idct(blocks[k*block_count+n]);
  151.         add_pred(pred[cc]+offs,cur[cc]+offs,lx,blocks[k*block_count+n]);
  152.       }
  153.       k++;
  154.     }
  155. }
  156. /* add prediction and prediction error, saturate to 0...255 */
  157. static void add_pred(pred,cur,lx,blk)
  158. unsigned char *pred, *cur;
  159. int lx;
  160. short *blk;
  161. {
  162.   int i, j;
  163.   for (j=0; j<8; j++)
  164.   {
  165.     for (i=0; i<8; i++)
  166.       cur[i] = clp[blk[i] + pred[i]];
  167.     blk+= 8;
  168.     cur+= lx;
  169.     pred+= lx;
  170.   }
  171. }
  172. /* subtract prediction from block data */
  173. static void sub_pred(pred,cur,lx,blk)
  174. unsigned char *pred, *cur;
  175. int lx;
  176. short *blk;
  177. {
  178.   int i, j;
  179.   for (j=0; j<8; j++)
  180.   {
  181.     for (i=0; i<8; i++)
  182.       blk[i] = cur[i] - pred[i];
  183.     blk+= 8;
  184.     cur+= lx;
  185.     pred+= lx;
  186.   }
  187. }
  188. /*
  189.  * select between frame and field DCT
  190.  *
  191.  * preliminary version: based on inter-field correlation
  192.  */
  193. void dct_type_estimation(pred,cur,mbi)
  194. unsigned char *pred,*cur;
  195. struct mbinfo *mbi;
  196. {
  197.   short blk0[128], blk1[128];
  198.   int i, j, i0, j0, k, offs, s0, s1, sq0, sq1, s01;
  199.   double d, r;
  200.   k = 0;
  201.   for (j0=0; j0<height2; j0+=16)
  202.     for (i0=0; i0<width; i0+=16)
  203.     {
  204.       if (frame_pred_dct || pict_struct!=FRAME_PICTURE)
  205.         mbi[k].dct_type = 0;
  206.       else
  207.       {
  208.         /* interlaced frame picture */
  209.         /*
  210.          * calculate prediction error (cur-pred) for top (blk0)
  211.          * and bottom field (blk1)
  212.          */
  213.         for (j=0; j<8; j++)
  214.         {
  215.           offs = width*((j<<1)+j0) + i0;
  216.           for (i=0; i<16; i++)
  217.           {
  218.             blk0[16*j+i] = cur[offs] - pred[offs];
  219.             blk1[16*j+i] = cur[offs+width] - pred[offs+width];
  220.             offs++;
  221.           }
  222.         }
  223.         /* correlate fields */
  224.         s0=s1=sq0=sq1=s01=0;
  225.         for (i=0; i<128; i++)
  226.         {
  227.           s0+= blk0[i];
  228.           sq0+= blk0[i]*blk0[i];
  229.           s1+= blk1[i];
  230.           sq1+= blk1[i]*blk1[i];
  231.           s01+= blk0[i]*blk1[i];
  232.         }
  233.         d = (sq0-(s0*s0)/128.0)*(sq1-(s1*s1)/128.0);
  234.         if (d>0.0)
  235.         {
  236.           r = (s01-(s0*s1)/128.0)/sqrt(d);
  237.           if (r>0.5)
  238.             mbi[k].dct_type = 0; /* frame DCT */
  239.           else
  240.             mbi[k].dct_type = 1; /* field DCT */
  241.         }
  242.         else
  243.           mbi[k].dct_type = 1; /* field DCT */
  244.       }
  245.       k++;
  246.     }
  247. }