~siretart/xine-lib/ubuntu

« back to all changes in this revision

Viewing changes to src/post/goom/xmmx.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2005-12-15 13:13:45 UTC
  • mfrom: (0.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051215131345-8n4osv1j7fy9c1s1
* SECURITY UPDATE: Fix arbitrary code execution with crafted PNG images in
  embedded ffmpeg copy.
* src/libffmpeg/libavcodec/utils.c, avcodec_default_get_buffer(): Apply
  upstream patch to fix buffer overflow on decoding of small PIX_FMT_PAL8
  PNG files.
* References:
  CVE-2005-4048
  http://mplayerhq.hu/pipermail/ffmpeg-devel/2005-November/005333.html
  http://www1.mplayerhq.hu/cgi-bin/cvsweb.cgi/ffmpeg/libavcodec/
  utils.c.diff?r1=1.161&r2=1.162&cvsroot=FFMpeg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#ifdef HAVE_MMX
 
3
 
1
4
/* a definir pour avoir exactement le meme resultat que la fonction C
2
 
 * (un chouillat plus lent)
 
5
 * (un chouillat plus lent).. mais la difference est assez peu notable.
3
6
 */
4
 
 
5
 
#ifdef HAVE_MMX
6
 
 
7
 
#define STRICT_COMPAT
8
 
 
9
 
//#define HAVE_ATHLON
 
7
// #define STRICT_COMPAT
10
8
 
11
9
#define BUFFPOINTNB 16
12
10
#define BUFFPOINTMASK 0xffff
50
48
 
51
49
        ratiox.d[0] = buffratio;
52
50
        ratiox.d[1] = buffratio;
53
 
        movq_m2r (ratiox, mm6);
54
 
        pslld_i2r (16,mm6);
55
51
 
56
 
        pxor_r2r (mm7,mm7); /* mise a zero de mm7 */
 
52
  asm volatile
 
53
    ("\n\t movq  %0, %%mm6"
 
54
     "\n\t pslld $16,      %%mm6" /* mm6 = [rat16=buffratio<<16 | rat16=buffratio<<16] */
 
55
     "\n\t pxor  %%mm7,    %%mm7" /* mm7 = 0 */
 
56
     ::"m"(ratiox));
57
57
 
58
58
        loop=0;
59
59
 
62
62
         */
63
63
        while (loop < bufsize)
64
64
        {
65
 
                /*
66
 
                 * pre : mm6 = [buffratio<<16|buffratio<<16]
67
 
                 * post : mm0 = S + ((D-S)*buffratio)>>16 format [X|Y]
 
65
                /* Thread #1
 
66
                 * pre :  mm6 = [rat16|rat16]
 
67
                 * post : mm0 = S + ((D-S)*rat16 format [X|Y]
68
68
                 * modified = mm0,mm1,mm2
69
69
                 */
70
70
 
71
 
                __asm__ __volatile__ (
72
 
                                      "movq %0,%%mm0\n"
73
 
                                      "movq %1,%%mm1\n"
74
 
                                      : :"X"(brutS[loop]),"X"(brutD[loop])
75
 
                                     );               /* mm0 = S */
76
 
 
77
 
                psubd_r2r (mm0,mm1);           /* mm1 = D - S */
78
 
                movq_r2r (mm1, mm2);           /* mm2 = D - S */
79
 
 
80
 
                pslld_i2r (16,mm1);
81
 
                mmx_r2r (pmulhuw, mm6, mm1);   /* mm1 = ?? */
82
 
                pmullw_r2r (mm6, mm2);
83
 
 
84
 
                paddd_r2r (mm2, mm1);     /* mm1 = (D - S) * buffratio >> 16 */
85
 
                pslld_i2r (16,mm0);
86
 
 
87
 
                paddd_r2r (mm1, mm0);     /* mm0 = S + mm1 */
88
 
                psrld_i2r (16, mm0);
 
71
                asm volatile
 
72
      ("#1 \n\t movq       %0, %%mm0"
 
73
       "#1 \n\t movq       %1, %%mm1"
 
74
       "#1 \n\t psubd   %%mm0, %%mm1" /* mm1 = D - S */
 
75
       "#1 \n\t movq    %%mm1, %%mm2" /* mm2 = D - S */
 
76
       "#1 \n\t pslld     $16, %%mm1"
 
77
                   "#1 \n\t pmullw  %%mm6, %%mm2"
 
78
       "#1 \n\t pmulhuw %%mm6, %%mm1"
 
79
 
 
80
       "#1 \n\t pslld   $16,   %%mm0"
 
81
       "#1 \n\t paddd   %%mm2, %%mm1"  /* mm1 = (D - S) * buffratio >> 16 */
 
82
 
 
83
       "#1 \n\t paddd   %%mm1, %%mm0"  /* mm0 = S + mm1 */
 
84
       "#1 \n\t psrld   $16,   %%mm0"
 
85
       :
 
86
       : "g"(brutS[loop])
 
87
       , "g"(brutD[loop])
 
88
      );               /* mm0 = S */
89
89
 
90
90
                /*
91
91
                 * pre : mm0 : position vector on screen
93
93
                 * post : clipped mm0
94
94
                 * modified : mm0,mm1,mm2
95
95
                 */
96
 
                movq_m2r (prevXY,mm1);
97
 
                pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient :
98
 
                                            1111 si prevXY > px
99
 
                                            0000 si prevXY <= px
100
 
                                           (idem pour y) */
 
96
    asm volatile
 
97
      ("#1 \n\t movq       %0, %%mm1"
 
98
       "#1 \n\t pcmpgtd %%mm0,  %%mm1"
 
99
       /* mm0 en X contient (idem pour Y) :
 
100
        *   1111 si prevXY > px
 
101
        *   0000 si prevXY <= px */
101
102
#ifdef STRICT_COMPAT
102
 
                movq_r2r (mm1,mm2);
103
 
                punpckhdq_r2r (mm2,mm2);
104
 
                punpckldq_r2r (mm1,mm1);
105
 
                pand_r2r (mm2, mm0);
 
103
       "#1 \n\t movq      %%mm1, %%mm2"
 
104
       "#1 \n\t punpckhdq %%mm2, %%mm2"
 
105
       "#1 \n\t punpckldq %%mm1, %%mm1"
 
106
       "#1 \n\t pand      %%mm2, %%mm0"
106
107
#endif
107
 
                pand_r2r (mm1, mm0);    /* on met a zero la partie qui deborde */
108
 
 
109
 
                /*
110
 
                 * pre : mm0 : clipped position on screen
111
 
                 *
112
 
                 * post : mm3 & mm4 : coefs for this position
113
 
                 *              mm1 : X vector [0|X]
114
 
                 *
115
 
                 * modif : eax,ebx
 
108
 
 
109
       "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */
 
110
        ::"m"(prevXY));
 
111
 
 
112
                /* Thread #2
 
113
                 * pre :  mm0 : clipped position on screen
 
114
                 *
 
115
                 * post : mm3 : coefs for this position
 
116
                 *        mm1 : X vector [0|X]
 
117
                 *
 
118
                 * modif : eax,esi
116
119
                 */
117
120
                __asm__ __volatile__ (
118
 
                        "movd %%mm0,%%ebx\n"
119
 
                        "movq %%mm0,%%mm1\n"
120
 
 
121
 
                        "andl $15,%%ebx\n"
122
 
                        "psrlq $32,%%mm1\n"
123
 
 
124
 
                        "shll $6,%%ebx\n"
125
 
                        "movd %%mm1,%%eax\n"
126
 
 
127
 
                        "addl %0,%%ebx\n"
128
 
                        "andl $15,%%eax\n"
129
 
 
130
 
                        "movd (%%ebx,%%eax,4),%%mm3\n"
131
 
                        ::"g"(precalCoef):"eax","ebx");
 
121
                        "#2 \n\t movd %%mm0,%%esi"
 
122
                        "#2 \n\t movq %%mm0,%%mm1"
 
123
 
 
124
                        "#2 \n\t andl $15,%%esi"
 
125
                        "#2 \n\t psrlq $32,%%mm1"
 
126
 
 
127
                        "#2 \n\t shll $6,%%esi"
 
128
                        "#2 \n\t movd %%mm1,%%eax"
 
129
 
 
130
                        "#2 \n\t addl %0,%%esi"
 
131
                        "#2 \n\t andl $15,%%eax"
 
132
 
 
133
                        "#2 \n\t movd (%%esi,%%eax,4),%%mm3"
 
134
                        ::"g"(precalCoef):"eax","esi");
132
135
 
133
136
                /*
134
 
                 * extraction des coefficients...
 
137
                 * extraction des coefficients... (Thread #3)
135
138
                 *
136
139
                 * pre : coef dans mm3
137
140
                 *
141
144
                 * modif : mm5
142
145
                 */
143
146
 
144
 
                /* entrelace avec portion d'apres (cf les '^')
145
 
                        movq_r2r (mm3, mm5);            / * ??-??-??-??-c4-c3-c2-c1 * /
146
 
                        punpcklbw_r2r (mm5, mm3);       / * c4-c4-c3-c3-c2-c2-c1-c1 * /
147
 
                        movq_r2r (mm3, mm4);            / * c4-c4-c3-c3-c2-c2-c1-c1 * /
148
 
                        movq_r2r (mm3, mm5);            / * c4-c4-c3-c3-c2-c2-c1-c1 * /
149
 
 
150
 
                        punpcklbw_r2r (mm5, mm3);       / * c2-c2-c2-c2-c1-c1-c1-c1 * /
151
 
                        punpckhbw_r2r (mm5, mm4);       / * c4-c4-c4-c4-c3-c3-c3-c3 * /
152
 
                */
153
 
 
154
 
                /*
 
147
                /* (Thread #4)
155
148
                 * pre : mm0 : Y pos [*|Y]
156
149
                 *       mm1 : X pos [*|X]
157
150
                 *
158
151
                 * post : mm0 : expix1[position]
159
152
                 *        mm2 : expix1[position+largeur]
160
153
                 *
161
 
                 * modif : eax,ebx
 
154
                 * modif : eax, esi
162
155
                 */
163
 
                psrld_i2r (PERTEDEC,mm0);
164
 
                psrld_i2r (PERTEDEC,mm1);
165
156
                __asm__ __volatile__ (
166
 
                        "movd %%mm1,%%eax\n"
167
 
                        /*^*/ "movq %%mm3,%%mm5\n"       /*^*/
168
 
 
169
 
                        "mull %1\n"
170
 
                        "movd %%mm0,%%ebx\n"
171
 
                        /*^*/ "punpcklbw %%mm5, %%mm3\n" /*^*/
172
 
 
173
 
                        "addl %%ebx,%%eax\n"
174
 
                        /*^*/ "movq %%mm3,%%mm4\n"       /*^*/
175
 
                        /*^*/ "movq %%mm3,%%mm5\n"       /*^*/
176
 
 
177
 
                        "movl %0,%%ebx\n"
178
 
                        /*^*/ "punpcklbw %%mm5,%%mm3\n"  /*^*/
179
 
 
180
 
                        "movq (%%ebx,%%eax,4),%%mm0\n"
181
 
                        /*^*/ "punpckhbw %%mm5,%%mm4\n"  /*^*/
182
 
 
183
 
                        "addl %1,%%eax\n"
184
 
                        "movq (%%ebx,%%eax,4),%%mm2\n"
185
 
 
186
 
                        : : "X"(expix1), "X"(prevX):"eax","ebx"
 
157
      "#2 \n\t psrld $4, %%mm0"
 
158
      "#2 \n\t psrld $4, %%mm1"      /* PERTEDEC = $4 */
 
159
 
 
160
      "#4 \n\t movd %%mm1,%%eax"
 
161
                        "#3 \n\t movq %%mm3,%%mm5" 
 
162
 
 
163
                        "#4 \n\t mull %1"
 
164
                        "#4 \n\t movd %%mm0,%%esi"
 
165
 
 
166
      "#3 \n\t punpcklbw %%mm5, %%mm3"
 
167
                        "#4 \n\t addl %%esi, %%eax"
 
168
 
 
169
      "#3 \n\t movq %%mm3, %%mm4"     
 
170
      "#3 \n\t movq %%mm3, %%mm5"     
 
171
 
 
172
      "#4 \n\t movl %0, %%esi"
 
173
      "#3 \n\t punpcklbw %%mm5, %%mm3"
 
174
 
 
175
      "#4 \n\t movq (%%esi,%%eax,4),%%mm0"
 
176
      "#3 \n\t punpckhbw %%mm5, %%mm4"
 
177
 
 
178
      "#4 \n\t addl %1,%%eax"
 
179
      "#4 \n\t movq (%%esi,%%eax,4),%%mm2"
 
180
 
 
181
                        :
 
182
      : "g"(expix1)
 
183
      , "g"(prevX)
 
184
      :"eax","esi"
187
185
                );
188
186
 
189
187
                /*
242
240
                ++loop;
243
241
        }
244
242
/*#ifdef HAVE_ATHLON*/
245
 
        __asm__ __volatile__ ("femms\n");
 
243
        __asm__ __volatile__ ("emms\n");
246
244
/*#else
247
245
        emms();
248
246
#endif*/
393
391
                }
394
392
        }
395
393
end_of_line:
396
 
        __asm__ __volatile__ ("femms\n"); 
 
394
        __asm__ __volatile__ ("emms\n"); 
397
395
}
398
396
 
399
397
#endif