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