| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * DSP utils | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * Copyright (c) 2000, 2001 Fabrice Bellard. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License along with this library; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |  * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at> | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | #include "avcodec.h"
 | 
					
						
							|  |  |  | #include "dsputil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void (*get_pixels)(DCTELEM *block, const UINT8 *pixels, int line_size); | 
					
						
							| 
									
										
										
										
											2002-04-17 04:32:12 +00:00
										 |  |  | void (*diff_pixels)(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); | 
					
						
							|  |  |  | void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | void (*gmc1)(UINT8 *dst, UINT8 *src, int srcStride, int h, int x16, int y16, int rounder); | 
					
						
							| 
									
										
										
										
											2002-03-28 13:41:04 +00:00
										 |  |  | void (*clear_blocks)(DCTELEM *blocks); | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  | int (*pix_sum)(UINT8 * pix, int line_size); | 
					
						
							|  |  |  | int (*pix_norm1)(UINT8 * pix, int line_size); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs16x16; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs16x16_x2; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs16x16_y2; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs16x16_xy2; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | op_pixels_abs_func pix_abs8x8; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs8x8_x2; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs8x8_y2; | 
					
						
							|  |  |  | op_pixels_abs_func pix_abs8x8_xy2; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-14 22:07:35 +00:00
										 |  |  | int ff_bit_exact=0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-11 19:00:43 +00:00
										 |  |  | UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | UINT32 squareTbl[512]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  | const UINT8 ff_zigzag_direct[64] = { | 
					
						
							|  |  |  |     0,   1,  8, 16,  9,  2,  3, 10, | 
					
						
							|  |  |  |     17, 24, 32, 25, 18, 11,  4,  5, | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  |     12, 19, 26, 33, 40, 48, 41, 34, | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |     27, 20, 13,  6,  7, 14, 21, 28, | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  |     35, 42, 49, 56, 57, 50, 43, 36, | 
					
						
							|  |  |  |     29, 22, 15, 23, 30, 37, 44, 51, | 
					
						
							|  |  |  |     58, 59, 52, 45, 38, 31, 39, 46, | 
					
						
							|  |  |  |     53, 60, 61, 54, 47, 55, 62, 63 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-27 13:30:18 +00:00
										 |  |  | /* not permutated inverse zigzag_direct + 1 for MMX quantizer */ | 
					
						
							|  |  |  | UINT16 __align8 inv_zigzag_direct16[64]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  | const UINT8 ff_alternate_horizontal_scan[64] = { | 
					
						
							|  |  |  |     0,  1,   2,  3,  8,  9, 16, 17,  | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  |     10, 11,  4,  5,  6,  7, 15, 14, | 
					
						
							|  |  |  |     13, 12, 19, 18, 24, 25, 32, 33,  | 
					
						
							|  |  |  |     26, 27, 20, 21, 22, 23, 28, 29, | 
					
						
							|  |  |  |     30, 31, 34, 35, 40, 41, 48, 49,  | 
					
						
							|  |  |  |     42, 43, 36, 37, 38, 39, 44, 45, | 
					
						
							|  |  |  |     46, 47, 50, 51, 56, 57, 58, 59,  | 
					
						
							|  |  |  |     52, 53, 54, 55, 60, 61, 62, 63, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  | const UINT8 ff_alternate_vertical_scan[64] = { | 
					
						
							|  |  |  |     0,  8,  16, 24,  1,  9,  2, 10,  | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  |     17, 25, 32, 40, 48, 56, 57, 49, | 
					
						
							|  |  |  |     41, 33, 26, 18,  3, 11,  4, 12,  | 
					
						
							|  |  |  |     19, 27, 34, 42, 50, 58, 35, 43, | 
					
						
							|  |  |  |     51, 59, 20, 28,  5, 13,  6, 14,  | 
					
						
							|  |  |  |     21, 29, 36, 44, 52, 60, 37, 45, | 
					
						
							|  |  |  |     53, 61, 22, 30,  7, 15, 23, 31,  | 
					
						
							|  |  |  |     38, 46, 54, 62, 39, 47, 55, 63, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-27 13:30:18 +00:00
										 |  |  | /* a*inverse[b]>>32 == a/b for all 0<=a<=65536 && 2<=b<=255 */ | 
					
						
							|  |  |  | UINT32 inverse[256]={ | 
					
						
							|  |  |  |          0, 4294967295U,2147483648U,1431655766, 1073741824,  858993460,  715827883,  613566757,  | 
					
						
							|  |  |  |  536870912,  477218589,  429496730,  390451573,  357913942,  330382100,  306783379,  286331154,  | 
					
						
							|  |  |  |  268435456,  252645136,  238609295,  226050911,  214748365,  204522253,  195225787,  186737709,  | 
					
						
							|  |  |  |  178956971,  171798692,  165191050,  159072863,  153391690,  148102321,  143165577,  138547333,  | 
					
						
							|  |  |  |  134217728,  130150525,  126322568,  122713352,  119304648,  116080198,  113025456,  110127367,  | 
					
						
							|  |  |  |  107374183,  104755300,  102261127,   99882961,   97612894,   95443718,   93368855,   91382283,  | 
					
						
							|  |  |  |   89478486,   87652394,   85899346,   84215046,   82595525,   81037119,   79536432,   78090315,  | 
					
						
							|  |  |  |   76695845,   75350304,   74051161,   72796056,   71582789,   70409300,   69273667,   68174085,  | 
					
						
							|  |  |  |   67108864,   66076420,   65075263,   64103990,   63161284,   62245903,   61356676,   60492498,  | 
					
						
							|  |  |  |   59652324,   58835169,   58040099,   57266231,   56512728,   55778797,   55063684,   54366675,  | 
					
						
							|  |  |  |   53687092,   53024288,   52377650,   51746594,   51130564,   50529028,   49941481,   49367441,  | 
					
						
							|  |  |  |   48806447,   48258060,   47721859,   47197443,   46684428,   46182445,   45691142,   45210183,  | 
					
						
							|  |  |  |   44739243,   44278014,   43826197,   43383509,   42949673,   42524429,   42107523,   41698712,  | 
					
						
							|  |  |  |   41297763,   40904451,   40518560,   40139882,   39768216,   39403370,   39045158,   38693400,  | 
					
						
							|  |  |  |   38347923,   38008561,   37675152,   37347542,   37025581,   36709123,   36398028,   36092163,  | 
					
						
							|  |  |  |   35791395,   35495598,   35204650,   34918434,   34636834,   34359739,   34087043,   33818641,  | 
					
						
							|  |  |  |   33554432,   33294321,   33038210,   32786010,   32537632,   32292988,   32051995,   31814573,  | 
					
						
							|  |  |  |   31580642,   31350127,   31122952,   30899046,   30678338,   30460761,   30246249,   30034737,  | 
					
						
							|  |  |  |   29826162,   29620465,   29417585,   29217465,   29020050,   28825284,   28633116,   28443493,  | 
					
						
							|  |  |  |   28256364,   28071682,   27889399,   27709467,   27531842,   27356480,   27183338,   27012373,  | 
					
						
							|  |  |  |   26843546,   26676816,   26512144,   26349493,   26188825,   26030105,   25873297,   25718368,  | 
					
						
							|  |  |  |   25565282,   25414008,   25264514,   25116768,   24970741,   24826401,   24683721,   24542671,  | 
					
						
							|  |  |  |   24403224,   24265352,   24129030,   23994231,   23860930,   23729102,   23598722,   23469767,  | 
					
						
							|  |  |  |   23342214,   23216040,   23091223,   22967740,   22845571,   22724695,   22605092,   22486740,  | 
					
						
							|  |  |  |   22369622,   22253717,   22139007,   22025474,   21913099,   21801865,   21691755,   21582751,  | 
					
						
							|  |  |  |   21474837,   21367997,   21262215,   21157475,   21053762,   20951060,   20849356,   20748635,  | 
					
						
							|  |  |  |   20648882,   20550083,   20452226,   20355296,   20259280,   20164166,   20069941,   19976593,  | 
					
						
							|  |  |  |   19884108,   19792477,   19701685,   19611723,   19522579,   19434242,   19346700,   19259944,  | 
					
						
							|  |  |  |   19173962,   19088744,   19004281,   18920561,   18837576,   18755316,   18673771,   18592933,  | 
					
						
							|  |  |  |   18512791,   18433337,   18354562,   18276457,   18199014,   18122225,   18046082,   17970575,  | 
					
						
							|  |  |  |   17895698,   17821442,   17747799,   17674763,   17602325,   17530479,   17459217,   17388532,  | 
					
						
							|  |  |  |   17318417,   17248865,   17179870,   17111424,   17043522,   16976156,   16909321,   16843010, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  | int pix_sum_c(UINT8 * pix, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i, j; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for (i = 0; i < 16; i++) { | 
					
						
							|  |  |  | 	for (j = 0; j < 16; j += 8) { | 
					
						
							|  |  |  | 	    s += pix[0]; | 
					
						
							|  |  |  | 	    s += pix[1]; | 
					
						
							|  |  |  | 	    s += pix[2]; | 
					
						
							|  |  |  | 	    s += pix[3]; | 
					
						
							|  |  |  | 	    s += pix[4]; | 
					
						
							|  |  |  | 	    s += pix[5]; | 
					
						
							|  |  |  | 	    s += pix[6]; | 
					
						
							|  |  |  | 	    s += pix[7]; | 
					
						
							|  |  |  | 	    pix += 8; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	pix += line_size - 16; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pix_norm1_c(UINT8 * pix, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i, j; | 
					
						
							|  |  |  |     UINT32 *sq = squareTbl + 256; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for (i = 0; i < 16; i++) { | 
					
						
							|  |  |  | 	for (j = 0; j < 16; j += 8) { | 
					
						
							|  |  |  | 	    s += sq[pix[0]]; | 
					
						
							|  |  |  | 	    s += sq[pix[1]]; | 
					
						
							|  |  |  | 	    s += sq[pix[2]]; | 
					
						
							|  |  |  | 	    s += sq[pix[3]]; | 
					
						
							|  |  |  | 	    s += sq[pix[4]]; | 
					
						
							|  |  |  | 	    s += sq[pix[5]]; | 
					
						
							|  |  |  | 	    s += sq[pix[6]]; | 
					
						
							|  |  |  | 	    s += sq[pix[7]]; | 
					
						
							|  |  |  | 	    pix += 8; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	pix += line_size - 16; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  | void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* read the pixels */ | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  |         block[0] = pixels[0]; | 
					
						
							|  |  |  |         block[1] = pixels[1]; | 
					
						
							|  |  |  |         block[2] = pixels[2]; | 
					
						
							|  |  |  |         block[3] = pixels[3]; | 
					
						
							|  |  |  |         block[4] = pixels[4]; | 
					
						
							|  |  |  |         block[5] = pixels[5]; | 
					
						
							|  |  |  |         block[6] = pixels[6]; | 
					
						
							|  |  |  |         block[7] = pixels[7]; | 
					
						
							|  |  |  |         pixels += line_size; | 
					
						
							|  |  |  |         block += 8; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  | void diff_pixels_c(DCTELEM *restrict block, const UINT8 *s1, const UINT8 *s2, | 
					
						
							|  |  |  | 		   int stride){ | 
					
						
							| 
									
										
										
										
											2002-04-17 04:32:12 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* read the pixels */ | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  |         block[0] = s1[0] - s2[0]; | 
					
						
							|  |  |  |         block[1] = s1[1] - s2[1]; | 
					
						
							|  |  |  |         block[2] = s1[2] - s2[2]; | 
					
						
							|  |  |  |         block[3] = s1[3] - s2[3]; | 
					
						
							|  |  |  |         block[4] = s1[4] - s2[4]; | 
					
						
							|  |  |  |         block[5] = s1[5] - s2[5]; | 
					
						
							|  |  |  |         block[6] = s1[6] - s2[6]; | 
					
						
							|  |  |  |         block[7] = s1[7] - s2[7]; | 
					
						
							| 
									
										
										
										
											2002-04-17 04:32:12 +00:00
										 |  |  |         s1 += stride; | 
					
						
							|  |  |  |         s2 += stride; | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  |         block += 8; | 
					
						
							| 
									
										
										
										
											2002-04-17 04:32:12 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  | void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels, | 
					
						
							|  |  |  |                           int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /* read the pixels */ | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  |         pixels[0] = cm[block[0]]; | 
					
						
							|  |  |  |         pixels[1] = cm[block[1]]; | 
					
						
							|  |  |  |         pixels[2] = cm[block[2]]; | 
					
						
							|  |  |  |         pixels[3] = cm[block[3]]; | 
					
						
							|  |  |  |         pixels[4] = cm[block[4]]; | 
					
						
							|  |  |  |         pixels[5] = cm[block[5]]; | 
					
						
							|  |  |  |         pixels[6] = cm[block[6]]; | 
					
						
							|  |  |  |         pixels[7] = cm[block[7]]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pixels += line_size; | 
					
						
							|  |  |  |         block += 8; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  | void add_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels, | 
					
						
							|  |  |  |                           int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /* read the pixels */ | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							| 
									
										
										
										
											2002-07-04 01:47:32 +00:00
										 |  |  |         pixels[0] = cm[pixels[0] + block[0]]; | 
					
						
							|  |  |  |         pixels[1] = cm[pixels[1] + block[1]]; | 
					
						
							|  |  |  |         pixels[2] = cm[pixels[2] + block[2]]; | 
					
						
							|  |  |  |         pixels[3] = cm[pixels[3] + block[3]]; | 
					
						
							|  |  |  |         pixels[4] = cm[pixels[4] + block[4]]; | 
					
						
							|  |  |  |         pixels[5] = cm[pixels[5] + block[5]]; | 
					
						
							|  |  |  |         pixels[6] = cm[pixels[6] + block[6]]; | 
					
						
							|  |  |  |         pixels[7] = cm[pixels[7] + block[7]]; | 
					
						
							|  |  |  |         pixels += line_size; | 
					
						
							|  |  |  |         block += 8; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | #if 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PIXOP2(OPNAME, OP) \
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _pixels(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         OP(*((uint64_t*)block), LD64(pixels));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _no_rnd_pixels_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |         OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _pixels_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |         OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _no_rnd_pixels_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels          );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+line_size);\ | 
					
						
							|  |  |  |         OP(*((uint64_t*)block), (a&b) + (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _pixels_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels          );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+line_size);\ | 
					
						
							|  |  |  |         OP(*((uint64_t*)block), (a|b) - (((a^b)&0xFEFEFEFEFEFEFEFEULL)>>1));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _pixels_xy2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |         int i;\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |         uint64_t l0=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                     + (b&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                     + 0x0202020202020202ULL;\ | 
					
						
							|  |  |  |         uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |                    + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |         uint64_t l1,h1;\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         for(i=0; i<h; i+=2){\ | 
					
						
							|  |  |  |             uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |             uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |             l1=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + (b&0x0303030303030303ULL);\ | 
					
						
							|  |  |  |             h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |             a= LD64(pixels  );\ | 
					
						
							|  |  |  |             b= LD64(pixels+1);\ | 
					
						
							|  |  |  |             l0=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + (b&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + 0x0202020202020202ULL;\ | 
					
						
							|  |  |  |             h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |         }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _no_rnd_pixels_xy2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |         int i;\ | 
					
						
							|  |  |  |         const uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |         const uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |         uint64_t l0=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                     + (b&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                     + 0x0101010101010101ULL;\ | 
					
						
							|  |  |  |         uint64_t h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |                    + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |         uint64_t l1,h1;\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         for(i=0; i<h; i+=2){\ | 
					
						
							|  |  |  |             uint64_t a= LD64(pixels  );\ | 
					
						
							|  |  |  |             uint64_t b= LD64(pixels+1);\ | 
					
						
							|  |  |  |             l1=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + (b&0x0303030303030303ULL);\ | 
					
						
							|  |  |  |             h1= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |             a= LD64(pixels  );\ | 
					
						
							|  |  |  |             b= LD64(pixels+1);\ | 
					
						
							|  |  |  |             l0=  (a&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + (b&0x0303030303030303ULL)\ | 
					
						
							|  |  |  |                + 0x0101010101010101ULL;\ | 
					
						
							|  |  |  |             h0= ((a&0xFCFCFCFCFCFCFCFCULL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCFCFCFCFCULL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint64_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0F0F0F0F0FULL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |         }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16    , OPNAME ## _pixels    , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_x2 , OPNAME ## _pixels_x2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_y2 , OPNAME ## _pixels_y2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_xy2, OPNAME ## _pixels_xy2, 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2 , OPNAME ## _no_rnd_pixels_x2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2 , OPNAME ## _no_rnd_pixels_y2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2, OPNAME ## _no_rnd_pixels_xy2, 8)\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | void (*OPNAME ## _pixels_tab[2][4])(uint8_t *block, const uint8_t *pixels, int line_size, int h) = {\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels_xy2},\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_xy2}\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | };\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | void (*OPNAME ## _no_rnd_pixels_tab[2][4])(uint8_t *block, const uint8_t *pixels, int line_size, int h) = {\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels_xy2},\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_xy2}\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define op_avg(a, b) a = ( ((a)|(b)) - ((((a)^(b))&0xFEFEFEFEFEFEFEFEULL)>>1) )
 | 
					
						
							|  |  |  | #else // 64 bit variant
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PIXOP2(OPNAME, OP) \
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## _pixels8(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)(block  )), LD32(pixels  ));\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)(block+4)), LD32(pixels+4));\ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         block +=line_size;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _no_rnd_pixels8(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8(block, pixels, line_size, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ | 
					
						
							|  |  |  |                                                 int src_stride1, int src_stride2, int h){\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         uint32_t a,b;\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1  ]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2  ]);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride  ]), (a&b) + (((a^b)&0xFEFEFEFEUL)>>1));\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1+4]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2+4]);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride+4]), (a&b) + (((a^b)&0xFEFEFEFEUL)>>1));\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ | 
					
						
							|  |  |  |                                                 int src_stride1, int src_stride2, int h){\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         uint32_t a,b;\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1  ]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2  ]);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride  ]), (a|b) - (((a^b)&0xFEFEFEFEUL)>>1));\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1+4]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2+4]);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride+4]), (a|b) - (((a^b)&0xFEFEFEFEUL)>>1));\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ | 
					
						
							|  |  |  |                                                 int src_stride1, int src_stride2, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l2(dst  , src1  , src2  , dst_stride, src_stride1, src_stride2, h);\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \ | 
					
						
							|  |  |  |                                                 int src_stride1, int src_stride2, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l2(dst  , src1  , src2  , dst_stride, src_stride1, src_stride2, h);\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _no_rnd_pixels8_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _pixels8_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _no_rnd_pixels8_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _pixels8_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static inline void OPNAME ## _pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ | 
					
						
							|  |  |  |                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         uint32_t a, b, c, d, l0, l1, h0, h1;\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2]);\ | 
					
						
							|  |  |  |         c= LD32(&src3[i*src_stride3]);\ | 
					
						
							|  |  |  |         d= LD32(&src4[i*src_stride4]);\ | 
					
						
							|  |  |  |         l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |            + (b&0x03030303UL)\ | 
					
						
							|  |  |  |            + 0x02020202UL;\ | 
					
						
							|  |  |  |         h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         l1=  (c&0x03030303UL)\ | 
					
						
							|  |  |  |            + (d&0x03030303UL);\ | 
					
						
							|  |  |  |         h1= ((c&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((d&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1+4]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2+4]);\ | 
					
						
							|  |  |  |         c= LD32(&src3[i*src_stride3+4]);\ | 
					
						
							|  |  |  |         d= LD32(&src4[i*src_stride4+4]);\ | 
					
						
							|  |  |  |         l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |            + (b&0x03030303UL)\ | 
					
						
							|  |  |  |            + 0x02020202UL;\ | 
					
						
							|  |  |  |         h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         l1=  (c&0x03030303UL)\ | 
					
						
							|  |  |  |            + (d&0x03030303UL);\ | 
					
						
							|  |  |  |         h1= ((c&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((d&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _no_rnd_pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ | 
					
						
							|  |  |  |                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++){\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         uint32_t a, b, c, d, l0, l1, h0, h1;\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2]);\ | 
					
						
							|  |  |  |         c= LD32(&src3[i*src_stride3]);\ | 
					
						
							|  |  |  |         d= LD32(&src4[i*src_stride4]);\ | 
					
						
							|  |  |  |         l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |            + (b&0x03030303UL)\ | 
					
						
							|  |  |  |            + 0x01010101UL;\ | 
					
						
							|  |  |  |         h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         l1=  (c&0x03030303UL)\ | 
					
						
							|  |  |  |            + (d&0x03030303UL);\ | 
					
						
							|  |  |  |         h1= ((c&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((d&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |         a= LD32(&src1[i*src_stride1+4]);\ | 
					
						
							|  |  |  |         b= LD32(&src2[i*src_stride2+4]);\ | 
					
						
							|  |  |  |         c= LD32(&src3[i*src_stride3+4]);\ | 
					
						
							|  |  |  |         d= LD32(&src4[i*src_stride4+4]);\ | 
					
						
							|  |  |  |         l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |            + (b&0x03030303UL)\ | 
					
						
							|  |  |  |            + 0x01010101UL;\ | 
					
						
							|  |  |  |         h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         l1=  (c&0x03030303UL)\ | 
					
						
							|  |  |  |            + (d&0x03030303UL);\ | 
					
						
							|  |  |  |         h1= ((c&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |           + ((d&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ | 
					
						
							|  |  |  |                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l4(dst  , src1  , src2  , src3  , src4  , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ | 
					
						
							|  |  |  |     OPNAME ## _pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static inline void OPNAME ## _no_rnd_pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\ | 
					
						
							|  |  |  |                  int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l4(dst  , src1  , src2  , src3  , src4  , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ | 
					
						
							|  |  |  |     OPNAME ## _no_rnd_pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\ | 
					
						
							|  |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _pixels8_xy2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int j;\ | 
					
						
							|  |  |  |     for(j=0; j<2; j++){\ | 
					
						
							|  |  |  |         int i;\ | 
					
						
							|  |  |  |         const uint32_t a= LD32(pixels  );\ | 
					
						
							|  |  |  |         const uint32_t b= LD32(pixels+1);\ | 
					
						
							|  |  |  |         uint32_t l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                     + (b&0x03030303UL)\ | 
					
						
							|  |  |  |                     + 0x02020202UL;\ | 
					
						
							|  |  |  |         uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |                    + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         uint32_t l1,h1;\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         for(i=0; i<h; i+=2){\ | 
					
						
							|  |  |  |             uint32_t a= LD32(pixels  );\ | 
					
						
							|  |  |  |             uint32_t b= LD32(pixels+1);\ | 
					
						
							|  |  |  |             l1=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                + (b&0x03030303UL);\ | 
					
						
							|  |  |  |             h1= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |             a= LD32(pixels  );\ | 
					
						
							|  |  |  |             b= LD32(pixels+1);\ | 
					
						
							|  |  |  |             l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                + (b&0x03030303UL)\ | 
					
						
							|  |  |  |                + 0x02020202UL;\ | 
					
						
							|  |  |  |             h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |         }\ | 
					
						
							|  |  |  |         pixels+=4-line_size*(h+1);\ | 
					
						
							|  |  |  |         block +=4-line_size*h;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void OPNAME ## _no_rnd_pixels8_xy2(uint8_t *block, const uint8_t *pixels, int line_size, int h)\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | {\ | 
					
						
							|  |  |  |     int j;\ | 
					
						
							|  |  |  |     for(j=0; j<2; j++){\ | 
					
						
							|  |  |  |         int i;\ | 
					
						
							|  |  |  |         const uint32_t a= LD32(pixels  );\ | 
					
						
							|  |  |  |         const uint32_t b= LD32(pixels+1);\ | 
					
						
							|  |  |  |         uint32_t l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                     + (b&0x03030303UL)\ | 
					
						
							|  |  |  |                     + 0x01010101UL;\ | 
					
						
							|  |  |  |         uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |                    + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |         uint32_t l1,h1;\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  |         pixels+=line_size;\ | 
					
						
							|  |  |  |         for(i=0; i<h; i+=2){\ | 
					
						
							|  |  |  |             uint32_t a= LD32(pixels  );\ | 
					
						
							|  |  |  |             uint32_t b= LD32(pixels+1);\ | 
					
						
							|  |  |  |             l1=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                + (b&0x03030303UL);\ | 
					
						
							|  |  |  |             h1= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |             a= LD32(pixels  );\ | 
					
						
							|  |  |  |             b= LD32(pixels+1);\ | 
					
						
							|  |  |  |             l0=  (a&0x03030303UL)\ | 
					
						
							|  |  |  |                + (b&0x03030303UL)\ | 
					
						
							|  |  |  |                + 0x01010101UL;\ | 
					
						
							|  |  |  |             h0= ((a&0xFCFCFCFCUL)>>2)\ | 
					
						
							|  |  |  |               + ((b&0xFCFCFCFCUL)>>2);\ | 
					
						
							|  |  |  |             OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\ | 
					
						
							|  |  |  |             pixels+=line_size;\ | 
					
						
							|  |  |  |             block +=line_size;\ | 
					
						
							|  |  |  |         }\ | 
					
						
							|  |  |  |         pixels+=4-line_size*(h+1);\ | 
					
						
							|  |  |  |         block +=4-line_size*h;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16    , OPNAME ## _pixels8    , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_x2 , OPNAME ## _pixels8_x2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_y2 , OPNAME ## _pixels8_y2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _pixels16_xy2, OPNAME ## _pixels8_xy2, 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16    , OPNAME ## _pixels8    , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2 , OPNAME ## _no_rnd_pixels8_x2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2 , OPNAME ## _no_rnd_pixels8_y2 , 8)\ | 
					
						
							|  |  |  | CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2, OPNAME ## _no_rnd_pixels8_xy2, 8)\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | void (*OPNAME ## _pixels_tab[2][4])(uint8_t *block, const uint8_t *pixels, int line_size, int h) = {\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16_xy2},\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels8,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels8_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels8_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _pixels8_xy2},\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | };\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | void (*OPNAME ## _no_rnd_pixels_tab[2][4])(uint8_t *block, const uint8_t *pixels, int line_size, int h) = {\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels16,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels16_xy2},\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OPNAME ## _pixels8,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels8_x2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels8_y2,\ | 
					
						
							|  |  |  |         OPNAME ## _no_rnd_pixels8_xy2},\ | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | #define op_avg(a, b) a = ( ((a)|(b)) - ((((a)^(b))&0xFEFEFEFEUL)>>1) )
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #define op_put(a, b) a = b
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PIXOP2(avg, op_avg) | 
					
						
							|  |  |  | PIXOP2(put, op_put) | 
					
						
							|  |  |  | #undef op_avg
 | 
					
						
							|  |  |  | #undef op_put
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:37:58 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2002-05-16 23:29:09 +00:00
										 |  |  | /* FIXME this stuff could be removed as its ot really used anymore */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | #define PIXOP(BTYPE, OPNAME, OP, INCR)                                                   \
 | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  | static void OPNAME ## _pixels(BTYPE *block, const UINT8 *pixels, int line_size, int h)    \ | 
					
						
							|  |  |  | {                                                                                        \ | 
					
						
							|  |  |  |     BTYPE *p;                                                                            \ | 
					
						
							|  |  |  |     const UINT8 *pix;                                                                    \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  |     p = block;                                                                           \ | 
					
						
							|  |  |  |     pix = pixels;                                                                        \ | 
					
						
							|  |  |  |     do {                                                                                 \ | 
					
						
							|  |  |  |         OP(p[0], pix[0]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[1], pix[1]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[2], pix[2]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[3], pix[3]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[4], pix[4]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[5], pix[5]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[6], pix[6]);                                                                  \ | 
					
						
							|  |  |  |         OP(p[7], pix[7]);                                                                  \ | 
					
						
							|  |  |  |         pix += line_size;                                                                \ | 
					
						
							|  |  |  |         p += INCR;                                                                       \ | 
					
						
							|  |  |  |     } while (--h);;                                                                       \ | 
					
						
							|  |  |  | }                                                                                        \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  | static void OPNAME ## _pixels_x2(BTYPE *block, const UINT8 *pixels, int line_size, int h)     \ | 
					
						
							|  |  |  | {                                                                                        \ | 
					
						
							|  |  |  |     BTYPE *p;                                                                          \ | 
					
						
							|  |  |  |     const UINT8 *pix;                                                                    \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  |     p = block;                                                                           \ | 
					
						
							|  |  |  |     pix = pixels;                                                                        \ | 
					
						
							|  |  |  |     do {                                                                   \ | 
					
						
							|  |  |  |         OP(p[0], avg2(pix[0], pix[1]));                                                    \ | 
					
						
							|  |  |  |         OP(p[1], avg2(pix[1], pix[2]));                                                    \ | 
					
						
							|  |  |  |         OP(p[2], avg2(pix[2], pix[3]));                                                    \ | 
					
						
							|  |  |  |         OP(p[3], avg2(pix[3], pix[4]));                                                    \ | 
					
						
							|  |  |  |         OP(p[4], avg2(pix[4], pix[5]));                                                    \ | 
					
						
							|  |  |  |         OP(p[5], avg2(pix[5], pix[6]));                                                    \ | 
					
						
							|  |  |  |         OP(p[6], avg2(pix[6], pix[7]));                                                    \ | 
					
						
							|  |  |  |         OP(p[7], avg2(pix[7], pix[8]));                                                    \ | 
					
						
							|  |  |  |         pix += line_size;                                                                \ | 
					
						
							|  |  |  |         p += INCR;                                                                       \ | 
					
						
							|  |  |  |     } while (--h);                                                                        \ | 
					
						
							|  |  |  | }                                                                                        \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  | static void OPNAME ## _pixels_y2(BTYPE *block, const UINT8 *pixels, int line_size, int h)     \ | 
					
						
							|  |  |  | {                                                                                        \ | 
					
						
							|  |  |  |     BTYPE *p;                                                                          \ | 
					
						
							|  |  |  |     const UINT8 *pix;                                                                    \ | 
					
						
							|  |  |  |     const UINT8 *pix1;                                                                   \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  |     p = block;                                                                           \ | 
					
						
							|  |  |  |     pix = pixels;                                                                        \ | 
					
						
							|  |  |  |     pix1 = pixels + line_size;                                                           \ | 
					
						
							|  |  |  |     do {                                                                                 \ | 
					
						
							|  |  |  |         OP(p[0], avg2(pix[0], pix1[0]));                                                   \ | 
					
						
							|  |  |  |         OP(p[1], avg2(pix[1], pix1[1]));                                                   \ | 
					
						
							|  |  |  |         OP(p[2], avg2(pix[2], pix1[2]));                                                   \ | 
					
						
							|  |  |  |         OP(p[3], avg2(pix[3], pix1[3]));                                                   \ | 
					
						
							|  |  |  |         OP(p[4], avg2(pix[4], pix1[4]));                                                   \ | 
					
						
							|  |  |  |         OP(p[5], avg2(pix[5], pix1[5]));                                                   \ | 
					
						
							|  |  |  |         OP(p[6], avg2(pix[6], pix1[6]));                                                   \ | 
					
						
							|  |  |  |         OP(p[7], avg2(pix[7], pix1[7]));                                                   \ | 
					
						
							|  |  |  |         pix += line_size;                                                                \ | 
					
						
							|  |  |  |         pix1 += line_size;                                                               \ | 
					
						
							|  |  |  |         p += INCR;                                                                       \ | 
					
						
							|  |  |  |     } while(--h);                                                                         \ | 
					
						
							|  |  |  | }                                                                                        \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  | static void OPNAME ## _pixels_xy2(BTYPE *block, const UINT8 *pixels, int line_size, int h)    \ | 
					
						
							|  |  |  | {                                                                                        \ | 
					
						
							|  |  |  |     BTYPE *p;                                                                          \ | 
					
						
							|  |  |  |     const UINT8 *pix;                                                                    \ | 
					
						
							|  |  |  |     const UINT8 *pix1;                                                                   \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  |     p = block;                                                                           \ | 
					
						
							|  |  |  |     pix = pixels;                                                                        \ | 
					
						
							|  |  |  |     pix1 = pixels + line_size;                                                           \ | 
					
						
							|  |  |  |     do {                                                                   \ | 
					
						
							|  |  |  |         OP(p[0], avg4(pix[0], pix[1], pix1[0], pix1[1]));                                  \ | 
					
						
							|  |  |  |         OP(p[1], avg4(pix[1], pix[2], pix1[1], pix1[2]));                                  \ | 
					
						
							|  |  |  |         OP(p[2], avg4(pix[2], pix[3], pix1[2], pix1[3]));                                  \ | 
					
						
							|  |  |  |         OP(p[3], avg4(pix[3], pix[4], pix1[3], pix1[4]));                                  \ | 
					
						
							|  |  |  |         OP(p[4], avg4(pix[4], pix[5], pix1[4], pix1[5]));                                  \ | 
					
						
							|  |  |  |         OP(p[5], avg4(pix[5], pix[6], pix1[5], pix1[6]));                                  \ | 
					
						
							|  |  |  |         OP(p[6], avg4(pix[6], pix[7], pix1[6], pix1[7]));                                  \ | 
					
						
							|  |  |  |         OP(p[7], avg4(pix[7], pix[8], pix1[7], pix1[8]));                                  \ | 
					
						
							|  |  |  |         pix += line_size;                                                                \ | 
					
						
							|  |  |  |         pix1 += line_size;                                                               \ | 
					
						
							|  |  |  |         p += INCR;                                                                       \ | 
					
						
							|  |  |  |     } while(--h);                                                                         \ | 
					
						
							|  |  |  | }                                                                                        \ | 
					
						
							|  |  |  |                                                                                          \ | 
					
						
							|  |  |  | void (*OPNAME ## _pixels_tab[4])(BTYPE *block, const UINT8 *pixels, int line_size, int h) = { \ | 
					
						
							|  |  |  |     OPNAME ## _pixels,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## _pixels_x2,                                                                \ | 
					
						
							|  |  |  |     OPNAME ## _pixels_y2,                                                                \ | 
					
						
							|  |  |  |     OPNAME ## _pixels_xy2,                                                               \ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* rounding primitives */ | 
					
						
							|  |  |  | #define avg2(a,b) ((a+b+1)>>1)
 | 
					
						
							|  |  |  | #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define op_avg(a, b) a = avg2(a, b)
 | 
					
						
							|  |  |  | #define op_sub(a, b) a -= b
 | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  | #define op_put(a, b) a = b
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PIXOP(DCTELEM, sub, op_sub, 8) | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  | PIXOP(uint8_t, avg, op_avg, line_size) | 
					
						
							|  |  |  | PIXOP(uint8_t, put, op_put, line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* not rounding primitives */ | 
					
						
							|  |  |  | #undef avg2
 | 
					
						
							|  |  |  | #undef avg4
 | 
					
						
							|  |  |  | #define avg2(a,b) ((a+b)>>1)
 | 
					
						
							|  |  |  | #define avg4(a,b,c,d) ((a+b+c+d+1)>>2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  | PIXOP(uint8_t, avg_no_rnd, op_avg, line_size) | 
					
						
							|  |  |  | PIXOP(uint8_t, put_no_rnd, op_put, line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* motion estimation */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #undef avg2
 | 
					
						
							|  |  |  | #undef avg4
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:37:58 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | #define avg2(a,b) ((a+b+1)>>1)
 | 
					
						
							|  |  |  | #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void gmc1_c(UINT8 *dst, UINT8 *src, int stride, int h, int x16, int y16, int rounder) | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     const int A=(16-x16)*(16-y16); | 
					
						
							|  |  |  |     const int B=(   x16)*(16-y16); | 
					
						
							|  |  |  |     const int C=(16-x16)*(   y16); | 
					
						
							|  |  |  |     const int D=(   x16)*(   y16); | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     rounder= 128 - rounder; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=0; i<h; i++) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         dst[0]= (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + rounder)>>8; | 
					
						
							|  |  |  |         dst[1]= (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + rounder)>>8; | 
					
						
							|  |  |  |         dst[2]= (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + rounder)>>8; | 
					
						
							|  |  |  |         dst[3]= (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + rounder)>>8; | 
					
						
							|  |  |  |         dst[4]= (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + rounder)>>8; | 
					
						
							|  |  |  |         dst[5]= (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + rounder)>>8; | 
					
						
							|  |  |  |         dst[6]= (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + rounder)>>8; | 
					
						
							|  |  |  |         dst[7]= (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + rounder)>>8; | 
					
						
							|  |  |  |         dst+= stride; | 
					
						
							|  |  |  |         src+= stride; | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void copy_block17(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h) | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     for(i=0; i<h; i++) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         ST32(dst   , LD32(src   )); | 
					
						
							|  |  |  |         ST32(dst+4 , LD32(src+4 )); | 
					
						
							|  |  |  |         ST32(dst+8 , LD32(src+8 )); | 
					
						
							|  |  |  |         ST32(dst+12, LD32(src+12)); | 
					
						
							|  |  |  |         dst[16]= src[16]; | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |         dst+=dstStride; | 
					
						
							|  |  |  |         src+=srcStride; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static inline void copy_block9(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h) | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     for(i=0; i<h; i++) | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |         ST32(dst   , LD32(src   )); | 
					
						
							|  |  |  |         ST32(dst+4 , LD32(src+4 )); | 
					
						
							|  |  |  |         dst[8]= src[8]; | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |         dst+=dstStride; | 
					
						
							|  |  |  |         src+=srcStride; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | #define QPEL_MC(r, OPNAME, RND, OP) \
 | 
					
						
							|  |  |  | static void OPNAME ## mpeg4_qpel8_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP;\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++)\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OP(dst[0], (src[0]+src[1])*20 - (src[0]+src[2])*6 + (src[1]+src[3])*3 - (src[2]+src[4]));\ | 
					
						
							|  |  |  |         OP(dst[1], (src[1]+src[2])*20 - (src[0]+src[3])*6 + (src[0]+src[4])*3 - (src[1]+src[5]));\ | 
					
						
							|  |  |  |         OP(dst[2], (src[2]+src[3])*20 - (src[1]+src[4])*6 + (src[0]+src[5])*3 - (src[0]+src[6]));\ | 
					
						
							|  |  |  |         OP(dst[3], (src[3]+src[4])*20 - (src[2]+src[5])*6 + (src[1]+src[6])*3 - (src[0]+src[7]));\ | 
					
						
							|  |  |  |         OP(dst[4], (src[4]+src[5])*20 - (src[3]+src[6])*6 + (src[2]+src[7])*3 - (src[1]+src[8]));\ | 
					
						
							|  |  |  |         OP(dst[5], (src[5]+src[6])*20 - (src[4]+src[7])*6 + (src[3]+src[8])*3 - (src[2]+src[8]));\ | 
					
						
							|  |  |  |         OP(dst[6], (src[6]+src[7])*20 - (src[5]+src[8])*6 + (src[4]+src[8])*3 - (src[3]+src[7]));\ | 
					
						
							|  |  |  |         OP(dst[7], (src[7]+src[8])*20 - (src[6]+src[8])*6 + (src[5]+src[7])*3 - (src[4]+src[6]));\ | 
					
						
							|  |  |  |         dst+=dstStride;\ | 
					
						
							|  |  |  |         src+=srcStride;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## mpeg4_qpel8_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int w){\ | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP;\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<w; i++)\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         const int src0= src[0*srcStride];\ | 
					
						
							|  |  |  |         const int src1= src[1*srcStride];\ | 
					
						
							|  |  |  |         const int src2= src[2*srcStride];\ | 
					
						
							|  |  |  |         const int src3= src[3*srcStride];\ | 
					
						
							|  |  |  |         const int src4= src[4*srcStride];\ | 
					
						
							|  |  |  |         const int src5= src[5*srcStride];\ | 
					
						
							|  |  |  |         const int src6= src[6*srcStride];\ | 
					
						
							|  |  |  |         const int src7= src[7*srcStride];\ | 
					
						
							|  |  |  |         const int src8= src[8*srcStride];\ | 
					
						
							|  |  |  |         OP(dst[0*dstStride], (src0+src1)*20 - (src0+src2)*6 + (src1+src3)*3 - (src2+src4));\ | 
					
						
							|  |  |  |         OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*6 + (src0+src4)*3 - (src1+src5));\ | 
					
						
							|  |  |  |         OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*6 + (src0+src5)*3 - (src0+src6));\ | 
					
						
							|  |  |  |         OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*6 + (src1+src6)*3 - (src0+src7));\ | 
					
						
							|  |  |  |         OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*6 + (src2+src7)*3 - (src1+src8));\ | 
					
						
							|  |  |  |         OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*6 + (src3+src8)*3 - (src2+src8));\ | 
					
						
							|  |  |  |         OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*6 + (src4+src8)*3 - (src3+src7));\ | 
					
						
							|  |  |  |         OP(dst[7*dstStride], (src7+src8)*20 - (src6+src8)*6 + (src5+src7)*3 - (src4+src6));\ | 
					
						
							|  |  |  |         dst++;\ | 
					
						
							|  |  |  |         src++;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## mpeg4_qpel16_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP;\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<h; i++)\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         OP(dst[ 0], (src[ 0]+src[ 1])*20 - (src[ 0]+src[ 2])*6 + (src[ 1]+src[ 3])*3 - (src[ 2]+src[ 4]));\ | 
					
						
							|  |  |  |         OP(dst[ 1], (src[ 1]+src[ 2])*20 - (src[ 0]+src[ 3])*6 + (src[ 0]+src[ 4])*3 - (src[ 1]+src[ 5]));\ | 
					
						
							|  |  |  |         OP(dst[ 2], (src[ 2]+src[ 3])*20 - (src[ 1]+src[ 4])*6 + (src[ 0]+src[ 5])*3 - (src[ 0]+src[ 6]));\ | 
					
						
							|  |  |  |         OP(dst[ 3], (src[ 3]+src[ 4])*20 - (src[ 2]+src[ 5])*6 + (src[ 1]+src[ 6])*3 - (src[ 0]+src[ 7]));\ | 
					
						
							|  |  |  |         OP(dst[ 4], (src[ 4]+src[ 5])*20 - (src[ 3]+src[ 6])*6 + (src[ 2]+src[ 7])*3 - (src[ 1]+src[ 8]));\ | 
					
						
							|  |  |  |         OP(dst[ 5], (src[ 5]+src[ 6])*20 - (src[ 4]+src[ 7])*6 + (src[ 3]+src[ 8])*3 - (src[ 2]+src[ 9]));\ | 
					
						
							|  |  |  |         OP(dst[ 6], (src[ 6]+src[ 7])*20 - (src[ 5]+src[ 8])*6 + (src[ 4]+src[ 9])*3 - (src[ 3]+src[10]));\ | 
					
						
							|  |  |  |         OP(dst[ 7], (src[ 7]+src[ 8])*20 - (src[ 6]+src[ 9])*6 + (src[ 5]+src[10])*3 - (src[ 4]+src[11]));\ | 
					
						
							|  |  |  |         OP(dst[ 8], (src[ 8]+src[ 9])*20 - (src[ 7]+src[10])*6 + (src[ 6]+src[11])*3 - (src[ 5]+src[12]));\ | 
					
						
							|  |  |  |         OP(dst[ 9], (src[ 9]+src[10])*20 - (src[ 8]+src[11])*6 + (src[ 7]+src[12])*3 - (src[ 6]+src[13]));\ | 
					
						
							|  |  |  |         OP(dst[10], (src[10]+src[11])*20 - (src[ 9]+src[12])*6 + (src[ 8]+src[13])*3 - (src[ 7]+src[14]));\ | 
					
						
							|  |  |  |         OP(dst[11], (src[11]+src[12])*20 - (src[10]+src[13])*6 + (src[ 9]+src[14])*3 - (src[ 8]+src[15]));\ | 
					
						
							|  |  |  |         OP(dst[12], (src[12]+src[13])*20 - (src[11]+src[14])*6 + (src[10]+src[15])*3 - (src[ 9]+src[16]));\ | 
					
						
							|  |  |  |         OP(dst[13], (src[13]+src[14])*20 - (src[12]+src[15])*6 + (src[11]+src[16])*3 - (src[10]+src[16]));\ | 
					
						
							|  |  |  |         OP(dst[14], (src[14]+src[15])*20 - (src[13]+src[16])*6 + (src[12]+src[16])*3 - (src[11]+src[15]));\ | 
					
						
							|  |  |  |         OP(dst[15], (src[15]+src[16])*20 - (src[14]+src[16])*6 + (src[13]+src[15])*3 - (src[12]+src[14]));\ | 
					
						
							|  |  |  |         dst+=dstStride;\ | 
					
						
							|  |  |  |         src+=srcStride;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## mpeg4_qpel16_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int w){\ | 
					
						
							|  |  |  |     UINT8 *cm = cropTbl + MAX_NEG_CROP;\ | 
					
						
							|  |  |  |     int i;\ | 
					
						
							|  |  |  |     for(i=0; i<w; i++)\ | 
					
						
							|  |  |  |     {\ | 
					
						
							|  |  |  |         const int src0= src[0*srcStride];\ | 
					
						
							|  |  |  |         const int src1= src[1*srcStride];\ | 
					
						
							|  |  |  |         const int src2= src[2*srcStride];\ | 
					
						
							|  |  |  |         const int src3= src[3*srcStride];\ | 
					
						
							|  |  |  |         const int src4= src[4*srcStride];\ | 
					
						
							|  |  |  |         const int src5= src[5*srcStride];\ | 
					
						
							|  |  |  |         const int src6= src[6*srcStride];\ | 
					
						
							|  |  |  |         const int src7= src[7*srcStride];\ | 
					
						
							|  |  |  |         const int src8= src[8*srcStride];\ | 
					
						
							|  |  |  |         const int src9= src[9*srcStride];\ | 
					
						
							|  |  |  |         const int src10= src[10*srcStride];\ | 
					
						
							|  |  |  |         const int src11= src[11*srcStride];\ | 
					
						
							|  |  |  |         const int src12= src[12*srcStride];\ | 
					
						
							|  |  |  |         const int src13= src[13*srcStride];\ | 
					
						
							|  |  |  |         const int src14= src[14*srcStride];\ | 
					
						
							|  |  |  |         const int src15= src[15*srcStride];\ | 
					
						
							|  |  |  |         const int src16= src[16*srcStride];\ | 
					
						
							|  |  |  |         OP(dst[ 0*dstStride], (src0 +src1 )*20 - (src0 +src2 )*6 + (src1 +src3 )*3 - (src2 +src4 ));\ | 
					
						
							|  |  |  |         OP(dst[ 1*dstStride], (src1 +src2 )*20 - (src0 +src3 )*6 + (src0 +src4 )*3 - (src1 +src5 ));\ | 
					
						
							|  |  |  |         OP(dst[ 2*dstStride], (src2 +src3 )*20 - (src1 +src4 )*6 + (src0 +src5 )*3 - (src0 +src6 ));\ | 
					
						
							|  |  |  |         OP(dst[ 3*dstStride], (src3 +src4 )*20 - (src2 +src5 )*6 + (src1 +src6 )*3 - (src0 +src7 ));\ | 
					
						
							|  |  |  |         OP(dst[ 4*dstStride], (src4 +src5 )*20 - (src3 +src6 )*6 + (src2 +src7 )*3 - (src1 +src8 ));\ | 
					
						
							|  |  |  |         OP(dst[ 5*dstStride], (src5 +src6 )*20 - (src4 +src7 )*6 + (src3 +src8 )*3 - (src2 +src9 ));\ | 
					
						
							|  |  |  |         OP(dst[ 6*dstStride], (src6 +src7 )*20 - (src5 +src8 )*6 + (src4 +src9 )*3 - (src3 +src10));\ | 
					
						
							|  |  |  |         OP(dst[ 7*dstStride], (src7 +src8 )*20 - (src6 +src9 )*6 + (src5 +src10)*3 - (src4 +src11));\ | 
					
						
							|  |  |  |         OP(dst[ 8*dstStride], (src8 +src9 )*20 - (src7 +src10)*6 + (src6 +src11)*3 - (src5 +src12));\ | 
					
						
							|  |  |  |         OP(dst[ 9*dstStride], (src9 +src10)*20 - (src8 +src11)*6 + (src7 +src12)*3 - (src6 +src13));\ | 
					
						
							|  |  |  |         OP(dst[10*dstStride], (src10+src11)*20 - (src9 +src12)*6 + (src8 +src13)*3 - (src7 +src14));\ | 
					
						
							|  |  |  |         OP(dst[11*dstStride], (src11+src12)*20 - (src10+src13)*6 + (src9 +src14)*3 - (src8 +src15));\ | 
					
						
							|  |  |  |         OP(dst[12*dstStride], (src12+src13)*20 - (src11+src14)*6 + (src10+src15)*3 - (src9 +src16));\ | 
					
						
							|  |  |  |         OP(dst[13*dstStride], (src13+src14)*20 - (src12+src15)*6 + (src11+src16)*3 - (src10+src16));\ | 
					
						
							|  |  |  |         OP(dst[14*dstStride], (src14+src15)*20 - (src13+src16)*6 + (src12+src16)*3 - (src11+src15));\ | 
					
						
							|  |  |  |         OP(dst[15*dstStride], (src15+src16)*20 - (src14+src16)*6 + (src13+src15)*3 - (src12+src14));\ | 
					
						
							|  |  |  |         dst++;\ | 
					
						
							|  |  |  |         src++;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel8_mc00_c (UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     OPNAME ## pixels8(dst, src, stride, 8);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel8_mc10_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 half[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, src, half, stride, stride, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc20_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc30_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 half[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, src+1, half, stride, stride, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc01_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 half[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, full, half, stride, 16, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc02_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							|  |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc03_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 half[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, full+16, half, stride, 16, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc11_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l4(dst, full, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc31_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l4(dst, full+1, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc13_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l4(dst, full+16, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc33_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full  , 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l4(dst, full+17, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc21_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							|  |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc23_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							|  |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc12_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc32_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[16*9];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 14:22:21 +00:00
										 |  |  |     UINT8 halfV[64];\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfHV[64];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     copy_block9(full, src, 16, stride, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16, 8);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8, 8);\ | 
					
						
							|  |  |  |     OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | static void OPNAME ## qpel8_mc22_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     UINT8 halfH[72];\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  |     put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8, 8);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc00_c (UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     OPNAME ## pixels16(dst, src, stride, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc10_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 half[256];\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, src, half, stride, stride, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc20_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16);\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }\ | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc30_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 half[256];\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, src+1, half, stride, stride, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc01_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 half[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc02_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc03_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 half[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc11_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc31_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc13_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc33_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full  , 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc21_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc23_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc12_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc32_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 full[24*17];\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     UINT8 halfV[256];\ | 
					
						
							|  |  |  |     UINT8 halfHV[256];\ | 
					
						
							|  |  |  |     copy_block17(full, src, 24, stride, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ | 
					
						
							|  |  |  |     OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | static void OPNAME ## qpel16_mc22_c(UINT8 *dst, UINT8 *src, int stride){\ | 
					
						
							|  |  |  |     UINT8 halfH[272];\ | 
					
						
							|  |  |  |     put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ | 
					
						
							|  |  |  |     OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16, 16);\ | 
					
						
							|  |  |  | }\ | 
					
						
							|  |  |  | qpel_mc_func OPNAME ## qpel_pixels_tab[2][16]={ \ | 
					
						
							|  |  |  |   {\ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc00_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc10_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc20_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc30_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc01_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc11_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc21_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc31_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc02_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc12_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc22_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc32_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc03_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc13_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc23_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel16_mc33_c,                                                                   \ | 
					
						
							|  |  |  |   },{\ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc00_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc10_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc20_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc30_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc01_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc11_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc21_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc31_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc02_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc12_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc22_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc32_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc03_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc13_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc23_c,                                                                   \ | 
					
						
							|  |  |  |     OPNAME ## qpel8_mc33_c,                                                                   \ | 
					
						
							|  |  |  |   }\ | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 12:39:53 +00:00
										 |  |  | #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
 | 
					
						
							|  |  |  | #define op_avg_no_rnd(a, b) a = (((a)+cm[((b) + 15)>>5])>>1)
 | 
					
						
							|  |  |  | #define op_put(a, b) a = cm[((b) + 16)>>5]
 | 
					
						
							|  |  |  | #define op_put_no_rnd(a, b) a = cm[((b) + 15)>>5]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QPEL_MC(0, put_       , _       , op_put) | 
					
						
							|  |  |  | QPEL_MC(1, put_no_rnd_, _no_rnd_, op_put_no_rnd) | 
					
						
							|  |  |  | QPEL_MC(0, avg_       , _       , op_avg) | 
					
						
							|  |  |  | //QPEL_MC(1, avg_no_rnd , _       , op_avg)
 | 
					
						
							|  |  |  | #undef op_avg
 | 
					
						
							|  |  |  | #undef op_avg_no_rnd
 | 
					
						
							|  |  |  | #undef op_put
 | 
					
						
							|  |  |  | #undef op_put_no_rnd
 | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     for(i=0;i<16;i++) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         s += abs(pix1[0] - pix2[0]); | 
					
						
							|  |  |  |         s += abs(pix1[1] - pix2[1]); | 
					
						
							|  |  |  |         s += abs(pix1[2] - pix2[2]); | 
					
						
							|  |  |  |         s += abs(pix1[3] - pix2[3]); | 
					
						
							|  |  |  |         s += abs(pix1[4] - pix2[4]); | 
					
						
							|  |  |  |         s += abs(pix1[5] - pix2[5]); | 
					
						
							|  |  |  |         s += abs(pix1[6] - pix2[6]); | 
					
						
							|  |  |  |         s += abs(pix1[7] - pix2[7]); | 
					
						
							|  |  |  |         s += abs(pix1[8] - pix2[8]); | 
					
						
							|  |  |  |         s += abs(pix1[9] - pix2[9]); | 
					
						
							|  |  |  |         s += abs(pix1[10] - pix2[10]); | 
					
						
							|  |  |  |         s += abs(pix1[11] - pix2[11]); | 
					
						
							|  |  |  |         s += abs(pix1[12] - pix2[12]); | 
					
						
							|  |  |  |         s += abs(pix1[13] - pix2[13]); | 
					
						
							|  |  |  |         s += abs(pix1[14] - pix2[14]); | 
					
						
							|  |  |  |         s += abs(pix1[15] - pix2[15]); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     for(i=0;i<16;i++) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         s += abs(pix1[0] - avg2(pix2[0], pix2[1])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg2(pix2[1], pix2[2])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg2(pix2[2], pix2[3])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg2(pix2[3], pix2[4])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg2(pix2[4], pix2[5])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg2(pix2[5], pix2[6])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg2(pix2[6], pix2[7])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg2(pix2[7], pix2[8])); | 
					
						
							|  |  |  |         s += abs(pix1[8] - avg2(pix2[8], pix2[9])); | 
					
						
							|  |  |  |         s += abs(pix1[9] - avg2(pix2[9], pix2[10])); | 
					
						
							|  |  |  |         s += abs(pix1[10] - avg2(pix2[10], pix2[11])); | 
					
						
							|  |  |  |         s += abs(pix1[11] - avg2(pix2[11], pix2[12])); | 
					
						
							|  |  |  |         s += abs(pix1[12] - avg2(pix2[12], pix2[13])); | 
					
						
							|  |  |  |         s += abs(pix1[13] - avg2(pix2[13], pix2[14])); | 
					
						
							|  |  |  |         s += abs(pix1[14] - avg2(pix2[14], pix2[15])); | 
					
						
							|  |  |  |         s += abs(pix1[15] - avg2(pix2[15], pix2[16])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  |     UINT8 *pix3 = pix2 + line_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     for(i=0;i<16;i++) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         s += abs(pix1[0] - avg2(pix2[0], pix3[0])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg2(pix2[1], pix3[1])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg2(pix2[2], pix3[2])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg2(pix2[3], pix3[3])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg2(pix2[4], pix3[4])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg2(pix2[5], pix3[5])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg2(pix2[6], pix3[6])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg2(pix2[7], pix3[7])); | 
					
						
							|  |  |  |         s += abs(pix1[8] - avg2(pix2[8], pix3[8])); | 
					
						
							|  |  |  |         s += abs(pix1[9] - avg2(pix2[9], pix3[9])); | 
					
						
							|  |  |  |         s += abs(pix1[10] - avg2(pix2[10], pix3[10])); | 
					
						
							|  |  |  |         s += abs(pix1[11] - avg2(pix2[11], pix3[11])); | 
					
						
							|  |  |  |         s += abs(pix1[12] - avg2(pix2[12], pix3[12])); | 
					
						
							|  |  |  |         s += abs(pix1[13] - avg2(pix2[13], pix3[13])); | 
					
						
							|  |  |  |         s += abs(pix1[14] - avg2(pix2[14], pix3[14])); | 
					
						
							|  |  |  |         s += abs(pix1[15] - avg2(pix2[15], pix3[15])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |         pix3 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  |     UINT8 *pix3 = pix2 + line_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     for(i=0;i<16;i++) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8])); | 
					
						
							|  |  |  |         s += abs(pix1[8] - avg4(pix2[8], pix2[9], pix3[8], pix3[9])); | 
					
						
							|  |  |  |         s += abs(pix1[9] - avg4(pix2[9], pix2[10], pix3[9], pix3[10])); | 
					
						
							|  |  |  |         s += abs(pix1[10] - avg4(pix2[10], pix2[11], pix3[10], pix3[11])); | 
					
						
							|  |  |  |         s += abs(pix1[11] - avg4(pix2[11], pix2[12], pix3[11], pix3[12])); | 
					
						
							|  |  |  |         s += abs(pix1[12] - avg4(pix2[12], pix2[13], pix3[12], pix3[13])); | 
					
						
							|  |  |  |         s += abs(pix1[13] - avg4(pix2[13], pix2[14], pix3[13], pix3[14])); | 
					
						
							|  |  |  |         s += abs(pix1[14] - avg4(pix2[14], pix2[15], pix3[14], pix3[15])); | 
					
						
							|  |  |  |         s += abs(pix1[15] - avg4(pix2[15], pix2[16], pix3[15], pix3[16])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |         pix3 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  | int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							|  |  |  |         s += abs(pix1[0] - pix2[0]); | 
					
						
							|  |  |  |         s += abs(pix1[1] - pix2[1]); | 
					
						
							|  |  |  |         s += abs(pix1[2] - pix2[2]); | 
					
						
							|  |  |  |         s += abs(pix1[3] - pix2[3]); | 
					
						
							|  |  |  |         s += abs(pix1[4] - pix2[4]); | 
					
						
							|  |  |  |         s += abs(pix1[5] - pix2[5]); | 
					
						
							|  |  |  |         s += abs(pix1[6] - pix2[6]); | 
					
						
							|  |  |  |         s += abs(pix1[7] - pix2[7]); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							|  |  |  |         s += abs(pix1[0] - avg2(pix2[0], pix2[1])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg2(pix2[1], pix2[2])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg2(pix2[2], pix2[3])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg2(pix2[3], pix2[4])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg2(pix2[4], pix2[5])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg2(pix2[5], pix2[6])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg2(pix2[6], pix2[7])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg2(pix2[7], pix2[8])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  |     UINT8 *pix3 = pix2 + line_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							|  |  |  |         s += abs(pix1[0] - avg2(pix2[0], pix3[0])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg2(pix2[1], pix3[1])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg2(pix2[2], pix3[2])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg2(pix2[3], pix3[3])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg2(pix2[4], pix3[4])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg2(pix2[5], pix3[5])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg2(pix2[6], pix3[6])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg2(pix2[7], pix3[7])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |         pix3 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pix_abs8x8_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int s, i; | 
					
						
							|  |  |  |     UINT8 *pix3 = pix2 + line_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s = 0; | 
					
						
							|  |  |  |     for(i=0;i<8;i++) { | 
					
						
							|  |  |  |         s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1])); | 
					
						
							|  |  |  |         s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2])); | 
					
						
							|  |  |  |         s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3])); | 
					
						
							|  |  |  |         s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4])); | 
					
						
							|  |  |  |         s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5])); | 
					
						
							|  |  |  |         s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6])); | 
					
						
							|  |  |  |         s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7])); | 
					
						
							|  |  |  |         s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8])); | 
					
						
							|  |  |  |         pix1 += line_size; | 
					
						
							|  |  |  |         pix2 += line_size; | 
					
						
							|  |  |  |         pix3 += line_size; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  | /* permute block according so that it corresponds to the MMX idct
 | 
					
						
							|  |  |  |    order */ | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  | void block_permute(INT16 *block, UINT8 *permutation) | 
					
						
							| 
									
										
										
										
											2001-12-09 12:04:09 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	INT16 temp[64]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  | 	for(i=0; i<64; i++) temp[ permutation[i] ] = block[i]; | 
					
						
							| 
									
										
										
										
											2001-12-09 12:04:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for(i=0; i<64; i++) block[i] = temp[i]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-28 13:41:04 +00:00
										 |  |  | void clear_blocks_c(DCTELEM *blocks) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     memset(blocks, 0, sizeof(DCTELEM)*6*64); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  | void dsputil_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-10-15 15:24:08 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2001-08-07 22:43:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; | 
					
						
							|  |  |  |     for(i=0;i<MAX_NEG_CROP;i++) { | 
					
						
							|  |  |  |         cropTbl[i] = 0; | 
					
						
							|  |  |  |         cropTbl[i + MAX_NEG_CROP + 256] = 255; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=0;i<512;i++) { | 
					
						
							|  |  |  |         squareTbl[i] = (i - 256) * (i - 256); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get_pixels = get_pixels_c; | 
					
						
							| 
									
										
										
										
											2002-04-17 04:32:12 +00:00
										 |  |  |     diff_pixels = diff_pixels_c; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     put_pixels_clamped = put_pixels_clamped_c; | 
					
						
							|  |  |  |     add_pixels_clamped = add_pixels_clamped_c; | 
					
						
							| 
									
										
										
										
											2002-03-09 13:01:16 +00:00
										 |  |  |     gmc1= gmc1_c; | 
					
						
							| 
									
										
										
										
											2002-03-28 13:41:04 +00:00
										 |  |  |     clear_blocks= clear_blocks_c; | 
					
						
							| 
									
										
										
										
											2002-08-25 21:19:50 +00:00
										 |  |  |     pix_sum= pix_sum_c; | 
					
						
							|  |  |  |     pix_norm1= pix_norm1_c; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     pix_abs16x16     = pix_abs16x16_c; | 
					
						
							|  |  |  |     pix_abs16x16_x2  = pix_abs16x16_x2_c; | 
					
						
							|  |  |  |     pix_abs16x16_y2  = pix_abs16x16_y2_c; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     pix_abs16x16_xy2 = pix_abs16x16_xy2_c; | 
					
						
							| 
									
										
										
										
											2002-03-27 21:25:22 +00:00
										 |  |  |     pix_abs8x8     = pix_abs8x8_c; | 
					
						
							|  |  |  |     pix_abs8x8_x2  = pix_abs8x8_x2_c; | 
					
						
							|  |  |  |     pix_abs8x8_y2  = pix_abs8x8_y2_c; | 
					
						
							|  |  |  |     pix_abs8x8_xy2 = pix_abs8x8_xy2_c; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-23 20:06:54 +00:00
										 |  |  | #ifdef HAVE_MMX
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     dsputil_init_mmx(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-08-13 21:45:36 +00:00
										 |  |  | #ifdef ARCH_ARMV4L
 | 
					
						
							|  |  |  |     dsputil_init_armv4l(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-09-16 21:54:00 +00:00
										 |  |  | #ifdef HAVE_MLIB
 | 
					
						
							|  |  |  |     dsputil_init_mlib(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-20 14:48:02 +00:00
										 |  |  | #ifdef ARCH_ALPHA
 | 
					
						
							|  |  |  |     dsputil_init_alpha(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-08-28 13:14:36 +00:00
										 |  |  | #ifdef ARCH_POWERPC
 | 
					
						
							| 
									
										
										
										
											2002-09-02 08:48:12 +00:00
										 |  |  |     dsputil_init_ppc(); | 
					
						
							| 
									
										
										
										
											2002-08-30 00:05:28 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-09-23 08:44:24 +00:00
										 |  |  | #ifdef HAVE_MMI
 | 
					
						
							|  |  |  |     dsputil_init_mmi(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-09-16 21:54:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |     for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-02-26 22:14:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:37:58 +00:00
										 |  |  | /* remove any non bit exact operation (testing purpose) */ | 
					
						
							|  |  |  | void avcodec_set_bit_exact(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-14 22:07:35 +00:00
										 |  |  |     ff_bit_exact=1; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:37:58 +00:00
										 |  |  | #ifdef HAVE_MMX
 | 
					
						
							|  |  |  |     dsputil_set_bit_exact_mmx(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-26 22:14:27 +00:00
										 |  |  | void get_psnr(UINT8 *orig_image[3], UINT8 *coded_image[3], | 
					
						
							|  |  |  |               int orig_linesize[3], int coded_linesize, | 
					
						
							|  |  |  |               AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int quad, diff, x, y; | 
					
						
							|  |  |  |     UINT8 *orig, *coded; | 
					
						
							|  |  |  |     UINT32 *sq = squareTbl + 256; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     quad = 0; | 
					
						
							|  |  |  |     diff = 0; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /* Luminance */ | 
					
						
							|  |  |  |     orig = orig_image[0]; | 
					
						
							|  |  |  |     coded = coded_image[0]; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     for (y=0;y<avctx->height;y++) { | 
					
						
							|  |  |  |         for (x=0;x<avctx->width;x++) { | 
					
						
							|  |  |  |             diff = *(orig + x) - *(coded + x); | 
					
						
							|  |  |  |             quad += sq[diff]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         orig += orig_linesize[0]; | 
					
						
							|  |  |  |         coded += coded_linesize; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |     avctx->psnr_y = (float) quad / (float) (avctx->width * avctx->height); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if (avctx->psnr_y) { | 
					
						
							|  |  |  |         avctx->psnr_y = (float) (255 * 255) / avctx->psnr_y; | 
					
						
							|  |  |  |         avctx->psnr_y = 10 * (float) log10 (avctx->psnr_y);  | 
					
						
							|  |  |  |     } else | 
					
						
							|  |  |  |         avctx->psnr_y = 99.99; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |