comparison motion_est.c @ 288:f82cce6cb182 libavcodec

10l (motion_val was uninitilized) 20l (first frame of a gop could be a p-frame sometimes) add hq flag to MpegEncContext
author michaelni
date Sun, 24 Mar 2002 04:16:51 +0000
parents 0778d4e1d584
children 648e9245546d
comparison
equal deleted inserted replaced
287:32a3dcce2e9b 288:f82cce6cb182
577 const int quant= s->qscale; 577 const int quant= s->qscale;
578 int pen_x, pen_y; 578 int pen_x, pen_y;
579 int mx, my, mx1, my1, d, xx, yy, dminh; 579 int mx, my, mx1, my1, d, xx, yy, dminh;
580 UINT8 *pix, *ptr; 580 UINT8 *pix, *ptr;
581 581
582
583 mx = *mx_ptr; 582 mx = *mx_ptr;
584 my = *my_ptr; 583 my = *my_ptr;
585 ptr = s->last_picture[0] + (my * s->linesize) + mx; 584 ptr = s->last_picture[0] + (my * s->linesize) + mx;
586 585
587 xx = 16 * s->mb_x; 586 xx = 16 * s->mb_x;
676 dmin = log_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax); 675 dmin = log_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);
677 break; 676 break;
678 case ME_PHODS: 677 case ME_PHODS:
679 dmin = phods_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax); 678 dmin = phods_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);
680 break; 679 break;
681 case ME_X1: // just reserving some space for experiments ... 680 case ME_X1:
682 case ME_EPZS: 681 case ME_EPZS:
683 rel_xmin= xmin - s->mb_x*16; 682 {
684 rel_xmax= xmax - s->mb_x*16;
685 rel_ymin= ymin - s->mb_y*16;
686 rel_ymax= ymax - s->mb_y*16;
687 if(s->out_format == FMT_H263){
688 static const int off[4]= {2, 1, 1, -1}; 683 static const int off[4]= {2, 1, 1, -1};
689 const int mot_stride = s->mb_width*2 + 2; 684 const int mot_stride = s->mb_width*2 + 2;
690 const int mot_xy = (s->mb_y*2 + 1)*mot_stride + s->mb_x*2 + 1; 685 const int mot_xy = (s->mb_y*2 + 1)*mot_stride + s->mb_x*2 + 1;
691 686
687 rel_xmin= xmin - s->mb_x*16;
688 rel_xmax= xmax - s->mb_x*16;
689 rel_ymin= ymin - s->mb_y*16;
690 rel_ymax= ymax - s->mb_y*16;
691
692 P[0][0] = s->motion_val[mot_xy ][0]; 692 P[0][0] = s->motion_val[mot_xy ][0];
693 P[0][1] = s->motion_val[mot_xy ][1]; 693 P[0][1] = s->motion_val[mot_xy ][1];
694 P[1][0] = s->motion_val[mot_xy - 1][0]; 694 P[1][0] = s->motion_val[mot_xy - 1][0];
695 P[1][1] = s->motion_val[mot_xy - 1][1]; 695 P[1][1] = s->motion_val[mot_xy - 1][1];
696 if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift); 696 if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);
697 697
698 /* special case for first line */ 698 /* special case for first line */
699 if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) { 699 if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {
700 pred_x = P[1][0]; 700 P[4][0] = P[1][0];
701 pred_y = P[1][1]; 701 P[4][1] = P[1][1];
702 } else { 702 } else {
703 P[2][0] = s->motion_val[mot_xy - mot_stride ][0]; 703 P[2][0] = s->motion_val[mot_xy - mot_stride ][0];
704 P[2][1] = s->motion_val[mot_xy - mot_stride ][1]; 704 P[2][1] = s->motion_val[mot_xy - mot_stride ][1];
705 P[3][0] = s->motion_val[mot_xy - mot_stride + off[0] ][0]; 705 P[3][0] = s->motion_val[mot_xy - mot_stride + off[0] ][0];
706 P[3][1] = s->motion_val[mot_xy - mot_stride + off[0] ][1]; 706 P[3][1] = s->motion_val[mot_xy - mot_stride + off[0] ][1];
707 if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift); 707 if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);
708 if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift); 708 if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);
709 if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift); 709 if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);
710 710
711 P[4][0]= pred_x = mid_pred(P[1][0], P[2][0], P[3][0]);
712 P[4][1]= pred_y = mid_pred(P[1][1], P[2][1], P[3][1]);
713 }
714 }else {
715 const int xy= s->mb_y*s->mb_width + s->mb_x;
716 pred_x= s->last_mv[0][0][0];
717 pred_y= s->last_mv[0][0][1];
718
719 P[0][0]= s->mv_table[0][xy ];
720 P[0][1]= s->mv_table[1][xy ];
721 if(s->mb_x == 0){
722 P[1][0]= 0;
723 P[1][1]= 0;
724 }else{
725 P[1][0]= s->mv_table[0][xy-1];
726 P[1][1]= s->mv_table[1][xy-1];
727 if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);
728 }
729
730 if (!(s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {
731 P[2][0] = s->mv_table[0][xy - s->mb_width];
732 P[2][1] = s->mv_table[1][xy - s->mb_width];
733 P[3][0] = s->mv_table[0][xy - s->mb_width+1];
734 P[3][1] = s->mv_table[1][xy - s->mb_width+1];
735 if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);
736 if(P[3][0] > (rel_xmax<<shift)) P[3][0]= (rel_xmax<<shift);
737 if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);
738 if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);
739
740 P[4][0]= mid_pred(P[1][0], P[2][0], P[3][0]); 711 P[4][0]= mid_pred(P[1][0], P[2][0], P[3][0]);
741 P[4][1]= mid_pred(P[1][1], P[2][1], P[3][1]); 712 P[4][1]= mid_pred(P[1][1], P[2][1], P[3][1]);
713 }
714 if(s->out_format == FMT_H263){
715 pred_x = P[4][0];
716 pred_y = P[4][1];
717 }else { /* mpeg1 at least */
718 pred_x= P[1][0];
719 pred_y= P[1][1];
742 } 720 }
743 } 721 }
744 dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax); 722 dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax);
745 723
746 mx+= s->mb_x*16; 724 mx+= s->mb_x*16;