comparison mpegvideo.c @ 763:339db642859d libavcodec

fixing interlaced MC & edge-emu
author michaelni
date Wed, 23 Oct 2002 08:14:12 +0000
parents e858fe220ce0
children d4726182dfd2
comparison
equal deleted inserted replaced
762:5da504c8c90e 763:339db642859d
1281 dest_y += dest_offset; 1281 dest_y += dest_offset;
1282 1282
1283 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1283 if(s->flags&CODEC_FLAG_EMU_EDGE){
1284 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos 1284 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
1285 || src_y + (motion_y&1) + h > v_edge_pos){ 1285 || src_y + (motion_y&1) + h > v_edge_pos){
1286 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos); 1286 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1287 ptr= s->edge_emu_buffer; 1287 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1288 ptr= s->edge_emu_buffer + src_offset;
1288 emu=1; 1289 emu=1;
1289 } 1290 }
1290 } 1291 }
1291 pix_op[0][dxy](dest_y, ptr, linesize, h); 1292 pix_op[0][dxy](dest_y, ptr, linesize, h);
1292 1293
1317 if (src_y == (height >> 1)) 1318 if (src_y == (height >> 1))
1318 dxy &= ~2; 1319 dxy &= ~2;
1319 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); 1320 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1320 ptr = ref_picture[1] + offset; 1321 ptr = ref_picture[1] + offset;
1321 if(emu){ 1322 if(emu){
1322 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1323 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1323 ptr= s->edge_emu_buffer; 1324 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1325 ptr= s->edge_emu_buffer + (src_offset >> 1);
1324 } 1326 }
1325 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1327 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1326 1328
1327 ptr = ref_picture[2] + offset; 1329 ptr = ref_picture[2] + offset;
1328 if(emu){ 1330 if(emu){
1329 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1331 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
1330 ptr= s->edge_emu_buffer; 1332 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1333 ptr= s->edge_emu_buffer + (src_offset >> 1);
1331 } 1334 }
1332 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1335 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1333 } 1336 }
1334 1337
1335 static inline void qpel_motion(MpegEncContext *s, 1338 static inline void qpel_motion(MpegEncContext *s,
1363 //printf("%d %d %d\n", src_x, src_y, dxy); 1366 //printf("%d %d %d\n", src_x, src_y, dxy);
1364 1367
1365 if(s->flags&CODEC_FLAG_EMU_EDGE){ 1368 if(s->flags&CODEC_FLAG_EMU_EDGE){
1366 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos 1369 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
1367 || src_y + (motion_y&3) + h > v_edge_pos){ 1370 || src_y + (motion_y&3) + h > v_edge_pos){
1368 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos); 1371 emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,
1369 ptr= s->edge_emu_buffer; 1372 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
1373 ptr= s->edge_emu_buffer + src_offset;
1370 emu=1; 1374 emu=1;
1371 } 1375 }
1372 } 1376 }
1373 if(!field_based) 1377 if(!field_based)
1374 qpix_op[0][dxy](dest_y, ptr, linesize); 1378 qpix_op[0][dxy](dest_y, ptr, linesize);
1407 dxy &= ~2; 1411 dxy &= ~2;
1408 1412
1409 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); 1413 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
1410 ptr = ref_picture[1] + offset; 1414 ptr = ref_picture[1] + offset;
1411 if(emu){ 1415 if(emu){
1412 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1416 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1413 ptr= s->edge_emu_buffer; 1417 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1418 ptr= s->edge_emu_buffer + (src_offset >> 1);
1414 } 1419 }
1415 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1420 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1416 1421
1417 ptr = ref_picture[2] + offset; 1422 ptr = ref_picture[2] + offset;
1418 if(emu){ 1423 if(emu){
1419 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1); 1424 emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
1420 ptr= s->edge_emu_buffer; 1425 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
1426 ptr= s->edge_emu_buffer + (src_offset >> 1);
1421 } 1427 }
1422 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1); 1428 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
1423 } 1429 }
1424 1430
1425 1431