recon.c
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:15k
源码类别:

Windows Mobile

开发平台:

C/C++

  1. /* Predict.c, motion compensation routines                                    */
  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 "config.h"
  29. #include "global.h"
  30. /* private prototypes */
  31. static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
  32.   unsigned char *dst[], int dfield,
  33.   int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
  34.   int average_flag));
  35. static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
  36.   int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
  37. void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
  38. int bx, by;
  39. int macroblock_type;
  40. int motion_type;
  41. int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
  42. int stwtype;
  43. {
  44.   int currentfield;
  45.   unsigned char **predframe;
  46.   int DMV[2][2];
  47.   int stwtop, stwbot;
  48.   stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
  49.   stwbot = stwtype/3;
  50.   if ((macroblock_type & MACROBLOCK_MOTION_FORWARD) 
  51.    || (picture_coding_type==P_TYPE))
  52.   {
  53.     if (picture_structure==FRAME_PICTURE)
  54.     {
  55.       if ((motion_type==MC_FRAME) 
  56.         || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  57.       {
  58.         /* frame-based prediction (broken into top and bottom halves
  59.              for spatial scalability prediction purposes) */
  60.         if (stwtop<2)
  61.           form_prediction(forward_reference_frame,0,current_frame,0,
  62.             Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
  63.             PMV[0][0][0],PMV[0][0][1],stwtop);
  64.         if (stwbot<2)
  65.           form_prediction(forward_reference_frame,1,current_frame,1,
  66.             Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
  67.             PMV[0][0][0],PMV[0][0][1],stwbot);
  68.       }
  69.       else if (motion_type==MC_FIELD) /* field-based prediction */
  70.       {
  71.         /* top field prediction */
  72.         if (stwtop<2)
  73.           form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
  74.             current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  75.             bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
  76.         /* bottom field prediction */
  77.         if (stwbot<2)
  78.           form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
  79.             current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  80.             bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
  81.       }
  82.       else if (motion_type==MC_DMV) /* dual prime prediction */
  83.       {
  84.         /* calculate derived motion vectors */
  85.         Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
  86.         if (stwtop<2)
  87.         {
  88.           /* predict top field from top field */
  89.           form_prediction(forward_reference_frame,0,current_frame,0,
  90.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
  91.             PMV[0][0][0],PMV[0][0][1]>>1,0);
  92.           /* predict and add to top field from bottom field */
  93.           form_prediction(forward_reference_frame,1,current_frame,0,
  94.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
  95.             DMV[0][0],DMV[0][1],1);
  96.         }
  97.         if (stwbot<2)
  98.         {
  99.           /* predict bottom field from bottom field */
  100.           form_prediction(forward_reference_frame,1,current_frame,1,
  101.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
  102.             PMV[0][0][0],PMV[0][0][1]>>1,0);
  103.           /* predict and add to bottom field from top field */
  104.           form_prediction(forward_reference_frame,0,current_frame,1,
  105.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
  106.             DMV[1][0],DMV[1][1],1);
  107.         }
  108.       }
  109.       else
  110.         /* invalid motion_type */
  111.         printf("invalid motion_typen");
  112.     }
  113.     else /* TOP_FIELD or BOTTOM_FIELD */
  114.     {
  115.       /* field picture */
  116.       currentfield = (picture_structure==BOTTOM_FIELD);
  117.       /* determine which frame to use for prediction */
  118.       if ((picture_coding_type==P_TYPE) && Second_Field
  119.          && (currentfield!=motion_vertical_field_select[0][0]))
  120.         predframe = backward_reference_frame; /* same frame */
  121.       else
  122.         predframe = forward_reference_frame; /* previous frame */
  123.       if ((motion_type==MC_FIELD)
  124.         || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
  125.       {
  126.         /* field-based prediction */
  127.         if (stwtop<2)
  128.           form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
  129.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
  130.             PMV[0][0][0],PMV[0][0][1],stwtop);
  131.       }
  132.       else if (motion_type==MC_16X8)
  133.       {
  134.         if (stwtop<2)
  135.         {
  136.           form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
  137.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
  138.             PMV[0][0][0],PMV[0][0][1],stwtop);
  139.           /* determine which frame to use for lower half prediction */
  140.           if ((picture_coding_type==P_TYPE) && Second_Field
  141.              && (currentfield!=motion_vertical_field_select[1][0]))
  142.             predframe = backward_reference_frame; /* same frame */
  143.           else
  144.             predframe = forward_reference_frame; /* previous frame */
  145.           form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
  146.             Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
  147.             PMV[1][0][0],PMV[1][0][1],stwtop);
  148.         }
  149.       }
  150.       else if (motion_type==MC_DMV) /* dual prime prediction */
  151.       {
  152.         if (Second_Field)
  153.           predframe = backward_reference_frame; /* same frame */
  154.         else
  155.           predframe = forward_reference_frame; /* previous frame */
  156.         /* calculate derived motion vectors */
  157.         Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
  158.         /* predict from field of same parity */
  159.         form_prediction(forward_reference_frame,currentfield,current_frame,0,
  160.           Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
  161.           PMV[0][0][0],PMV[0][0][1],0);
  162.         /* predict from field of opposite parity */
  163.         form_prediction(predframe,!currentfield,current_frame,0,
  164.           Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
  165.           DMV[0][0],DMV[0][1],1);
  166.       }
  167.       else
  168.         /* invalid motion_type */
  169.         printf("invalid motion_typen");
  170.     }
  171.     stwtop = stwbot = 1;
  172.   }
  173.   if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
  174.   {
  175.     if (picture_structure==FRAME_PICTURE)
  176.     {
  177.       if (motion_type==MC_FRAME)
  178.       {
  179.         /* frame-based prediction */
  180.         if (stwtop<2)
  181.           form_prediction(backward_reference_frame,0,current_frame,0,
  182.             Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
  183.             PMV[0][1][0],PMV[0][1][1],stwtop);
  184.         if (stwbot<2)
  185.           form_prediction(backward_reference_frame,1,current_frame,1,
  186.             Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
  187.             PMV[0][1][0],PMV[0][1][1],stwbot);
  188.       }
  189.       else /* field-based prediction */
  190.       {
  191.         /* top field prediction */
  192.         if (stwtop<2)
  193.           form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
  194.             current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  195.             bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
  196.         /* bottom field prediction */
  197.         if (stwbot<2)
  198.           form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
  199.             current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  200.             bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
  201.       }
  202.     }
  203.     else /* TOP_FIELD or BOTTOM_FIELD */
  204.     {
  205.       /* field picture */
  206.       if (motion_type==MC_FIELD)
  207.       {
  208.         /* field-based prediction */
  209.         form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
  210.           current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
  211.           bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
  212.       }
  213.       else if (motion_type==MC_16X8)
  214.       {
  215.         form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
  216.           current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  217.           bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
  218.         form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
  219.           current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
  220.           bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
  221.       }
  222.       else
  223.         /* invalid motion_type */
  224.         printf("invalid motion_typen");
  225.     }
  226.   }
  227. }
  228. static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
  229. unsigned char *src[]; /* prediction source buffer */
  230. int sfield;           /* prediction source field number (0 or 1) */
  231. unsigned char *dst[]; /* prediction destination buffer */
  232. int dfield;           /* prediction destination field number (0 or 1)*/
  233. int lx,lx2;           /* line strides */
  234. int w,h;              /* prediction block/sub-block width, height */
  235. int x,y;              /* pixel co-ordinates of top-left sample in current MB */
  236. int dx,dy;            /* horizontal, vertical prediction address */
  237. int average_flag;     /* add prediction error to prediction ? */
  238. {
  239.   /* Y */
  240.   form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
  241.     lx,lx2,w,h,x,y,dx,dy,average_flag);
  242.   if (chroma_format!=CHROMA444)
  243.   {
  244.     lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
  245.   }
  246.   if (chroma_format==CHROMA420)
  247.   {
  248.     h>>=1; y>>=1; dy/=2;
  249.   }
  250.   /* Cb */
  251.   form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
  252.     lx,lx2,w,h,x,y,dx,dy,average_flag);
  253.   /* Cr */
  254.   form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
  255.     lx,lx2,w,h,x,y,dx,dy,average_flag);
  256. }
  257. /* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
  258. /* NOTE: the arithmetic below produces numerically equivalent results
  259.  *  to 7.6.4, yet is more elegant. It differs in the following ways:
  260.  *
  261.  *   1. the vectors (dx, dy) are based on cartesian frame 
  262.  *      coordiantes along a half-pel grid (always positive numbers)
  263.  *      In contrast, vector[r][s][t] are differential (with positive and 
  264.  *      negative values). As a result, deriving the integer vectors 
  265.  *      (int_vec[t]) from dx, dy is accomplished by a simple right shift.
  266.  *
  267.  *   2. Half pel flags (xh, yh) are equivalent to the LSB (Least
  268.  *      Significant Bit) of the half-pel coordinates (dx,dy).
  269.  * 
  270.  *
  271.  *  NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
  272.  *  is distributed among several other stages.  This is accomplished by 
  273.  *  folding line offsets into the source and destination (src,dst)
  274.  *  addresses (note the call arguments to form_prediction() in Predict()),
  275.  *  line stride variables lx and lx2, the block dimension variables (w,h), 
  276.  *  average_flag, and by the very order in which Predict() is called.  
  277.  *  This implementation design (implicitly different than the spec) 
  278.  *  was chosen for its elegance.
  279. */
  280. static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
  281. unsigned char *src;
  282. unsigned char *dst;
  283. int lx;          /* raster line increment */ 
  284. int lx2;
  285. int w,h;
  286. int x,y;
  287. int dx,dy;
  288. int average_flag;      /* flag that signals bi-directional or Dual-Prime 
  289.                           averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
  290.                           a previously formed prediction has been stored in 
  291.                           pel_pred[] */
  292. {
  293.   int xint;      /* horizontal integer sample vector: analogous to int_vec[0] */
  294.   int yint;      /* vertical integer sample vectors: analogous to int_vec[1] */
  295.   int xh;        /* horizontal half sample flag: analogous to half_flag[0]  */
  296.   int yh;        /* vertical half sample flag: analogous to half_flag[1]  */
  297.   int i, j, v;
  298.   unsigned char *s;    /* source pointer: analogous to pel_ref[][]   */
  299.   unsigned char *d;    /* destination pointer:  analogous to pel_pred[][]  */
  300.   /* half pel scaling for integer vectors */
  301.   xint = dx>>1;
  302.   yint = dy>>1;
  303.   /* derive half pel flags */
  304.   xh = dx & 1;
  305.   yh = dy & 1;
  306.   /* compute the linear address of pel_ref[][] and pel_pred[][] 
  307.      based on cartesian/raster cordinates provided */
  308.   s = src + lx*(y+yint) + x + xint;
  309.   d = dst + lx*y + x;
  310.   if (!xh && !yh) /* no horizontal nor vertical half-pel */
  311.   {
  312.     if (average_flag)
  313.     {
  314.       for (j=0; j<h; j++)
  315.       {
  316.         for (i=0; i<w; i++)
  317.         {
  318.           v = d[i]+s[i];
  319.           d[i] = (v+(v>=0?1:0))>>1;
  320.         }
  321.       
  322.         s+= lx2;
  323.         d+= lx2;
  324.       }
  325.     }
  326.     else
  327.     {
  328.       for (j=0; j<h; j++)
  329.       {
  330.         for (i=0; i<w; i++)
  331.         {
  332.           d[i] = s[i];
  333.         }
  334.         
  335.         s+= lx2;
  336.         d+= lx2;
  337.       }
  338.     }
  339.   }
  340.   else if (!xh && yh) /* no horizontal but vertical half-pel */
  341.   {
  342.     if (average_flag)
  343.     {
  344.       for (j=0; j<h; j++)
  345.       {
  346.         for (i=0; i<w; i++)
  347.         {
  348.           v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
  349.           d[i]=(v+(v>=0?1:0))>>1;
  350.         }
  351.      
  352.         s+= lx2;
  353.         d+= lx2;
  354.       }
  355.     }
  356.     else
  357.     {
  358.       for (j=0; j<h; j++)
  359.       {
  360.         for (i=0; i<w; i++)
  361.         {
  362.           d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
  363.         }
  364.         s+= lx2;
  365.         d+= lx2;
  366.       }
  367.     }
  368.   }
  369.   else if (xh && !yh) /* horizontal but no vertical half-pel */
  370.   {
  371.     if (average_flag)
  372.     {
  373.       for (j=0; j<h; j++)
  374.       {
  375.         for (i=0; i<w; i++)
  376.         {
  377.           v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
  378.           d[i] = (v+(v>=0?1:0))>>1;
  379.         }
  380.      
  381.         s+= lx2;
  382.         d+= lx2;
  383.       }
  384.     }
  385.     else
  386.     {
  387.       for (j=0; j<h; j++)
  388.       {
  389.         for (i=0; i<w; i++)
  390.         {
  391.           d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
  392.         }
  393.         s+= lx2;
  394.         d+= lx2;
  395.       }
  396.     }
  397.   }
  398.   else /* if (xh && yh) horizontal and vertical half-pel */
  399.   {
  400.     if (average_flag)
  401.     {
  402.       for (j=0; j<h; j++)
  403.       {
  404.         for (i=0; i<w; i++)
  405.         {
  406.           v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
  407.           d[i] = (v+(v>=0?1:0))>>1;
  408.         }
  409.      
  410.         s+= lx2;
  411.         d+= lx2;
  412.       }
  413.     }
  414.     else
  415.     {
  416.       for (j=0; j<h; j++)
  417.       {
  418.         for (i=0; i<w; i++)
  419.         {
  420.           d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
  421.         }
  422.         s+= lx2;
  423.         d+= lx2;
  424.       }
  425.     }
  426.   }
  427. }