Mercurial > libavcodec.hg
comparison motion_est.c @ 1389:da0b3a50d209 libavcodec
rate distortion mb decision support
fix decoding of old %16!=0 divx
fix assertion failure in motion_est.c
author | michaelni |
---|---|
date | Tue, 29 Jul 2003 02:09:12 +0000 |
parents | b33c63b53cef |
children | a7a9df478e46 |
comparison
equal
deleted
inserted
replaced
1388:b5c65adac96a | 1389:da0b3a50d209 |
---|---|
1081 | 1081 |
1082 #if 0 | 1082 #if 0 |
1083 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", | 1083 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", |
1084 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); | 1084 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); |
1085 #endif | 1085 #endif |
1086 if(s->flags&CODEC_FLAG_HQ){ | 1086 if(s->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ |
1087 if (vard <= 64 || vard < varc) | 1087 if (vard <= 64 || vard < varc) |
1088 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); | 1088 s->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); |
1089 else | 1089 else |
1090 s->scene_change_score+= s->qscale; | 1090 s->scene_change_score+= s->qscale; |
1091 | 1091 |
1313 | 1313 |
1314 if(s->quarter_sample){ | 1314 if(s->quarter_sample){ |
1315 dxy = ((motion_fy & 3) << 2) | (motion_fx & 3); | 1315 dxy = ((motion_fy & 3) << 2) | (motion_fx & 3); |
1316 src_x = mb_x * 16 + (motion_fx >> 2); | 1316 src_x = mb_x * 16 + (motion_fx >> 2); |
1317 src_y = mb_y * 16 + (motion_fy >> 2); | 1317 src_y = mb_y * 16 + (motion_fy >> 2); |
1318 assert(src_x >=-16 && src_x<=s->width); | 1318 assert(src_x >=-16 && src_x<=s->h_edge_pos); |
1319 assert(src_y >=-16 && src_y<=s->height); | 1319 assert(src_y >=-16 && src_y<=s->v_edge_pos); |
1320 | 1320 |
1321 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; | 1321 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; |
1322 s->dsp.put_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); | 1322 s->dsp.put_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); |
1323 | 1323 |
1324 dxy = ((motion_by & 3) << 2) | (motion_bx & 3); | 1324 dxy = ((motion_by & 3) << 2) | (motion_bx & 3); |
1325 src_x = mb_x * 16 + (motion_bx >> 2); | 1325 src_x = mb_x * 16 + (motion_bx >> 2); |
1326 src_y = mb_y * 16 + (motion_by >> 2); | 1326 src_y = mb_y * 16 + (motion_by >> 2); |
1327 assert(src_x >=-16 && src_x<=s->width); | 1327 assert(src_x >=-16 && src_x<=s->h_edge_pos); |
1328 assert(src_y >=-16 && src_y<=s->height); | 1328 assert(src_y >=-16 && src_y<=s->v_edge_pos); |
1329 | 1329 |
1330 ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; | 1330 ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; |
1331 s->dsp.avg_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); | 1331 s->dsp.avg_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); |
1332 }else{ | 1332 }else{ |
1333 dxy = ((motion_fy & 1) << 1) | (motion_fx & 1); | 1333 dxy = ((motion_fy & 1) << 1) | (motion_fx & 1); |
1334 src_x = mb_x * 16 + (motion_fx >> 1); | 1334 src_x = mb_x * 16 + (motion_fx >> 1); |
1335 src_y = mb_y * 16 + (motion_fy >> 1); | 1335 src_y = mb_y * 16 + (motion_fy >> 1); |
1336 assert(src_x >=-16 && src_x<=s->width); | 1336 assert(src_x >=-16 && src_x<=s->h_edge_pos); |
1337 assert(src_y >=-16 && src_y<=s->height); | 1337 assert(src_y >=-16 && src_y<=s->v_edge_pos); |
1338 | 1338 |
1339 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; | 1339 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; |
1340 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); | 1340 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); |
1341 | 1341 |
1342 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); | 1342 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); |
1343 src_x = mb_x * 16 + (motion_bx >> 1); | 1343 src_x = mb_x * 16 + (motion_bx >> 1); |
1344 src_y = mb_y * 16 + (motion_by >> 1); | 1344 src_y = mb_y * 16 + (motion_by >> 1); |
1345 assert(src_x >=-16 && src_x<=s->width); | 1345 assert(src_x >=-16 && src_x<=s->h_edge_pos); |
1346 assert(src_y >=-16 && src_y<=s->height); | 1346 assert(src_y >=-16 && src_y<=s->v_edge_pos); |
1347 | 1347 |
1348 ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; | 1348 ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; |
1349 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); | 1349 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); |
1350 } | 1350 } |
1351 | 1351 |
1521 score= ((unsigned)(score*score + 128*256))>>16; | 1521 score= ((unsigned)(score*score + 128*256))>>16; |
1522 s->current_picture.mc_mb_var_sum += score; | 1522 s->current_picture.mc_mb_var_sum += score; |
1523 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE | 1523 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE |
1524 } | 1524 } |
1525 | 1525 |
1526 if(s->flags&CODEC_FLAG_HQ){ | 1526 if(s->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ |
1527 type= MB_TYPE_FORWARD | MB_TYPE_BACKWARD | MB_TYPE_BIDIR | MB_TYPE_DIRECT; //FIXME something smarter | 1527 type= MB_TYPE_FORWARD | MB_TYPE_BACKWARD | MB_TYPE_BIDIR | MB_TYPE_DIRECT; //FIXME something smarter |
1528 if(dmin>256*256*16) type&= ~MB_TYPE_DIRECT; //dont try direct mode if its invalid for this MB | 1528 if(dmin>256*256*16) type&= ~MB_TYPE_DIRECT; //dont try direct mode if its invalid for this MB |
1529 } | 1529 } |
1530 | 1530 |
1531 s->mb_type[mb_y*s->mb_stride + mb_x]= type; | 1531 s->mb_type[mb_y*s->mb_stride + mb_x]= type; |