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