unsigned char *Clip; /* IMPLEMENTAION specific rouintes */ static void Initialize_Decoder() { int i; /* Clip table */ if (!(Clip=(unsigned char *)malloc(1024))) Error("Clip[] malloc failed\n"); Clip += 384; for (i=-384; i<640; i++) Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i); } /* horizontal 1:2 interpolation filter */ static void conv422to444( unsigned char *src, unsigned char *dst ) { int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3; w = Coded_Picture_Width>>1; if (base.MPEG2_Flag) { for (j=0; j>8]; } src+= w; dst+= Coded_Picture_Width; } } else { for (j=0; j>8]; dst[i2+1] = Clip[(int)( 5*src[ip3] -21*src[ip2] +70*src[ip1] +228*src[i] -37*src[im1] +11*src[im2]+128)>>8]; } src+= w; dst+= Coded_Picture_Width; } } } /* vertical 1:2 interpolation filter */ static void conv420to422( unsigned char *src, unsigned char *dst ) { int w, h, i, j, j2; int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7; w = Coded_Picture_Width>>1; h = Coded_Picture_Height>>1; if (progressive_frame) { /* intra frame */ for (i=0; i>8]; dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3] -16*src[w*jp2] +67*src[w*jp1] +227*src[w*j] -32*src[w*jm1] +7*src[w*jm2]+128)>>8]; } src++; dst++; } } else { /* intra field */ for (i=0; i>8]; /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */ /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */ dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4] -35*src[w*jm2] +194*src[w*j] +110*src[w*jp2] -24*src[w*jp4] +4*src[w*jp6]+128)>>8]; /* bottom field */ jm5 = (j<5) ? 1 : j-5; jm3 = (j<3) ? 1 : j-3; jm1 = (j<1) ? 1 : j-1; jp1 = (j>8]; dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7] -7*src[w*jp5] +30*src[w*jp3] +248*src[w*jp1] -21*src[w*jm1] +5*src[w*jm3]+128)>>8]; } src++; dst++; } } }