comparison vc1.c @ 3430:d0e85690841d libavcodec

Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC. Not quite there yet but a bit better picture on some files.
author kostya
date Fri, 07 Jul 2006 05:02:01 +0000
parents fb2a69de8ded
children ec6096b1ab04
comparison
equal deleted inserted replaced
3429:fb2a69de8ded 3430:d0e85690841d
926 uvmy = (my + ((my & 3) == 3)) >> 1; 926 uvmy = (my + ((my & 3) == 3)) >> 1;
927 srcY = s->last_picture.data[0]; 927 srcY = s->last_picture.data[0];
928 srcU = s->last_picture.data[1]; 928 srcU = s->last_picture.data[1];
929 srcV = s->last_picture.data[2]; 929 srcV = s->last_picture.data[2];
930 930
931 if(v->fastuvmc) { // XXX: 8.3.5.4.5 specifies something different
932 uvmx = (uvmx + 1) & ~1;
933 uvmy = (uvmy + 1) & ~1;
934 }
935
936 src_x = s->mb_x * 16 + (mx >> 2); 931 src_x = s->mb_x * 16 + (mx >> 2);
937 src_y = s->mb_y * 16 + (my >> 2); 932 src_y = s->mb_y * 16 + (my >> 2);
938 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); 933 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
939 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); 934 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
940 935
981 src2 += s->uvlinesize; 976 src2 += s->uvlinesize;
982 } 977 }
983 } 978 }
984 } 979 }
985 980
981 if(v->fastuvmc) {
982 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
983 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
984 }
985
986 if(!s->quarter_sample) { // hpel mc 986 if(!s->quarter_sample) { // hpel mc
987 mx >>= 1; 987 mx >>= 1;
988 my >>= 1; 988 my >>= 1;
989 dxy = ((my & 1) << 1) | (mx & 1); 989 dxy = ((my & 1) << 1) | (mx & 1);
990 uvdxy = 0;
991 990
992 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); 991 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
993 } else { 992 } else {
994 dxy = ((my & 3) << 2) | (mx & 3); 993 dxy = ((my & 3) << 2) | (mx & 3);
995 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1);
996 994
997 dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); 995 dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize);
998 } 996 }
997 uvmx >>= 1;
998 uvmy >>= 1;
999 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1);
999 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8); 1000 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8);
1000 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8); 1001 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8);
1001 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[1], srcU, s->uvlinesize); 1002 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[1], srcU, s->uvlinesize);
1002 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[2], srcV, s->uvlinesize); 1003 // dsp->put_mspel_pixels_tab[uvdxy](s->dest[2], srcV, s->uvlinesize);
1003 } 1004 }
1048 } 1049 }
1049 1050
1050 static inline int median4(int a, int b, int c, int d) 1051 static inline int median4(int a, int b, int c, int d)
1051 { 1052 {
1052 if(a < b) { 1053 if(a < b) {
1053 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) >> 1; 1054 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
1054 else return (FFMIN(b, c) + FFMAX(a, d)) >> 1; 1055 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
1055 } else { 1056 } else {
1056 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) >> 1; 1057 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
1057 else return (FFMIN(a, c) + FFMAX(b, d)) >> 1; 1058 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
1058 } 1059 }
1059 } 1060 }
1060 1061
1061 1062
1062 /** Do motion compensation for 4-MV macroblock - both chroma blocks 1063 /** Do motion compensation for 4-MV macroblock - both chroma blocks
1105 } 1106 }
1106 } else if(count[idx] == 2) { 1107 } else if(count[idx] == 2) {
1107 int t1 = 0, t2 = 0; 1108 int t1 = 0, t2 = 0;
1108 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;} 1109 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
1109 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;} 1110 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
1110 tx = (mvx[t1] + mvx[t2]) >> 1; 1111 tx = (mvx[t1] + mvx[t2]) / 2;
1111 ty = (mvy[t1] + mvy[t2]) >> 1; 1112 ty = (mvy[t1] + mvy[t2]) / 2;
1112 } else 1113 } else
1113 return; //no need to do MC for inter blocks 1114 return; //no need to do MC for inter blocks
1114 1115
1115 uvmx = (tx + ((tx&3) == 3)) >> 1; 1116 uvmx = (tx + ((tx&3) == 3)) >> 1;
1116 uvmy = (ty + ((ty&3) == 3)) >> 1; 1117 uvmy = (ty + ((ty&3) == 3)) >> 1;
1130 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); 1131 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
1131 srcU = s->edge_emu_buffer; 1132 srcU = s->edge_emu_buffer;
1132 srcV = s->edge_emu_buffer + 16; 1133 srcV = s->edge_emu_buffer + 16;
1133 } 1134 }
1134 1135
1135 if(!s->quarter_sample) // hpel mc 1136 if(v->fastuvmc) {
1136 uvdxy = 0; 1137 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
1137 else 1138 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
1138 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1); 1139 }
1140
1141 uvmx >>= 1;
1142 uvmy >>= 1;
1143 uvdxy = ((uvmy & 1) << 1) | (uvmx & 1);
1139 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8); 1144 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8);
1140 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8); 1145 dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8);
1141 } 1146 }
1142 1147
1143 /** 1148 /**