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