comparison dsputil.c @ 954:13aec7e50c52 libavcodec

qpel in mmx2/3dnow qpel refinement quality parameter
author michaelni
date Sun, 05 Jan 2003 15:57:10 +0000
parents 463f7260b155
children e162c09efbe7
comparison
equal deleted inserted replaced
953:9eb066d6e0db 954:13aec7e50c52
779 dst+=dstStride; 779 dst+=dstStride;
780 src+=srcStride; 780 src+=srcStride;
781 } 781 }
782 } 782 }
783 783
784
784 #define QPEL_MC(r, OPNAME, RND, OP) \ 785 #define QPEL_MC(r, OPNAME, RND, OP) \
785 static void OPNAME ## mpeg4_qpel8_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ 786 static void OPNAME ## mpeg4_qpel8_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\
786 UINT8 *cm = cropTbl + MAX_NEG_CROP;\ 787 UINT8 *cm = cropTbl + MAX_NEG_CROP;\
787 int i;\ 788 int i;\
788 for(i=0; i<h; i++)\ 789 for(i=0; i<h; i++)\
828 }\ 829 }\
829 \ 830 \
830 static void OPNAME ## mpeg4_qpel16_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ 831 static void OPNAME ## mpeg4_qpel16_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\
831 UINT8 *cm = cropTbl + MAX_NEG_CROP;\ 832 UINT8 *cm = cropTbl + MAX_NEG_CROP;\
832 int i;\ 833 int i;\
834 \
833 for(i=0; i<h; i++)\ 835 for(i=0; i<h; i++)\
834 {\ 836 {\
835 OP(dst[ 0], (src[ 0]+src[ 1])*20 - (src[ 0]+src[ 2])*6 + (src[ 1]+src[ 3])*3 - (src[ 2]+src[ 4]));\ 837 OP(dst[ 0], (src[ 0]+src[ 1])*20 - (src[ 0]+src[ 2])*6 + (src[ 1]+src[ 3])*3 - (src[ 2]+src[ 4]));\
836 OP(dst[ 1], (src[ 1]+src[ 2])*20 - (src[ 0]+src[ 3])*6 + (src[ 0]+src[ 4])*3 - (src[ 1]+src[ 5]));\ 838 OP(dst[ 1], (src[ 1]+src[ 2])*20 - (src[ 0]+src[ 3])*6 + (src[ 0]+src[ 4])*3 - (src[ 1]+src[ 5]));\
837 OP(dst[ 2], (src[ 2]+src[ 3])*20 - (src[ 1]+src[ 4])*6 + (src[ 0]+src[ 5])*3 - (src[ 0]+src[ 6]));\ 839 OP(dst[ 2], (src[ 2]+src[ 3])*20 - (src[ 1]+src[ 4])*6 + (src[ 0]+src[ 5])*3 - (src[ 0]+src[ 6]));\
851 dst+=dstStride;\ 853 dst+=dstStride;\
852 src+=srcStride;\ 854 src+=srcStride;\
853 }\ 855 }\
854 }\ 856 }\
855 \ 857 \
856 static void OPNAME ## mpeg4_qpel16_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int w){\ 858 static void OPNAME ## mpeg4_qpel16_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride){\
857 UINT8 *cm = cropTbl + MAX_NEG_CROP;\ 859 UINT8 *cm = cropTbl + MAX_NEG_CROP;\
858 int i;\ 860 int i;\
861 const int w=16;\
859 for(i=0; i<w; i++)\ 862 for(i=0; i<w; i++)\
860 {\ 863 {\
861 const int src0= src[0*srcStride];\ 864 const int src0= src[0*srcStride];\
862 const int src1= src[1*srcStride];\ 865 const int src1= src[1*srcStride];\
863 const int src2= src[2*srcStride];\ 866 const int src2= src[2*srcStride];\
1044 \ 1047 \
1045 static void OPNAME ## qpel16_mc01_c(UINT8 *dst, UINT8 *src, int stride){\ 1048 static void OPNAME ## qpel16_mc01_c(UINT8 *dst, UINT8 *src, int stride){\
1046 UINT8 full[24*17];\ 1049 UINT8 full[24*17];\
1047 UINT8 half[256];\ 1050 UINT8 half[256];\
1048 copy_block17(full, src, 24, stride, 17);\ 1051 copy_block17(full, src, 24, stride, 17);\
1049 put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24, 16);\ 1052 put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\
1050 OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);\ 1053 OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);\
1051 }\ 1054 }\
1052 \ 1055 \
1053 static void OPNAME ## qpel16_mc02_c(UINT8 *dst, UINT8 *src, int stride){\ 1056 static void OPNAME ## qpel16_mc02_c(UINT8 *dst, UINT8 *src, int stride){\
1054 UINT8 full[24*17];\ 1057 UINT8 full[24*17];\
1055 copy_block17(full, src, 24, stride, 17);\ 1058 copy_block17(full, src, 24, stride, 17);\
1056 OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24, 16);\ 1059 OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24);\
1057 }\ 1060 }\
1058 \ 1061 \
1059 static void OPNAME ## qpel16_mc03_c(UINT8 *dst, UINT8 *src, int stride){\ 1062 static void OPNAME ## qpel16_mc03_c(UINT8 *dst, UINT8 *src, int stride){\
1060 UINT8 full[24*17];\ 1063 UINT8 full[24*17];\
1061 UINT8 half[256];\ 1064 UINT8 half[256];\
1062 copy_block17(full, src, 24, stride, 17);\ 1065 copy_block17(full, src, 24, stride, 17);\
1063 put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24, 16);\ 1066 put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\
1064 OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);\ 1067 OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);\
1065 }\ 1068 }\
1066 static void OPNAME ## qpel16_mc11_c(UINT8 *dst, UINT8 *src, int stride){\ 1069 static void OPNAME ## qpel16_mc11_c(UINT8 *dst, UINT8 *src, int stride){\
1067 UINT8 full[24*17];\ 1070 UINT8 full[24*17];\
1068 UINT8 halfH[272];\ 1071 UINT8 halfH[272];\
1069 UINT8 halfV[256];\ 1072 UINT8 halfV[256];\
1070 UINT8 halfHV[256];\ 1073 UINT8 halfHV[256];\
1071 copy_block17(full, src, 24, stride, 17);\ 1074 copy_block17(full, src, 24, stride, 17);\
1072 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ 1075 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
1073 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ 1076 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
1074 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1077 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1075 OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ 1078 OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
1076 }\ 1079 }\
1077 static void OPNAME ## qpel16_mc31_c(UINT8 *dst, UINT8 *src, int stride){\ 1080 static void OPNAME ## qpel16_mc31_c(UINT8 *dst, UINT8 *src, int stride){\
1078 UINT8 full[24*17];\ 1081 UINT8 full[24*17];\
1079 UINT8 halfH[272];\ 1082 UINT8 halfH[272];\
1080 UINT8 halfV[256];\ 1083 UINT8 halfV[256];\
1081 UINT8 halfHV[256];\ 1084 UINT8 halfHV[256];\
1082 copy_block17(full, src, 24, stride, 17);\ 1085 copy_block17(full, src, 24, stride, 17);\
1083 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ 1086 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
1084 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ 1087 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
1085 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1088 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1086 OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ 1089 OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
1087 }\ 1090 }\
1088 static void OPNAME ## qpel16_mc13_c(UINT8 *dst, UINT8 *src, int stride){\ 1091 static void OPNAME ## qpel16_mc13_c(UINT8 *dst, UINT8 *src, int stride){\
1089 UINT8 full[24*17];\ 1092 UINT8 full[24*17];\
1090 UINT8 halfH[272];\ 1093 UINT8 halfH[272];\
1091 UINT8 halfV[256];\ 1094 UINT8 halfV[256];\
1092 UINT8 halfHV[256];\ 1095 UINT8 halfHV[256];\
1093 copy_block17(full, src, 24, stride, 17);\ 1096 copy_block17(full, src, 24, stride, 17);\
1094 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ 1097 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
1095 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ 1098 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
1096 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1099 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1097 OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ 1100 OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
1098 }\ 1101 }\
1099 static void OPNAME ## qpel16_mc33_c(UINT8 *dst, UINT8 *src, int stride){\ 1102 static void OPNAME ## qpel16_mc33_c(UINT8 *dst, UINT8 *src, int stride){\
1100 UINT8 full[24*17];\ 1103 UINT8 full[24*17];\
1101 UINT8 halfH[272];\ 1104 UINT8 halfH[272];\
1102 UINT8 halfV[256];\ 1105 UINT8 halfV[256];\
1103 UINT8 halfHV[256];\ 1106 UINT8 halfHV[256];\
1104 copy_block17(full, src, 24, stride, 17);\ 1107 copy_block17(full, src, 24, stride, 17);\
1105 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full , 16, 24, 17);\ 1108 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full , 16, 24, 17);\
1106 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ 1109 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
1107 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1110 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1108 OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ 1111 OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\
1109 }\ 1112 }\
1110 static void OPNAME ## qpel16_mc21_c(UINT8 *dst, UINT8 *src, int stride){\ 1113 static void OPNAME ## qpel16_mc21_c(UINT8 *dst, UINT8 *src, int stride){\
1111 UINT8 halfH[272];\ 1114 UINT8 halfH[272];\
1112 UINT8 halfHV[256];\ 1115 UINT8 halfHV[256];\
1113 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ 1116 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
1114 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1117 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1115 OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\ 1118 OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\
1116 }\ 1119 }\
1117 static void OPNAME ## qpel16_mc23_c(UINT8 *dst, UINT8 *src, int stride){\ 1120 static void OPNAME ## qpel16_mc23_c(UINT8 *dst, UINT8 *src, int stride){\
1118 UINT8 halfH[272];\ 1121 UINT8 halfH[272];\
1119 UINT8 halfHV[256];\ 1122 UINT8 halfHV[256];\
1120 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ 1123 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
1121 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1124 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1122 OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\ 1125 OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\
1123 }\ 1126 }\
1124 static void OPNAME ## qpel16_mc12_c(UINT8 *dst, UINT8 *src, int stride){\ 1127 static void OPNAME ## qpel16_mc12_c(UINT8 *dst, UINT8 *src, int stride){\
1125 UINT8 full[24*17];\ 1128 UINT8 full[24*17];\
1126 UINT8 halfH[272];\ 1129 UINT8 halfH[272];\
1127 UINT8 halfV[256];\ 1130 UINT8 halfV[256];\
1128 UINT8 halfHV[256];\ 1131 UINT8 halfHV[256];\
1129 copy_block17(full, src, 24, stride, 17);\ 1132 copy_block17(full, src, 24, stride, 17);\
1130 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ 1133 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
1131 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24, 16);\ 1134 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\
1132 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1135 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1133 OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ 1136 OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\
1134 }\ 1137 }\
1135 static void OPNAME ## qpel16_mc32_c(UINT8 *dst, UINT8 *src, int stride){\ 1138 static void OPNAME ## qpel16_mc32_c(UINT8 *dst, UINT8 *src, int stride){\
1136 UINT8 full[24*17];\ 1139 UINT8 full[24*17];\
1137 UINT8 halfH[272];\ 1140 UINT8 halfH[272];\
1138 UINT8 halfV[256];\ 1141 UINT8 halfV[256];\
1139 UINT8 halfHV[256];\ 1142 UINT8 halfHV[256];\
1140 copy_block17(full, src, 24, stride, 17);\ 1143 copy_block17(full, src, 24, stride, 17);\
1141 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ 1144 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\
1142 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24, 16);\ 1145 put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\
1143 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16, 16);\ 1146 put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\
1144 OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ 1147 OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\
1145 }\ 1148 }\
1146 static void OPNAME ## qpel16_mc22_c(UINT8 *dst, UINT8 *src, int stride){\ 1149 static void OPNAME ## qpel16_mc22_c(UINT8 *dst, UINT8 *src, int stride){\
1147 UINT8 halfH[272];\ 1150 UINT8 halfH[272];\
1148 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ 1151 put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\
1149 OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16, 16);\ 1152 OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\
1150 } 1153 }
1151 1154
1152 #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1) 1155 #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
1153 #define op_avg_no_rnd(a, b) a = (((a)+cm[((b) + 15)>>5])>>1) 1156 #define op_avg_no_rnd(a, b) a = (((a)+cm[((b) + 15)>>5])>>1)
1154 #define op_put(a, b) a = cm[((b) + 16)>>5] 1157 #define op_put(a, b) a = cm[((b) + 16)>>5]