Mercurial > mplayer.hg
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 |