remove relative include paths, to avoid conflicts with libtool
[x262.git] / common / mc.c
1 /*****************************************************************************
2  * mc.c: h264 encoder library (Motion Compensation)
3  *****************************************************************************
4  * Copyright (C) 2003 Laurent Aimar
5  * $Id: mc.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #ifdef HAVE_STDINT_H
25 #include <stdint.h>
26 #else
27 #include <inttypes.h>
28 #endif
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <stdarg.h>
33
34 #include "x264.h"
35
36 #include "mc.h"
37 #include "clip1.h"
38
39 #ifdef _MSC_VER
40 #undef HAVE_MMXEXT  /* not finished now */
41 #endif
42 #ifdef HAVE_MMXEXT
43 #   include "i386/mc.h"
44 #endif
45 #ifdef ARCH_PPC
46 #   include "ppc/mc.h"
47 #endif
48
49
50 static inline int x264_tapfilter( uint8_t *pix, int i_pix_next )
51 {
52     return pix[-2*i_pix_next] - 5*pix[-1*i_pix_next] + 20*(pix[0] + pix[1*i_pix_next]) - 5*pix[ 2*i_pix_next] + pix[ 3*i_pix_next];
53 }
54 static inline int x264_tapfilter1( uint8_t *pix )
55 {
56     return pix[-2] - 5*pix[-1] + 20*(pix[0] + pix[1]) - 5*pix[ 2] + pix[ 3];
57 }
58
59 static inline void pixel_avg( uint8_t *dst,  int i_dst_stride,
60                               uint8_t *src1, int i_src1_stride,
61                               uint8_t *src2, int i_src2_stride,
62                               int i_width, int i_height )
63 {
64     int x, y;
65     for( y = 0; y < i_height; y++ )
66     {
67         for( x = 0; x < i_width; x++ )
68         {
69             dst[x] = ( src1[x] + src2[x] + 1 ) >> 1;
70         }
71         dst  += i_dst_stride;
72         src1 += i_src1_stride;
73         src2 += i_src2_stride;
74     }
75 }
76
77 typedef void (*pf_mc_t)(uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height );
78
79 static void mc_copy( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
80 {
81     int y;
82
83     for( y = 0; y < i_height; y++ )
84     {
85         memcpy( dst, src, i_width );
86
87         src += i_src_stride;
88         dst += i_dst_stride;
89     }
90 }
91 static inline void mc_hh( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
92 {
93     int x, y;
94
95     for( y = 0; y < i_height; y++ )
96     {
97         for( x = 0; x < i_width; x++ )
98         {
99             dst[x] = x264_mc_clip1( ( x264_tapfilter1( &src[x] ) + 16 ) >> 5 );
100         }
101         src += i_src_stride;
102         dst += i_dst_stride;
103     }
104 }
105 static inline void mc_hv( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
106 {
107     int x, y;
108
109     for( y = 0; y < i_height; y++ )
110     {
111         for( x = 0; x < i_width; x++ )
112         {
113             dst[x] = x264_mc_clip1( ( x264_tapfilter( &src[x], i_src_stride ) + 16 ) >> 5 );
114         }
115         src += i_src_stride;
116         dst += i_dst_stride;
117     }
118 }
119 static inline void mc_hc( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
120 {
121     uint8_t *out;
122     uint8_t *pix;
123     int x, y;
124
125     for( x = 0; x < i_width; x++ )
126     {
127         int tap[6];
128
129         pix = &src[x];
130         out = &dst[x];
131
132         tap[0] = x264_tapfilter1( &pix[-2*i_src_stride] );
133         tap[1] = x264_tapfilter1( &pix[-1*i_src_stride] );
134         tap[2] = x264_tapfilter1( &pix[ 0*i_src_stride] );
135         tap[3] = x264_tapfilter1( &pix[ 1*i_src_stride] );
136         tap[4] = x264_tapfilter1( &pix[ 2*i_src_stride] );
137
138         for( y = 0; y < i_height; y++ )
139         {
140             tap[5] = x264_tapfilter1( &pix[ 3*i_src_stride] );
141
142             *out = x264_mc_clip1( ( tap[0] - 5*tap[1] + 20 * tap[2] + 20 * tap[3] -5*tap[4] + tap[5] + 512 ) >> 10 );
143
144             /* Next line */
145             pix += i_src_stride;
146             out += i_dst_stride;
147             tap[0] = tap[1];
148             tap[1] = tap[2];
149             tap[2] = tap[3];
150             tap[3] = tap[4];
151             tap[4] = tap[5];
152         }
153     }
154 }
155
156 /* mc I+H */
157 static void mc_xy10( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
158 {
159     uint8_t tmp[16*16];
160     mc_hh( src, i_src_stride, tmp, i_width, i_width, i_height );
161     pixel_avg( dst, i_dst_stride, src, i_src_stride, tmp, i_width, i_width, i_height );
162 }
163 static void mc_xy30( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
164 {
165     uint8_t tmp[16*16];
166     mc_hh( src, i_src_stride, tmp, i_width, i_width, i_height );
167     pixel_avg( dst, i_dst_stride, src+1, i_src_stride, tmp, i_width, i_width, i_height );
168 }
169 /* mc I+V */
170 static void mc_xy01( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
171 {
172     uint8_t tmp[16*16];
173     mc_hv( src, i_src_stride, tmp, i_width, i_width, i_height );
174     pixel_avg( dst, i_dst_stride, src, i_src_stride, tmp, i_width, i_width, i_height );
175 }
176 static void mc_xy03( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
177 {
178     uint8_t tmp[16*16];
179     mc_hv( src, i_src_stride, tmp, i_width, i_width, i_height );
180     pixel_avg( dst, i_dst_stride, src+i_src_stride, i_src_stride, tmp, i_width, i_width, i_height );
181 }
182 /* H+V */
183 static void mc_xy11( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
184 {
185     uint8_t tmp1[16*16];
186     uint8_t tmp2[16*16];
187
188     mc_hv( src, i_src_stride, tmp1, i_width, i_width, i_height );
189     mc_hh( src, i_src_stride, tmp2, i_width, i_width, i_height );
190     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
191 }
192 static void mc_xy31( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
193 {
194     uint8_t tmp1[16*16];
195     uint8_t tmp2[16*16];
196
197     mc_hv( src+1, i_src_stride, tmp1, i_width, i_width, i_height );
198     mc_hh( src,   i_src_stride, tmp2, i_width, i_width, i_height );
199     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
200 }
201 static void mc_xy13( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
202 {
203     uint8_t tmp1[16*16];
204     uint8_t tmp2[16*16];
205
206     mc_hv( src,              i_src_stride, tmp1, i_width, i_width, i_height );
207     mc_hh( src+i_src_stride, i_src_stride, tmp2, i_width, i_width, i_height );
208     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
209 }
210 static void mc_xy33( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
211 {
212     uint8_t tmp1[16*16];
213     uint8_t tmp2[16*16];
214
215     mc_hv( src+1,            i_src_stride, tmp1, i_width, i_width, i_height );
216     mc_hh( src+i_src_stride, i_src_stride, tmp2, i_width, i_width, i_height );
217     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
218 }
219 static void mc_xy21( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
220 {
221     uint8_t tmp1[16*16];
222     uint8_t tmp2[16*16];
223
224     mc_hc( src, i_src_stride, tmp1, i_width, i_width, i_height );
225     mc_hh( src, i_src_stride, tmp2, i_width, i_width, i_height );
226     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
227 }
228 static void mc_xy12( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
229 {
230     uint8_t tmp1[16*16];
231     uint8_t tmp2[16*16];
232
233     mc_hc( src, i_src_stride, tmp1, i_width, i_width, i_height );
234     mc_hv( src, i_src_stride, tmp2, i_width, i_width, i_height );
235     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
236 }
237 static void mc_xy32( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
238 {
239     uint8_t tmp1[16*16];
240     uint8_t tmp2[16*16];
241
242     mc_hc( src,   i_src_stride, tmp1, i_width, i_width, i_height );
243     mc_hv( src+1, i_src_stride, tmp2, i_width, i_width, i_height );
244     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
245 }
246 static void mc_xy23( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_width, int i_height )
247 {
248     uint8_t tmp1[16*16];
249     uint8_t tmp2[16*16];
250
251     mc_hc( src,              i_src_stride, tmp1, i_width, i_width, i_height );
252     mc_hh( src+i_src_stride, i_src_stride, tmp2, i_width, i_width, i_height );
253     pixel_avg( dst, i_dst_stride, tmp1, i_width, tmp2, i_width, i_width, i_height );
254 }
255
256 static void motion_compensation_luma( uint8_t *src, int i_src_stride,
257                                       uint8_t *dst, int i_dst_stride,
258                                       int mvx,int mvy,
259                                       int i_width, int i_height )
260 {
261     static pf_mc_t pf_mc[4][4] =    /*XXX [dqy][dqx] */
262     {
263         { mc_copy,  mc_xy10,    mc_hh,      mc_xy30 },
264         { mc_xy01,  mc_xy11,    mc_xy21,    mc_xy31 },
265         { mc_hv,    mc_xy12,    mc_hc,      mc_xy32 },
266         { mc_xy03,  mc_xy13,    mc_xy23,    mc_xy33 },
267     };
268
269     src += (mvy >> 2) * i_src_stride + (mvx >> 2);
270     pf_mc[mvy&0x03][mvx&0x03]( src, i_src_stride, dst, i_dst_stride, i_width, i_height );
271 }
272
273 /* full chroma mc (ie until 1/8 pixel)*/
274 static void motion_compensation_chroma( uint8_t *src, int i_src_stride,
275                                         uint8_t *dst, int i_dst_stride,
276                                         int mvx, int mvy,
277                                         int i_width, int i_height )
278 {
279     uint8_t *srcp;
280     int x, y;
281
282     const int d8x = mvx&0x07;
283     const int d8y = mvy&0x07;
284
285     const int cA = (8-d8x)*(8-d8y);
286     const int cB = d8x    *(8-d8y);
287     const int cC = (8-d8x)*d8y;
288     const int cD = d8x    *d8y;
289
290     src  += (mvy >> 3) * i_src_stride + (mvx >> 3);
291     srcp = &src[i_src_stride];
292
293     for( y = 0; y < i_height; y++ )
294     {
295         for( x = 0; x < i_width; x++ )
296         {
297             dst[x] = ( cA*src[x]  + cB*src[x+1] +
298                        cC*srcp[x] + cD*srcp[x+1] + 32 ) >> 6;
299         }
300         dst  += i_dst_stride;
301
302         src   = srcp;
303         srcp += i_src_stride;
304     }
305 }
306
307 void x264_mc_init( int cpu, x264_mc_function_t pf[2] )
308 {
309     pf[MC_LUMA]   = motion_compensation_luma;
310     pf[MC_CHROMA] = motion_compensation_chroma;
311
312 #ifdef HAVE_MMXEXT
313     if( cpu&X264_CPU_MMXEXT )
314         x264_mc_mmxext_init( pf );
315 #endif
316 #ifdef HAVE_SSE2
317     if( cpu&X264_CPU_SSE2 )
318         x264_mc_sse2_init( pf );
319 #endif
320
321 #ifdef ARCH_PPC
322     if( cpu&X264_CPU_ALTIVEC )
323         x264_mc_altivec_init( pf );
324 #endif
325 }
326