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