--- sad.c 2003/06/09 13:54:46 1.13.2.4 +++ sad.c 2004/04/12 15:49:56 1.16 @@ -19,7 +19,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: sad.c,v 1.13.2.4 2003/06/09 13:54:46 edgomez Exp $ + * $Id: sad.c,v 1.16 2004/04/12 15:49:56 edgomez Exp $ * ****************************************************************************/ @@ -35,6 +35,8 @@ sad8biFuncPtr sad8bi; /* not really sad16, but no difference in prototype */ dev16FuncPtr dev16; sad16vFuncPtr sad16v; +sse8Func_16bitPtr sse8_16bit; +sse8Func_8bitPtr sse8_8bit; sadInitFuncPtr sadInit; @@ -69,7 +71,7 @@ sad += abs(ptr_cur[14] - ptr_ref[14]); sad += abs(ptr_cur[15] - ptr_ref[15]); - if (sad >= best_sad) + if (sad >= best_sad) return sad; ptr_cur += stride; @@ -163,7 +165,7 @@ sad += abs(ptr_cur[5] - ptr_ref[5]); sad += abs(ptr_cur[6] - ptr_ref[6]); sad += abs(ptr_cur[7] - ptr_ref[7]); - + ptr_cur += stride; ptr_ref += stride; @@ -209,29 +211,29 @@ return dev; } -uint32_t sad16v_c(const uint8_t * const cur, - const uint8_t * const ref, - const uint32_t stride, +uint32_t sad16v_c(const uint8_t * const cur, + const uint8_t * const ref, + const uint32_t stride, int32_t *sad) { sad[0] = sad8(cur, ref, stride); sad[1] = sad8(cur + 8, ref + 8, stride); sad[2] = sad8(cur + 8*stride, ref + 8*stride, stride); sad[3] = sad8(cur + 8*stride + 8, ref + 8*stride + 8, stride); - + return sad[0]+sad[1]+sad[2]+sad[3]; } -uint32_t sad32v_c(const uint8_t * const cur, - const uint8_t * const ref, - const uint32_t stride, +uint32_t sad32v_c(const uint8_t * const cur, + const uint8_t * const ref, + const uint32_t stride, int32_t *sad) { sad[0] = sad16(cur, ref, stride, 256*4096); - sad[1] = sad16(cur + 8, ref + 8, stride, 256*4096); - sad[2] = sad16(cur + 8*stride, ref + 8*stride, stride, 256*4096); - sad[3] = sad16(cur + 8*stride + 8, ref + 8*stride + 8, stride, 256*4096); - + sad[1] = sad16(cur + 16, ref + 16, stride, 256*4096); + sad[2] = sad16(cur + 16*stride, ref + 16*stride, stride, 256*4096); + sad[3] = sad16(cur + 16*stride + 16, ref + 16*stride + 16, stride, 256*4096); + return sad[0]+sad[1]+sad[2]+sad[3]; } @@ -276,7 +278,54 @@ } return MRSAD16_CORRFACTOR * sad; +} + +uint32_t +sse8_16bit_c(const int16_t * b1, + const int16_t * b2, + const uint32_t stride) +{ + int i; + int sse = 0; + + for (i=0; i<8; i++) { + sse += (b1[0] - b2[0])*(b1[0] - b2[0]); + sse += (b1[1] - b2[1])*(b1[1] - b2[1]); + sse += (b1[2] - b2[2])*(b1[2] - b2[2]); + sse += (b1[3] - b2[3])*(b1[3] - b2[3]); + sse += (b1[4] - b2[4])*(b1[4] - b2[4]); + sse += (b1[5] - b2[5])*(b1[5] - b2[5]); + sse += (b1[6] - b2[6])*(b1[6] - b2[6]); + sse += (b1[7] - b2[7])*(b1[7] - b2[7]); + b1 = (const int16_t*)((int8_t*)b1+stride); + b2 = (const int16_t*)((int8_t*)b2+stride); + } + + return(sse); } +uint32_t +sse8_8bit_c(const uint8_t * b1, + const uint8_t * b2, + const uint32_t stride) +{ + int i; + int sse = 0; + + for (i=0; i<8; i++) { + sse += (b1[0] - b2[0])*(b1[0] - b2[0]); + sse += (b1[1] - b2[1])*(b1[1] - b2[1]); + sse += (b1[2] - b2[2])*(b1[2] - b2[2]); + sse += (b1[3] - b2[3])*(b1[3] - b2[3]); + sse += (b1[4] - b2[4])*(b1[4] - b2[4]); + sse += (b1[5] - b2[5])*(b1[5] - b2[5]); + sse += (b1[6] - b2[6])*(b1[6] - b2[6]); + sse += (b1[7] - b2[7])*(b1[7] - b2[7]); + + b1 = b1+stride; + b2 = b2+stride; + } + return(sse); +}