spatscal.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:7k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   File: spatscal.cc
  3. */
  4. #include "all.hh"
  5. #include <string.h>
  6. static void spatpred(int prog_frame, int llprog_frame,
  7.      unsigned char *fld0, unsigned char *fld1, short *tmp, unsigned char *dst,
  8.      int llx0, int lly0, int llw, int llh, int horizontal_size, int vertical_size,
  9.      int vm, int vn, int hm, int hn, int aperture);
  10. static void deinterlace(unsigned char *fld0, unsigned char *fld1,
  11. int j0, int lx, int ly, int aperture);
  12. static void subv(unsigned char *s, short *d,
  13.  int lx, int lys, int lyd, int m, int n, int j0, int dj);
  14. static void subh(short *s, unsigned char *d,
  15.  int x0, int lx, int lxs, int lxd, int ly, int m, int n);
  16. /* get reference frame */
  17. void getspatref(){
  18.   int i, j, llw2, llh2;
  19.   FILE *fd;
  20.   char fname[80];
  21.   llw2 = llw>>1;
  22.   llh2 = llh>>1;
  23.   sprintf(fname,llinputname,lltempref,'a');
  24.   strcat(fname,".Y");
  25.   if (verbose>1)
  26.     printf("reading %sn",fname);
  27.   fd=fopen(fname,"rb");
  28.   for (j=0; j<llh; j+=2)
  29.     for (i=0; i<llw; i++)
  30.       llframe0[0][llw*j+i]=getc(fd);
  31.   fclose(fd);
  32.   sprintf(fname,llinputname,lltempref,'b');
  33.   strcat(fname,".Y");
  34.   if (verbose>1)
  35.     printf("reading %sn",fname);
  36.   fd=fopen(fname,"rb");
  37.   for (j=1; j<llh; j+=2)
  38.     for (i=0; i<llw; i++)
  39.       llframe1[0][llw*j+i]=getc(fd);
  40.   fclose(fd);
  41.   sprintf(fname,llinputname,lltempref,'a');
  42.   strcat(fname,".U");
  43.   if (verbose>1)
  44.     printf("reading %sn",fname);
  45.   fd=fopen(fname,"rb");
  46.   for (j=0; j<llh2; j+=2)
  47.     for (i=0; i<llw2; i++)
  48.       llframe0[1][llw2*j+i]=getc(fd);
  49.   fclose(fd);
  50.   sprintf(fname,llinputname,lltempref,'b');
  51.   strcat(fname,".U");
  52.   if (verbose>1)
  53.     printf("reading %sn",fname);
  54.   fd=fopen(fname,"rb");
  55.   for (j=1; j<llh2; j+=2)
  56.     for (i=0; i<llw2; i++)
  57.       llframe1[1][llw2*j+i]=getc(fd);
  58.   fclose(fd);
  59.   sprintf(fname,llinputname,lltempref,'a');
  60.   strcat(fname,".V");
  61.   if (verbose>1)
  62.     printf("reading %sn",fname);
  63.   fd=fopen(fname,"rb");
  64.   for (j=0; j<llh2; j+=2)
  65.     for (i=0; i<llw2; i++)
  66.       llframe0[2][llw2*j+i]=getc(fd);
  67.   fclose(fd);
  68.   sprintf(fname,llinputname,lltempref,'b');
  69.   strcat(fname,".V");
  70.   if (verbose>1)
  71.     printf("reading %sn",fname);
  72.   fd=fopen(fname,"rb");
  73.   for (j=1; j<llh2; j+=2)
  74.     for (i=0; i<llw2; i++)
  75.       llframe1[2][llw2*j+i]=getc(fd);
  76.   fclose(fd);
  77.   spatpred(prog_frame,llprog_frame,llframe0[0],llframe1[0],lltmp,newframe[0],
  78.     llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,
  79.       pict_struct!=FRAME_PICTURE); /* this changed from CD to DIS */
  80.   spatpred(prog_frame,llprog_frame,llframe0[1],llframe1[1],lltmp,newframe[1],
  81.     llx0/2,lly0/2,llw2,llh2,horizontal_size>>1,vertical_size>>1,vm,vn,hm,hn,1);
  82.   spatpred(prog_frame,llprog_frame,llframe0[2],llframe1[2],lltmp,newframe[2],
  83.     llx0/2,lly0/2,llw2,llh2,horizontal_size>>1,vertical_size>>1,vm,vn,hm,hn,1);
  84. }
  85. /* form spatial prediction */
  86. static void spatpred(int prog_frame, int llprog_frame,
  87. unsigned char *fld0, unsigned char *fld1,
  88. short *tmp, unsigned char *dst,
  89. int llx0,int lly0,int llw,int llh,int horizontal_size,int vertical_size,int vm,int vn,int hm,int hn,int aperture){
  90.   int w, h, x0, llw2, llh2;
  91. #if 0
  92.   if (llprog_frame){
  93.     /* progressive -> progressive / interlaced */
  94.     subv(fld0,tmp,horizontal_sizell,vertical_sizell,vertical_size,m,n,0,1);
  95.     subh(tmp,dst,0,horizontal_size,horizontal_sizell,horizontal_size,vertical_size,m,n);
  96.   }
  97.   else if (prog_frame){
  98.     /* interlaced -> progressive */
  99.     if (ll_fldsel){
  100.       deinterlace(fld1,fld0);
  101.       subv(fld1,tmp);
  102.       subh(tmp,dst);
  103.     }
  104.     else {
  105.       deinterlace(fld0,fld1);
  106.       subv(fld0,tmp);
  107.       subh(tmp,dst);
  108.     }
  109.   }
  110.   else
  111.   {
  112. #endif
  113.     /* interlaced -> interlaced */
  114.     llw2 = (llw*hn)/hm;
  115.     llh2 = (llh*vn)/vm;
  116.     deinterlace(fld0,fld1,1,llw,llh,aperture);
  117.     deinterlace(fld1,fld0,0,llw,llh,aperture);
  118.     subv(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
  119.     subv(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
  120.     /* vertical limits */
  121.     if (lly0<0)
  122.     {
  123.       tmp-= llw*lly0;
  124.       llh2+= lly0;
  125.       if (llh2<0)
  126.         llh2 = 0;
  127.       h = (vertical_size<llh2) ? vertical_size : llh2;
  128.     }
  129.     else
  130.     {
  131.       dst+= horizontal_size*lly0;
  132.       h= vertical_size - lly0;
  133.       if (h>llh2)
  134.         h = llh2;
  135.     }
  136.     /* horizontal limits */
  137.     if (llx0<0)
  138.     {
  139.       x0 = -llx0;
  140.       llw2+= llx0;
  141.       if (llw2<0)
  142.         llw2 = 0;
  143.       w = (horizontal_size<llw2) ? horizontal_size : llw2;
  144.     }
  145.     else
  146.     {
  147.       dst+= llx0;
  148.       x0 = 0;
  149.       w = horizontal_size - llx0;
  150.       if (w>llw2)
  151.         w = llw2;
  152.     }
  153.     subh(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
  154. #if 0
  155.   }
  156. #endif
  157. }
  158. /* deinterlace one field (interpolate opposite parity samples)
  159.  *
  160.  * deinterlacing is done in-place: if j0=1, fld0 contains the input field in
  161.  * its even lines and the odd lines are interpolated by this routine
  162.  * if j0=0, the input field is in the odd lines and the even lines are
  163.  * interpolated
  164.  *
  165.  * fld0: field to be deinterlaced
  166.  * fld1: other field (referenced by the two field aperture filter)
  167.  * j0:   0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
  168.  * lx:   width of fld0 and fld1
  169.  * ly:   height of the deinterlaced field (has to be even)
  170.  * aperture: 1: use one field aperture filter (two field otherwise)
  171.  */
  172. static void deinterlace(unsigned char *fld0, unsigned char *fld1,
  173. int j0, int lx, int ly, int aperture){
  174.   int i,j,v;
  175.   unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
  176.   /* deinterlace one field */
  177.   for (j=j0; j<ly; j+=2){
  178.     p0 = fld0+lx*j;
  179.     p0m1 = (j==0)    ? p0+lx : p0-lx;
  180.     p0p1 = (j==ly-1) ? p0-lx : p0+lx;
  181.     if (aperture)
  182.       for (i=0; i<lx; i++)
  183.         p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
  184.     else {
  185.       p1 = fld1 + lx*j;
  186.       p1m2 = (j<2)     ? p1 : p1-2*lx;
  187.       p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
  188.       for (i=0; i<lx; i++){
  189.         v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
  190.         p0[i] = clp[(v + ((v>=0) ? 8 : 7))>>4];
  191.       }
  192.     }
  193.   }
  194. }
  195. /* vertical resampling */
  196. static void subv(unsigned char *s, short *d, int lx, int lys,
  197.  int lyd,int m,int n,int j0,int dj){
  198.   int i, c1, c2, jd;
  199.   unsigned char *s1, *s2;
  200.   short *d1;
  201.   
  202.   for (int j=j0; j<lyd; j+=dj){
  203.     d1 = d + lx*j;
  204.     jd = (j*m)/n;
  205.     s1 = s + lx*jd;
  206.     s2 = (jd<lys-1)? s1+lx : s1;
  207.     c2 = (16*((j*m)%n) + (n>>1))/n;
  208.     c1 = 16 - c2;
  209.     for (i=0; i<lx; i++) d1[i] = c1*s1[i] + c2*s2[i];
  210.   }
  211. }
  212. /* horizontal resampling */
  213. static void subh(short *s, unsigned char *d,
  214. int x0, int lx, int lxs, int lxd, int ly, int m, int n){
  215.   int i, i1, j, id, c1, c2, v;
  216.   short *s1, *s2;
  217.   unsigned char *d1;
  218.   for (i1=0; i1<lx; i1++){
  219.     d1 = d + i1;
  220.     i = x0 + i1;
  221.     id = (i*m)/n;
  222.     s1 = s+id;
  223.     s2 = (id<lxs-1) ? s1+1 : s1;
  224.     c2 = (16*((i*m)%n) + (n>>1))/n;
  225.     c1 = 16 - c2;
  226.     for (j=0; j<ly; j++){
  227.       v = c1*(*s1) + c2*(*s2);
  228.       *d1 = (v + ((v>=0) ? 128 : 127))>>8;
  229.       d1+= lxd;
  230.       s1+= lxs;
  231.       s2+= lxs;
  232.     }
  233.   }
  234. }