2001-07-22 14:18:56 +00:00
/*
* DSP utils
2002-05-25 22:45:33 +00:00
* Copyright (c) 2000, 2001 Fabrice Bellard.
2004-01-10 16:04:55 +00:00
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
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
*/
2003-03-06 11:32:04 +00:00
/**
* @file dsputil.c
* DSP utils
*/
2001-07-22 14:18:56 +00:00
#include "avcodec.h"
#include "dsputil.h"
2002-12-27 23:51:46 +00:00
#include "mpegvideo.h"
2003-03-03 14:54:00 +00:00
#include "simple_idct.h"
2003-10-22 18:26:38 +00:00
#include "faandct.h"
2002-09-14 22:07:35 +00:00
2005-02-24 19:08:50 +00:00
/* snow.c */
void ff_spatial_dwt ( int * buffer , int width , int height , int stride , int type , int decomposition_count );
2004-08-13 15:30:42 +00:00
uint8_t cropTbl [ 256 + 2 * MAX_NEG_CROP ] = { 0 , };
uint32_t squareTbl [ 512 ] = { 0 , };
2001-07-22 14:18:56 +00:00
2003-02-11 16:35:48 +00:00
const uint8_t ff_zigzag_direct [ 64 ] = {
2002-09-29 22:44:22 +00:00
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
};
2003-10-24 18:28:01 +00:00
/* Specific zigzag scan for 248 idct. NOTE that unlike the
specification, we interleave the fields */
const uint8_t ff_zigzag248_direct [ 64 ] = {
0 , 8 , 1 , 9 , 16 , 24 , 2 , 10 ,
17 , 25 , 32 , 40 , 48 , 56 , 33 , 41 ,
18 , 26 , 3 , 11 , 4 , 12 , 19 , 27 ,
34 , 42 , 49 , 57 , 50 , 58 , 35 , 43 ,
20 , 28 , 5 , 13 , 6 , 14 , 21 , 29 ,
36 , 44 , 51 , 59 , 52 , 60 , 37 , 45 ,
22 , 30 , 7 , 15 , 23 , 31 , 38 , 46 ,
53 , 61 , 54 , 62 , 39 , 47 , 55 , 63 ,
};
2002-01-27 13:30:18 +00:00
/* not permutated inverse zigzag_direct + 1 for MMX quantizer */
2004-08-13 15:30:42 +00:00
uint16_t __align8 inv_zigzag_direct16 [ 64 ] = { 0 , };
2002-01-27 13:30:18 +00:00
2003-02-11 16:35:48 +00:00
const uint8_t ff_alternate_horizontal_scan [ 64 ] = {
2002-09-29 22:44:22 +00:00
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 ,
};
2003-02-11 16:35:48 +00:00
const uint8_t ff_alternate_vertical_scan [ 64 ] = {
2002-09-29 22:44:22 +00:00
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 */
2003-02-11 16:35:48 +00:00
const uint32_t inverse [ 256 ] = {
2002-01-27 13:30:18 +00:00
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 ,
};
2003-03-03 14:54:00 +00:00
/* Input permutation for the simple_idct_mmx */
static const uint8_t simple_mmx_permutation [ 64 ] = {
0x00 , 0x08 , 0x04 , 0x09 , 0x01 , 0x0C , 0x05 , 0x0D ,
0x10 , 0x18 , 0x14 , 0x19 , 0x11 , 0x1C , 0x15 , 0x1D ,
0x20 , 0x28 , 0x24 , 0x29 , 0x21 , 0x2C , 0x25 , 0x2D ,
0x12 , 0x1A , 0x16 , 0x1B , 0x13 , 0x1E , 0x17 , 0x1F ,
0x02 , 0x0A , 0x06 , 0x0B , 0x03 , 0x0E , 0x07 , 0x0F ,
0x30 , 0x38 , 0x34 , 0x39 , 0x31 , 0x3C , 0x35 , 0x3D ,
0x22 , 0x2A , 0x26 , 0x2B , 0x23 , 0x2E , 0x27 , 0x2F ,
0x32 , 0x3A , 0x36 , 0x3B , 0x33 , 0x3E , 0x37 , 0x3F ,
};
2003-02-11 16:35:48 +00:00
static int pix_sum_c ( uint8_t * pix , int line_size )
2002-08-25 21:19:50 +00:00
{
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 ;
}
2003-02-11 16:35:48 +00:00
static int pix_norm1_c ( uint8_t * pix , int line_size )
2002-08-25 21:19:50 +00:00
{
int s , i , j ;
2003-02-11 16:35:48 +00:00
uint32_t * sq = squareTbl + 256 ;
2002-08-25 21:19:50 +00:00
s = 0 ;
for ( i = 0 ; i < 16 ; i ++ ) {
for ( j = 0 ; j < 16 ; j += 8 ) {
2003-01-11 22:32:56 +00:00
#if 0
2002-08-25 21:19:50 +00:00
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]];
2003-01-11 22:32:56 +00:00
#else
#if LONG_MAX > 2147483647
register uint64_t x =* ( uint64_t * ) pix ;
s += sq [ x & 0xff ];
s += sq [( x >> 8 ) & 0xff ];
s += sq [( x >> 16 ) & 0xff ];
s += sq [( x >> 24 ) & 0xff ];
s += sq [( x >> 32 ) & 0xff ];
s += sq [( x >> 40 ) & 0xff ];
s += sq [( x >> 48 ) & 0xff ];
s += sq [( x >> 56 ) & 0xff ];
#else
register uint32_t x =* ( uint32_t * ) pix ;
s += sq [ x & 0xff ];
s += sq [( x >> 8 ) & 0xff ];
s += sq [( x >> 16 ) & 0xff ];
s += sq [( x >> 24 ) & 0xff ];
x =* ( uint32_t * )( pix + 4 );
s += sq [ x & 0xff ];
s += sq [( x >> 8 ) & 0xff ];
s += sq [( x >> 16 ) & 0xff ];
s += sq [( x >> 24 ) & 0xff ];
#endif
#endif
2002-08-25 21:19:50 +00:00
pix += 8 ;
}
pix += line_size - 16 ;
}
return s ;
}
2003-05-19 13:30:59 +00:00
static void bswap_buf ( uint32_t * dst , uint32_t * src , int w ){
int i ;
for ( i = 0 ; i + 8 <= w ; i += 8 ){
dst [ i + 0 ] = bswap_32 ( src [ i + 0 ]);
dst [ i + 1 ] = bswap_32 ( src [ i + 1 ]);
dst [ i + 2 ] = bswap_32 ( src [ i + 2 ]);
dst [ i + 3 ] = bswap_32 ( src [ i + 3 ]);
dst [ i + 4 ] = bswap_32 ( src [ i + 4 ]);
dst [ i + 5 ] = bswap_32 ( src [ i + 5 ]);
dst [ i + 6 ] = bswap_32 ( src [ i + 6 ]);
dst [ i + 7 ] = bswap_32 ( src [ i + 7 ]);
}
for (; i < w ; i ++ ){
dst [ i + 0 ] = bswap_32 ( src [ i + 0 ]);
}
}
2002-08-25 21:19:50 +00:00
2004-08-22 17:16:03 +00:00
static int sse4_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
{
int s , i ;
uint32_t * sq = squareTbl + 256 ;
s = 0 ;
for ( i = 0 ; i < h ; i ++ ) {
s += sq [ pix1 [ 0 ] - pix2 [ 0 ]];
s += sq [ pix1 [ 1 ] - pix2 [ 1 ]];
s += sq [ pix1 [ 2 ] - pix2 [ 2 ]];
s += sq [ pix1 [ 3 ] - pix2 [ 3 ]];
pix1 += line_size ;
pix2 += line_size ;
}
return s ;
}
2003-12-30 16:07:57 +00:00
static int sse8_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-12-27 23:51:46 +00:00
{
int s , i ;
2003-02-11 16:35:48 +00:00
uint32_t * sq = squareTbl + 256 ;
2002-12-27 23:51:46 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2002-12-27 23:51:46 +00:00
s += sq [ pix1 [ 0 ] - pix2 [ 0 ]];
s += sq [ pix1 [ 1 ] - pix2 [ 1 ]];
s += sq [ pix1 [ 2 ] - pix2 [ 2 ]];
s += sq [ pix1 [ 3 ] - pix2 [ 3 ]];
s += sq [ pix1 [ 4 ] - pix2 [ 4 ]];
s += sq [ pix1 [ 5 ] - pix2 [ 5 ]];
s += sq [ pix1 [ 6 ] - pix2 [ 6 ]];
s += sq [ pix1 [ 7 ] - pix2 [ 7 ]];
pix1 += line_size ;
pix2 += line_size ;
}
return s ;
}
2003-12-30 16:07:57 +00:00
static int sse16_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-11-22 07:53:06 +00:00
{
2003-01-19 12:06:36 +00:00
int s , i ;
uint32_t * sq = squareTbl + 256 ;
2002-11-22 07:53:06 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2003-01-19 12:06:36 +00:00
s += sq [ pix1 [ 0 ] - pix2 [ 0 ]];
s += sq [ pix1 [ 1 ] - pix2 [ 1 ]];
s += sq [ pix1 [ 2 ] - pix2 [ 2 ]];
s += sq [ pix1 [ 3 ] - pix2 [ 3 ]];
s += sq [ pix1 [ 4 ] - pix2 [ 4 ]];
s += sq [ pix1 [ 5 ] - pix2 [ 5 ]];
s += sq [ pix1 [ 6 ] - pix2 [ 6 ]];
s += sq [ pix1 [ 7 ] - pix2 [ 7 ]];
s += sq [ pix1 [ 8 ] - pix2 [ 8 ]];
s += sq [ pix1 [ 9 ] - pix2 [ 9 ]];
s += sq [ pix1 [ 10 ] - pix2 [ 10 ]];
s += sq [ pix1 [ 11 ] - pix2 [ 11 ]];
s += sq [ pix1 [ 12 ] - pix2 [ 12 ]];
s += sq [ pix1 [ 13 ] - pix2 [ 13 ]];
s += sq [ pix1 [ 14 ] - pix2 [ 14 ]];
s += sq [ pix1 [ 15 ] - pix2 [ 15 ]];
2003-01-11 22:32:56 +00:00
2003-01-19 12:06:36 +00:00
pix1 += line_size ;
pix2 += line_size ;
2002-11-22 07:53:06 +00:00
}
return s ;
}
2004-08-22 17:16:03 +00:00
static inline int w_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int w , int h , int type ){
2005-05-02 22:14:42 +00:00
#ifdef CONFIG_SNOW_ENCODER //idwt is in snow.c
2004-08-22 17:16:03 +00:00
int s , i , j ;
const int dec_count = w == 8 ? 3 : 4 ;
int tmp [ 16 * 16 ];
#if 0
int level, ori;
static const int scale[2][2][4][4]={
{
{
//8x8 dec=3
{268, 239, 239, 213},
{ 0, 224, 224, 152},
{ 0, 135, 135, 110},
},{
//16x16 dec=4
{344, 310, 310, 280},
{ 0, 320, 320, 228},
{ 0, 175, 175, 136},
{ 0, 129, 129, 102},
}
},{
{//FIXME 5/3
//8x8 dec=3
{275, 245, 245, 218},
{ 0, 230, 230, 156},
{ 0, 138, 138, 113},
},{
//16x16 dec=4
{352, 317, 317, 286},
{ 0, 328, 328, 233},
{ 0, 180, 180, 140},
{ 0, 132, 132, 105},
}
}
};
#endif
for ( i = 0 ; i < h ; i ++ ) {
for ( j = 0 ; j < w ; j += 4 ) {
tmp [ 16 * i + j + 0 ] = ( pix1 [ j + 0 ] - pix2 [ j + 0 ]) << 4 ;
tmp [ 16 * i + j + 1 ] = ( pix1 [ j + 1 ] - pix2 [ j + 1 ]) << 4 ;
tmp [ 16 * i + j + 2 ] = ( pix1 [ j + 2 ] - pix2 [ j + 2 ]) << 4 ;
tmp [ 16 * i + j + 3 ] = ( pix1 [ j + 3 ] - pix2 [ j + 3 ]) << 4 ;
}
pix1 += line_size ;
pix2 += line_size ;
}
2005-05-02 22:14:42 +00:00
2004-08-22 17:16:03 +00:00
ff_spatial_dwt ( tmp , w , h , 16 , type , dec_count );
s = 0 ;
#if 0
for(level=0; level<dec_count; level++){
for(ori= level ? 1 : 0; ori<4; ori++){
int sx= (ori&1) ? 1<<level: 0;
int stride= 16<<(dec_count-level);
int sy= (ori&2) ? stride>>1 : 0;
int size= 1<<level;
for(i=0; i<size; i++){
for(j=0; j<size; j++){
int v= tmp[sx + sy + i*stride + j] * scale[type][dec_count-3][level][ori];
s += ABS(v);
}
}
}
}
#endif
for ( i = 0 ; i < h ; i ++ ) {
for ( j = 0 ; j < w ; j += 4 ) {
s += ABS ( tmp [ 16 * i + j + 0 ]);
s += ABS ( tmp [ 16 * i + j + 1 ]);
s += ABS ( tmp [ 16 * i + j + 2 ]);
s += ABS ( tmp [ 16 * i + j + 3 ]);
}
}
assert ( s >= 0 );
return s >> 2 ;
2005-05-02 22:14:42 +00:00
#endif
2004-08-22 17:16:03 +00:00
}
static int w53_8_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h ){
return w_c ( v , pix1 , pix2 , line_size , 8 , h , 1 );
}
static int w97_8_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h ){
return w_c ( v , pix1 , pix2 , line_size , 8 , h , 0 );
}
static int w53_16_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h ){
return w_c ( v , pix1 , pix2 , line_size , 16 , h , 1 );
}
static int w97_16_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h ){
return w_c ( v , pix1 , pix2 , line_size , 16 , h , 0 );
}
2003-02-11 16:35:48 +00:00
static void get_pixels_c ( DCTELEM * restrict block , const uint8_t * 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
}
}
2003-02-11 16:35:48 +00:00
static void diff_pixels_c ( DCTELEM * restrict block , const uint8_t * s1 ,
const uint8_t * 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
}
}
2003-02-11 16:35:48 +00:00
static void put_pixels_clamped_c ( const DCTELEM * block , uint8_t * restrict pixels ,
2002-11-11 09:40:17 +00:00
int line_size )
2001-07-22 14:18:56 +00:00
{
int i ;
2003-02-11 16:35:48 +00:00
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
2001-07-22 14:18:56 +00:00
/* 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
}
}
2004-09-25 23:18:58 +00:00
static void put_pixels_clamped4_c ( const DCTELEM * block , uint8_t * restrict pixels ,
int line_size )
{
int i ;
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
/* read the pixels */
for ( i = 0 ; i < 4 ; i ++ ) {
pixels [ 0 ] = cm [ block [ 0 ]];
pixels [ 1 ] = cm [ block [ 1 ]];
pixels [ 2 ] = cm [ block [ 2 ]];
pixels [ 3 ] = cm [ block [ 3 ]];
pixels += line_size ;
block += 8 ;
}
}
2004-09-26 00:18:12 +00:00
static void put_pixels_clamped2_c ( const DCTELEM * block , uint8_t * restrict pixels ,
int line_size )
{
int i ;
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
/* read the pixels */
for ( i = 0 ; i < 2 ; i ++ ) {
pixels [ 0 ] = cm [ block [ 0 ]];
pixels [ 1 ] = cm [ block [ 1 ]];
pixels += line_size ;
block += 8 ;
}
}
2004-04-27 03:58:06 +00:00
static void put_signed_pixels_clamped_c ( const DCTELEM * block ,
uint8_t * restrict pixels ,
int line_size )
{
int i , j ;
for ( i = 0 ; i < 8 ; i ++ ) {
for ( j = 0 ; j < 8 ; j ++ ) {
if ( * block < - 128 )
* pixels = 0 ;
else if ( * block > 127 )
* pixels = 255 ;
else
* pixels = ( uint8_t )( * block + 128 );
block ++ ;
pixels ++ ;
}
pixels += ( line_size - 8 );
}
}
2003-02-11 16:35:48 +00:00
static void add_pixels_clamped_c ( const DCTELEM * block , uint8_t * restrict pixels ,
2002-07-04 01:47:32 +00:00
int line_size )
2001-07-22 14:18:56 +00:00
{
int i ;
2003-02-11 16:35:48 +00:00
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
2001-07-22 14:18:56 +00:00
/* 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
}
}
2004-09-25 23:18:58 +00:00
static void add_pixels_clamped4_c ( const DCTELEM * block , uint8_t * restrict pixels ,
int line_size )
{
int i ;
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
/* read the pixels */
for ( i = 0 ; i < 4 ; i ++ ) {
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 += line_size ;
block += 8 ;
}
}
2004-09-26 00:18:12 +00:00
static void add_pixels_clamped2_c ( const DCTELEM * block , uint8_t * restrict pixels ,
int line_size )
{
int i ;
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
/* read the pixels */
for ( i = 0 ; i < 2 ; i ++ ) {
pixels [ 0 ] = cm [ pixels [ 0 ] + block [ 0 ]];
pixels [ 1 ] = cm [ pixels [ 1 ] + block [ 1 ]];
pixels += line_size ;
block += 8 ;
}
}
2005-06-17 08:24:35 +00:00
static void add_pixels8_c ( uint8_t * restrict pixels , DCTELEM * block , int line_size )
{
int i ;
for ( i = 0 ; i < 8 ; i ++ ) {
pixels [ 0 ] += block [ 0 ];
pixels [ 1 ] += block [ 1 ];
pixels [ 2 ] += block [ 2 ];
pixels [ 3 ] += block [ 3 ];
pixels [ 4 ] += block [ 4 ];
pixels [ 5 ] += block [ 5 ];
pixels [ 6 ] += block [ 6 ];
pixels [ 7 ] += block [ 7 ];
pixels += line_size ;
block += 8 ;
}
}
static void add_pixels4_c ( uint8_t * restrict pixels , DCTELEM * block , int line_size )
{
int i ;
for ( i = 0 ; i < 4 ; i ++ ) {
pixels [ 0 ] += block [ 0 ];
pixels [ 1 ] += block [ 1 ];
pixels [ 2 ] += block [ 2 ];
pixels [ 3 ] += block [ 3 ];
pixels += line_size ;
block += 4 ;
}
}
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-11-12 09:47:14 +00:00
static void OPNAME ## _no_rnd_pixels_x2_c(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-11-12 09:47:14 +00:00
static void OPNAME ## _pixels_x2_c(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-11-12 09:47:14 +00:00
static void OPNAME ## _no_rnd_pixels_y2_c(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-11-12 09:47:14 +00:00
static void OPNAME ## _pixels_y2_c(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-11-12 09:47:14 +00:00
static void OPNAME ## _pixels_xy2_c(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-11-12 09:47:14 +00:00
static void OPNAME ## _no_rnd_pixels_xy2_c(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-11-12 09:47:14 +00:00
CALL_2X_PIXELS(OPNAME ## _pixels16_c , OPNAME ## _pixels_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_x2_c , OPNAME ## _pixels_x2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_y2_c , OPNAME ## _pixels_y2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_xy2_c, OPNAME ## _pixels_xy2_c, 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2_c , OPNAME ## _no_rnd_pixels_x2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2_c , OPNAME ## _no_rnd_pixels_y2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2_c, OPNAME ## _no_rnd_pixels_xy2_c, 8)
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) \
2003-05-15 23:30:03 +00:00
static void OPNAME ## _pixels2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
int i;\
for(i=0; i<h; i++){\
OP(*((uint16_t*)(block )), LD16(pixels ));\
pixels+=line_size;\
block +=line_size;\
}\
}\
2003-04-04 14:42:28 +00:00
static void OPNAME ## _pixels4_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
int i;\
for(i=0; i<h; i++){\
OP(*((uint32_t*)(block )), LD32(pixels ));\
pixels+=line_size;\
block +=line_size;\
}\
}\
2002-11-12 09:47:14 +00:00
static void OPNAME ## _pixels8_c(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-11-12 09:47:14 +00:00
static inline void OPNAME ## _no_rnd_pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
OPNAME ## _pixels8_c(block, pixels, line_size, h);\
2002-09-11 12:39:53 +00:00
}\
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 ]);\
2003-05-14 23:08:01 +00:00
OP(*((uint32_t*)&dst[i*dst_stride ]), no_rnd_avg32(a, b));\
2002-09-11 12:39:53 +00:00
a= LD32(&src1[i*src_stride1+4]);\
b= LD32(&src2[i*src_stride2+4]);\
2003-05-14 23:08:01 +00:00
OP(*((uint32_t*)&dst[i*dst_stride+4]), no_rnd_avg32(a, b));\
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 ]);\
2003-05-14 23:08:01 +00:00
OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
2002-09-11 12:39:53 +00:00
a= LD32(&src1[i*src_stride1+4]);\
b= LD32(&src2[i*src_stride2+4]);\
2003-05-14 23:08:01 +00:00
OP(*((uint32_t*)&dst[i*dst_stride+4]), rnd_avg32(a, b));\
2002-05-16 23:29:09 +00:00
}\
}\
\
2003-04-04 14:42:28 +00:00
static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
int src_stride1, int src_stride2, int h){\
int i;\
for(i=0; i<h; i++){\
uint32_t a,b;\
a= LD32(&src1[i*src_stride1 ]);\
b= LD32(&src2[i*src_stride2 ]);\
2003-05-14 23:08:01 +00:00
OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
2003-04-04 14:42:28 +00:00
}\
}\
\
2003-05-15 23:30:03 +00:00
static inline void OPNAME ## _pixels2_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
int src_stride1, int src_stride2, int h){\
int i;\
for(i=0; i<h; i++){\
uint32_t a,b;\
a= LD16(&src1[i*src_stride1 ]);\
b= LD16(&src2[i*src_stride2 ]);\
OP(*((uint16_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
}\
}\
\
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);\
2002-05-16 23:29:09 +00:00
}\
\
2002-09-11 12:39:53 +00:00
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);\
2002-05-16 23:29:09 +00:00
}\
\
2002-11-12 09:47:14 +00:00
static inline void OPNAME ## _no_rnd_pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
2002-09-11 12:39:53 +00:00
OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
}\
\
2002-11-12 09:47:14 +00:00
static inline void OPNAME ## _pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
2002-09-11 12:39:53 +00:00
OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
}\
\
2002-11-12 09:47:14 +00:00
static inline void OPNAME ## _no_rnd_pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
2002-09-11 12:39:53 +00:00
OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
}\
\
2002-11-12 09:47:14 +00:00
static inline void OPNAME ## _pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
2002-09-11 12:39:53 +00:00
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){\
int i;\
for(i=0; i<h; i++){\
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));\
}\
}\
2003-05-15 23:30:03 +00:00
\
static inline void OPNAME ## _pixels4_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
OPNAME ## _pixels4_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
}\
\
static inline void OPNAME ## _pixels4_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
OPNAME ## _pixels4_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
}\
\
static inline void OPNAME ## _pixels2_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
OPNAME ## _pixels2_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
}\
\
static inline void OPNAME ## _pixels2_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
OPNAME ## _pixels2_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
}\
\
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){\
int i;\
for(i=0; i<h; i++){\
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));\
}\
}\
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);\
}\
\
2003-05-15 23:30:03 +00:00
static inline void OPNAME ## _pixels2_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
{\
int i, a0, b0, a1, b1;\
a0= pixels[0];\
b0= pixels[1] + 2;\
a0 += b0;\
b0 += pixels[2];\
\
pixels+=line_size;\
for(i=0; i<h; i+=2){\
a1= pixels[0];\
b1= pixels[1];\
a1 += b1;\
b1 += pixels[2];\
\
block[0]= (a1+a0)>>2; /* FIXME non put */ \
block[1]= (b1+b0)>>2;\
\
pixels+=line_size;\
block +=line_size;\
\
a0= pixels[0];\
b0= pixels[1] + 2;\
a0 += b0;\
b0 += pixels[2];\
\
block[0]= (a1+a0)>>2;\
block[1]= (b1+b0)>>2;\
pixels+=line_size;\
block +=line_size;\
}\
}\
\
static inline void OPNAME ## _pixels4_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
{\
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;\
}\
}\
\
2002-11-12 09:47:14 +00:00
static inline void OPNAME ## _pixels8_xy2_c(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-11-12 09:47:14 +00:00
static inline void OPNAME ## _no_rnd_pixels8_xy2_c(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-11-12 09:47:14 +00:00
CALL_2X_PIXELS(OPNAME ## _pixels16_c , OPNAME ## _pixels8_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_x2_c , OPNAME ## _pixels8_x2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_y2_c , OPNAME ## _pixels8_y2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _pixels16_xy2_c, OPNAME ## _pixels8_xy2_c, 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_c , OPNAME ## _pixels8_c , 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_x2_c , OPNAME ## _no_rnd_pixels8_x2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_y2_c , OPNAME ## _no_rnd_pixels8_y2_c , 8)\
CALL_2X_PIXELS(OPNAME ## _no_rnd_pixels16_xy2_c, OPNAME ## _no_rnd_pixels8_xy2_c, 8)\
2002-09-11 12:39:53 +00:00
2003-05-14 23:08:01 +00:00
#define op_avg(a, b) a = rnd_avg32(a, b)
2002-05-16 23:29:09 +00:00
#endif
#define op_put(a, b) a = b
PIXOP2 ( avg , op_avg )
PIXOP2 ( put , op_put )
#undef op_avg
#undef op_put
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)
2004-03-05 18:44:04 +00:00
static void put_no_rnd_pixels16_l2_c ( uint8_t * dst , const uint8_t * a , const uint8_t * b , int stride , int h ){
put_no_rnd_pixels16_l2 ( dst , a , b , stride , stride , stride , h );
}
static void put_no_rnd_pixels8_l2_c ( uint8_t * dst , const uint8_t * a , const uint8_t * b , int stride , int h ){
put_no_rnd_pixels8_l2 ( dst , a , b , stride , stride , stride , h );
}
2002-10-16 19:55:49 +00:00
2003-02-11 16:35:48 +00:00
static void gmc1_c ( uint8_t * dst , uint8_t * 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 ;
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
}
}
2003-02-11 16:35:48 +00:00
static void gmc_c ( uint8_t * dst , uint8_t * src , int stride , int h , int ox , int oy ,
2002-10-16 19:55:49 +00:00
int dxx , int dxy , int dyx , int dyy , int shift , int r , int width , int height )
{
int y , vx , vy ;
const int s = 1 << shift ;
width -- ;
height -- ;
for ( y = 0 ; y < h ; y ++ ){
int x ;
vx = ox ;
vy = oy ;
for ( x = 0 ; x < 8 ; x ++ ){ //XXX FIXME optimize
int src_x , src_y , frac_x , frac_y , index ;
src_x = vx >> 16 ;
src_y = vy >> 16 ;
frac_x = src_x & ( s - 1 );
frac_y = src_y & ( s - 1 );
src_x >>= shift ;
src_y >>= shift ;
if (( unsigned ) src_x < width ){
if (( unsigned ) src_y < height ){
index = src_x + src_y * stride ;
dst [ y * stride + x ] = ( ( src [ index ] * ( s - frac_x )
+ src [ index + 1 ] * frac_x ) * ( s - frac_y )
+ ( src [ index + stride ] * ( s - frac_x )
+ src [ index + stride + 1 ] * frac_x ) * frac_y
+ r ) >> ( shift * 2 );
} else {
index = src_x + clip ( src_y , 0 , height ) * stride ;
dst [ y * stride + x ] = ( ( src [ index ] * ( s - frac_x )
+ src [ index + 1 ] * frac_x ) * s
+ r ) >> ( shift * 2 );
}
} else {
if (( unsigned ) src_y < height ){
index = clip ( src_x , 0 , width ) + src_y * stride ;
dst [ y * stride + x ] = ( ( src [ index ] * ( s - frac_y )
+ src [ index + stride ] * frac_y ) * s
+ r ) >> ( shift * 2 );
} else {
index = clip ( src_x , 0 , width ) + clip ( src_y , 0 , height ) * stride ;
dst [ y * stride + x ] = src [ index ];
}
}
vx += dxx ;
vy += dyx ;
}
ox += dxy ;
oy += dyy ;
}
}
2003-05-15 23:30:03 +00:00
static inline void put_tpel_pixels_mc00_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
switch ( width ){
case 2 : put_pixels2_c ( dst , src , stride , height ); break ;
case 4 : put_pixels4_c ( dst , src , stride , height ); break ;
case 8 : put_pixels8_c ( dst , src , stride , height ); break ;
case 16 : put_pixels16_c ( dst , src , stride , height ); break ;
}
}
static inline void put_tpel_pixels_mc10_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 683 * ( 2 * src [ j ] + src [ j + 1 ] + 1 )) >> 11 ;
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc20_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 683 * ( src [ j ] + 2 * src [ j + 1 ] + 1 )) >> 11 ;
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc01_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 683 * ( 2 * src [ j ] + src [ j + stride ] + 1 )) >> 11 ;
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc11_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 2731 * ( 4 * src [ j ] + 3 * src [ j + 1 ] + 3 * src [ j + stride ] + 2 * src [ j + stride + 1 ] + 6 )) >> 15 ;
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc12_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
2003-06-27 15:03:58 +00:00
dst [ j ] = ( 2731 * ( 3 * src [ j ] + 2 * src [ j + 1 ] + 4 * src [ j + stride ] + 3 * src [ j + stride + 1 ] + 6 )) >> 15 ;
2003-05-15 23:30:03 +00:00
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc02_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 683 * ( src [ j ] + 2 * src [ j + stride ] + 1 )) >> 11 ;
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc21_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
2003-06-27 15:03:58 +00:00
dst [ j ] = ( 2731 * ( 3 * src [ j ] + 4 * src [ j + 1 ] + 2 * src [ j + stride ] + 3 * src [ j + stride + 1 ] + 6 )) >> 15 ;
2003-05-15 23:30:03 +00:00
}
src += stride ;
dst += stride ;
}
}
static inline void put_tpel_pixels_mc22_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( 2731 * ( 2 * src [ j ] + 3 * src [ j + 1 ] + 3 * src [ j + stride ] + 4 * src [ j + stride + 1 ] + 6 )) >> 15 ;
}
src += stride ;
dst += stride ;
}
}
2003-06-19 01:44:44 +00:00
static inline void avg_tpel_pixels_mc00_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
switch ( width ){
case 2 : avg_pixels2_c ( dst , src , stride , height ); break ;
case 4 : avg_pixels4_c ( dst , src , stride , height ); break ;
case 8 : avg_pixels8_c ( dst , src , stride , height ); break ;
case 16 : avg_pixels16_c ( dst , src , stride , height ); break ;
}
}
static inline void avg_tpel_pixels_mc10_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 683 * ( 2 * src [ j ] + src [ j + 1 ] + 1 )) >> 11 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc20_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 683 * ( src [ j ] + 2 * src [ j + 1 ] + 1 )) >> 11 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc01_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 683 * ( 2 * src [ j ] + src [ j + stride ] + 1 )) >> 11 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc11_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 2731 * ( 4 * src [ j ] + 3 * src [ j + 1 ] + 3 * src [ j + stride ] + 2 * src [ j + stride + 1 ] + 6 )) >> 15 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc12_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
2003-06-27 15:03:58 +00:00
dst [ j ] = ( dst [ j ] + (( 2731 * ( 3 * src [ j ] + 2 * src [ j + 1 ] + 4 * src [ j + stride ] + 3 * src [ j + stride + 1 ] + 6 )) >> 15 ) + 1 ) >> 1 ;
2003-06-19 01:44:44 +00:00
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc02_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 683 * ( src [ j ] + 2 * src [ j + stride ] + 1 )) >> 11 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc21_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
2003-06-27 15:03:58 +00:00
dst [ j ] = ( dst [ j ] + (( 2731 * ( 3 * src [ j ] + 4 * src [ j + 1 ] + 2 * src [ j + stride ] + 3 * src [ j + stride + 1 ] + 6 )) >> 15 ) + 1 ) >> 1 ;
2003-06-19 01:44:44 +00:00
}
src += stride ;
dst += stride ;
}
}
static inline void avg_tpel_pixels_mc22_c ( uint8_t * dst , const uint8_t * src , int stride , int width , int height ){
int i , j ;
for ( i = 0 ; i < height ; i ++ ) {
for ( j = 0 ; j < width ; j ++ ) {
dst [ j ] = ( dst [ j ] + (( 2731 * ( 2 * src [ j ] + 3 * src [ j + 1 ] + 3 * src [ j + stride ] + 4 * src [ j + stride + 1 ] + 6 )) >> 15 ) + 1 ) >> 1 ;
}
src += stride ;
dst += stride ;
}
}
2003-05-15 23:30:03 +00:00
#if 0
#define TPEL_WIDTH(width)\
static void put_tpel_pixels ## width ## _mc00_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc00_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc10_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc10_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc20_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc20_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc01_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc01_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc11_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc11_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc21_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc21_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc02_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc02_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc12_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc12_c(dst, src, stride, width, height);}\
static void put_tpel_pixels ## width ## _mc22_c(uint8_t *dst, const uint8_t *src, int stride, int height){\
void put_tpel_pixels_mc22_c(dst, src, stride, width, height);}
#endif
2003-04-04 14:42:28 +00:00
#define H264_CHROMA_MC(OPNAME, OP)\
static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst /*align 8*/ , uint8_t *src /*align 1*/ , int stride, int h, int x, int y){\
const int A=(8-x)*(8-y);\
const int B=( x)*(8-y);\
const int C=(8-x)*( y);\
const int D=( x)*( y);\
int i;\
\
assert(x<8 && y<8 && x>=0 && y>=0);\
\
for(i=0; i<h; i++)\
{\
OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
dst+= stride;\
src+= stride;\
}\
}\
\
static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst /*align 8*/ , uint8_t *src /*align 1*/ , int stride, int h, int x, int y){\
const int A=(8-x)*(8-y);\
const int B=( x)*(8-y);\
const int C=(8-x)*( y);\
const int D=( x)*( y);\
int i;\
\
assert(x<8 && y<8 && x>=0 && y>=0);\
\
for(i=0; i<h; i++)\
{\
OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
dst+= stride;\
src+= stride;\
}\
}\
\
static void OPNAME ## h264_chroma_mc8_c(uint8_t *dst /*align 8*/ , uint8_t *src /*align 1*/ , int stride, int h, int x, int y){\
const int A=(8-x)*(8-y);\
const int B=( x)*(8-y);\
const int C=(8-x)*( y);\
const int D=( x)*( y);\
int i;\
\
assert(x<8 && y<8 && x>=0 && y>=0);\
\
for(i=0; i<h; i++)\
{\
OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
dst+= stride;\
src+= stride;\
}\
}
#define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
#define op_put(a, b) a = (((b) + 32)>>6)
H264_CHROMA_MC ( put_ , op_put )
H264_CHROMA_MC ( avg_ , op_avg )
#undef op_avg
#undef op_put
static inline void copy_block4 ( uint8_t * dst , uint8_t * src , int dstStride , int srcStride , int h )
{
int i ;
for ( i = 0 ; i < h ; i ++ )
{
ST32 ( dst , LD32 ( src ));
dst += dstStride ;
src += srcStride ;
}
}
static inline void copy_block8 ( uint8_t * dst , uint8_t * src , int dstStride , int srcStride , int h )
{
int i ;
for ( i = 0 ; i < h ; i ++ )
{
ST32 ( dst , LD32 ( src ));
ST32 ( dst + 4 , LD32 ( src + 4 ));
dst += dstStride ;
src += srcStride ;
}
}
static inline void copy_block16 ( uint8_t * dst , uint8_t * src , int dstStride , int srcStride , int h )
{
int i ;
for ( i = 0 ; i < h ; i ++ )
{
ST32 ( dst , LD32 ( src ));
ST32 ( dst + 4 , LD32 ( src + 4 ));
ST32 ( dst + 8 , LD32 ( src + 8 ));
ST32 ( dst + 12 , LD32 ( src + 12 ));
dst += dstStride ;
src += srcStride ;
}
}
2002-10-16 19:55:49 +00:00
2003-02-11 16:35:48 +00:00
static inline void copy_block17 ( uint8_t * dst , uint8_t * 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 ;
}
}
2003-02-11 16:35:48 +00:00
static inline void copy_block9 ( uint8_t * dst , uint8_t * 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 ;
}
}
2003-01-05 15:57:10 +00:00
2002-09-11 12:39:53 +00:00
#define QPEL_MC(r, OPNAME, RND, OP) \
2003-02-11 16:35:48 +00:00
static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
2002-09-11 12:39:53 +00:00
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
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
2003-01-09 20:42:37 +00:00
const int w=8;\
2003-02-11 16:35:48 +00:00
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
2002-09-11 12:39:53 +00:00
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++;\
}\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
2002-09-11 12:39:53 +00:00
int i;\
2003-01-05 15:57:10 +00:00
\
2002-09-11 12:39:53 +00:00
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;\
}\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
2002-09-11 12:39:53 +00:00
int i;\
2003-01-05 15:57:10 +00:00
const int w=16;\
2002-09-11 12:39:53 +00:00
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++;\
}\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){\
2002-11-12 09:47:14 +00:00
OPNAME ## pixels8_c(dst, src, stride, 8);\
2002-09-11 12:39:53 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t 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
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){\
2002-09-11 12:39:53 +00:00
OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8);\
2002-03-09 13:01:16 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t 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
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc01_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t half[64];\
2002-09-11 12:39:53 +00:00
copy_block9(full, src, 16, stride, 9);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l2(dst, full, half, stride, 16, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
2002-09-11 12:39:53 +00:00
copy_block9(full, src, 16, stride, 9);\
2003-01-09 20:42:37 +00:00
OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16);\
2002-03-09 13:01:16 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc03_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t half[64];\
2002-09-11 12:39:53 +00:00
copy_block9(full, src, 16, stride, 9);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l2(dst, full+16, half, stride, 16, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t halfHV[64];\
2003-01-09 20:42:37 +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);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l4(dst, full, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc11_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfHV[64];\
2003-01-09 20:42:37 +00:00
copy_block9(full, src, 16, stride, 9);\
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\
put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t 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);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 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
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc31_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t 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);\
2003-01-09 20:42:37 +00:00
put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t 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);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l4(dst, full+16, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc13_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfHV[64];\
2003-01-09 20:42:37 +00:00
copy_block9(full, src, 16, stride, 9);\
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\
put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t 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);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l4(dst, full+17, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc33_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfHV[64];\
2003-01-09 20:42:37 +00:00
copy_block9(full, src, 16, stride, 9);\
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\
put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc21_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[72];\
uint8_t halfHV[64];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc23_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[72];\
uint8_t halfHV[64];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t 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);\
2003-01-09 20:42:37 +00:00
put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
2003-01-09 20:42:37 +00:00
copy_block9(full, src, 16, stride, 9);\
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\
put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\
OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel8_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
uint8_t halfV[64];\
uint8_t halfHV[64];\
2003-01-09 20:42:37 +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);\
put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[16*9];\
uint8_t halfH[72];\
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);\
2003-01-09 20:42:37 +00:00
put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\
OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[72];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\
2003-01-09 20:42:37 +00:00
OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\
2002-03-09 13:01:16 +00:00
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc00_c (uint8_t *dst, uint8_t *src, int stride){\
2002-11-12 09:47:14 +00:00
OPNAME ## pixels16_c(dst, src, stride, 16);\
2002-09-11 12:39:53 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc10_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t half[256];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\
OPNAME ## pixels16_l2(dst, src, half, stride, stride, 16, 16);\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc20_c(uint8_t *dst, uint8_t *src, int stride){\
2002-09-11 12:39:53 +00:00
OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16);\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc30_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t half[256];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\
OPNAME ## pixels16_l2(dst, src+1, half, stride, stride, 16, 16);\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc01_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t half[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);\
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc02_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
2003-01-05 15:57:10 +00:00
OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24);\
2002-09-11 12:39:53 +00:00
}\
\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc03_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t half[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc11_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc31_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc13_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full , 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc21_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc23_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[272];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc12_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\
OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\
}\
2003-02-11 16:35:48 +00:00
void ff_ ## OPNAME ## qpel16_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
uint8_t halfV[256];\
uint8_t halfHV[256];\
2002-09-11 12:39:53 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
2003-01-05 15:57:10 +00:00
put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
2002-09-11 12:39:53 +00:00
OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc32_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[24*17];\
uint8_t halfH[272];\
2003-01-09 20:42:37 +00:00
copy_block17(full, src, 24, stride, 17);\
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\
OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\
}\
2003-02-11 16:35:48 +00:00
static void OPNAME ## qpel16_mc22_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t halfH[272];\
2002-09-11 12:39:53 +00:00
put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
2003-01-05 15:57:10 +00:00
OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\
2002-11-12 09:47:14 +00:00
}
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
2003-04-04 14:42:28 +00:00
#if 1
#define H264_LOWPASS(OPNAME, OP, OP2) \
static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
const int h=4;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
for(i=0; i<h; i++)\
{\
OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));\
OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));\
OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]));\
OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]));\
dst+=dstStride;\
src+=srcStride;\
}\
}\
\
static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
const int w=4;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
for(i=0; i<w; i++)\
{\
const int srcB= src[-2*srcStride];\
const int srcA= src[-1*srcStride];\
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];\
OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
dst++;\
src++;\
}\
}\
\
static void OPNAME ## h264_qpel4_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
const int h=4;\
const int w=4;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
src -= 2*srcStride;\
for(i=0; i<h+5; i++)\
{\
tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);\
tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);\
tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]);\
tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]);\
tmp+=tmpStride;\
src+=srcStride;\
}\
tmp -= tmpStride*(h+5-2);\
for(i=0; i<w; i++)\
{\
const int tmpB= tmp[-2*tmpStride];\
const int tmpA= tmp[-1*tmpStride];\
const int tmp0= tmp[0 *tmpStride];\
const int tmp1= tmp[1 *tmpStride];\
const int tmp2= tmp[2 *tmpStride];\
const int tmp3= tmp[3 *tmpStride];\
const int tmp4= tmp[4 *tmpStride];\
const int tmp5= tmp[5 *tmpStride];\
const int tmp6= tmp[6 *tmpStride];\
OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
dst++;\
tmp++;\
}\
}\
\
static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
const int h=8;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
for(i=0; i<h; i++)\
{\
OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]));\
OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]));\
OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]));\
OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]));\
OP(dst[4], (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]));\
OP(dst[5], (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]));\
OP(dst[6], (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]));\
OP(dst[7], (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]));\
dst+=dstStride;\
src+=srcStride;\
}\
}\
\
static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
const int w=8;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
for(i=0; i<w; i++)\
{\
const int srcB= src[-2*srcStride];\
const int srcA= src[-1*srcStride];\
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];\
OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7));\
OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8));\
OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9));\
OP(dst[7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10));\
dst++;\
src++;\
}\
}\
\
static void OPNAME ## h264_qpel8_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
const int h=8;\
const int w=8;\
uint8_t *cm = cropTbl + MAX_NEG_CROP;\
int i;\
src -= 2*srcStride;\
for(i=0; i<h+5; i++)\
{\
tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]);\
tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]);\
tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]);\
tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]);\
tmp[4]= (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]);\
tmp[5]= (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]);\
tmp[6]= (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]);\
tmp[7]= (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]);\
tmp+=tmpStride;\
src+=srcStride;\
}\
tmp -= tmpStride*(h+5-2);\
for(i=0; i<w; i++)\
{\
const int tmpB= tmp[-2*tmpStride];\
const int tmpA= tmp[-1*tmpStride];\
const int tmp0= tmp[0 *tmpStride];\
const int tmp1= tmp[1 *tmpStride];\
const int tmp2= tmp[2 *tmpStride];\
const int tmp3= tmp[3 *tmpStride];\
const int tmp4= tmp[4 *tmpStride];\
const int tmp5= tmp[5 *tmpStride];\
const int tmp6= tmp[6 *tmpStride];\
const int tmp7= tmp[7 *tmpStride];\
const int tmp8= tmp[8 *tmpStride];\
const int tmp9= tmp[9 *tmpStride];\
const int tmp10=tmp[10*tmpStride];\
OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
OP2(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));\
OP2(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));\
OP2(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));\
OP2(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));\
dst++;\
tmp++;\
}\
}\
\
static void OPNAME ## h264_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
src += 8*srcStride;\
dst += 8*dstStride;\
OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
}\
\
static void OPNAME ## h264_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
src += 8*srcStride;\
dst += 8*dstStride;\
OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
}\
\
static void OPNAME ## h264_qpel16_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
src += 8*srcStride;\
dst += 8*dstStride;\
OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
}\
#define H264_MC(OPNAME, SIZE) \
static void OPNAME ## h264_qpel ## SIZE ## _mc00_c (uint8_t *dst, uint8_t *src, int stride){\
OPNAME ## pixels ## SIZE ## _c(dst, src, stride, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t half[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, src, half, stride, stride, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc20_c(uint8_t *dst, uint8_t *src, int stride){\
OPNAME ## h264_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t half[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, src+1, half, stride, stride, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t half[SIZE*SIZE];\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, full_mid, half, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc02_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
OPNAME ## h264_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t half[SIZE*SIZE];\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, full_mid+SIZE, half, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc33_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, int stride){\
int16_t tmp[SIZE*(SIZE+5)];\
OPNAME ## h264_qpel ## SIZE ## _hv_lowpass(dst, tmp, src, stride, SIZE, stride);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, int stride){\
int16_t tmp[SIZE*(SIZE+5)];\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfHV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, int stride){\
int16_t tmp[SIZE*(SIZE+5)];\
uint8_t halfH[SIZE*SIZE];\
uint8_t halfHV[SIZE*SIZE];\
put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
int16_t tmp[SIZE*(SIZE+5)];\
uint8_t halfV[SIZE*SIZE];\
uint8_t halfHV[SIZE*SIZE];\
copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
}\
\
static void OPNAME ## h264_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, int stride){\
uint8_t full[SIZE*(SIZE+5)];\
uint8_t * const full_mid= full + SIZE*2;\
int16_t tmp[SIZE*(SIZE+5)];\
uint8_t halfV[SIZE*SIZE];\
uint8_t halfHV[SIZE*SIZE];\
copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
}\
#define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
//#define op_avg2(a, b) a = (((a)*w1+cm[((b) + 16)>>5]*w2 + o + 64)>>7)
#define op_put(a, b) a = cm[((b) + 16)>>5]
#define op2_avg(a, b) a = (((a)+cm[((b) + 512)>>10]+1)>>1)
#define op2_put(a, b) a = cm[((b) + 512)>>10]
H264_LOWPASS ( put_ , op_put , op2_put )
H264_LOWPASS ( avg_ , op_avg , op2_avg )
H264_MC ( put_ , 4 )
H264_MC ( put_ , 8 )
H264_MC ( put_ , 16 )
H264_MC ( avg_ , 4 )
H264_MC ( avg_ , 8 )
H264_MC ( avg_ , 16 )
#undef op_avg
#undef op_put
#undef op2_avg
#undef op2_put
#endif
2005-01-23 11:08:18 +00:00
#define op_scale1(x) block[x] = clip_uint8( (block[x]*weight + offset) >> log2_denom )
#define op_scale2(x) dst[x] = clip_uint8( (src[x]*weights + dst[x]*weightd + offset) >> (log2_denom+1))
2005-01-07 05:56:07 +00:00
#define H264_WEIGHT(W,H) \
static void weight_h264_pixels ## W ## x ## H ## _c(uint8_t *block, int stride, int log2_denom, int weight, int offset){ \
2005-02-24 19:08:50 +00:00
int attribute_unused x, y; \
2005-01-07 05:56:07 +00:00
offset <<= log2_denom; \
if(log2_denom) offset += 1<<(log2_denom-1); \
for(y=0; y<H; y++, block += stride){ \
op_scale1(0); \
op_scale1(1); \
if(W==2) continue; \
op_scale1(2); \
op_scale1(3); \
if(W==4) continue; \
op_scale1(4); \
op_scale1(5); \
op_scale1(6); \
op_scale1(7); \
if(W==8) continue; \
op_scale1(8); \
op_scale1(9); \
op_scale1(10); \
op_scale1(11); \
op_scale1(12); \
op_scale1(13); \
op_scale1(14); \
op_scale1(15); \
} \
} \
static void biweight_h264_pixels ## W ## x ## H ## _c(uint8_t *dst, uint8_t *src, int stride, int log2_denom, int weightd, int weights, int offsetd, int offsets){ \
2005-02-24 19:08:50 +00:00
int attribute_unused x, y; \
2005-01-07 05:56:07 +00:00
int offset = (offsets + offsetd + 1) >> 1; \
offset = ((offset << 1) + 1) << log2_denom; \
for(y=0; y<H; y++, dst += stride, src += stride){ \
op_scale2(0); \
op_scale2(1); \
if(W==2) continue; \
op_scale2(2); \
op_scale2(3); \
if(W==4) continue; \
op_scale2(4); \
op_scale2(5); \
op_scale2(6); \
op_scale2(7); \
if(W==8) continue; \
op_scale2(8); \
op_scale2(9); \
op_scale2(10); \
op_scale2(11); \
op_scale2(12); \
op_scale2(13); \
op_scale2(14); \
op_scale2(15); \
} \
}
H264_WEIGHT ( 16 , 16 )
H264_WEIGHT ( 16 , 8 )
H264_WEIGHT ( 8 , 16 )
H264_WEIGHT ( 8 , 8 )
H264_WEIGHT ( 8 , 4 )
H264_WEIGHT ( 4 , 8 )
H264_WEIGHT ( 4 , 4 )
H264_WEIGHT ( 4 , 2 )
H264_WEIGHT ( 2 , 4 )
H264_WEIGHT ( 2 , 2 )
#undef op_scale1
#undef op_scale2
#undef H264_WEIGHT
2002-12-27 23:51:46 +00:00
static void wmv2_mspel8_h_lowpass ( uint8_t * dst , uint8_t * src , int dstStride , int srcStride , int h ){
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
int i ;
for ( i = 0 ; i < h ; i ++ ){
dst [ 0 ] = cm [( 9 * ( src [ 0 ] + src [ 1 ]) - ( src [ - 1 ] + src [ 2 ]) + 8 ) >> 4 ];
dst [ 1 ] = cm [( 9 * ( src [ 1 ] + src [ 2 ]) - ( src [ 0 ] + src [ 3 ]) + 8 ) >> 4 ];
dst [ 2 ] = cm [( 9 * ( src [ 2 ] + src [ 3 ]) - ( src [ 1 ] + src [ 4 ]) + 8 ) >> 4 ];
dst [ 3 ] = cm [( 9 * ( src [ 3 ] + src [ 4 ]) - ( src [ 2 ] + src [ 5 ]) + 8 ) >> 4 ];
dst [ 4 ] = cm [( 9 * ( src [ 4 ] + src [ 5 ]) - ( src [ 3 ] + src [ 6 ]) + 8 ) >> 4 ];
dst [ 5 ] = cm [( 9 * ( src [ 5 ] + src [ 6 ]) - ( src [ 4 ] + src [ 7 ]) + 8 ) >> 4 ];
dst [ 6 ] = cm [( 9 * ( src [ 6 ] + src [ 7 ]) - ( src [ 5 ] + src [ 8 ]) + 8 ) >> 4 ];
dst [ 7 ] = cm [( 9 * ( src [ 7 ] + src [ 8 ]) - ( src [ 6 ] + src [ 9 ]) + 8 ) >> 4 ];
dst += dstStride ;
src += srcStride ;
}
}
static void wmv2_mspel8_v_lowpass ( uint8_t * dst , uint8_t * src , int dstStride , int srcStride , int w ){
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
int i ;
for ( i = 0 ; i < w ; i ++ ){
const int src_1 = src [ - srcStride ];
const int src0 = src [ 0 ];
const int src1 = src [ 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 ];
dst [ 0 * dstStride ] = cm [( 9 * ( src0 + src1 ) - ( src_1 + src2 ) + 8 ) >> 4 ];
dst [ 1 * dstStride ] = cm [( 9 * ( src1 + src2 ) - ( src0 + src3 ) + 8 ) >> 4 ];
dst [ 2 * dstStride ] = cm [( 9 * ( src2 + src3 ) - ( src1 + src4 ) + 8 ) >> 4 ];
dst [ 3 * dstStride ] = cm [( 9 * ( src3 + src4 ) - ( src2 + src5 ) + 8 ) >> 4 ];
dst [ 4 * dstStride ] = cm [( 9 * ( src4 + src5 ) - ( src3 + src6 ) + 8 ) >> 4 ];
dst [ 5 * dstStride ] = cm [( 9 * ( src5 + src6 ) - ( src4 + src7 ) + 8 ) >> 4 ];
dst [ 6 * dstStride ] = cm [( 9 * ( src6 + src7 ) - ( src5 + src8 ) + 8 ) >> 4 ];
dst [ 7 * dstStride ] = cm [( 9 * ( src7 + src8 ) - ( src6 + src9 ) + 8 ) >> 4 ];
src ++ ;
dst ++ ;
}
}
static void put_mspel8_mc00_c ( uint8_t * dst , uint8_t * src , int stride ){
put_pixels8_c ( dst , src , stride , 8 );
}
static void put_mspel8_mc10_c ( uint8_t * dst , uint8_t * src , int stride ){
uint8_t half [ 64 ];
wmv2_mspel8_h_lowpass ( half , src , 8 , stride , 8 );
put_pixels8_l2 ( dst , src , half , stride , stride , 8 , 8 );
}
static void put_mspel8_mc20_c ( uint8_t * dst , uint8_t * src , int stride ){
wmv2_mspel8_h_lowpass ( dst , src , stride , stride , 8 );
}
static void put_mspel8_mc30_c ( uint8_t * dst , uint8_t * src , int stride ){
uint8_t half [ 64 ];
wmv2_mspel8_h_lowpass ( half , src , 8 , stride , 8 );
put_pixels8_l2 ( dst , src + 1 , half , stride , stride , 8 , 8 );
}
static void put_mspel8_mc02_c ( uint8_t * dst , uint8_t * src , int stride ){
wmv2_mspel8_v_lowpass ( dst , src , stride , stride , 8 );
}
static void put_mspel8_mc12_c ( uint8_t * dst , uint8_t * src , int stride ){
uint8_t halfH [ 88 ];
uint8_t halfV [ 64 ];
uint8_t halfHV [ 64 ];
wmv2_mspel8_h_lowpass ( halfH , src - stride , 8 , stride , 11 );
wmv2_mspel8_v_lowpass ( halfV , src , 8 , stride , 8 );
wmv2_mspel8_v_lowpass ( halfHV , halfH + 8 , 8 , 8 , 8 );
put_pixels8_l2 ( dst , halfV , halfHV , stride , 8 , 8 , 8 );
}
static void put_mspel8_mc32_c ( uint8_t * dst , uint8_t * src , int stride ){
uint8_t halfH [ 88 ];
uint8_t halfV [ 64 ];
uint8_t halfHV [ 64 ];
wmv2_mspel8_h_lowpass ( halfH , src - stride , 8 , stride , 11 );
wmv2_mspel8_v_lowpass ( halfV , src + 1 , 8 , stride , 8 );
wmv2_mspel8_v_lowpass ( halfHV , halfH + 8 , 8 , 8 , 8 );
put_pixels8_l2 ( dst , halfV , halfHV , stride , 8 , 8 , 8 );
}
static void put_mspel8_mc22_c ( uint8_t * dst , uint8_t * src , int stride ){
uint8_t halfH [ 88 ];
wmv2_mspel8_h_lowpass ( halfH , src - stride , 8 , stride , 11 );
wmv2_mspel8_v_lowpass ( dst , halfH + 8 , stride , 8 , 8 );
}
2003-12-01 15:23:14 +00:00
static void h263_v_loop_filter_c ( uint8_t * src , int stride , int qscale ){
int x ;
const int strength = ff_h263_loop_filter_strength [ qscale ];
for ( x = 0 ; x < 8 ; x ++ ){
int d1 , d2 , ad1 ;
int p0 = src [ x - 2 * stride ];
int p1 = src [ x - 1 * stride ];
int p2 = src [ x + 0 * stride ];
int p3 = src [ x + 1 * stride ];
int d = ( p0 - p3 + 4 * ( p2 - p1 )) / 8 ;
if ( d <- 2 * strength ) d1 = 0 ;
else if ( d <- strength ) d1 =- 2 * strength - d ;
else if ( d < strength ) d1 = d ;
else if ( d < 2 * strength ) d1 = 2 * strength - d ;
else d1 = 0 ;
p1 += d1 ;
p2 -= d1 ;
if ( p1 & 256 ) p1 = ~ ( p1 >> 31 );
if ( p2 & 256 ) p2 = ~ ( p2 >> 31 );
src [ x - 1 * stride ] = p1 ;
src [ x + 0 * stride ] = p2 ;
2003-12-01 15:49:10 +00:00
ad1 = ABS ( d1 ) >> 1 ;
2003-12-01 15:23:14 +00:00
d2 = clip (( p0 - p3 ) / 4 , - ad1 , ad1 );
src [ x - 2 * stride ] = p0 - d2 ;
src [ x + stride ] = p3 + d2 ;
}
}
static void h263_h_loop_filter_c ( uint8_t * src , int stride , int qscale ){
int y ;
const int strength = ff_h263_loop_filter_strength [ qscale ];
for ( y = 0 ; y < 8 ; y ++ ){
int d1 , d2 , ad1 ;
int p0 = src [ y * stride - 2 ];
int p1 = src [ y * stride - 1 ];
int p2 = src [ y * stride + 0 ];
int p3 = src [ y * stride + 1 ];
int d = ( p0 - p3 + 4 * ( p2 - p1 )) / 8 ;
if ( d <- 2 * strength ) d1 = 0 ;
else if ( d <- strength ) d1 =- 2 * strength - d ;
else if ( d < strength ) d1 = d ;
else if ( d < 2 * strength ) d1 = 2 * strength - d ;
else d1 = 0 ;
p1 += d1 ;
p2 -= d1 ;
if ( p1 & 256 ) p1 = ~ ( p1 >> 31 );
if ( p2 & 256 ) p2 = ~ ( p2 >> 31 );
src [ y * stride - 1 ] = p1 ;
src [ y * stride + 0 ] = p2 ;
ad1 = ABS ( d1 ) >> 1 ;
d2 = clip (( p0 - p3 ) / 4 , - ad1 , ad1 );
src [ y * stride - 2 ] = p0 - d2 ;
src [ y * stride + 1 ] = p3 + d2 ;
}
}
2002-12-27 23:51:46 +00:00
2004-05-30 21:21:13 +00:00
static void h261_loop_filter_c ( uint8_t * src , int stride ){
int x , y , xy , yz ;
int temp [ 64 ];
for ( x = 0 ; x < 8 ; x ++ ){
temp [ x ] = 4 * src [ x ];
temp [ x + 7 * 8 ] = 4 * src [ x + 7 * stride ];
}
for ( y = 1 ; y < 7 ; y ++ ){
for ( x = 0 ; x < 8 ; x ++ ){
xy = y * stride + x ;
yz = y * 8 + x ;
temp [ yz ] = src [ xy - stride ] + 2 * src [ xy ] + src [ xy + stride ];
2004-05-30 20:37:15 +00:00
}
}
2004-05-30 21:21:13 +00:00
for ( y = 0 ; y < 8 ; y ++ ){
src [ y * stride ] = ( temp [ y * 8 ] + 2 ) >> 2 ;
src [ 7 + y * stride ] = ( temp [ 7 + y * 8 ] + 2 ) >> 2 ;
for ( x = 1 ; x < 7 ; x ++ ){
xy = y * stride + x ;
yz = y * 8 + x ;
src [ xy ] = ( temp [ yz - 1 ] + 2 * temp [ yz ] + temp [ yz + 1 ] + 8 ) >> 4 ;
2004-05-30 20:37:15 +00:00
}
}
}
2005-05-18 09:17:22 +00:00
static inline void h264_loop_filter_luma_c ( uint8_t * pix , int xstride , int ystride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
int i , d ;
for ( i = 0 ; i < 4 ; i ++ ) {
if ( tc0 [ i ] < 0 ) {
pix += 4 * ystride ;
continue ;
}
for ( d = 0 ; d < 4 ; d ++ ) {
const int p0 = pix [ - 1 * xstride ];
const int p1 = pix [ - 2 * xstride ];
const int p2 = pix [ - 3 * xstride ];
const int q0 = pix [ 0 ];
const int q1 = pix [ 1 * xstride ];
const int q2 = pix [ 2 * xstride ];
if ( ABS ( p0 - q0 ) < alpha &&
ABS ( p1 - p0 ) < beta &&
ABS ( q1 - q0 ) < beta ) {
int tc = tc0 [ i ];
int i_delta ;
if ( ABS ( p2 - p0 ) < beta ) {
2005-05-07 16:35:24 +00:00
pix [ - 2 * xstride ] = p1 + clip ( (( p2 + ( ( p0 + q0 + 1 ) >> 1 ) ) >> 1 ) - p1 , - tc0 [ i ], tc0 [ i ] );
2005-04-25 01:01:41 +00:00
tc ++ ;
}
if ( ABS ( q2 - q0 ) < beta ) {
2005-05-07 16:35:24 +00:00
pix [ xstride ] = q1 + clip ( (( q2 + ( ( p0 + q0 + 1 ) >> 1 ) ) >> 1 ) - q1 , - tc0 [ i ], tc0 [ i ] );
2005-04-25 01:01:41 +00:00
tc ++ ;
}
i_delta = clip ( ((( q0 - p0 ) << 2 ) + ( p1 - q1 ) + 4 ) >> 3 , - tc , tc );
pix [ - xstride ] = clip_uint8 ( p0 + i_delta ); /* p0' */
pix [ 0 ] = clip_uint8 ( q0 - i_delta ); /* q0' */
}
pix += ystride ;
}
}
}
2005-05-18 09:17:22 +00:00
static void h264_v_loop_filter_luma_c ( uint8_t * pix , int stride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
h264_loop_filter_luma_c ( pix , stride , 1 , alpha , beta , tc0 );
}
2005-05-18 09:17:22 +00:00
static void h264_h_loop_filter_luma_c ( uint8_t * pix , int stride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
h264_loop_filter_luma_c ( pix , 1 , stride , alpha , beta , tc0 );
}
2005-05-18 09:17:22 +00:00
static inline void h264_loop_filter_chroma_c ( uint8_t * pix , int xstride , int ystride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
int i , d ;
for ( i = 0 ; i < 4 ; i ++ ) {
const int tc = tc0 [ i ];
if ( tc <= 0 ) {
pix += 2 * ystride ;
continue ;
}
for ( d = 0 ; d < 2 ; d ++ ) {
const int p0 = pix [ - 1 * xstride ];
const int p1 = pix [ - 2 * xstride ];
const int q0 = pix [ 0 ];
const int q1 = pix [ 1 * xstride ];
if ( ABS ( p0 - q0 ) < alpha &&
ABS ( p1 - p0 ) < beta &&
ABS ( q1 - q0 ) < beta ) {
int delta = clip ( ((( q0 - p0 ) << 2 ) + ( p1 - q1 ) + 4 ) >> 3 , - tc , tc );
pix [ - xstride ] = clip_uint8 ( p0 + delta ); /* p0' */
pix [ 0 ] = clip_uint8 ( q0 - delta ); /* q0' */
}
pix += ystride ;
}
}
}
2005-05-18 09:17:22 +00:00
static void h264_v_loop_filter_chroma_c ( uint8_t * pix , int stride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
h264_loop_filter_chroma_c ( pix , stride , 1 , alpha , beta , tc0 );
}
2005-05-18 09:17:22 +00:00
static void h264_h_loop_filter_chroma_c ( uint8_t * pix , int stride , int alpha , int beta , int8_t * tc0 )
2005-04-25 01:01:41 +00:00
{
h264_loop_filter_chroma_c ( pix , 1 , stride , alpha , beta , tc0 );
}
2005-05-18 09:17:22 +00:00
static inline void h264_loop_filter_chroma_intra_c ( uint8_t * pix , int xstride , int ystride , int alpha , int beta )
{
int d ;
for ( d = 0 ; d < 8 ; d ++ ) {
const int p0 = pix [ - 1 * xstride ];
const int p1 = pix [ - 2 * xstride ];
const int q0 = pix [ 0 ];
const int q1 = pix [ 1 * xstride ];
if ( ABS ( p0 - q0 ) < alpha &&
ABS ( p1 - p0 ) < beta &&
ABS ( q1 - q0 ) < beta ) {
pix [ - xstride ] = ( 2 * p1 + p0 + q1 + 2 ) >> 2 ; /* p0' */
pix [ 0 ] = ( 2 * q1 + q0 + p1 + 2 ) >> 2 ; /* q0' */
}
pix += ystride ;
}
}
static void h264_v_loop_filter_chroma_intra_c ( uint8_t * pix , int stride , int alpha , int beta )
{
h264_loop_filter_chroma_intra_c ( pix , stride , 1 , alpha , beta );
}
static void h264_h_loop_filter_chroma_intra_c ( uint8_t * pix , int stride , int alpha , int beta )
{
h264_loop_filter_chroma_intra_c ( pix , 1 , stride , alpha , beta );
}
2003-12-30 16:07:57 +00:00
static inline int pix_abs16_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2001-07-22 14:18:56 +00:00
{
int s , i ;
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; 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 ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs16_x2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2001-07-22 14:18:56 +00:00
{
int s , i ;
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; 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 ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs16_y2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2001-07-22 14:18:56 +00:00
{
int s , i ;
2003-02-11 16:35:48 +00:00
uint8_t * pix3 = pix2 + line_size ;
2001-07-22 14:18:56 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; 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 ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs16_xy2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2001-07-22 14:18:56 +00:00
{
int s , i ;
2003-02-11 16:35:48 +00:00
uint8_t * pix3 = pix2 + line_size ;
2001-07-22 14:18:56 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; 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 ;
}
2003-12-30 16:07:57 +00:00
static inline int pix_abs8_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-03-27 21:25:22 +00:00
{
int s , i ;
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2002-03-27 21:25:22 +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 ]);
pix1 += line_size ;
pix2 += line_size ;
}
return s ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs8_x2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-03-27 21:25:22 +00:00
{
int s , i ;
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2002-03-27 21:25:22 +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 ]));
pix1 += line_size ;
pix2 += line_size ;
}
return s ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs8_y2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-03-27 21:25:22 +00:00
{
int s , i ;
2003-02-11 16:35:48 +00:00
uint8_t * pix3 = pix2 + line_size ;
2002-03-27 21:25:22 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2002-03-27 21:25:22 +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 ]));
pix1 += line_size ;
pix2 += line_size ;
pix3 += line_size ;
}
return s ;
}
2003-12-30 16:07:57 +00:00
static int pix_abs8_xy2_c ( void * v , uint8_t * pix1 , uint8_t * pix2 , int line_size , int h )
2002-03-27 21:25:22 +00:00
{
int s , i ;
2003-02-11 16:35:48 +00:00
uint8_t * pix3 = pix2 + line_size ;
2002-03-27 21:25:22 +00:00
s = 0 ;
2003-12-30 16:07:57 +00:00
for ( i = 0 ; i < h ; i ++ ) {
2002-03-27 21:25:22 +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 ]));
pix1 += line_size ;
pix2 += line_size ;
pix3 += line_size ;
}
return s ;
}
2005-08-14 15:42:40 +00:00
static int nsse16_c ( void * v , uint8_t * s1 , uint8_t * s2 , int stride , int h ){
MpegEncContext * c = v ;
2004-06-07 03:23:31 +00:00
int score1 = 0 ;
int score2 = 0 ;
int x , y ;
2004-06-07 17:30:02 +00:00
2004-06-07 03:23:31 +00:00
for ( y = 0 ; y < h ; y ++ ){
for ( x = 0 ; x < 16 ; x ++ ){
score1 += ( s1 [ x ] - s2 [ x ]) * ( s1 [ x ] - s2 [ x ]);
}
if ( y + 1 < h ){
for ( x = 0 ; x < 15 ; x ++ ){
score2 += ABS ( s1 [ x ] - s1 [ x + stride ]
- s1 [ x + 1 ] + s1 [ x + 1 + stride ])
- ABS ( s2 [ x ] - s2 [ x + stride ]
- s2 [ x + 1 ] + s2 [ x + 1 + stride ]);
}
}
s1 += stride ;
s2 += stride ;
}
2004-06-07 17:30:02 +00:00
if ( c ) return score1 + ABS ( score2 ) * c -> avctx -> nsse_weight ;
else return score1 + ABS ( score2 ) * 8 ;
2004-06-07 03:23:31 +00:00
}
2005-08-14 15:42:40 +00:00
static int nsse8_c ( void * v , uint8_t * s1 , uint8_t * s2 , int stride , int h ){
MpegEncContext * c = v ;
2004-06-07 03:23:31 +00:00
int score1 = 0 ;
int score2 = 0 ;
int x , y ;
for ( y = 0 ; y < h ; y ++ ){
for ( x = 0 ; x < 8 ; x ++ ){
score1 += ( s1 [ x ] - s2 [ x ]) * ( s1 [ x ] - s2 [ x ]);
}
if ( y + 1 < h ){
for ( x = 0 ; x < 7 ; x ++ ){
score2 += ABS ( s1 [ x ] - s1 [ x + stride ]
- s1 [ x + 1 ] + s1 [ x + 1 + stride ])
- ABS ( s2 [ x ] - s2 [ x + stride ]
- s2 [ x + 1 ] + s2 [ x + 1 + stride ]);
}
}
s1 += stride ;
s2 += stride ;
}
2004-06-07 17:30:02 +00:00
if ( c ) return score1 + ABS ( score2 ) * c -> avctx -> nsse_weight ;
else return score1 + ABS ( score2 ) * 8 ;
2004-06-07 03:23:31 +00:00
}
2004-02-06 02:12:37 +00:00
static int try_8x8basis_c ( int16_t rem [ 64 ], int16_t weight [ 64 ], int16_t basis [ 64 ], int scale ){
int i ;
unsigned int sum = 0 ;
for ( i = 0 ; i < 8 * 8 ; i ++ ){
int b = rem [ i ] + (( basis [ i ] * scale + ( 1 << ( BASIS_SHIFT - RECON_SHIFT - 1 ))) >> ( BASIS_SHIFT - RECON_SHIFT ));
int w = weight [ i ];
b >>= RECON_SHIFT ;
assert ( - 512 < b && b < 512 );
sum += ( w * b ) * ( w * b ) >> 4 ;
}
return sum >> 2 ;
}
static void add_8x8basis_c ( int16_t rem [ 64 ], int16_t basis [ 64 ], int scale ){
int i ;
for ( i = 0 ; i < 8 * 8 ; i ++ ){
rem [ i ] += ( basis [ i ] * scale + ( 1 << ( BASIS_SHIFT - RECON_SHIFT - 1 ))) >> ( BASIS_SHIFT - RECON_SHIFT );
}
}
2003-03-05 23:55:52 +00:00
/**
* permutes an 8x8 block.
2003-03-06 02:04:54 +00:00
* @param block the block which will be permuted according to the given permutation vector
2003-03-05 23:55:52 +00:00
* @param permutation the permutation vector
* @param last the last non zero coefficient in scantable order, used to speed the permutation up
2003-03-06 02:04:54 +00:00
* @param scantable the used scantable, this is only used to speed the permutation up, the block is not
* (inverse) permutated to scantable order!
2003-03-05 23:55:52 +00:00
*/
2003-02-11 16:35:48 +00:00
void ff_block_permute ( DCTELEM * block , uint8_t * permutation , const uint8_t * scantable , int last )
2001-12-09 12:04:09 +00:00
{
2002-10-23 15:11:07 +00:00
int i ;
2002-12-31 17:23:56 +00:00
DCTELEM temp [ 64 ];
2002-10-23 15:11:07 +00:00
if ( last <= 0 ) return ;
2002-11-22 07:24:28 +00:00
//if(permutation[1]==1) return; //FIXME its ok but not clean and might fail for some perms
2001-12-09 12:04:09 +00:00
2002-10-23 15:11:07 +00:00
for ( i = 0 ; i <= last ; i ++ ){
const int j = scantable [ i ];
temp [ j ] = block [ j ];
block [ j ] = 0 ;
}
for ( i = 0 ; i <= last ; i ++ ){
const int j = scantable [ i ];
const int perm_j = permutation [ j ];
block [ perm_j ] = temp [ j ];
}
2001-12-09 12:04:09 +00:00
}
2001-08-07 22:43:19 +00:00
2004-01-05 22:57:07 +00:00
static int zero_cmp ( void * s , uint8_t * a , uint8_t * b , int stride , int h ){
return 0 ;
}
void ff_set_cmp ( DSPContext * c , me_cmp_func * cmp , int type ){
int i ;
memset ( cmp , 0 , sizeof ( void * ) * 5 );
for ( i = 0 ; i < 5 ; i ++ ){
switch ( type & 0xFF ){
case FF_CMP_SAD :
cmp [ i ] = c -> sad [ i ];
break ;
case FF_CMP_SATD :
cmp [ i ] = c -> hadamard8_diff [ i ];
break ;
case FF_CMP_SSE :
cmp [ i ] = c -> sse [ i ];
break ;
case FF_CMP_DCT :
cmp [ i ] = c -> dct_sad [ i ];
break ;
2004-12-08 18:02:56 +00:00
case FF_CMP_DCTMAX :
cmp [ i ] = c -> dct_max [ i ];
break ;
2004-01-05 22:57:07 +00:00
case FF_CMP_PSNR :
cmp [ i ] = c -> quant_psnr [ i ];
break ;
case FF_CMP_BIT :
cmp [ i ] = c -> bit [ i ];
break ;
case FF_CMP_RD :
cmp [ i ] = c -> rd [ i ];
break ;
case FF_CMP_VSAD :
cmp [ i ] = c -> vsad [ i ];
break ;
case FF_CMP_VSSE :
cmp [ i ] = c -> vsse [ i ];
break ;
case FF_CMP_ZERO :
cmp [ i ] = zero_cmp ;
break ;
2004-06-07 03:23:31 +00:00
case FF_CMP_NSSE :
cmp [ i ] = c -> nsse [ i ];
break ;
2004-08-22 17:16:03 +00:00
case FF_CMP_W53 :
cmp [ i ] = c -> w53 [ i ];
break ;
case FF_CMP_W97 :
cmp [ i ] = c -> w97 [ i ];
break ;
2004-01-05 22:57:07 +00:00
default :
av_log ( NULL , AV_LOG_ERROR , "internal error in cmp function selection \n " );
}
}
}
2003-03-06 02:04:54 +00:00
/**
* memset(blocks, 0, sizeof(DCTELEM)*6*64)
*/
2002-11-11 09:40:17 +00:00
static void clear_blocks_c ( DCTELEM * blocks )
2002-03-28 13:41:04 +00:00
{
memset ( blocks , 0 , sizeof ( DCTELEM ) * 6 * 64 );
}
2002-11-14 19:20:04 +00:00
static void add_bytes_c ( uint8_t * dst , uint8_t * src , int w ){
int i ;
2003-01-11 21:04:47 +00:00
for ( i = 0 ; i + 7 < w ; i += 8 ){
2002-11-14 19:20:04 +00:00
dst [ i + 0 ] += src [ i + 0 ];
dst [ i + 1 ] += src [ i + 1 ];
dst [ i + 2 ] += src [ i + 2 ];
dst [ i + 3 ] += src [ i + 3 ];
dst [ i + 4 ] += src [ i + 4 ];
dst [ i + 5 ] += src [ i + 5 ];
dst [ i + 6 ] += src [ i + 6 ];
dst [ i + 7 ] += src [ i + 7 ];
}
for (; i < w ; i ++ )
dst [ i + 0 ] += src [ i + 0 ];
}
static void diff_bytes_c ( uint8_t * dst , uint8_t * src1 , uint8_t * src2 , int w ){
int i ;
2003-01-11 21:04:47 +00:00
for ( i = 0 ; i + 7 < w ; i += 8 ){
2002-11-14 19:20:04 +00:00
dst [ i + 0 ] = src1 [ i + 0 ] - src2 [ i + 0 ];
dst [ i + 1 ] = src1 [ i + 1 ] - src2 [ i + 1 ];
dst [ i + 2 ] = src1 [ i + 2 ] - src2 [ i + 2 ];
dst [ i + 3 ] = src1 [ i + 3 ] - src2 [ i + 3 ];
dst [ i + 4 ] = src1 [ i + 4 ] - src2 [ i + 4 ];
dst [ i + 5 ] = src1 [ i + 5 ] - src2 [ i + 5 ];
dst [ i + 6 ] = src1 [ i + 6 ] - src2 [ i + 6 ];
dst [ i + 7 ] = src1 [ i + 7 ] - src2 [ i + 7 ];
}
for (; i < w ; i ++ )
dst [ i + 0 ] = src1 [ i + 0 ] - src2 [ i + 0 ];
}
2003-10-13 17:27:30 +00:00
static void sub_hfyu_median_prediction_c ( uint8_t * dst , uint8_t * src1 , uint8_t * src2 , int w , int * left , int * left_top ){
int i ;
uint8_t l , lt ;
l = * left ;
lt = * left_top ;
for ( i = 0 ; i < w ; i ++ ){
const int pred = mid_pred ( l , src1 [ i ], ( l + src1 [ i ] - lt ) & 0xFF );
lt = src1 [ i ];
l = src2 [ i ];
dst [ i ] = l - pred ;
}
* left = l ;
* left_top = lt ;
}
2002-12-27 23:51:46 +00:00
#define BUTTERFLY2(o1,o2,i1,i2) \
o1= (i1)+(i2);\
o2= (i1)-(i2);
#define BUTTERFLY1(x,y) \
{\
int a,b;\
a= x;\
b= y;\
x= a+b;\
y= a-b;\
}
#define BUTTERFLYA(x,y) (ABS((x)+(y)) + ABS((x)-(y)))
2003-12-30 16:07:57 +00:00
static int hadamard8_diff8x8_c ( /*MpegEncContext*/ void * s , uint8_t * dst , uint8_t * src , int stride , int h ){
2002-12-27 23:51:46 +00:00
int i ;
int temp [ 64 ];
int sum = 0 ;
2003-12-30 16:07:57 +00:00
assert ( h == 8 );
2002-12-27 23:51:46 +00:00
for ( i = 0 ; i < 8 ; i ++ ){
//FIXME try pointer walks
BUTTERFLY2 ( temp [ 8 * i + 0 ], temp [ 8 * i + 1 ], src [ stride * i + 0 ] - dst [ stride * i + 0 ], src [ stride * i + 1 ] - dst [ stride * i + 1 ]);
BUTTERFLY2 ( temp [ 8 * i + 2 ], temp [ 8 * i + 3 ], src [ stride * i + 2 ] - dst [ stride * i + 2 ], src [ stride * i + 3 ] - dst [ stride * i + 3 ]);
BUTTERFLY2 ( temp [ 8 * i + 4 ], temp [ 8 * i + 5 ], src [ stride * i + 4 ] - dst [ stride * i + 4 ], src [ stride * i + 5 ] - dst [ stride * i + 5 ]);
BUTTERFLY2 ( temp [ 8 * i + 6 ], temp [ 8 * i + 7 ], src [ stride * i + 6 ] - dst [ stride * i + 6 ], src [ stride * i + 7 ] - dst [ stride * i + 7 ]);
BUTTERFLY1 ( temp [ 8 * i + 0 ], temp [ 8 * i + 2 ]);
BUTTERFLY1 ( temp [ 8 * i + 1 ], temp [ 8 * i + 3 ]);
BUTTERFLY1 ( temp [ 8 * i + 4 ], temp [ 8 * i + 6 ]);
BUTTERFLY1 ( temp [ 8 * i + 5 ], temp [ 8 * i + 7 ]);
BUTTERFLY1 ( temp [ 8 * i + 0 ], temp [ 8 * i + 4 ]);
BUTTERFLY1 ( temp [ 8 * i + 1 ], temp [ 8 * i + 5 ]);
BUTTERFLY1 ( temp [ 8 * i + 2 ], temp [ 8 * i + 6 ]);
BUTTERFLY1 ( temp [ 8 * i + 3 ], temp [ 8 * i + 7 ]);
}
for ( i = 0 ; i < 8 ; i ++ ){
BUTTERFLY1 ( temp [ 8 * 0 + i ], temp [ 8 * 1 + i ]);
BUTTERFLY1 ( temp [ 8 * 2 + i ], temp [ 8 * 3 + i ]);
BUTTERFLY1 ( temp [ 8 * 4 + i ], temp [ 8 * 5 + i ]);
BUTTERFLY1 ( temp [ 8 * 6 + i ], temp [ 8 * 7 + i ]);
BUTTERFLY1 ( temp [ 8 * 0 + i ], temp [ 8 * 2 + i ]);
BUTTERFLY1 ( temp [ 8 * 1 + i ], temp [ 8 * 3 + i ]);
BUTTERFLY1 ( temp [ 8 * 4 + i ], temp [ 8 * 6 + i ]);
BUTTERFLY1 ( temp [ 8 * 5 + i ], temp [ 8 * 7 + i ]);
sum +=
BUTTERFLYA ( temp [ 8 * 0 + i ], temp [ 8 * 4 + i ])
+ BUTTERFLYA ( temp [ 8 * 1 + i ], temp [ 8 * 5 + i ])
+ BUTTERFLYA ( temp [ 8 * 2 + i ], temp [ 8 * 6 + i ])
+ BUTTERFLYA ( temp [ 8 * 3 + i ], temp [ 8 * 7 + i ]);
}
#if 0
static int maxi=0;
if(sum>maxi){
maxi=sum;
printf("MAX:%d\n", maxi);
}
#endif
return sum ;
}
2004-01-05 22:57:07 +00:00
static int hadamard8_intra8x8_c ( /*MpegEncContext*/ void * s , uint8_t * src , uint8_t * dummy , int stride , int h ){
2002-12-27 23:51:46 +00:00
int i ;
int temp [ 64 ];
int sum = 0 ;
2004-01-05 22:57:07 +00:00
assert ( h == 8 );
2002-12-27 23:51:46 +00:00
for ( i = 0 ; i < 8 ; i ++ ){
//FIXME try pointer walks
2004-01-05 22:57:07 +00:00
BUTTERFLY2 ( temp [ 8 * i + 0 ], temp [ 8 * i + 1 ], src [ stride * i + 0 ], src [ stride * i + 1 ]);
BUTTERFLY2 ( temp [ 8 * i + 2 ], temp [ 8 * i + 3 ], src [ stride * i + 2 ], src [ stride * i + 3 ]);
BUTTERFLY2 ( temp [ 8 * i + 4 ], temp [ 8 * i + 5 ], src [ stride * i + 4 ], src [ stride * i + 5 ]);
BUTTERFLY2 ( temp [ 8 * i + 6 ], temp [ 8 * i + 7 ], src [ stride * i + 6 ], src [ stride * i + 7 ]);
2002-12-27 23:51:46 +00:00
BUTTERFLY1 ( temp [ 8 * i + 0 ], temp [ 8 * i + 2 ]);
BUTTERFLY1 ( temp [ 8 * i + 1 ], temp [ 8 * i + 3 ]);
BUTTERFLY1 ( temp [ 8 * i + 4 ], temp [ 8 * i + 6 ]);
BUTTERFLY1 ( temp [ 8 * i + 5 ], temp [ 8 * i + 7 ]);
BUTTERFLY1 ( temp [ 8 * i + 0 ], temp [ 8 * i + 4 ]);
BUTTERFLY1 ( temp [ 8 * i + 1 ], temp [ 8 * i + 5 ]);
BUTTERFLY1 ( temp [ 8 * i + 2 ], temp [ 8 * i + 6 ]);
BUTTERFLY1 ( temp [ 8 * i + 3 ], temp [ 8 * i + 7 ]);
}
for ( i = 0 ; i < 8 ; i ++ ){
BUTTERFLY1 ( temp [ 8 * 0 + i ], temp [ 8 * 1 + i ]);
BUTTERFLY1 ( temp [ 8 * 2 + i ], temp [ 8 * 3 + i ]);
BUTTERFLY1 ( temp [ 8 * 4 + i ], temp [ 8 * 5 + i ]);
BUTTERFLY1 ( temp [ 8 * 6 + i ], temp [ 8 * 7 + i ]);
BUTTERFLY1 ( temp [ 8 * 0 + i ], temp [ 8 * 2 + i ]);
BUTTERFLY1 ( temp [ 8 * 1 + i ], temp [ 8 * 3 + i ]);
BUTTERFLY1 ( temp [ 8 * 4 + i ], temp [ 8 * 6 + i ]);
BUTTERFLY1 ( temp [ 8 * 5 + i ], temp [ 8 * 7 + i ]);
sum +=
BUTTERFLYA ( temp [ 8 * 0 + i ], temp [ 8 * 4 + i ])
+ BUTTERFLYA ( temp [ 8 * 1 + i ], temp [ 8 * 5 + i ])
+ BUTTERFLYA ( temp [ 8 * 2 + i ], temp [ 8 * 6 + i ])
+ BUTTERFLYA ( temp [ 8 * 3 + i ], temp [ 8 * 7 + i ]);
}
2004-01-05 22:57:07 +00:00
sum -= ABS ( temp [ 8 * 0 ] + temp [ 8 * 4 ]); // -mean
2002-12-27 23:51:46 +00:00
return sum ;
}
2003-12-30 16:07:57 +00:00
static int dct_sad8x8_c ( /*MpegEncContext*/ void * c , uint8_t * src1 , uint8_t * src2 , int stride , int h ){
2002-12-27 23:51:46 +00:00
MpegEncContext * const s = ( MpegEncContext * ) c ;
2003-01-19 20:04:35 +00:00
uint64_t __align8 aligned_temp [ sizeof ( DCTELEM ) * 64 / 8 ];
DCTELEM * const temp = ( DCTELEM * ) aligned_temp ;
2002-12-27 23:51:46 +00:00
int sum = 0 , i ;
2003-12-30 16:07:57 +00:00
assert ( h == 8 );
2002-12-27 23:51:46 +00:00
s -> dsp . diff_pixels ( temp , src1 , src2 , stride );
2003-03-03 14:54:00 +00:00
s -> dsp . fdct ( temp );
2002-12-27 23:51:46 +00:00
for ( i = 0 ; i < 64 ; i ++ )
sum += ABS ( temp [ i ]);
return sum ;
}
2004-12-08 18:02:56 +00:00
static int dct_max8x8_c ( /*MpegEncContext*/ void * c , uint8_t * src1 , uint8_t * src2 , int stride , int h ){
MpegEncContext * const s = ( MpegEncContext * ) c ;
uint64_t __align8 aligned_temp [ sizeof ( DCTELEM ) * 64 / 8 ];
DCTELEM * const temp = ( DCTELEM * ) aligned_temp ;
int sum = 0 , i ;
assert ( h == 8 );
s -> dsp . diff_pixels ( temp , src1 , src2 , stride );
s -> dsp . fdct ( temp );
for ( i = 0 ; i < 64 ; i ++ )
sum = FFMAX ( sum , ABS ( temp [ i ]));
return sum ;
}
2003-01-15 19:21:21 +00:00
void simple_idct ( DCTELEM * block ); //FIXME
2002-12-27 23:51:46 +00:00
2003-12-30 16:07:57 +00:00
static int quant_psnr8x8_c ( /*MpegEncContext*/ void * c , uint8_t * src1 , uint8_t * src2 , int stride , int h ){
2002-12-27 23:51:46 +00:00
MpegEncContext * const s = ( MpegEncContext * ) c ;
2003-01-19 20:04:35 +00:00
uint64_t __align8 aligned_temp [ sizeof ( DCTELEM ) * 64 * 2 / 8 ];
DCTELEM * const temp = ( DCTELEM * ) aligned_temp ;
DCTELEM * const bak = (( DCTELEM * ) aligned_temp ) + 64 ;
2002-12-27 23:51:46 +00:00
int sum = 0 , i ;
2003-12-30 16:07:57 +00:00
assert ( h == 8 );
2002-12-27 23:51:46 +00:00
s -> mb_intra = 0 ;
s -> dsp . diff_pixels ( temp , src1 , src2 , stride );
memcpy ( bak , temp , 64 * sizeof ( DCTELEM ));
2003-01-19 17:55:13 +00:00
s -> block_last_index [ 0 /*FIXME*/ ] = s -> fast_dct_quantize ( s , temp , 0 /*FIXME*/ , s -> qscale , & i );
2003-12-14 02:57:00 +00:00
s -> dct_unquantize_inter ( s , temp , 0 , s -> qscale );
2002-12-27 23:51:46 +00:00
simple_idct ( temp ); //FIXME
for ( i = 0 ; i < 64 ; i ++ )
sum += ( temp [ i ] - bak [ i ]) * ( temp [ i ] - bak [ i ]);
return sum ;
}
2003-12-30 16:07:57 +00:00
static int rd8x8_c ( /*MpegEncContext*/ void * c , uint8_t * src1 , uint8_t * src2 , int stride , int h ){
2003-01-15 18:05:23 +00:00
MpegEncContext * const s = ( MpegEncContext * ) c ;
2003-02-11 16:35:48 +00:00
const uint8_t * scantable = s -> intra_scantable . permutated ;
2003-01-19 20:04:35 +00:00
uint64_t __align8 aligned_temp [ sizeof ( DCTELEM ) * 64 / 8 ];
uint64_t __align8 aligned_bak [ stride ];
DCTELEM * const temp = ( DCTELEM * ) aligned_temp ;
uint8_t * const bak = ( uint8_t * ) aligned_bak ;
2003-01-15 18:05:23 +00:00
int i , last , run , bits , level , distoration , start_i ;
const int esc_length = s -> ac_esc_length ;
uint8_t * length ;
uint8_t * last_length ;
2003-12-30 16:07:57 +00:00
assert ( h == 8 );
2003-01-15 18:05:23 +00:00
for ( i = 0 ; i < 8 ; i ++ ){
(( uint32_t * )( bak + i * stride ))[ 0 ] = (( uint32_t * )( src2 + i * stride ))[ 0 ];
(( uint32_t * )( bak + i * stride ))[ 1 ] = (( uint32_t * )( src2 + i * stride ))[ 1 ];
}
s -> dsp . diff_pixels ( temp , src1 , src2 , stride );
2003-01-19 17:55:13 +00:00
s -> block_last_index [ 0 /*FIXME*/ ] = last = s -> fast_dct_quantize ( s , temp , 0 /*FIXME*/ , s -> qscale , & i );
2003-01-15 18:05:23 +00:00
bits = 0 ;
2003-01-19 17:55:13 +00:00
if ( s -> mb_intra ) {
start_i = 1 ;
length = s -> intra_ac_vlc_length ;
last_length = s -> intra_ac_vlc_last_length ;
bits += s -> luma_dc_vlc_length [ temp [ 0 ] + 256 ]; //FIXME chroma
} else {
start_i = 0 ;
length = s -> inter_ac_vlc_length ;
last_length = s -> inter_ac_vlc_last_length ;
}
if ( last >= start_i ){
2003-01-15 18:05:23 +00:00
run = 0 ;
for ( i = start_i ; i < last ; i ++ ){
int j = scantable [ i ];
level = temp [ j ];
if ( level ){
level += 64 ;
if (( level & ( ~ 127 )) == 0 ){
bits += length [ UNI_AC_ENC_INDEX ( run , level )];
} else
bits += esc_length ;
run = 0 ;
} else
run ++ ;
}
i = scantable [ last ];
2003-01-18 01:37:42 +00:00
2003-01-15 18:05:23 +00:00
level = temp [ i ] + 64 ;
2003-01-18 01:37:42 +00:00
assert ( level - 64 );
2003-01-15 18:05:23 +00:00
if (( level & ( ~ 127 )) == 0 ){
bits += last_length [ UNI_AC_ENC_INDEX ( run , level )];
} else
bits += esc_length ;
2003-01-19 17:55:13 +00:00
}
if ( last >= 0 ){
2003-12-14 02:57:00 +00:00
if ( s -> mb_intra )
s -> dct_unquantize_intra ( s , temp , 0 , s -> qscale );
else
s -> dct_unquantize_inter ( s , temp , 0 , s -> qscale );
2003-01-15 18:05:23 +00:00
}
2003-03-03 14:54:00 +00:00
s -> dsp . idct_add ( bak , stride , temp );
2003-01-15 18:05:23 +00:00
2003-12-30 16:07:57 +00:00
distoration = s -> dsp . sse [ 1 ]( NULL , bak , src1 , stride , 8 );
2003-01-15 18:05:23 +00:00
2003-01-19 17:55:13 +00:00
return distoration + (( bits * s -> qscale * s -> qscale * 109 + 64 ) >> 7 );
2003-01-15 18:05:23 +00:00
}
2003-12-30 16:07:57 +00:00
static int bit8x8_c ( /*MpegEncContext*/ void * c , uint8_t * src1 , uint8_t * src2 , int stride , int h ){
2003-01-15 18:05:23 +00:00
MpegEncContext * const s = ( MpegEncContext * ) c ;
2003-02-11 16:35:48 +00:00
const uint8_t * scantable = s -> intra_scantable . permutated ;
2003-01-19 20:04:35 +00:00
uint64_t __align8 aligned_temp [ sizeof ( DCTELEM ) * 64 / 8 ];
DCTELEM * const temp = ( DCTELEM * ) aligned_temp ;
2003-01-15 18:05:23 +00:00
int i , last , run , bits , level , start_i ;
const int esc_length = s -> ac_esc_length ;
uint8_t * length ;
uint8_t * last_length ;
2003-12-30 16:07:57 +00:00
assert ( h == 8 );
2003-01-19 17:55:13 +00:00
s -> dsp . diff_pixels ( temp , src1 , src2 , stride );
2003-01-15 18:05:23 +00:00
2003-01-19 17:55:13 +00:00
s -> block_last_index [ 0 /*FIXME*/ ] = last = s -> fast_dct_quantize ( s , temp , 0 /*FIXME*/ , s -> qscale , & i );
bits = 0 ;
2003-01-15 18:05:23 +00:00
if ( s -> mb_intra ) {
2003-01-19 17:55:13 +00:00
start_i = 1 ;
2003-01-15 18:05:23 +00:00
length = s -> intra_ac_vlc_length ;
last_length = s -> intra_ac_vlc_last_length ;
2003-01-19 17:55:13 +00:00
bits += s -> luma_dc_vlc_length [ temp [ 0 ] + 256 ]; //FIXME chroma
2003-01-15 18:05:23 +00:00
} else {
start_i = 0 ;
length = s -> inter_ac_vlc_length ;
last_length = s -> inter_ac_vlc_last_length ;
}
2003-01-19 17:55:13 +00:00
if ( last >= start_i ){
2003-01-15 18:05:23 +00:00
run = 0 ;
for ( i = start_i ; i < last ; i ++ ){
int j = scantable [ i ];
level = temp [ j ];
if ( level ){
level += 64 ;
if (( level & ( ~ 127 )) == 0 ){
bits += length [ UNI_AC_ENC_INDEX ( run , level )];
} else
bits += esc_length ;
run = 0 ;
} else
run ++ ;
}
i = scantable [ last ];
2003-01-19 17:55:13 +00:00
2003-01-15 18:05:23 +00:00
level = temp [ i ] + 64 ;
2003-01-19 17:55:13 +00:00
assert ( level - 64 );
2003-01-15 18:05:23 +00:00
if (( level & ( ~ 127 )) == 0 ){
bits += last_length [ UNI_AC_ENC_INDEX ( run , level )];
} else
bits += esc_length ;
}
return bits ;
}
2004-01-05 22:57:07 +00:00
static int vsad_intra16_c ( /*MpegEncContext*/ void * c , uint8_t * s , uint8_t * dummy , int stride , int h ){
int score = 0 ;
int x , y ;
for ( y = 1 ; y < h ; y ++ ){
for ( x = 0 ; x < 16 ; x += 4 ){
score += ABS ( s [ x ] - s [ x + stride ]) + ABS ( s [ x + 1 ] - s [ x + 1 + stride ])
+ ABS ( s [ x + 2 ] - s [ x + 2 + stride ]) + ABS ( s [ x + 3 ] - s [ x + 3 + stride ]);
}
s += stride ;
}
return score ;
}
static int vsad16_c ( /*MpegEncContext*/ void * c , uint8_t * s1 , uint8_t * s2 , int stride , int h ){
int score = 0 ;
int x , y ;
for ( y = 1 ; y < h ; y ++ ){
for ( x = 0 ; x < 16 ; x ++ ){
score += ABS ( s1 [ x ] - s2 [ x ] - s1 [ x + stride ] + s2 [ x + stride ]);
}
s1 += stride ;
s2 += stride ;
}
return score ;
}
#define SQ(a) ((a)*(a))
static int vsse_intra16_c ( /*MpegEncContext*/ void * c , uint8_t * s , uint8_t * dummy , int stride , int h ){
int score = 0 ;
int x , y ;
for ( y = 1 ; y < h ; y ++ ){
for ( x = 0 ; x < 16 ; x += 4 ){
score += SQ ( s [ x ] - s [ x + stride ]) + SQ ( s [ x + 1 ] - s [ x + 1 + stride ])
+ SQ ( s [ x + 2 ] - s [ x + 2 + stride ]) + SQ ( s [ x + 3 ] - s [ x + 3 + stride ]);
}
s += stride ;
}
return score ;
}
static int vsse16_c ( /*MpegEncContext*/ void * c , uint8_t * s1 , uint8_t * s2 , int stride , int h ){
int score = 0 ;
int x , y ;
for ( y = 1 ; y < h ; y ++ ){
for ( x = 0 ; x < 16 ; x ++ ){
score += SQ ( s1 [ x ] - s2 [ x ] - s1 [ x + stride ] + s2 [ x + stride ]);
}
s1 += stride ;
s2 += stride ;
}
return score ;
}
2003-12-30 16:07:57 +00:00
WARPER8_16_SQ ( hadamard8_diff8x8_c , hadamard8_diff16_c )
2004-01-05 22:57:07 +00:00
WARPER8_16_SQ ( hadamard8_intra8x8_c , hadamard8_intra16_c )
2003-12-30 16:07:57 +00:00
WARPER8_16_SQ ( dct_sad8x8_c , dct_sad16_c )
2004-12-08 18:02:56 +00:00
WARPER8_16_SQ ( dct_max8x8_c , dct_max16_c )
2003-12-30 16:07:57 +00:00
WARPER8_16_SQ ( quant_psnr8x8_c , quant_psnr16_c )
WARPER8_16_SQ ( rd8x8_c , rd16_c )
WARPER8_16_SQ ( bit8x8_c , bit16_c )
2002-12-27 23:51:46 +00:00
2003-03-03 14:54:00 +00:00
/* XXX: those functions should be suppressed ASAP when all IDCTs are
converted */
static void ff_jref_idct_put ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct ( block );
put_pixels_clamped_c ( block , dest , line_size );
}
static void ff_jref_idct_add ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct ( block );
add_pixels_clamped_c ( block , dest , line_size );
}
2004-09-25 23:18:58 +00:00
static void ff_jref_idct4_put ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct4 ( block );
put_pixels_clamped4_c ( block , dest , line_size );
}
static void ff_jref_idct4_add ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct4 ( block );
add_pixels_clamped4_c ( block , dest , line_size );
}
2004-09-26 00:18:12 +00:00
static void ff_jref_idct2_put ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct2 ( block );
put_pixels_clamped2_c ( block , dest , line_size );
}
static void ff_jref_idct2_add ( uint8_t * dest , int line_size , DCTELEM * block )
{
j_rev_dct2 ( block );
add_pixels_clamped2_c ( block , dest , line_size );
}
2004-09-26 10:01:40 +00:00
static void ff_jref_idct1_put ( uint8_t * dest , int line_size , DCTELEM * block )
{
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
dest [ 0 ] = cm [( block [ 0 ] + 4 ) >> 3 ];
}
static void ff_jref_idct1_add ( uint8_t * dest , int line_size , DCTELEM * block )
{
uint8_t * cm = cropTbl + MAX_NEG_CROP ;
dest [ 0 ] = cm [ dest [ 0 ] + (( block [ 0 ] + 4 ) >> 3 )];
}
2003-04-20 16:16:52 +00:00
/* init static data */
void dsputil_static_init ( void )
2001-07-22 14:18:56 +00:00
{
2002-10-15 15:24:08 +00:00
int i ;
2001-07-22 14:18:56 +00:00
2003-04-20 16:16:52 +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 ;
2001-07-22 14:18:56 +00:00
}
2003-04-20 16:16:52 +00:00
for ( i = 0 ; i < 512 ; i ++ ) {
squareTbl [ i ] = ( i - 256 ) * ( i - 256 );
}
for ( i = 0 ; i < 64 ; i ++ ) inv_zigzag_direct16 [ ff_zigzag_direct [ i ]] = i + 1 ;
}
void dsputil_init ( DSPContext * c , AVCodecContext * avctx )
{
int i ;
2001-07-22 14:18:56 +00:00
2003-03-03 14:54:00 +00:00
#ifdef CONFIG_ENCODERS
2003-10-24 18:28:01 +00:00
if ( avctx -> dct_algo == FF_DCT_FASTINT ) {
2003-03-03 14:54:00 +00:00
c -> fdct = fdct_ifast ;
2003-10-25 00:32:54 +00:00
c -> fdct248 = fdct_ifast248 ;
2003-10-24 18:28:01 +00:00
}
else if ( avctx -> dct_algo == FF_DCT_FAAN ) {
2003-10-22 18:26:38 +00:00
c -> fdct = ff_faandct ;
2003-10-25 00:32:54 +00:00
c -> fdct248 = ff_faandct248 ;
2003-10-24 18:28:01 +00:00
}
else {
2003-03-03 14:54:00 +00:00
c -> fdct = ff_jpeg_fdct_islow ; //slow/accurate/default
2003-10-24 18:28:01 +00:00
c -> fdct248 = ff_fdct248_islow ;
}
2003-03-03 14:54:00 +00:00
#endif //CONFIG_ENCODERS
2004-09-25 23:18:58 +00:00
if ( avctx -> lowres == 1 ){
2004-09-27 19:47:17 +00:00
if ( avctx -> idct_algo == FF_IDCT_INT || avctx -> idct_algo == FF_IDCT_AUTO ){
c -> idct_put = ff_jref_idct4_put ;
c -> idct_add = ff_jref_idct4_add ;
} else {
c -> idct_put = ff_h264_lowres_idct_put_c ;
c -> idct_add = ff_h264_lowres_idct_add_c ;
}
2004-09-25 23:18:58 +00:00
c -> idct = j_rev_dct4 ;
2003-03-03 14:54:00 +00:00
c -> idct_permutation_type = FF_NO_IDCT_PERM ;
2004-09-26 00:18:12 +00:00
} else if ( avctx -> lowres == 2 ){
c -> idct_put = ff_jref_idct2_put ;
c -> idct_add = ff_jref_idct2_add ;
c -> idct = j_rev_dct2 ;
c -> idct_permutation_type = FF_NO_IDCT_PERM ;
2004-09-26 10:01:40 +00:00
} else if ( avctx -> lowres == 3 ){
c -> idct_put = ff_jref_idct1_put ;
c -> idct_add = ff_jref_idct1_add ;
c -> idct = j_rev_dct1 ;
c -> idct_permutation_type = FF_NO_IDCT_PERM ;
2004-09-25 23:18:58 +00:00
} else {
if ( avctx -> idct_algo == FF_IDCT_INT ){
c -> idct_put = ff_jref_idct_put ;
c -> idct_add = ff_jref_idct_add ;
c -> idct = j_rev_dct ;
c -> idct_permutation_type = FF_LIBMPEG2_IDCT_PERM ;
2005-05-17 11:12:04 +00:00
} else if ( avctx -> idct_algo == FF_IDCT_VP3 ){
c -> idct_put = ff_vp3_idct_put_c ;
c -> idct_add = ff_vp3_idct_add_c ;
c -> idct = ff_vp3_idct_c ;
c -> idct_permutation_type = FF_NO_IDCT_PERM ;
2004-09-25 23:18:58 +00:00
} else { //accurate/default
c -> idct_put = simple_idct_put ;
c -> idct_add = simple_idct_add ;
c -> idct = simple_idct ;
c -> idct_permutation_type = FF_NO_IDCT_PERM ;
}
2003-03-03 14:54:00 +00:00
}
2004-09-27 19:47:17 +00:00
c -> h264_idct_add = ff_h264_idct_add_c ;
2005-06-02 21:15:20 +00:00
c -> h264_idct8_add = ff_h264_idct8_add_c ;
2004-09-27 19:47:17 +00:00
2002-11-11 09:40:17 +00:00
c -> get_pixels = get_pixels_c ;
c -> diff_pixels = diff_pixels_c ;
c -> put_pixels_clamped = put_pixels_clamped_c ;
2004-04-27 03:58:06 +00:00
c -> put_signed_pixels_clamped = put_signed_pixels_clamped_c ;
2002-11-11 09:40:17 +00:00
c -> add_pixels_clamped = add_pixels_clamped_c ;
2005-06-17 08:24:35 +00:00
c -> add_pixels8 = add_pixels8_c ;
c -> add_pixels4 = add_pixels4_c ;
2002-11-11 09:40:17 +00:00
c -> gmc1 = gmc1_c ;
c -> gmc = gmc_c ;
c -> clear_blocks = clear_blocks_c ;
c -> pix_sum = pix_sum_c ;
c -> pix_norm1 = pix_norm1_c ;
2001-07-22 14:18:56 +00:00
2002-11-12 09:47:14 +00:00
/* TODO [0] 16 [1] 8 */
2003-12-30 16:07:57 +00:00
c -> pix_abs [ 0 ][ 0 ] = pix_abs16_c ;
c -> pix_abs [ 0 ][ 1 ] = pix_abs16_x2_c ;
c -> pix_abs [ 0 ][ 2 ] = pix_abs16_y2_c ;
c -> pix_abs [ 0 ][ 3 ] = pix_abs16_xy2_c ;
c -> pix_abs [ 1 ][ 0 ] = pix_abs8_c ;
c -> pix_abs [ 1 ][ 1 ] = pix_abs8_x2_c ;
c -> pix_abs [ 1 ][ 2 ] = pix_abs8_y2_c ;
c -> pix_abs [ 1 ][ 3 ] = pix_abs8_xy2_c ;
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
#define dspfunc(PFX, IDX, NUM) \
c->PFX ## _pixels_tab[IDX][0] = PFX ## _pixels ## NUM ## _c; \
c->PFX ## _pixels_tab[IDX][1] = PFX ## _pixels ## NUM ## _x2_c; \
c->PFX ## _pixels_tab[IDX][2] = PFX ## _pixels ## NUM ## _y2_c; \
c->PFX ## _pixels_tab[IDX][3] = PFX ## _pixels ## NUM ## _xy2_c
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( put , 0 , 16 );
dspfunc ( put_no_rnd , 0 , 16 );
dspfunc ( put , 1 , 8 );
dspfunc ( put_no_rnd , 1 , 8 );
2003-05-15 23:30:03 +00:00
dspfunc ( put , 2 , 4 );
dspfunc ( put , 3 , 2 );
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( avg , 0 , 16 );
dspfunc ( avg_no_rnd , 0 , 16 );
dspfunc ( avg , 1 , 8 );
dspfunc ( avg_no_rnd , 1 , 8 );
2003-06-19 01:44:44 +00:00
dspfunc ( avg , 2 , 4 );
dspfunc ( avg , 3 , 2 );
2002-11-12 09:47:14 +00:00
#undef dspfunc
2002-11-11 09:40:17 +00:00
2004-03-05 18:44:04 +00:00
c -> put_no_rnd_pixels_l2 [ 0 ] = put_no_rnd_pixels16_l2_c ;
c -> put_no_rnd_pixels_l2 [ 1 ] = put_no_rnd_pixels8_l2_c ;
2003-05-15 23:30:03 +00:00
c -> put_tpel_pixels_tab [ 0 ] = put_tpel_pixels_mc00_c ;
c -> put_tpel_pixels_tab [ 1 ] = put_tpel_pixels_mc10_c ;
c -> put_tpel_pixels_tab [ 2 ] = put_tpel_pixels_mc20_c ;
c -> put_tpel_pixels_tab [ 4 ] = put_tpel_pixels_mc01_c ;
c -> put_tpel_pixels_tab [ 5 ] = put_tpel_pixels_mc11_c ;
c -> put_tpel_pixels_tab [ 6 ] = put_tpel_pixels_mc21_c ;
c -> put_tpel_pixels_tab [ 8 ] = put_tpel_pixels_mc02_c ;
c -> put_tpel_pixels_tab [ 9 ] = put_tpel_pixels_mc12_c ;
c -> put_tpel_pixels_tab [ 10 ] = put_tpel_pixels_mc22_c ;
2003-06-19 01:44:44 +00:00
c -> avg_tpel_pixels_tab [ 0 ] = avg_tpel_pixels_mc00_c ;
c -> avg_tpel_pixels_tab [ 1 ] = avg_tpel_pixels_mc10_c ;
c -> avg_tpel_pixels_tab [ 2 ] = avg_tpel_pixels_mc20_c ;
c -> avg_tpel_pixels_tab [ 4 ] = avg_tpel_pixels_mc01_c ;
c -> avg_tpel_pixels_tab [ 5 ] = avg_tpel_pixels_mc11_c ;
c -> avg_tpel_pixels_tab [ 6 ] = avg_tpel_pixels_mc21_c ;
c -> avg_tpel_pixels_tab [ 8 ] = avg_tpel_pixels_mc02_c ;
c -> avg_tpel_pixels_tab [ 9 ] = avg_tpel_pixels_mc12_c ;
c -> avg_tpel_pixels_tab [ 10 ] = avg_tpel_pixels_mc22_c ;
2002-11-12 09:47:14 +00:00
#define dspfunc(PFX, IDX, NUM) \
c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_c; \
c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_c; \
c->PFX ## _pixels_tab[IDX][ 2] = PFX ## NUM ## _mc20_c; \
c->PFX ## _pixels_tab[IDX][ 3] = PFX ## NUM ## _mc30_c; \
c->PFX ## _pixels_tab[IDX][ 4] = PFX ## NUM ## _mc01_c; \
c->PFX ## _pixels_tab[IDX][ 5] = PFX ## NUM ## _mc11_c; \
c->PFX ## _pixels_tab[IDX][ 6] = PFX ## NUM ## _mc21_c; \
c->PFX ## _pixels_tab[IDX][ 7] = PFX ## NUM ## _mc31_c; \
c->PFX ## _pixels_tab[IDX][ 8] = PFX ## NUM ## _mc02_c; \
c->PFX ## _pixels_tab[IDX][ 9] = PFX ## NUM ## _mc12_c; \
c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_c; \
c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_c; \
c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_c; \
c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_c; \
c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_c; \
c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_c
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( put_qpel , 0 , 16 );
dspfunc ( put_no_rnd_qpel , 0 , 16 );
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( avg_qpel , 0 , 16 );
/* dspfunc(avg_no_rnd_qpel, 0, 16); */
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( put_qpel , 1 , 8 );
dspfunc ( put_no_rnd_qpel , 1 , 8 );
2002-11-11 09:40:17 +00:00
2002-11-12 09:47:14 +00:00
dspfunc ( avg_qpel , 1 , 8 );
/* dspfunc(avg_no_rnd_qpel, 1, 8); */
2003-04-04 14:42:28 +00:00
dspfunc ( put_h264_qpel , 0 , 16 );
dspfunc ( put_h264_qpel , 1 , 8 );
dspfunc ( put_h264_qpel , 2 , 4 );
dspfunc ( avg_h264_qpel , 0 , 16 );
dspfunc ( avg_h264_qpel , 1 , 8 );
dspfunc ( avg_h264_qpel , 2 , 4 );
2002-11-12 09:47:14 +00:00
#undef dspfunc
2003-04-04 14:42:28 +00:00
c -> put_h264_chroma_pixels_tab [ 0 ] = put_h264_chroma_mc8_c ;
c -> put_h264_chroma_pixels_tab [ 1 ] = put_h264_chroma_mc4_c ;
c -> put_h264_chroma_pixels_tab [ 2 ] = put_h264_chroma_mc2_c ;
c -> avg_h264_chroma_pixels_tab [ 0 ] = avg_h264_chroma_mc8_c ;
c -> avg_h264_chroma_pixels_tab [ 1 ] = avg_h264_chroma_mc4_c ;
c -> avg_h264_chroma_pixels_tab [ 2 ] = avg_h264_chroma_mc2_c ;
2002-11-11 16:17:25 +00:00
2005-01-07 05:56:07 +00:00
c -> weight_h264_pixels_tab [ 0 ] = weight_h264_pixels16x16_c ;
c -> weight_h264_pixels_tab [ 1 ] = weight_h264_pixels16x8_c ;
c -> weight_h264_pixels_tab [ 2 ] = weight_h264_pixels8x16_c ;
c -> weight_h264_pixels_tab [ 3 ] = weight_h264_pixels8x8_c ;
c -> weight_h264_pixels_tab [ 4 ] = weight_h264_pixels8x4_c ;
c -> weight_h264_pixels_tab [ 5 ] = weight_h264_pixels4x8_c ;
c -> weight_h264_pixels_tab [ 6 ] = weight_h264_pixels4x4_c ;
c -> weight_h264_pixels_tab [ 7 ] = weight_h264_pixels4x2_c ;
c -> weight_h264_pixels_tab [ 8 ] = weight_h264_pixels2x4_c ;
c -> weight_h264_pixels_tab [ 9 ] = weight_h264_pixels2x2_c ;
c -> biweight_h264_pixels_tab [ 0 ] = biweight_h264_pixels16x16_c ;
c -> biweight_h264_pixels_tab [ 1 ] = biweight_h264_pixels16x8_c ;
c -> biweight_h264_pixels_tab [ 2 ] = biweight_h264_pixels8x16_c ;
c -> biweight_h264_pixels_tab [ 3 ] = biweight_h264_pixels8x8_c ;
c -> biweight_h264_pixels_tab [ 4 ] = biweight_h264_pixels8x4_c ;
c -> biweight_h264_pixels_tab [ 5 ] = biweight_h264_pixels4x8_c ;
c -> biweight_h264_pixels_tab [ 6 ] = biweight_h264_pixels4x4_c ;
c -> biweight_h264_pixels_tab [ 7 ] = biweight_h264_pixels4x2_c ;
c -> biweight_h264_pixels_tab [ 8 ] = biweight_h264_pixels2x4_c ;
c -> biweight_h264_pixels_tab [ 9 ] = biweight_h264_pixels2x2_c ;
2002-12-27 23:51:46 +00:00
c -> put_mspel_pixels_tab [ 0 ] = put_mspel8_mc00_c ;
c -> put_mspel_pixels_tab [ 1 ] = put_mspel8_mc10_c ;
c -> put_mspel_pixels_tab [ 2 ] = put_mspel8_mc20_c ;
c -> put_mspel_pixels_tab [ 3 ] = put_mspel8_mc30_c ;
c -> put_mspel_pixels_tab [ 4 ] = put_mspel8_mc02_c ;
c -> put_mspel_pixels_tab [ 5 ] = put_mspel8_mc12_c ;
c -> put_mspel_pixels_tab [ 6 ] = put_mspel8_mc22_c ;
c -> put_mspel_pixels_tab [ 7 ] = put_mspel8_mc32_c ;
2003-05-15 23:30:03 +00:00
2003-12-30 16:07:57 +00:00
#define SET_CMP_FUNC(name) \
c->name[0]= name ## 16_c;\
c->name[1]= name ## 8x8_c;
SET_CMP_FUNC ( hadamard8_diff )
2004-01-05 22:57:07 +00:00
c -> hadamard8_diff [ 4 ] = hadamard8_intra16_c ;
2003-12-30 16:07:57 +00:00
SET_CMP_FUNC ( dct_sad )
2004-12-08 18:02:56 +00:00
SET_CMP_FUNC ( dct_max )
2003-12-30 16:07:57 +00:00
c -> sad [ 0 ] = pix_abs16_c ;
c -> sad [ 1 ] = pix_abs8_c ;
c -> sse [ 0 ] = sse16_c ;
c -> sse [ 1 ] = sse8_c ;
2004-08-22 17:16:03 +00:00
c -> sse [ 2 ] = sse4_c ;
2003-12-30 16:07:57 +00:00
SET_CMP_FUNC ( quant_psnr )
SET_CMP_FUNC ( rd )
SET_CMP_FUNC ( bit )
2004-01-05 22:57:07 +00:00
c -> vsad [ 0 ] = vsad16_c ;
c -> vsad [ 4 ] = vsad_intra16_c ;
c -> vsse [ 0 ] = vsse16_c ;
c -> vsse [ 4 ] = vsse_intra16_c ;
2004-06-07 03:23:31 +00:00
c -> nsse [ 0 ] = nsse16_c ;
c -> nsse [ 1 ] = nsse8_c ;
2004-08-22 17:16:03 +00:00
c -> w53 [ 0 ] = w53_16_c ;
c -> w53 [ 1 ] = w53_8_c ;
c -> w97 [ 0 ] = w97_16_c ;
c -> w97 [ 1 ] = w97_8_c ;
2002-11-14 19:20:04 +00:00
c -> add_bytes = add_bytes_c ;
c -> diff_bytes = diff_bytes_c ;
2003-10-13 17:27:30 +00:00
c -> sub_hfyu_median_prediction = sub_hfyu_median_prediction_c ;
2003-05-19 13:30:59 +00:00
c -> bswap_buf = bswap_buf ;
2005-04-25 01:01:41 +00:00
c -> h264_v_loop_filter_luma = h264_v_loop_filter_luma_c ;
c -> h264_h_loop_filter_luma = h264_h_loop_filter_luma_c ;
c -> h264_v_loop_filter_chroma = h264_v_loop_filter_chroma_c ;
c -> h264_h_loop_filter_chroma = h264_h_loop_filter_chroma_c ;
2005-05-18 09:17:22 +00:00
c -> h264_v_loop_filter_chroma_intra = h264_v_loop_filter_chroma_intra_c ;
c -> h264_h_loop_filter_chroma_intra = h264_h_loop_filter_chroma_intra_c ;
2003-12-01 15:23:14 +00:00
c -> h263_h_loop_filter = h263_h_loop_filter_c ;
c -> h263_v_loop_filter = h263_v_loop_filter_c ;
2004-02-06 02:12:37 +00:00
2004-05-30 21:21:13 +00:00
c -> h261_loop_filter = h261_loop_filter_c ;
2004-05-30 20:37:15 +00:00
2004-02-06 02:12:37 +00:00
c -> try_8x8basis = try_8x8basis_c ;
c -> add_8x8basis = add_8x8basis_c ;
2002-11-14 19:20:04 +00:00
2001-07-23 20:06:54 +00:00
#ifdef HAVE_MMX
2003-03-03 14:54:00 +00:00
dsputil_init_mmx ( c , avctx );
2001-07-22 14:18:56 +00:00
#endif
2001-08-13 21:45:36 +00:00
#ifdef ARCH_ARMV4L
2003-03-03 14:54:00 +00:00
dsputil_init_armv4l ( c , avctx );
2001-08-13 21:45:36 +00:00
#endif
2001-09-16 21:54:00 +00:00
#ifdef HAVE_MLIB
2003-03-03 14:54:00 +00:00
dsputil_init_mlib ( c , avctx );
2001-09-16 21:54:00 +00:00
#endif
2004-04-23 23:38:54 +00:00
#ifdef ARCH_SPARC
dsputil_init_vis ( c , avctx );
#endif
2002-01-20 14:48:02 +00:00
#ifdef ARCH_ALPHA
2003-03-03 14:54:00 +00:00
dsputil_init_alpha ( c , avctx );
2002-01-20 14:48:02 +00:00
#endif
2002-08-28 13:14:36 +00:00
#ifdef ARCH_POWERPC
2003-03-03 14:54:00 +00:00
dsputil_init_ppc ( c , avctx );
2002-08-30 00:05:28 +00:00
#endif
2002-09-23 08:44:24 +00:00
#ifdef HAVE_MMI
2003-03-03 14:54:00 +00:00
dsputil_init_mmi ( c , avctx );
2002-09-23 08:44:24 +00:00
#endif
2003-05-14 12:18:49 +00:00
#ifdef ARCH_SH4
dsputil_init_sh4 ( c , avctx );
#endif
2003-03-03 14:54:00 +00:00
switch ( c -> idct_permutation_type ){
case FF_NO_IDCT_PERM :
for ( i = 0 ; i < 64 ; i ++ )
c -> idct_permutation [ i ] = i ;
break ;
case FF_LIBMPEG2_IDCT_PERM :
for ( i = 0 ; i < 64 ; i ++ )
c -> idct_permutation [ i ] = ( i & 0x38 ) | (( i & 6 ) >> 1 ) | (( i & 1 ) << 2 );
break ;
case FF_SIMPLE_IDCT_PERM :
for ( i = 0 ; i < 64 ; i ++ )
c -> idct_permutation [ i ] = simple_mmx_permutation [ i ];
break ;
case FF_TRANSPOSE_IDCT_PERM :
for ( i = 0 ; i < 64 ; i ++ )
c -> idct_permutation [ i ] = (( i & 7 ) << 3 ) | ( i >> 3 );
break ;
2005-05-17 18:28:40 +00:00
case FF_PARTTRANS_IDCT_PERM :
for ( i = 0 ; i < 64 ; i ++ )
c -> idct_permutation [ i ] = ( i & 0x24 ) | (( i & 3 ) << 3 ) | (( i >> 3 ) & 3 );
break ;
2003-03-03 14:54:00 +00:00
default :
2003-11-03 13:26:22 +00:00
av_log ( avctx , AV_LOG_ERROR , "Internal error, IDCT permutation not set \n " );
2003-03-03 14:54:00 +00:00
}
2001-07-22 14:18:56 +00:00
}
2002-02-26 22:14:27 +00:00