comparison postproc/swscale.c @ 4402:67abbf501b02

area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
author michael
date Tue, 29 Jan 2002 01:43:15 +0000
parents 8d00348d0d6b
children f002407e298d
comparison
equal deleted inserted replaced
4401:8d00348d0d6b 4402:67abbf501b02
602 case 0: flags|= SWS_FAST_BILINEAR; break; 602 case 0: flags|= SWS_FAST_BILINEAR; break;
603 case 1: flags|= SWS_BILINEAR; break; 603 case 1: flags|= SWS_BILINEAR; break;
604 case 2: flags|= SWS_BICUBIC; break; 604 case 2: flags|= SWS_BICUBIC; break;
605 case 3: flags|= SWS_X; break; 605 case 3: flags|= SWS_X; break;
606 case 4: flags|= SWS_POINT; break; 606 case 4: flags|= SWS_POINT; break;
607 case 5: flags|= SWS_AREA; break;
607 default:flags|= SWS_BILINEAR; break; 608 default:flags|= SWS_BILINEAR; break;
608 } 609 }
609 610
610 if(!context) context=getSwsContext(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat, flags, &src_filter, NULL); 611 if(!context) context=getSwsContext(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat, flags, &src_filter, NULL);
611 612
664 { 665 {
665 int i; 666 int i;
666 int xDstInSrc; 667 int xDstInSrc;
667 if (flags&SWS_BICUBIC) filterSize= 4; 668 if (flags&SWS_BICUBIC) filterSize= 4;
668 else if(flags&SWS_X ) filterSize= 4; 669 else if(flags&SWS_X ) filterSize= 4;
669 else filterSize= 2; 670 else filterSize= 2; // SWS_BILINEAR / SWS_AREA
670 // printf("%d %d %d\n", filterSize, srcW, dstW); 671 // printf("%d %d %d\n", filterSize, srcW, dstW);
671 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize); 672 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);
672 673
673 xDstInSrc= xInc/2 - 0x8000; 674 xDstInSrc= xInc/2 - 0x8000;
674 for(i=0; i<dstW; i++) 675 for(i=0; i<dstW; i++)
703 filter[i*filterSize + 3]= y4; 704 filter[i*filterSize + 3]= y4;
704 // printf("%1.3f %1.3f %1.3f %1.3f %1.3f\n",d , y1, y2, y3, y4); 705 // printf("%1.3f %1.3f %1.3f %1.3f %1.3f\n",d , y1, y2, y3, y4);
705 } 706 }
706 else 707 else
707 { 708 {
709 //Bilinear upscale / linear interpolate / Area averaging
708 for(j=0; j<filterSize; j++) 710 for(j=0; j<filterSize; j++)
709 { 711 {
710 double d= ABS((xx<<16) - xDstInSrc)/(double)(1<<16); 712 double d= ABS((xx<<16) - xDstInSrc)/(double)(1<<16);
711 double coeff= 1.0 - d; 713 double coeff= 1.0 - d;
712 if(coeff<0) coeff=0; 714 if(coeff<0) coeff=0;
719 } 721 }
720 } 722 }
721 else // downscale 723 else // downscale
722 { 724 {
723 int xDstInSrc; 725 int xDstInSrc;
724 if(flags&SWS_BICUBIC) filterSize= (int)ceil(1 + 4.0*srcW / (double)dstW); 726 if(flags&SWS_BICUBIC) filterSize= (int)ceil(1 + 4.0*srcW / (double)dstW);
725 else if(flags&SWS_X) filterSize= (int)ceil(1 + 4.0*srcW / (double)dstW); 727 else if(flags&SWS_X) filterSize= (int)ceil(1 + 4.0*srcW / (double)dstW);
726 else filterSize= (int)ceil(1 + 2.0*srcW / (double)dstW); 728 else if(flags&SWS_AREA) filterSize= (int)ceil(1 + 1.0*srcW / (double)dstW);
729 else /* BILINEAR */ filterSize= (int)ceil(1 + 2.0*srcW / (double)dstW);
727 // printf("%d %d %d\n", *filterSize, srcW, dstW); 730 // printf("%d %d %d\n", *filterSize, srcW, dstW);
728 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize); 731 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);
729 732
730 xDstInSrc= xInc/2 - 0x8000; 733 xDstInSrc= xInc/2 - 0x8000;
731 for(i=0; i<dstW; i++) 734 for(i=0; i<dstW; i++)
747 else if(d<2.0) 750 else if(d<2.0)
748 coeff = (-4.0*A + 8.0*A*d - 5.0*A*d*d + A*d*d*d); 751 coeff = (-4.0*A + 8.0*A*d - 5.0*A*d*d + A*d*d*d);
749 else 752 else
750 coeff=0.0; 753 coeff=0.0;
751 } 754 }
752 /* else if(flags & SWS_X) 755 else if(flags & SWS_AREA)
753 { 756 {
754 }*/ 757 double srcPixelSize= (1<<16)/(double)xInc;
758 if(d + srcPixelSize/2 < 0.5) coeff= 1.0;
759 else if(d - srcPixelSize/2 < 0.5) coeff= (0.5-d)/srcPixelSize + 0.5;
760 else coeff=0.0;
761 }
755 else 762 else
756 { 763 {
757 coeff= 1.0 - d; 764 coeff= 1.0 - d;
758 if(coeff<0) coeff=0; 765 if(coeff<0) coeff=0;
759 } 766 }
760 // printf("%1.3f %d %d \n", coeff, (int)d, xDstInSrc); 767 // printf("%1.3f %2.3f %d \n", coeff, d, xDstInSrc);
761 filter[i*filterSize + j]= coeff; 768 filter[i*filterSize + j]= coeff;
762 xx++; 769 xx++;
763 } 770 }
764 xDstInSrc+= xInc; 771 xDstInSrc+= xInc;
765 } 772 }
1223 else if(flags&SWS_BILINEAR) 1230 else if(flags&SWS_BILINEAR)
1224 fprintf(stderr, "\nSwScaler: BILINEAR scaler "); 1231 fprintf(stderr, "\nSwScaler: BILINEAR scaler ");
1225 else if(flags&SWS_BICUBIC) 1232 else if(flags&SWS_BICUBIC)
1226 fprintf(stderr, "\nSwScaler: BICUBIC scaler "); 1233 fprintf(stderr, "\nSwScaler: BICUBIC scaler ");
1227 else if(flags&SWS_POINT) 1234 else if(flags&SWS_POINT)
1228 fprintf(stderr, "\nSwScaler: POINT scaler "); 1235 fprintf(stderr, "\nSwScaler: Nearest Neighbor / POINT scaler ");
1236 else if(flags&SWS_AREA)
1237 fprintf(stderr, "\nSwScaler: Area Averageing scaler ");
1229 else 1238 else
1230 fprintf(stderr, "\nSwScaler: ehh flags invalid?! "); 1239 fprintf(stderr, "\nSwScaler: ehh flags invalid?! ");
1231 1240
1232 if(dstFormat==IMGFMT_BGR15) 1241 if(dstFormat==IMGFMT_BGR15)
1233 fprintf(stderr, "with%s BGR15 output ", dither); 1242 fprintf(stderr, "with%s BGR15 output ", dither);