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;