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