comparison vc1.c @ 3528:79ad5cd43686 libavcodec

Use bicubic MC (should also remove those ringing artifacts) when needed
author kostya
date Sun, 30 Jul 2006 03:50:31 +0000
parents 3187e7ffe52d
children f26bf13bbb69
comparison
equal deleted inserted replaced
3527:3187e7ffe52d 3528:79ad5cd43686
796 srcU = s->edge_emu_buffer + 18 * s->linesize; 796 srcU = s->edge_emu_buffer + 18 * s->linesize;
797 srcV = s->edge_emu_buffer + 18 * s->linesize; 797 srcV = s->edge_emu_buffer + 18 * s->linesize;
798 } 798 }
799 799
800 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) 800 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
801 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 801 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
802 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ 802 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
803 uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize; 803 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
804 804
805 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, 805 srcY -= s->mspel * (1 + s->linesize);
806 src_x, src_y, s->h_edge_pos, s->v_edge_pos); 806 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
807 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
807 srcY = s->edge_emu_buffer; 808 srcY = s->edge_emu_buffer;
808 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, 809 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
809 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); 810 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
810 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, 811 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
811 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); 812 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
815 if(v->rangeredfrm) { 816 if(v->rangeredfrm) {
816 int i, j; 817 int i, j;
817 uint8_t *src, *src2; 818 uint8_t *src, *src2;
818 819
819 src = srcY; 820 src = srcY;
820 for(j = 0; j < 17; j++) { 821 for(j = 0; j < 17 + s->mspel*2; j++) {
821 for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; 822 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
822 src += s->linesize; 823 src += s->linesize;
823 } 824 }
824 src = srcU; src2 = srcV; 825 src = srcU; src2 = srcV;
825 for(j = 0; j < 9; j++) { 826 for(j = 0; j < 9; j++) {
826 for(i = 0; i < 9; i++) { 827 for(i = 0; i < 9; i++) {
835 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { 836 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
836 int i, j; 837 int i, j;
837 uint8_t *src, *src2; 838 uint8_t *src, *src2;
838 839
839 src = srcY; 840 src = srcY;
840 for(j = 0; j < 17; j++) { 841 for(j = 0; j < 17 + s->mspel*2; j++) {
841 for(i = 0; i < 17; i++) src[i] = v->luty[src[i]]; 842 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
842 src += s->linesize; 843 src += s->linesize;
843 } 844 }
844 src = srcU; src2 = srcV; 845 src = srcU; src2 = srcV;
845 for(j = 0; j < 9; j++) { 846 for(j = 0; j < 9; j++) {
846 for(i = 0; i < 9; i++) { 847 for(i = 0; i < 9; i++) {
849 } 850 }
850 src += s->uvlinesize; 851 src += s->uvlinesize;
851 src2 += s->uvlinesize; 852 src2 += s->uvlinesize;
852 } 853 }
853 } 854 }
855 srcY += s->mspel * (1 + s->linesize);
854 } 856 }
855 857
856 if(v->fastuvmc) { 858 if(v->fastuvmc) {
857 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); 859 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
858 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); 860 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
859 } 861 }
860 862
861 if(!s->quarter_sample) { // hpel mc 863 if(s->mspel) {
864 dxy = ((my & 3) << 2) | (mx & 3);
865 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
866 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
867 srcY += s->linesize * 8;
868 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
869 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
870 } else if(!s->quarter_sample) { // hpel mc
862 mx >>= 1; 871 mx >>= 1;
863 my >>= 1; 872 my >>= 1;
864 dxy = ((my & 1) << 1) | (mx & 1); 873 dxy = ((my & 1) << 1) | (mx & 1);
865 874
866 if(!v->rnd) 875 if(!v->rnd)
911 src_x = clip( src_x, -16, s->mb_width * 16); 920 src_x = clip( src_x, -16, s->mb_width * 16);
912 src_y = clip( src_y, -16, s->mb_height * 16); 921 src_y = clip( src_y, -16, s->mb_height * 16);
913 922
914 srcY += src_y * s->linesize + src_x; 923 srcY += src_y * s->linesize + src_x;
915 924
916 if(v->rangeredfrm || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 925 if(v->rangeredfrm || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel
917 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ 926 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel){
918 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, 927 srcY -= s->mspel * (1 + s->linesize);
919 src_x, src_y, s->h_edge_pos, s->v_edge_pos); 928 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
929 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
920 srcY = s->edge_emu_buffer; 930 srcY = s->edge_emu_buffer;
921 /* if we deal with range reduction we need to scale source blocks */ 931 /* if we deal with range reduction we need to scale source blocks */
922 if(v->rangeredfrm) { 932 if(v->rangeredfrm) {
923 int i, j; 933 int i, j;
924 uint8_t *src; 934 uint8_t *src;
925 935
926 src = srcY; 936 src = srcY;
927 for(j = 0; j < 17; j++) { 937 for(j = 0; j < 9 + s->mspel*2; j++) {
928 for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; 938 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
929 src += s->linesize; 939 src += s->linesize;
930 } 940 }
931 } 941 }
932 } 942 srcY += s->mspel * (1 + s->linesize);
933 943 }
934 if(!s->quarter_sample) { // hpel mc 944
945 if(s->mspel) {
946 dxy = ((my & 3) << 2) | (mx & 3);
947 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
948 } else if(!s->quarter_sample) { // hpel mc
935 mx >>= 1; 949 mx >>= 1;
936 my >>= 1; 950 my >>= 1;
937 dxy = ((my & 1) << 1) | (mx & 1); 951 dxy = ((my & 1) << 1) | (mx & 1);
938 952
939 if(!v->rnd) 953 if(!v->rnd)