comparison motion_est.c @ 903:22ee74da2cd3 libavcodec

cleanup adding AVVideoFrame moving quality, pict_type, key_frame, qscale_table, ... to AVVideoFrame removing obsolete variables in AVCodecContext skiping of MBs in b frames correctly initalizing AVCodecContext picture buffer cleanup
author michaelni
date Wed, 04 Dec 2002 10:04:03 +0000
parents 2cef5c4c0ca6
children 51f3b644ae30
comparison
equal deleted inserted replaced
902:6acc8394960d 903:22ee74da2cd3
90 if (y1 < ymin) 90 if (y1 < ymin)
91 y1 = ymin; 91 y1 = ymin;
92 y2 = yy + range - 1; 92 y2 = yy + range - 1;
93 if (y2 > ymax) 93 if (y2 > ymax)
94 y2 = ymax; 94 y2 = ymax;
95 pix = s->new_picture[0] + (yy * s->linesize) + xx; 95 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
96 dmin = 0x7fffffff; 96 dmin = 0x7fffffff;
97 mx = 0; 97 mx = 0;
98 my = 0; 98 my = 0;
99 for (y = y1; y <= y2; y++) { 99 for (y = y1; y <= y2; y++) {
100 for (x = x1; x <= x2; x++) { 100 for (x = x1; x <= x2; x++) {
153 /* Lower limit */ 153 /* Lower limit */
154 y2 = yy + range; 154 y2 = yy + range;
155 if (y2 > ymax) 155 if (y2 > ymax)
156 y2 = ymax; 156 y2 = ymax;
157 157
158 pix = s->new_picture[0] + (yy * s->linesize) + xx; 158 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
159 dmin = 0x7fffffff; 159 dmin = 0x7fffffff;
160 mx = 0; 160 mx = 0;
161 my = 0; 161 my = 0;
162 162
163 do { 163 do {
229 /* Lower limit */ 229 /* Lower limit */
230 y2 = yy + range; 230 y2 = yy + range;
231 if (y2 > ymax) 231 if (y2 > ymax)
232 y2 = ymax; 232 y2 = ymax;
233 233
234 pix = s->new_picture[0] + (yy * s->linesize) + xx; 234 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
235 mx = 0; 235 mx = 0;
236 my = 0; 236 my = 0;
237 237
238 x = xx; 238 x = xx;
239 y = yy; 239 y = yy;
558 const int shift= 1+s->quarter_sample; 558 const int shift= 1+s->quarter_sample;
559 uint32_t *map= s->me_map; 559 uint32_t *map= s->me_map;
560 uint16_t *score_map= s->me_score_map; 560 uint16_t *score_map= s->me_score_map;
561 int map_generation; 561 int map_generation;
562 562
563 new_pic = s->new_picture[0] + pic_xy; 563 new_pic = s->new_picture.data[0] + pic_xy;
564 old_pic = ref_picture + pic_xy; 564 old_pic = ref_picture + pic_xy;
565 565
566 map_generation= update_map_generation(s); 566 map_generation= update_map_generation(s);
567 567
568 dmin = s->dsp.pix_abs16x16(new_pic, old_pic, pic_stride); 568 dmin = s->dsp.pix_abs16x16(new_pic, old_pic, pic_stride);
647 const int shift= 1+s->quarter_sample; 647 const int shift= 1+s->quarter_sample;
648 uint32_t *map= s->me_map; 648 uint32_t *map= s->me_map;
649 uint16_t *score_map= s->me_score_map; 649 uint16_t *score_map= s->me_score_map;
650 int map_generation; 650 int map_generation;
651 651
652 new_pic = s->new_picture[0] + pic_xy; 652 new_pic = s->new_picture.data[0] + pic_xy;
653 old_pic = ref_picture + pic_xy; 653 old_pic = ref_picture + pic_xy;
654 654
655 map_generation= update_map_generation(s); 655 map_generation= update_map_generation(s);
656 656
657 dmin = 1000000; 657 dmin = 1000000;
721 return dmin; 721 return dmin;
722 } 722 }
723 723
724 xx = 16 * s->mb_x + 8*(n&1); 724 xx = 16 * s->mb_x + 8*(n&1);
725 yy = 16 * s->mb_y + 8*(n>>1); 725 yy = 16 * s->mb_y + 8*(n>>1);
726 pix = s->new_picture[0] + (yy * s->linesize) + xx; 726 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
727 727
728 mx = *mx_ptr; 728 mx = *mx_ptr;
729 my = *my_ptr; 729 my = *my_ptr;
730 ptr = ref_picture + ((yy + my) * s->linesize) + (xx + mx); 730 ptr = ref_picture + ((yy + my) * s->linesize) + (xx + mx);
731 731
787 } 787 }
788 // printf("N"); 788 // printf("N");
789 789
790 xx = 16 * s->mb_x + 8*(n&1); 790 xx = 16 * s->mb_x + 8*(n&1);
791 yy = 16 * s->mb_y + 8*(n>>1); 791 yy = 16 * s->mb_y + 8*(n>>1);
792 pix = s->new_picture[0] + (yy * s->linesize) + xx; 792 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
793 793
794 mx = *mx_ptr; 794 mx = *mx_ptr;
795 my = *my_ptr; 795 my = *my_ptr;
796 ptr = ref_picture + ((yy + my) * s->linesize) + (xx + mx); 796 ptr = ref_picture + ((yy + my) * s->linesize) + (xx + mx);
797 797
929 929
930 static inline int mv4_search(MpegEncContext *s, int xmin, int ymin, int xmax, int ymax, int mx, int my, int shift) 930 static inline int mv4_search(MpegEncContext *s, int xmin, int ymin, int xmax, int ymax, int mx, int my, int shift)
931 { 931 {
932 int block; 932 int block;
933 int P[10][2]; 933 int P[10][2];
934 uint8_t *ref_picture= s->last_picture[0]; 934 uint8_t *ref_picture= s->last_picture.data[0];
935 int dmin_sum=0; 935 int dmin_sum=0;
936 936
937 for(block=0; block<4; block++){ 937 for(block=0; block<4; block++){
938 int mx4, my4; 938 int mx4, my4;
939 int pred_x4, pred_y4; 939 int pred_x4, pred_y4;
1017 int rel_xmin, rel_ymin, rel_xmax, rel_ymax; 1017 int rel_xmin, rel_ymin, rel_xmax, rel_ymax;
1018 int pred_x=0, pred_y=0; 1018 int pred_x=0, pred_y=0;
1019 int P[10][2]; 1019 int P[10][2];
1020 const int shift= 1+s->quarter_sample; 1020 const int shift= 1+s->quarter_sample;
1021 int mb_type=0; 1021 int mb_type=0;
1022 uint8_t *ref_picture= s->last_picture[0]; 1022 uint8_t *ref_picture= s->last_picture.data[0];
1023 Picture * const pic= &s->current_picture;
1023 1024
1024 get_limits(s, &range, &xmin, &ymin, &xmax, &ymax, s->f_code); 1025 get_limits(s, &range, &xmin, &ymin, &xmax, &ymax, s->f_code);
1025 rel_xmin= xmin - mb_x*16; 1026 rel_xmin= xmin - mb_x*16;
1026 rel_xmax= xmax - mb_x*16; 1027 rel_xmax= xmax - mb_x*16;
1027 rel_ymin= ymin - mb_y*16; 1028 rel_ymin= ymin - mb_y*16;
1102 1103
1103 /* intra / predictive decision */ 1104 /* intra / predictive decision */
1104 xx = mb_x * 16; 1105 xx = mb_x * 16;
1105 yy = mb_y * 16; 1106 yy = mb_y * 16;
1106 1107
1107 pix = s->new_picture[0] + (yy * s->linesize) + xx; 1108 pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
1108 /* At this point (mx,my) are full-pell and the relative displacement */ 1109 /* At this point (mx,my) are full-pell and the relative displacement */
1109 ppix = ref_picture + ((yy+my) * s->linesize) + (xx+mx); 1110 ppix = ref_picture + ((yy+my) * s->linesize) + (xx+mx);
1110 1111
1111 sum = s->dsp.pix_sum(pix, s->linesize); 1112 sum = s->dsp.pix_sum(pix, s->linesize);
1112 1113
1113 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; 1114 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
1114 // FIXME: MMX OPTIMIZE 1115 // FIXME: MMX OPTIMIZE
1115 vard = (s->dsp.pix_norm(pix, ppix, s->linesize)+128)>>8; 1116 vard = (s->dsp.pix_norm(pix, ppix, s->linesize)+128)>>8;
1116 1117
1117 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout); 1118 //printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
1118 s->mb_var [s->mb_width * mb_y + mb_x] = varc; 1119 pic->mb_var [s->mb_width * mb_y + mb_x] = varc;
1119 s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard; 1120 pic->mc_mb_var[s->mb_width * mb_y + mb_x] = vard;
1120 s->mb_mean [s->mb_width * mb_y + mb_x] = (sum+128)>>8; 1121 pic->mb_mean [s->mb_width * mb_y + mb_x] = (sum+128)>>8;
1121 s->mb_var_sum += varc; 1122 pic->mb_var_sum += varc;
1122 s->mc_mb_var_sum += vard; 1123 pic->mc_mb_var_sum += vard;
1123 //printf("E%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout); 1124 //printf("E%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
1124 1125
1125 #if 0 1126 #if 0
1126 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", 1127 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",
1127 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); 1128 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);
1316 dxy&= 2; 1317 dxy&= 2;
1317 src_y = clip(src_y, -16, s->height); 1318 src_y = clip(src_y, -16, s->height);
1318 if (src_y == s->height) 1319 if (src_y == s->height)
1319 dxy&= 1; 1320 dxy&= 1;
1320 1321
1321 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x; 1322 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x;
1322 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1323 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1323 1324
1324 fbmin += (mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*s->qscale; 1325 fbmin += (mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*s->qscale;
1325 1326
1326 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); 1327 dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
1331 dxy&= 2; 1332 dxy&= 2;
1332 src_y = clip(src_y, -16, s->height); 1333 src_y = clip(src_y, -16, s->height);
1333 if (src_y == s->height) 1334 if (src_y == s->height)
1334 dxy&= 1; 1335 dxy&= 1;
1335 1336
1336 ptr = s->next_picture[0] + (src_y * s->linesize) + src_x; 1337 ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x;
1337 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1338 s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1338 1339
1339 fbmin += s->dsp.pix_abs16x16(s->new_picture[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize); 1340 fbmin += s->dsp.pix_abs16x16(s->new_picture.data[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize);
1340 return fbmin; 1341 return fbmin;
1341 } 1342 }
1342 1343
1343 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/ 1344 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/
1344 static inline int bidir_refine(MpegEncContext * s, 1345 static inline int bidir_refine(MpegEncContext * s,
1416 src_x = clip(src_x, -16, width); 1417 src_x = clip(src_x, -16, width);
1417 if (src_x == width) dxy &= ~1; 1418 if (src_x == width) dxy &= ~1;
1418 src_y = clip(src_y, -16, height); 1419 src_y = clip(src_y, -16, height);
1419 if (src_y == height) dxy &= ~2; 1420 if (src_y == height) dxy &= ~2;
1420 1421
1421 ptr = s->last_picture[0] + (src_y * s->linesize) + src_x; 1422 ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x;
1422 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); 1423 s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
1423 1424
1424 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); 1425 dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
1425 src_x = (mb_x + bx) * 16 + (motion_bx >> 1); 1426 src_x = (mb_x + bx) * 16 + (motion_bx >> 1);
1426 src_y = (mb_y + by) * 16 + (motion_by >> 1); 1427 src_y = (mb_y + by) * 16 + (motion_by >> 1);
1509 int fmin, bmin, dmin, fbmin; 1510 int fmin, bmin, dmin, fbmin;
1510 int type=0; 1511 int type=0;
1511 1512
1512 dmin= direct_search(s, mb_x, mb_y); 1513 dmin= direct_search(s, mb_x, mb_y);
1513 1514
1514 fmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_forw_mv_table, s->last_picture[0], s->f_code); 1515 fmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_forw_mv_table, s->last_picture.data[0], s->f_code);
1515 bmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_back_mv_table, s->next_picture[0], s->b_code) - quant; 1516 bmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_back_mv_table, s->next_picture.data[0], s->b_code) - quant;
1516 //printf(" %d %d ", s->b_forw_mv_table[xy][0], s->b_forw_mv_table[xy][1]); 1517 //printf(" %d %d ", s->b_forw_mv_table[xy][0], s->b_forw_mv_table[xy][1]);
1517 1518
1518 fbmin= bidir_refine(s, mb_x, mb_y); 1519 fbmin= bidir_refine(s, mb_x, mb_y);
1519 1520
1520 { 1521 {
1532 if(fbmin<score){ 1533 if(fbmin<score){
1533 score=fbmin; 1534 score=fbmin;
1534 type= MB_TYPE_BIDIR; 1535 type= MB_TYPE_BIDIR;
1535 } 1536 }
1536 score= ((unsigned)(score*score + 128*256))>>16; 1537 score= ((unsigned)(score*score + 128*256))>>16;
1537 s->mc_mb_var_sum += score; 1538 s->current_picture.mc_mb_var_sum += score;
1538 s->mc_mb_var[mb_y*s->mb_width + mb_x] = score; //FIXME use SSD 1539 s->current_picture.mc_mb_var[mb_y*s->mb_width + mb_x] = score; //FIXME use SSD
1539 } 1540 }
1540 1541
1541 if(s->flags&CODEC_FLAG_HQ){ 1542 if(s->flags&CODEC_FLAG_HQ){
1542 type= MB_TYPE_FORWARD | MB_TYPE_BACKWARD | MB_TYPE_BIDIR | MB_TYPE_DIRECT; //FIXME something smarter 1543 type= MB_TYPE_FORWARD | MB_TYPE_BACKWARD | MB_TYPE_BIDIR | MB_TYPE_DIRECT; //FIXME something smarter
1543 } 1544 }
1579 int fcode= FFMAX(fcode_tab[mv_table[xy][0] + MAX_MV], 1580 int fcode= FFMAX(fcode_tab[mv_table[xy][0] + MAX_MV],
1580 fcode_tab[mv_table[xy][1] + MAX_MV]); 1581 fcode_tab[mv_table[xy][1] + MAX_MV]);
1581 int j; 1582 int j;
1582 1583
1583 for(j=0; j<fcode && j<8; j++){ 1584 for(j=0; j<fcode && j<8; j++){
1584 if(s->pict_type==B_TYPE || s->mc_mb_var[i] < s->mb_var[i]) 1585 if(s->pict_type==B_TYPE || s->current_picture.mc_mb_var[i] < s->current_picture.mb_var[i])
1585 score[j]-= 170; 1586 score[j]-= 170;
1586 } 1587 }
1587 } 1588 }
1588 i++; 1589 i++;
1589 xy++; 1590 xy++;