comparison motion_est_template.c @ 2184:3378d0677903 libavcodec

4x4 SSE compare function wavelet based compare functions make epzs_motion_search() more flexible so it can be used for a wider range of block sizes make get_penalty_factor() independant of MpegEncContext
author michael
date Sun, 22 Aug 2004 17:16:03 +0000
parents 07a663d46be2
children 70b27300a496
comparison
equal deleted inserted replaced
2183:6d40885b03ad 2184:3378d0677903
849 return var_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags); 849 return var_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
850 } 850 }
851 851
852 static always_inline int epzs_motion_search_internal(MpegEncContext * s, int *mx_ptr, int *my_ptr, 852 static always_inline int epzs_motion_search_internal(MpegEncContext * s, int *mx_ptr, int *my_ptr,
853 int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], 853 int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2],
854 int ref_mv_scale, int flags) 854 int ref_mv_scale, int flags, int size, int h)
855 { 855 {
856 MotionEstContext * const c= &s->me; 856 MotionEstContext * const c= &s->me;
857 int best[2]={0, 0}; 857 int best[2]={0, 0};
858 int d, dmin; 858 int d, dmin;
859 int map_generation; 859 int map_generation;
860 const int penalty_factor= c->penalty_factor; 860 const int penalty_factor= c->penalty_factor;
861 const int size=0;
862 const int h=16;
863 const int ref_mv_stride= s->mb_stride; //pass as arg FIXME 861 const int ref_mv_stride= s->mb_stride; //pass as arg FIXME
864 const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride; //add to last_mv beforepassing FIXME 862 const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride; //add to last_mv beforepassing FIXME
865 me_cmp_func cmpf, chroma_cmpf; 863 me_cmp_func cmpf, chroma_cmpf;
866 864
867 LOAD_COMMON 865 LOAD_COMMON
870 cmpf= s->dsp.me_cmp[size]; 868 cmpf= s->dsp.me_cmp[size];
871 chroma_cmpf= s->dsp.me_cmp[size+1]; 869 chroma_cmpf= s->dsp.me_cmp[size+1];
872 870
873 map_generation= update_map_generation(c); 871 map_generation= update_map_generation(c);
874 872
873 assert(cmpf);
875 dmin= cmp(s, 0, 0, 0, 0, size, h, ref_index, src_index, cmpf, chroma_cmpf, flags); 874 dmin= cmp(s, 0, 0, 0, 0, size, h, ref_index, src_index, cmpf, chroma_cmpf, flags);
876 map[0]= map_generation; 875 map[0]= map_generation;
877 score_map[0]= dmin; 876 score_map[0]= dmin;
878 877
879 /* first line */ 878 /* first line */
880 if (s->first_slice_line) { 879 if (s->first_slice_line) {
881 CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift) 880 CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
882 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16, 881 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
883 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16) 882 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
884 }else{ 883 }else{
885 if(dmin<256 && ( P_LEFT[0] |P_LEFT[1] 884 if(dmin<h*h && ( P_LEFT[0] |P_LEFT[1]
886 |P_TOP[0] |P_TOP[1] 885 |P_TOP[0] |P_TOP[1]
887 |P_TOPRIGHT[0]|P_TOPRIGHT[1])==0){ 886 |P_TOPRIGHT[0]|P_TOPRIGHT[1])==0){
888 *mx_ptr= 0; 887 *mx_ptr= 0;
889 *my_ptr= 0; 888 *my_ptr= 0;
890 c->skip=1; 889 c->skip=1;
891 return dmin; 890 return dmin;
892 } 891 }
893 CHECK_MV(P_MEDIAN[0]>>shift, P_MEDIAN[1]>>shift) 892 CHECK_MV(P_MEDIAN[0]>>shift, P_MEDIAN[1]>>shift)
894 if(dmin>256*2){ 893 if(dmin>h*h*2){
895 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16, 894 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
896 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16) 895 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
897 CHECK_MV(P_LEFT[0] >>shift, P_LEFT[1] >>shift) 896 CHECK_MV(P_LEFT[0] >>shift, P_LEFT[1] >>shift)
898 CHECK_MV(P_TOP[0] >>shift, P_TOP[1] >>shift) 897 CHECK_MV(P_TOP[0] >>shift, P_TOP[1] >>shift)
899 CHECK_MV(P_TOPRIGHT[0]>>shift, P_TOPRIGHT[1]>>shift) 898 CHECK_MV(P_TOPRIGHT[0]>>shift, P_TOPRIGHT[1]>>shift)
900 } 899 }
901 } 900 }
902 if(dmin>256*4){ 901 if(dmin>h*h*4){
903 if(c->pre_pass){ 902 if(c->pre_pass){
904 CHECK_CLIPED_MV((last_mv[ref_mv_xy-1][0]*ref_mv_scale + (1<<15))>>16, 903 CHECK_CLIPED_MV((last_mv[ref_mv_xy-1][0]*ref_mv_scale + (1<<15))>>16,
905 (last_mv[ref_mv_xy-1][1]*ref_mv_scale + (1<<15))>>16) 904 (last_mv[ref_mv_xy-1][1]*ref_mv_scale + (1<<15))>>16)
906 if(!s->first_slice_line) 905 if(!s->first_slice_line)
907 CHECK_CLIPED_MV((last_mv[ref_mv_xy-ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16, 906 CHECK_CLIPED_MV((last_mv[ref_mv_xy-ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16,
946 // printf("%d %d %d \n", best[0], best[1], dmin); 945 // printf("%d %d %d \n", best[0], best[1], dmin);
947 return dmin; 946 return dmin;
948 } 947 }
949 948
950 //this function is dedicated to the braindamaged gcc 949 //this function is dedicated to the braindamaged gcc
951 static inline int epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, 950 inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr,
952 int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], 951 int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2],
953 int ref_mv_scale) 952 int ref_mv_scale, int size, int h)
954 { 953 {
955 MotionEstContext * const c= &s->me; 954 MotionEstContext * const c= &s->me;
956 //FIXME convert other functions in the same way if faster 955 //FIXME convert other functions in the same way if faster
957 switch(c->flags){ 956 if(c->flags==0 && h==16 && size==0){
958 case 0: 957 return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, 0, 0, 16);
959 return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, 0);
960 // case FLAG_QPEL: 958 // case FLAG_QPEL:
961 // return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, FLAG_QPEL); 959 // return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, FLAG_QPEL);
962 default: 960 }else{
963 return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, c->flags); 961 return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, c->flags, size, h);
964 } 962 }
965 } 963 }
966 964
967 static int epzs_motion_search4(MpegEncContext * s, 965 static int epzs_motion_search4(MpegEncContext * s,
968 int *mx_ptr, int *my_ptr, int P[10][2], 966 int *mx_ptr, int *my_ptr, int P[10][2],