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