00001
00002 void zoom_filter_mmx (int prevX, int prevY, unsigned int *expix1, unsigned int *expix2, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]);
00003 int zoom_filter_mmx_supported (void);
00004
00005 #ifdef MMX
00006 #define BUFFPOINTNB 16
00007 #define BUFFPOINTMASK 0xffff
00008 #define BUFFINCR 0xff
00009
00010 #include "mmx.h"
00011
00012 #define sqrtperte 16
00013
00014 #define PERTEMASK 0xf
00015
00016 #define PERTEDEC 4
00017
00018 #include "libavutil/cpu.h"
00019
00020 int zoom_filter_mmx_supported () {
00021 return (av_get_cpu_flags() & AV_CPU_FLAG_MMX);
00022 }
00023
00024 void zoom_filter_mmx (int prevX, int prevY,
00025 unsigned int *expix1, unsigned int *expix2,
00026 int *brutS, int *brutD, int buffratio,
00027 int precalCoef[16][16])
00028 {
00029 unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC;
00030
00031 int bufsize = prevX * prevY;
00032 int loop;
00033
00034 pxor_r2r(mm7,mm7);
00035
00036 for (loop=0; loop<bufsize; loop++)
00037 {
00038 int px,py;
00039 int pos;
00040 int coeffs;
00041
00042 int posplusprevX;
00043
00044 int myPos = loop << 1, myPos2 = myPos + 1;
00045 int brutSmypos = brutS[myPos];
00046
00047 px = brutSmypos +
00048 (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB);
00049
00050 brutSmypos = brutS[myPos2];
00051 py = brutSmypos +
00052 (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB);
00053
00054 if (px < 0)
00055 px = 0;
00056
00057 if (py < 0)
00058 py = 0;
00059
00060 if ((py>=(int)ay) || (px>=(int)ax))
00061 {
00062 pos=coeffs=0;
00063 }
00064 else {
00065 pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
00066
00067 coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
00068 }
00069
00070 posplusprevX = pos + prevX;
00071
00072 movd_m2r(coeffs, mm6);
00073
00074
00075 movq_m2r(expix1[pos], mm0);
00076 movq_r2r(mm0, mm1);
00077
00078
00079 punpcklbw_r2r(mm7, mm0);
00080 movq_r2r(mm6, mm5);
00081
00082
00083 punpckhbw_r2r(mm7, mm1);
00084
00085
00086 punpcklbw_r2r(mm5, mm6);
00087 movq_r2r(mm6, mm4);
00088 movq_r2r(mm6, mm5);
00089 punpcklbw_r2r(mm5, mm6);
00090 punpckhbw_r2r(mm5, mm4);
00091
00092 movq_r2r(mm6, mm3);
00093 punpcklbw_r2r(mm7, mm6);
00094 punpckhbw_r2r(mm7, mm3);
00095
00096
00097 pmullw_r2r(mm6, mm0);
00098 pmullw_r2r(mm3, mm1);
00099 paddw_r2r(mm1, mm0);
00100
00101
00102 movq_r2r(mm4, mm5);
00103 punpcklbw_r2r(mm7, mm4);
00104 punpckhbw_r2r(mm7, mm5);
00105
00106
00107
00108 movq_m2r(expix1[posplusprevX], mm1);
00109 movq_r2r(mm1, mm2);
00110
00111
00112 punpcklbw_r2r(mm7, mm1);
00113 punpckhbw_r2r(mm7, mm2);
00114
00115
00116 pmullw_r2r(mm4, mm1);
00117 pmullw_r2r(mm5, mm2);
00118
00119
00120 paddw_r2r(mm1, mm0);
00121 paddw_r2r(mm2, mm0);
00122
00123
00124 psrlw_i2r(8, mm0);
00125 packuswb_r2r(mm7, mm0);
00126 movd_r2m(mm0,expix2[loop]);
00127 }
00128 emms();
00129 }
00130
00131 #else
00132
00133 int zoom_filter_mmx_supported () {
00134 return 0;
00135 }
00136
00137 void zoom_filter_mmx (int prevX, int prevY,
00138 unsigned int *expix1, unsigned int *expix2,
00139 int *brutS, int *brutD, int buffratio,
00140 int precalCoef[16][16])
00141 {
00142 (void)prevX;
00143 (void)prevY;
00144 (void)expix1;
00145 (void)expix2;
00146 (void)brutS;
00147 (void)brutD;
00148 (void)buffratio;
00149 (void)precalCoef;
00150 return;
00151 }
00152
00153 #endif
00154
00155
00156
00157
00158