Mercurial > libavcodec.hg
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 /** |