comparison libswscale/swscale.c @ 23129:9528d1ebe68f

cosmetics: Remove trailing whitespace.
author diego
date Thu, 26 Apr 2007 23:07:11 +0000
parents d581a6ba2d9c
children 1befc8d767cd
comparison
equal deleted inserted replaced
23128:0c4b9bc10494 23129:9528d1ebe68f
23 23
24 /* 24 /*
25 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09, PAL8 25 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09, PAL8
26 supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09 26 supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09
27 {BGR,RGB}{1,4,8,15,16} support dithering 27 {BGR,RGB}{1,4,8,15,16} support dithering
28 28
29 unscaled special converters (YV12=I420=IYUV, Y800=Y8) 29 unscaled special converters (YV12=I420=IYUV, Y800=Y8)
30 YV12 -> {BGR,RGB}{1,4,8,15,16,24,32} 30 YV12 -> {BGR,RGB}{1,4,8,15,16,24,32}
31 x -> x 31 x -> x
32 YUV9 -> YV12 32 YUV9 -> YV12
33 YUV9/YV12 -> Y800 33 YUV9/YV12 -> Y800
35 BGR24 -> BGR32 & RGB24 -> RGB32 35 BGR24 -> BGR32 & RGB24 -> RGB32
36 BGR32 -> BGR24 & RGB32 -> RGB24 36 BGR32 -> BGR24 & RGB32 -> RGB24
37 BGR15 -> BGR16 37 BGR15 -> BGR16
38 */ 38 */
39 39
40 /* 40 /*
41 tested special converters (most are tested actually but i didnt write it down ...) 41 tested special converters (most are tested actually but i didnt write it down ...)
42 YV12 -> BGR16 42 YV12 -> BGR16
43 YV12 -> YV12 43 YV12 -> YV12
44 BGR15 -> BGR16 44 BGR15 -> BGR16
45 BGR16 -> BGR16 45 BGR16 -> BGR16
197 197
198 // clipping helper table for C implementations: 198 // clipping helper table for C implementations:
199 static unsigned char clip_table[768]; 199 static unsigned char clip_table[768];
200 200
201 static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b); 201 static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b);
202 202
203 extern const uint8_t dither_2x2_4[2][8]; 203 extern const uint8_t dither_2x2_4[2][8];
204 extern const uint8_t dither_2x2_8[2][8]; 204 extern const uint8_t dither_2x2_8[2][8];
205 extern const uint8_t dither_8x8_32[8][8]; 205 extern const uint8_t dither_8x8_32[8][8];
206 extern const uint8_t dither_8x8_73[8][8]; 206 extern const uint8_t dither_8x8_73[8][8];
207 extern const uint8_t dither_8x8_220[8][8]; 207 extern const uint8_t dither_8x8_220[8][8];
421 if(U>255) U=255;\ 421 if(U>255) U=255;\
422 else if(U<0) U=0;\ 422 else if(U<0) U=0;\
423 if(V>255) V=255;\ 423 if(V>255) V=255;\
424 else if(V<0) V=0;\ 424 else if(V<0) V=0;\
425 } 425 }
426 426
427 #define YSCALE_YUV_2_RGBX_C(type) \ 427 #define YSCALE_YUV_2_RGBX_C(type) \
428 YSCALE_YUV_2_PACKEDX_C(type)\ 428 YSCALE_YUV_2_PACKEDX_C(type)\
429 r = (type *)c->table_rV[V];\ 429 r = (type *)c->table_rV[V];\
430 g = (type *)(c->table_gU[U] + c->table_gV[V]);\ 430 g = (type *)(c->table_gU[U] + c->table_gV[V]);\
431 b = (type *)c->table_bU[U];\ 431 b = (type *)c->table_bU[U];\
902 902
903 static double getSplineCoeff(double a, double b, double c, double d, double dist) 903 static double getSplineCoeff(double a, double b, double c, double d, double dist)
904 { 904 {
905 // printf("%f %f %f %f %f\n", a,b,c,d,dist); 905 // printf("%f %f %f %f %f\n", a,b,c,d,dist);
906 if(dist<=1.0) return ((d*dist + c)*dist + b)*dist +a; 906 if(dist<=1.0) return ((d*dist + c)*dist + b)*dist +a;
907 else return getSplineCoeff( 0.0, 907 else return getSplineCoeff( 0.0,
908 b+ 2.0*c + 3.0*d, 908 b+ 2.0*c + 3.0*d,
909 c + 3.0*d, 909 c + 3.0*d,
910 -b- 3.0*c - 6.0*d, 910 -b- 3.0*c - 6.0*d,
911 dist-1.0); 911 dist-1.0);
912 } 912 }
947 { 947 {
948 int i; 948 int i;
949 int xDstInSrc; 949 int xDstInSrc;
950 filterSize= 1; 950 filterSize= 1;
951 filter= av_malloc(dstW*sizeof(double)*filterSize); 951 filter= av_malloc(dstW*sizeof(double)*filterSize);
952 952
953 xDstInSrc= xInc/2 - 0x8000; 953 xDstInSrc= xInc/2 - 0x8000;
954 for(i=0; i<dstW; i++) 954 for(i=0; i<dstW; i++)
955 { 955 {
956 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16; 956 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16;
957 957
964 { 964 {
965 int i; 965 int i;
966 int xDstInSrc; 966 int xDstInSrc;
967 if (flags&SWS_BICUBIC) filterSize= 4; 967 if (flags&SWS_BICUBIC) filterSize= 4;
968 else if(flags&SWS_X ) filterSize= 4; 968 else if(flags&SWS_X ) filterSize= 4;
969 else filterSize= 2; // SWS_BILINEAR / SWS_AREA 969 else filterSize= 2; // SWS_BILINEAR / SWS_AREA
970 filter= av_malloc(dstW*sizeof(double)*filterSize); 970 filter= av_malloc(dstW*sizeof(double)*filterSize);
971 971
972 xDstInSrc= xInc/2 - 0x8000; 972 xDstInSrc= xInc/2 - 0x8000;
973 for(i=0; i<dstW; i++) 973 for(i=0; i<dstW; i++)
974 { 974 {
1004 else if(flags&SWS_BILINEAR) sizeFactor= 2.0; 1004 else if(flags&SWS_BILINEAR) sizeFactor= 2.0;
1005 else { 1005 else {
1006 sizeFactor= 0.0; //GCC warning killer 1006 sizeFactor= 0.0; //GCC warning killer
1007 ASSERT(0) 1007 ASSERT(0)
1008 } 1008 }
1009 1009
1010 if(xInc1 <= 1.0) filterSizeInSrc= sizeFactor; // upscale 1010 if(xInc1 <= 1.0) filterSizeInSrc= sizeFactor; // upscale
1011 else filterSizeInSrc= sizeFactor*srcW / (double)dstW; 1011 else filterSizeInSrc= sizeFactor*srcW / (double)dstW;
1012 1012
1013 filterSize= (int)ceil(1 + filterSizeInSrc); // will be reduced later if possible 1013 filterSize= (int)ceil(1 + filterSizeInSrc); // will be reduced later if possible
1014 if(filterSize > srcW-2) filterSize=srcW-2; 1014 if(filterSize > srcW-2) filterSize=srcW-2;
1028 if(flags & SWS_BICUBIC) 1028 if(flags & SWS_BICUBIC)
1029 { 1029 {
1030 double B= param[0] != SWS_PARAM_DEFAULT ? param[0] : 0.0; 1030 double B= param[0] != SWS_PARAM_DEFAULT ? param[0] : 0.0;
1031 double C= param[1] != SWS_PARAM_DEFAULT ? param[1] : 0.6; 1031 double C= param[1] != SWS_PARAM_DEFAULT ? param[1] : 0.6;
1032 1032
1033 if(d<1.0) 1033 if(d<1.0)
1034 coeff = (12-9*B-6*C)*d*d*d + (-18+12*B+6*C)*d*d + 6-2*B; 1034 coeff = (12-9*B-6*C)*d*d*d + (-18+12*B+6*C)*d*d + 6-2*B;
1035 else if(d<2.0) 1035 else if(d<2.0)
1036 coeff = (-B-6*C)*d*d*d + (6*B+30*C)*d*d + (-12*B-48*C)*d +8*B+24*C; 1036 coeff = (-B-6*C)*d*d*d + (6*B+30*C)*d*d + (-12*B-48*C)*d +8*B+24*C;
1037 else 1037 else
1038 coeff=0.0; 1038 coeff=0.0;
1044 coeff*= pow(2.0, - p*d*d); 1044 coeff*= pow(2.0, - p*d*d);
1045 }*/ 1045 }*/
1046 else if(flags & SWS_X) 1046 else if(flags & SWS_X)
1047 { 1047 {
1048 double A= param[0] != SWS_PARAM_DEFAULT ? param[0] : 1.0; 1048 double A= param[0] != SWS_PARAM_DEFAULT ? param[0] : 1.0;
1049 1049
1050 if(d<1.0) 1050 if(d<1.0)
1051 coeff = cos(d*PI); 1051 coeff = cos(d*PI);
1052 else 1052 else
1053 coeff=-1.0; 1053 coeff=-1.0;
1054 if(coeff<0.0) coeff= -pow(-coeff, A); 1054 if(coeff<0.0) coeff= -pow(-coeff, A);
1071 { 1071 {
1072 coeff = d ? sin(d*PI)/(d*PI) : 1.0; 1072 coeff = d ? sin(d*PI)/(d*PI) : 1.0;
1073 } 1073 }
1074 else if(flags & SWS_LANCZOS) 1074 else if(flags & SWS_LANCZOS)
1075 { 1075 {
1076 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0; 1076 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0;
1077 coeff = d ? sin(d*PI)*sin(d*PI/p)/(d*d*PI*PI/p) : 1.0; 1077 coeff = d ? sin(d*PI)*sin(d*PI/p)/(d*d*PI*PI/p) : 1.0;
1078 if(d>p) coeff=0; 1078 if(d>p) coeff=0;
1079 } 1079 }
1080 else if(flags & SWS_BILINEAR) 1080 else if(flags & SWS_BILINEAR)
1081 { 1081 {
1216 if(j>=filter2Size) filter[i*filterSize + j]= 0.0; 1216 if(j>=filter2Size) filter[i*filterSize + j]= 0.0;
1217 else filter[i*filterSize + j]= filter2[i*filter2Size + j]; 1217 else filter[i*filterSize + j]= filter2[i*filter2Size + j];
1218 } 1218 }
1219 } 1219 }
1220 av_free(filter2); filter2=NULL; 1220 av_free(filter2); filter2=NULL;
1221 1221
1222 1222
1223 //FIXME try to align filterpos if possible 1223 //FIXME try to align filterpos if possible
1224 1224
1225 //fix borders 1225 //fix borders
1226 for(i=0; i<dstW; i++) 1226 for(i=0; i<dstW; i++)
1275 int intV= floor(v + 0.5); 1275 int intV= floor(v + 0.5);
1276 (*outFilter)[i*(*outFilterSize) + j]= intV; 1276 (*outFilter)[i*(*outFilterSize) + j]= intV;
1277 error = v - intV; 1277 error = v - intV;
1278 } 1278 }
1279 } 1279 }
1280 1280
1281 (*filterPos)[dstW]= (*filterPos)[dstW-1]; // the MMX scaler will read over the end 1281 (*filterPos)[dstW]= (*filterPos)[dstW-1]; // the MMX scaler will read over the end
1282 for(i=0; i<*outFilterSize; i++) 1282 for(i=0; i<*outFilterSize; i++)
1283 { 1283 {
1284 int j= dstW*(*outFilterSize); 1284 int j= dstW*(*outFilterSize);
1285 (*outFilter)[j + i]= (*outFilter)[j + i - (*outFilterSize)]; 1285 (*outFilter)[j + i]= (*outFilter)[j + i - (*outFilterSize)];
1310 1310
1311 asm volatile( 1311 asm volatile(
1312 "jmp 9f \n\t" 1312 "jmp 9f \n\t"
1313 // Begin 1313 // Begin
1314 "0: \n\t" 1314 "0: \n\t"
1315 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t" 1315 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t"
1316 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t" 1316 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t"
1317 "movd 1(%%"REG_c", %%"REG_S"), %%mm1\n\t" 1317 "movd 1(%%"REG_c", %%"REG_S"), %%mm1\n\t"
1318 "punpcklbw %%mm7, %%mm1 \n\t" 1318 "punpcklbw %%mm7, %%mm1 \n\t"
1319 "punpcklbw %%mm7, %%mm0 \n\t" 1319 "punpcklbw %%mm7, %%mm0 \n\t"
1320 "pshufw $0xFF, %%mm1, %%mm1 \n\t" 1320 "pshufw $0xFF, %%mm1, %%mm1 \n\t"
1321 "1: \n\t" 1321 "1: \n\t"
1350 1350
1351 asm volatile( 1351 asm volatile(
1352 "jmp 9f \n\t" 1352 "jmp 9f \n\t"
1353 // Begin 1353 // Begin
1354 "0: \n\t" 1354 "0: \n\t"
1355 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t" 1355 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t"
1356 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t" 1356 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t"
1357 "punpcklbw %%mm7, %%mm0 \n\t" 1357 "punpcklbw %%mm7, %%mm0 \n\t"
1358 "pshufw $0xFF, %%mm0, %%mm1 \n\t" 1358 "pshufw $0xFF, %%mm0, %%mm1 \n\t"
1359 "1: \n\t" 1359 "1: \n\t"
1360 "pshufw $0xFF, %%mm0, %%mm0 \n\t" 1360 "pshufw $0xFF, %%mm0, %%mm0 \n\t"
1361 "2: \n\t" 1361 "2: \n\t"
1386 "=r" (fragmentLengthB) 1386 "=r" (fragmentLengthB)
1387 ); 1387 );
1388 1388
1389 xpos= 0; //lumXInc/2 - 0x8000; // difference between pixel centers 1389 xpos= 0; //lumXInc/2 - 0x8000; // difference between pixel centers
1390 fragmentPos=0; 1390 fragmentPos=0;
1391 1391
1392 for(i=0; i<dstW/numSplits; i++) 1392 for(i=0; i<dstW/numSplits; i++)
1393 { 1393 {
1394 int xx=xpos>>16; 1394 int xx=xpos>>16;
1395 1395
1396 if((i&3) == 0) 1396 if((i&3) == 0)
1470 clip_table[i]=c; 1470 clip_table[i]=c;
1471 } 1471 }
1472 } 1472 }
1473 1473
1474 static SwsFunc getSwsFunc(int flags){ 1474 static SwsFunc getSwsFunc(int flags){
1475 1475
1476 #if defined(RUNTIME_CPUDETECT) && defined (CONFIG_GPL) 1476 #if defined(RUNTIME_CPUDETECT) && defined (CONFIG_GPL)
1477 #if defined(ARCH_X86) 1477 #if defined(ARCH_X86)
1478 // ordered per speed fasterst first 1478 // ordered per speed fasterst first
1479 if(flags & SWS_CPU_CAPS_MMX2) 1479 if(flags & SWS_CPU_CAPS_MMX2)
1480 return swScale_MMX2; 1480 return swScale_MMX2;
1579 case 0x64: conv= rgb16to24; break; 1579 case 0x64: conv= rgb16to24; break;
1580 case 0x68: conv= rgb32to24; break; 1580 case 0x68: conv= rgb32to24; break;
1581 case 0x83: conv= rgb15to32; break; 1581 case 0x83: conv= rgb15to32; break;
1582 case 0x84: conv= rgb16to32; break; 1582 case 0x84: conv= rgb16to32; break;
1583 case 0x86: conv= rgb24to32; break; 1583 case 0x86: conv= rgb24to32; break;
1584 default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", 1584 default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n",
1585 sws_format_name(srcFormat), sws_format_name(dstFormat)); break; 1585 sws_format_name(srcFormat), sws_format_name(dstFormat)); break;
1586 } 1586 }
1587 }else if( (isBGR(srcFormat) && isRGB(dstFormat)) 1587 }else if( (isBGR(srcFormat) && isRGB(dstFormat))
1588 || (isRGB(srcFormat) && isBGR(dstFormat))){ 1588 || (isRGB(srcFormat) && isBGR(dstFormat))){
1589 switch(srcId | (dstId<<4)){ 1589 switch(srcId | (dstId<<4)){
1601 case 0x68: conv= rgb32tobgr24; break; 1601 case 0x68: conv= rgb32tobgr24; break;
1602 case 0x83: conv= rgb15tobgr32; break; 1602 case 0x83: conv= rgb15tobgr32; break;
1603 case 0x84: conv= rgb16tobgr32; break; 1603 case 0x84: conv= rgb16tobgr32; break;
1604 case 0x86: conv= rgb24tobgr32; break; 1604 case 0x86: conv= rgb24tobgr32; break;
1605 case 0x88: conv= rgb32tobgr32; break; 1605 case 0x88: conv= rgb32tobgr32; break;
1606 default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", 1606 default: av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n",
1607 sws_format_name(srcFormat), sws_format_name(dstFormat)); break; 1607 sws_format_name(srcFormat), sws_format_name(dstFormat)); break;
1608 } 1608 }
1609 }else{ 1609 }else{
1610 av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n", 1610 av_log(c, AV_LOG_ERROR, "swScaler: internal error %s -> %s converter\n",
1611 sws_format_name(srcFormat), sws_format_name(dstFormat)); 1611 sws_format_name(srcFormat), sws_format_name(dstFormat));
1612 } 1612 }
1613 1613
1614 if(dstStride[0]*srcBpp == srcStride[0]*dstBpp) 1614 if(dstStride[0]*srcBpp == srcStride[0]*dstBpp)
1615 conv(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]); 1615 conv(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
1623 { 1623 {
1624 conv(srcPtr, dstPtr, c->srcW*srcBpp); 1624 conv(srcPtr, dstPtr, c->srcW*srcBpp);
1625 srcPtr+= srcStride[0]; 1625 srcPtr+= srcStride[0];
1626 dstPtr+= dstStride[0]; 1626 dstPtr+= dstStride[0];
1627 } 1627 }
1628 } 1628 }
1629 return srcSliceH; 1629 return srcSliceH;
1630 } 1630 }
1631 1631
1632 static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, 1632 static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1633 int srcSliceH, uint8_t* dst[], int dstStride[]){ 1633 int srcSliceH, uint8_t* dst[], int dstStride[]){
1634 1634
1635 rgb24toyv12( 1635 rgb24toyv12(
1636 src[0], 1636 src[0],
1637 dst[0]+ srcSliceY *dstStride[0], 1637 dst[0]+ srcSliceY *dstStride[0],
1638 dst[1]+(srcSliceY>>1)*dstStride[1], 1638 dst[1]+(srcSliceY>>1)*dstStride[1],
1639 dst[2]+(srcSliceY>>1)*dstStride[2], 1639 dst[2]+(srcSliceY>>1)*dstStride[2],
1640 c->srcW, srcSliceH, 1640 c->srcW, srcSliceH,
1641 dstStride[0], dstStride[1], srcStride[0]); 1641 dstStride[0], dstStride[1], srcStride[0]);
1642 return srcSliceH; 1642 return srcSliceH;
1643 } 1643 }
1644 1644
1645 static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, 1645 static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1646 int srcSliceH, uint8_t* dst[], int dstStride[]){ 1646 int srcSliceH, uint8_t* dst[], int dstStride[]){
1647 int i; 1647 int i;
1648 1648
1649 /* copy Y */ 1649 /* copy Y */
1650 if(srcStride[0]==dstStride[0] && srcStride[0] > 0) 1650 if(srcStride[0]==dstStride[0] && srcStride[0] > 0)
1651 memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH); 1651 memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH);
1652 else{ 1652 else{
1653 uint8_t *srcPtr= src[0]; 1653 uint8_t *srcPtr= src[0];
1654 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; 1654 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1655 1655
1685 uint8_t *srcPtr= src[0]; 1685 uint8_t *srcPtr= src[0];
1686 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; 1686 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1687 int length=0; 1687 int length=0;
1688 1688
1689 /* universal length finder */ 1689 /* universal length finder */
1690 while(length+c->srcW <= FFABS(dstStride[0]) 1690 while(length+c->srcW <= FFABS(dstStride[0])
1691 && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW; 1691 && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW;
1692 ASSERT(length!=0); 1692 ASSERT(length!=0);
1693 1693
1694 for(i=0; i<srcSliceH; i++) 1694 for(i=0; i<srcSliceH; i++)
1695 { 1695 {
1697 srcPtr+= srcStride[0]; 1697 srcPtr+= srcStride[0];
1698 dstPtr+= dstStride[0]; 1698 dstPtr+= dstStride[0];
1699 } 1699 }
1700 } 1700 }
1701 } 1701 }
1702 else 1702 else
1703 { /* Planar YUV or gray */ 1703 { /* Planar YUV or gray */
1704 int plane; 1704 int plane;
1705 for(plane=0; plane<3; plane++) 1705 for(plane=0; plane<3; plane++)
1706 { 1706 {
1707 int length= plane==0 ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample); 1707 int length= plane==0 ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample);
1902 //FIXME factorize 1902 //FIXME factorize
1903 1903
1904 #ifdef COMPILE_ALTIVEC 1904 #ifdef COMPILE_ALTIVEC
1905 if (c->flags & SWS_CPU_CAPS_ALTIVEC) 1905 if (c->flags & SWS_CPU_CAPS_ALTIVEC)
1906 yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation); 1906 yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation);
1907 #endif 1907 #endif
1908 return 0; 1908 return 0;
1909 } 1909 }
1910 1910
1911 /** 1911 /**
1912 * @return -1 if not supported 1912 * @return -1 if not supported
1919 *srcRange = c->srcRange; 1919 *srcRange = c->srcRange;
1920 *dstRange = c->dstRange; 1920 *dstRange = c->dstRange;
1921 *brightness= c->brightness; 1921 *brightness= c->brightness;
1922 *contrast = c->contrast; 1922 *contrast = c->contrast;
1923 *saturation= c->saturation; 1923 *saturation= c->saturation;
1924 1924
1925 return 0; 1925 return 0;
1926 } 1926 }
1927 1927
1928 static int handle_jpeg(int *format) 1928 static int handle_jpeg(int *format)
1929 { 1929 {
1930 switch (*format) { 1930 switch (*format) {
1970 #endif /* RUNTIME_CPUDETECT */ 1970 #endif /* RUNTIME_CPUDETECT */
1971 if(clip_table[512] != 255) globalInit(); 1971 if(clip_table[512] != 255) globalInit();
1972 if(rgb15to16 == NULL) sws_rgb2rgb_init(flags); 1972 if(rgb15to16 == NULL) sws_rgb2rgb_init(flags);
1973 1973
1974 unscaled = (srcW == dstW && srcH == dstH); 1974 unscaled = (srcW == dstW && srcH == dstH);
1975 needsDither= (isBGR(dstFormat) || isRGB(dstFormat)) 1975 needsDither= (isBGR(dstFormat) || isRGB(dstFormat))
1976 && (fmt_depth(dstFormat))<24 1976 && (fmt_depth(dstFormat))<24
1977 && ((fmt_depth(dstFormat))<(fmt_depth(srcFormat)) || (!(isRGB(srcFormat) || isBGR(srcFormat)))); 1977 && ((fmt_depth(dstFormat))<(fmt_depth(srcFormat)) || (!(isRGB(srcFormat) || isBGR(srcFormat))));
1978 1978
1979 srcRange = handle_jpeg(&srcFormat); 1979 srcRange = handle_jpeg(&srcFormat);
1980 dstRange = handle_jpeg(&dstFormat); 1980 dstRange = handle_jpeg(&dstFormat);
1981 1981
1982 if(!isSupportedIn(srcFormat)) 1982 if(!isSupportedIn(srcFormat))
1983 { 1983 {
1984 av_log(NULL, AV_LOG_ERROR, "swScaler: %s is not supported as input format\n", sws_format_name(srcFormat)); 1984 av_log(NULL, AV_LOG_ERROR, "swScaler: %s is not supported as input format\n", sws_format_name(srcFormat));
1985 return NULL; 1985 return NULL;
1986 } 1986 }
1987 if(!isSupportedOut(dstFormat)) 1987 if(!isSupportedOut(dstFormat))
1991 } 1991 }
1992 1992
1993 /* sanity check */ 1993 /* sanity check */
1994 if(srcW<4 || srcH<1 || dstW<8 || dstH<1) //FIXME check if these are enough and try to lowwer them after fixing the relevant parts of the code 1994 if(srcW<4 || srcH<1 || dstW<8 || dstH<1) //FIXME check if these are enough and try to lowwer them after fixing the relevant parts of the code
1995 { 1995 {
1996 av_log(NULL, AV_LOG_ERROR, "swScaler: %dx%d -> %dx%d is invalid scaling dimension\n", 1996 av_log(NULL, AV_LOG_ERROR, "swScaler: %dx%d -> %dx%d is invalid scaling dimension\n",
1997 srcW, srcH, dstW, dstH); 1997 srcW, srcH, dstW, dstH);
1998 return NULL; 1998 return NULL;
1999 } 1999 }
2000 2000
2001 if(!dstFilter) dstFilter= &dummyFilter; 2001 if(!dstFilter) dstFilter= &dummyFilter;
2057 c->chrSrcW= -((-srcW) >> c->chrSrcHSubSample); 2057 c->chrSrcW= -((-srcW) >> c->chrSrcHSubSample);
2058 c->chrSrcH= -((-srcH) >> c->chrSrcVSubSample); 2058 c->chrSrcH= -((-srcH) >> c->chrSrcVSubSample);
2059 c->chrDstW= -((-dstW) >> c->chrDstHSubSample); 2059 c->chrDstW= -((-dstW) >> c->chrDstHSubSample);
2060 c->chrDstH= -((-dstH) >> c->chrDstVSubSample); 2060 c->chrDstH= -((-dstH) >> c->chrDstVSubSample);
2061 2061
2062 sws_setColorspaceDetails(c, Inverse_Table_6_9[SWS_CS_DEFAULT], srcRange, Inverse_Table_6_9[SWS_CS_DEFAULT] /* FIXME*/, dstRange, 0, 1<<16, 1<<16); 2062 sws_setColorspaceDetails(c, Inverse_Table_6_9[SWS_CS_DEFAULT], srcRange, Inverse_Table_6_9[SWS_CS_DEFAULT] /* FIXME*/, dstRange, 0, 1<<16, 1<<16);
2063 2063
2064 /* unscaled special Cases */ 2064 /* unscaled special Cases */
2065 if(unscaled && !usesHFilter && !usesVFilter) 2065 if(unscaled && !usesHFilter && !usesVFilter)
2066 { 2066 {
2067 /* yv12_to_nv12 */ 2067 /* yv12_to_nv12 */
2074 if((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P) && (isBGR(dstFormat) || isRGB(dstFormat))) 2074 if((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P) && (isBGR(dstFormat) || isRGB(dstFormat)))
2075 { 2075 {
2076 c->swScale= yuv2rgb_get_func_ptr(c); 2076 c->swScale= yuv2rgb_get_func_ptr(c);
2077 } 2077 }
2078 #endif 2078 #endif
2079 2079
2080 if( srcFormat==PIX_FMT_YUV410P && dstFormat==PIX_FMT_YUV420P ) 2080 if( srcFormat==PIX_FMT_YUV410P && dstFormat==PIX_FMT_YUV420P )
2081 { 2081 {
2082 c->swScale= yvu9toyv12Wrapper; 2082 c->swScale= yvu9toyv12Wrapper;
2083 } 2083 }
2084 2084
2085 /* bgr24toYV12 */ 2085 /* bgr24toYV12 */
2086 if(srcFormat==PIX_FMT_BGR24 && dstFormat==PIX_FMT_YUV420P) 2086 if(srcFormat==PIX_FMT_BGR24 && dstFormat==PIX_FMT_YUV420P)
2087 c->swScale= bgr24toyv12Wrapper; 2087 c->swScale= bgr24toyv12Wrapper;
2088 2088
2089 /* rgb/bgr -> rgb/bgr (no dither needed forms) */ 2089 /* rgb/bgr -> rgb/bgr (no dither needed forms) */
2090 if( (isBGR(srcFormat) || isRGB(srcFormat)) 2090 if( (isBGR(srcFormat) || isRGB(srcFormat))
2091 && (isBGR(dstFormat) || isRGB(dstFormat)) 2091 && (isBGR(dstFormat) || isRGB(dstFormat))
2092 && srcFormat != PIX_FMT_BGR8 && dstFormat != PIX_FMT_BGR8 2092 && srcFormat != PIX_FMT_BGR8 && dstFormat != PIX_FMT_BGR8
2093 && srcFormat != PIX_FMT_RGB8 && dstFormat != PIX_FMT_RGB8 2093 && srcFormat != PIX_FMT_RGB8 && dstFormat != PIX_FMT_RGB8
2094 && srcFormat != PIX_FMT_BGR4 && dstFormat != PIX_FMT_BGR4 2094 && srcFormat != PIX_FMT_BGR4 && dstFormat != PIX_FMT_BGR4
2095 && srcFormat != PIX_FMT_RGB4 && dstFormat != PIX_FMT_RGB4 2095 && srcFormat != PIX_FMT_RGB4 && dstFormat != PIX_FMT_RGB4
2096 && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE 2096 && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE
2101 2101
2102 /* LQ converters if -sws 0 or -sws 4*/ 2102 /* LQ converters if -sws 0 or -sws 4*/
2103 if(c->flags&(SWS_FAST_BILINEAR|SWS_POINT)){ 2103 if(c->flags&(SWS_FAST_BILINEAR|SWS_POINT)){
2104 /* rgb/bgr -> rgb/bgr (dither needed forms) */ 2104 /* rgb/bgr -> rgb/bgr (dither needed forms) */
2105 if( (isBGR(srcFormat) || isRGB(srcFormat)) 2105 if( (isBGR(srcFormat) || isRGB(srcFormat))
2106 && (isBGR(dstFormat) || isRGB(dstFormat)) 2106 && (isBGR(dstFormat) || isRGB(dstFormat))
2107 && needsDither) 2107 && needsDither)
2108 c->swScale= rgb2rgbWrapper; 2108 c->swScale= rgb2rgbWrapper;
2109 2109
2110 /* yv12_to_yuy2 */ 2110 /* yv12_to_yuy2 */
2111 if(srcFormat == PIX_FMT_YUV420P && 2111 if(srcFormat == PIX_FMT_YUV420P &&
2112 (dstFormat == PIX_FMT_YUYV422 || dstFormat == PIX_FMT_UYVY422)) 2112 (dstFormat == PIX_FMT_YUYV422 || dstFormat == PIX_FMT_UYVY422))
2113 { 2113 {
2114 if (dstFormat == PIX_FMT_YUYV422) 2114 if (dstFormat == PIX_FMT_YUYV422)
2115 c->swScale= PlanarToYuy2Wrapper; 2115 c->swScale= PlanarToYuy2Wrapper;
2116 else 2116 else
2118 } 2118 }
2119 } 2119 }
2120 2120
2121 #ifdef COMPILE_ALTIVEC 2121 #ifdef COMPILE_ALTIVEC
2122 if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && 2122 if ((c->flags & SWS_CPU_CAPS_ALTIVEC) &&
2123 ((srcFormat == PIX_FMT_YUV420P && 2123 ((srcFormat == PIX_FMT_YUV420P &&
2124 (dstFormat == PIX_FMT_YUYV422 || dstFormat == PIX_FMT_UYVY422)))) { 2124 (dstFormat == PIX_FMT_YUYV422 || dstFormat == PIX_FMT_UYVY422)))) {
2125 // unscaled YV12 -> packed YUV, we want speed 2125 // unscaled YV12 -> packed YUV, we want speed
2126 if (dstFormat == PIX_FMT_YUYV422) 2126 if (dstFormat == PIX_FMT_YUYV422)
2127 c->swScale= yv12toyuy2_unscaled_altivec; 2127 c->swScale= yv12toyuy2_unscaled_altivec;
2128 else 2128 else
2149 c->swScale= graytogray16; 2149 c->swScale= graytogray16;
2150 } 2150 }
2151 if(srcFormat != dstFormat && isGray16(srcFormat) && isGray16(dstFormat)) 2151 if(srcFormat != dstFormat && isGray16(srcFormat) && isGray16(dstFormat))
2152 { 2152 {
2153 c->swScale= gray16swap; 2153 c->swScale= gray16swap;
2154 } 2154 }
2155 2155
2156 if(c->swScale){ 2156 if(c->swScale){
2157 if(flags&SWS_PRINT_INFO) 2157 if(flags&SWS_PRINT_INFO)
2158 av_log(c, AV_LOG_INFO, "SwScaler: using unscaled %s -> %s special converter\n", 2158 av_log(c, AV_LOG_INFO, "SwScaler: using unscaled %s -> %s special converter\n",
2159 sws_format_name(srcFormat), sws_format_name(dstFormat)); 2159 sws_format_name(srcFormat), sws_format_name(dstFormat));
2160 return c; 2160 return c;
2161 } 2161 }
2162 } 2162 }
2163 2163
2339 av_log(c, AV_LOG_INFO, "SwScaler: Bicubic spline scaler, "); 2339 av_log(c, AV_LOG_INFO, "SwScaler: Bicubic spline scaler, ");
2340 else 2340 else
2341 av_log(c, AV_LOG_INFO, "SwScaler: ehh flags invalid?! "); 2341 av_log(c, AV_LOG_INFO, "SwScaler: ehh flags invalid?! ");
2342 2342
2343 if(dstFormat==PIX_FMT_BGR555 || dstFormat==PIX_FMT_BGR565) 2343 if(dstFormat==PIX_FMT_BGR555 || dstFormat==PIX_FMT_BGR565)
2344 av_log(c, AV_LOG_INFO, "from %s to%s %s ", 2344 av_log(c, AV_LOG_INFO, "from %s to%s %s ",
2345 sws_format_name(srcFormat), dither, sws_format_name(dstFormat)); 2345 sws_format_name(srcFormat), dither, sws_format_name(dstFormat));
2346 else 2346 else
2347 av_log(c, AV_LOG_INFO, "from %s to %s ", 2347 av_log(c, AV_LOG_INFO, "from %s to %s ",
2348 sws_format_name(srcFormat), sws_format_name(dstFormat)); 2348 sws_format_name(srcFormat), sws_format_name(dstFormat));
2349 2349
2350 if(flags & SWS_CPU_CAPS_MMX2) 2350 if(flags & SWS_CPU_CAPS_MMX2)
2351 av_log(c, AV_LOG_INFO, "using MMX2\n"); 2351 av_log(c, AV_LOG_INFO, "using MMX2\n");
2352 else if(flags & SWS_CPU_CAPS_3DNOW) 2352 else if(flags & SWS_CPU_CAPS_3DNOW)
2353 av_log(c, AV_LOG_INFO, "using 3DNOW\n"); 2353 av_log(c, AV_LOG_INFO, "using 3DNOW\n");
2354 else if(flags & SWS_CPU_CAPS_MMX) 2354 else if(flags & SWS_CPU_CAPS_MMX)
2355 av_log(c, AV_LOG_INFO, "using MMX\n"); 2355 av_log(c, AV_LOG_INFO, "using MMX\n");
2356 else if(flags & SWS_CPU_CAPS_ALTIVEC) 2356 else if(flags & SWS_CPU_CAPS_ALTIVEC)
2357 av_log(c, AV_LOG_INFO, "using AltiVec\n"); 2357 av_log(c, AV_LOG_INFO, "using AltiVec\n");
2358 else 2358 else
2359 av_log(c, AV_LOG_INFO, "using C\n"); 2359 av_log(c, AV_LOG_INFO, "using C\n");
2360 } 2360 }
2361 2361
2362 if(flags & SWS_PRINT_INFO) 2362 if(flags & SWS_PRINT_INFO)
2363 { 2363 {
2482 2482
2483 src2[0] += (srcSliceH-1)*srcStride[0]; 2483 src2[0] += (srcSliceH-1)*srcStride[0];
2484 if(c->srcFormat != PIX_FMT_PAL8) 2484 if(c->srcFormat != PIX_FMT_PAL8)
2485 src2[1] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[1]; 2485 src2[1] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[1];
2486 src2[2] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[2]; 2486 src2[2] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[2];
2487 2487
2488 return c->swScale(c, src2, srcStride2, c->srcH-srcSliceY-srcSliceH, srcSliceH, dst2, dstStride2); 2488 return c->swScale(c, src2, srcStride2, c->srcH-srcSliceY-srcSliceH, srcSliceH, dst2, dstStride2);
2489 } 2489 }
2490 } 2490 }
2491 2491
2492 /** 2492 /**
2495 int sws_scale_ordered(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, 2495 int sws_scale_ordered(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
2496 int srcSliceH, uint8_t* dst[], int dstStride[]){ 2496 int srcSliceH, uint8_t* dst[], int dstStride[]){
2497 return sws_scale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride); 2497 return sws_scale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride);
2498 } 2498 }
2499 2499
2500 SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, 2500 SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
2501 float lumaSharpen, float chromaSharpen, 2501 float lumaSharpen, float chromaSharpen,
2502 float chromaHShift, float chromaVShift, 2502 float chromaHShift, float chromaVShift,
2503 int verbose) 2503 int verbose)
2504 { 2504 {
2505 SwsFilter *filter= av_malloc(sizeof(SwsFilter)); 2505 SwsFilter *filter= av_malloc(sizeof(SwsFilter));
2720 av_free(diff); 2720 av_free(diff);
2721 } 2721 }
2722 2722
2723 void sws_convVec(SwsVector *a, SwsVector *b){ 2723 void sws_convVec(SwsVector *a, SwsVector *b){
2724 SwsVector *conv= sws_getConvVec(a, b); 2724 SwsVector *conv= sws_getConvVec(a, b);
2725 av_free(a->coeff); 2725 av_free(a->coeff);
2726 a->coeff= conv->coeff; 2726 a->coeff= conv->coeff;
2727 a->length= conv->length; 2727 a->length= conv->length;
2728 av_free(conv); 2728 av_free(conv);
2729 } 2729 }
2730 2730