comparison mpegvideo.c @ 673:242f0f7d8c15 libavcodec

fixing qpel 4mv
author michaelni
date Sat, 14 Sep 2002 12:36:54 +0000
parents 3f2e5a282f61
children a1c69cb685b3
comparison
equal deleted inserted replaced
672:8c9edc20599a 673:242f0f7d8c15
1273 0, pix_op, 1273 0, pix_op,
1274 s->mv[dir][0][0], s->mv[dir][0][1], 16); 1274 s->mv[dir][0][0], s->mv[dir][0][1], 16);
1275 } 1275 }
1276 break; 1276 break;
1277 case MV_TYPE_8X8: 1277 case MV_TYPE_8X8:
1278 if(s->quarter_sample){ fprintf(stderr, "qpel4mv"); fflush(stderr);} 1278 mx = 0;
1279 for(i=0;i<4;i++) { 1279 my = 0;
1280 motion_x = s->mv[dir][i][0]; 1280 if(s->quarter_sample){
1281 motion_y = s->mv[dir][i][1]; 1281 for(i=0;i<4;i++) {
1282 1282 motion_x = s->mv[dir][i][0];
1283 dxy = ((motion_y & 1) << 1) | (motion_x & 1); 1283 motion_y = s->mv[dir][i][1];
1284 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8; 1284
1285 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8; 1285 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
1286 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
1287 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
1286 1288
1287 /* WARNING: do no forget half pels */ 1289 /* WARNING: do no forget half pels */
1288 src_x = clip(src_x, -16, s->width); 1290 src_x = clip(src_x, -16, s->width);
1289 if (src_x == s->width) 1291 if (src_x == s->width)
1290 dxy &= ~1; 1292 dxy &= ~3;
1291 src_y = clip(src_y, -16, s->height); 1293 src_y = clip(src_y, -16, s->height);
1292 if (src_y == s->height) 1294 if (src_y == s->height)
1293 dxy &= ~2; 1295 dxy &= ~12;
1294 1296
1295 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x); 1297 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1296 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1298 if(s->flags&CODEC_FLAG_EMU_EDGE){
1297 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos 1299 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
1298 || src_y + (motion_y&1) + 8 > s->v_edge_pos){ 1300 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
1299 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); 1301 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1300 ptr= s->edge_emu_buffer; 1302 ptr= s->edge_emu_buffer;
1303 }
1301 } 1304 }
1302 } 1305 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1303 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize; 1306 qpix_op[1][dxy](dest, ptr, s->linesize);
1304 pix_op[1][dxy](dest, ptr, s->linesize, 8); 1307
1305 } 1308 mx += s->mv[dir][i][0]/2;
1306 1309 my += s->mv[dir][i][1]/2;
1310 }
1311 }else{
1312 for(i=0;i<4;i++) {
1313 motion_x = s->mv[dir][i][0];
1314 motion_y = s->mv[dir][i][1];
1315
1316 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
1317 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
1318 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
1319
1320 /* WARNING: do no forget half pels */
1321 src_x = clip(src_x, -16, s->width);
1322 if (src_x == s->width)
1323 dxy &= ~1;
1324 src_y = clip(src_y, -16, s->height);
1325 if (src_y == s->height)
1326 dxy &= ~2;
1327
1328 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
1329 if(s->flags&CODEC_FLAG_EMU_EDGE){
1330 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
1331 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
1332 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
1333 ptr= s->edge_emu_buffer;
1334 }
1335 }
1336 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
1337 pix_op[1][dxy](dest, ptr, s->linesize, 8);
1338
1339 mx += s->mv[dir][i][0];
1340 my += s->mv[dir][i][1];
1341 }
1342 }
1343
1307 if(s->flags&CODEC_FLAG_GRAY) break; 1344 if(s->flags&CODEC_FLAG_GRAY) break;
1308 /* In case of 8X8, we construct a single chroma motion vector 1345 /* In case of 8X8, we construct a single chroma motion vector
1309 with a special rounding */ 1346 with a special rounding */
1310 mx = 0;
1311 my = 0;
1312 for(i=0;i<4;i++) { 1347 for(i=0;i<4;i++) {
1313 mx += s->mv[dir][i][0];
1314 my += s->mv[dir][i][1];
1315 } 1348 }
1316 if (mx >= 0) 1349 if (mx >= 0)
1317 mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1)); 1350 mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
1318 else { 1351 else {
1319 mx = -mx; 1352 mx = -mx;