comparison vc1.c @ 4680:71c1e1171e83 libavcodec

Proper handling of motion vectors for adv. profile
author kostya
date Sun, 18 Mar 2007 07:51:40 +0000
parents d4feec96fd64
children b82cff2e2e83
comparison
equal deleted inserted replaced
4679:acdd4b24f5c5 4680:71c1e1171e83
819 src_x = s->mb_x * 16 + (mx >> 2); 819 src_x = s->mb_x * 16 + (mx >> 2);
820 src_y = s->mb_y * 16 + (my >> 2); 820 src_y = s->mb_y * 16 + (my >> 2);
821 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); 821 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
822 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); 822 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
823 823
824 if(v->profile != PROFILE_ADVANCED){
824 src_x = av_clip( src_x, -16, s->mb_width * 16); 825 src_x = av_clip( src_x, -16, s->mb_width * 16);
825 src_y = av_clip( src_y, -16, s->mb_height * 16); 826 src_y = av_clip( src_y, -16, s->mb_height * 16);
826 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); 827 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
827 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); 828 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
829 }else{
830 src_x = av_clip( src_x, -17, s->avctx->coded_width);
831 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
832 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
833 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
834 }
828 835
829 srcY += src_y * s->linesize + src_x; 836 srcY += src_y * s->linesize + src_x;
830 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; 837 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
831 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; 838 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
832 839
942 off = s->linesize * 4 * (n&2) + (n&1) * 8; 949 off = s->linesize * 4 * (n&2) + (n&1) * 8;
943 950
944 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2); 951 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
945 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2); 952 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
946 953
954 if(v->profile != PROFILE_ADVANCED){
947 src_x = av_clip( src_x, -16, s->mb_width * 16); 955 src_x = av_clip( src_x, -16, s->mb_width * 16);
948 src_y = av_clip( src_y, -16, s->mb_height * 16); 956 src_y = av_clip( src_y, -16, s->mb_height * 16);
957 }else{
958 src_x = av_clip( src_x, -17, s->avctx->coded_width);
959 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
960 }
949 961
950 srcY += src_y * s->linesize + src_x; 962 srcY += src_y * s->linesize + src_x;
951 963
952 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) 964 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
953 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2 965 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
1069 } 1081 }
1070 1082
1071 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); 1083 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
1072 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); 1084 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
1073 1085
1086 if(v->profile != PROFILE_ADVANCED){
1074 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); 1087 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
1075 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); 1088 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
1089 }else{
1090 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
1091 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
1092 }
1093
1076 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x; 1094 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
1077 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x; 1095 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
1078 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) 1096 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
1079 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 1097 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
1080 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){ 1098 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
1282 v->broadcast = get_bits1(gb); 1300 v->broadcast = get_bits1(gb);
1283 v->interlace = get_bits1(gb); 1301 v->interlace = get_bits1(gb);
1284 v->tfcntrflag = get_bits1(gb); 1302 v->tfcntrflag = get_bits1(gb);
1285 v->finterpflag = get_bits1(gb); 1303 v->finterpflag = get_bits1(gb);
1286 get_bits1(gb); // reserved 1304 get_bits1(gb); // reserved
1305
1306 v->s.h_edge_pos = v->s.avctx->coded_width;
1307 v->s.v_edge_pos = v->s.avctx->coded_height;
1287 1308
1288 av_log(v->s.avctx, AV_LOG_DEBUG, 1309 av_log(v->s.avctx, AV_LOG_DEBUG,
1289 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" 1310 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
1290 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n" 1311 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
1291 "TFCTRflag=%i, FINTERPflag=%i\n", 1312 "TFCTRflag=%i, FINTERPflag=%i\n",
2116 src_x = s->mb_x * 16 + (mx >> 2); 2137 src_x = s->mb_x * 16 + (mx >> 2);
2117 src_y = s->mb_y * 16 + (my >> 2); 2138 src_y = s->mb_y * 16 + (my >> 2);
2118 uvsrc_x = s->mb_x * 8 + (uvmx >> 2); 2139 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
2119 uvsrc_y = s->mb_y * 8 + (uvmy >> 2); 2140 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
2120 2141
2142 if(v->profile != PROFILE_ADVANCED){
2121 src_x = av_clip( src_x, -16, s->mb_width * 16); 2143 src_x = av_clip( src_x, -16, s->mb_width * 16);
2122 src_y = av_clip( src_y, -16, s->mb_height * 16); 2144 src_y = av_clip( src_y, -16, s->mb_height * 16);
2123 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); 2145 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
2124 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); 2146 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
2147 }else{
2148 src_x = av_clip( src_x, -17, s->avctx->coded_width);
2149 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
2150 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
2151 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
2152 }
2125 2153
2126 srcY += src_y * s->linesize + src_x; 2154 srcY += src_y * s->linesize + src_x;
2127 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; 2155 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
2128 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; 2156 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
2129 2157