variance_mmx.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #include "./vpx_dsp_rtcd.h"
  11. extern void vpx_get4x4var_mmx(const uint8_t *a, int a_stride,
  12. const uint8_t *b, int b_stride,
  13. unsigned int *sse, int *sum);
  14. unsigned int vpx_variance4x4_mmx(const unsigned char *a, int a_stride,
  15. const unsigned char *b, int b_stride,
  16. unsigned int *sse) {
  17. unsigned int var;
  18. int avg;
  19. vpx_get4x4var_mmx(a, a_stride, b, b_stride, &var, &avg);
  20. *sse = var;
  21. return (var - (((unsigned int)avg * avg) >> 4));
  22. }
  23. unsigned int vpx_variance8x8_mmx(const unsigned char *a, int a_stride,
  24. const unsigned char *b, int b_stride,
  25. unsigned int *sse) {
  26. unsigned int var;
  27. int avg;
  28. vpx_get8x8var_mmx(a, a_stride, b, b_stride, &var, &avg);
  29. *sse = var;
  30. return (var - (((unsigned int)avg * avg) >> 6));
  31. }
  32. unsigned int vpx_mse16x16_mmx(const unsigned char *a, int a_stride,
  33. const unsigned char *b, int b_stride,
  34. unsigned int *sse) {
  35. unsigned int sse0, sse1, sse2, sse3, var;
  36. int sum0, sum1, sum2, sum3;
  37. vpx_get8x8var_mmx(a, a_stride, b, b_stride, &sse0, &sum0);
  38. vpx_get8x8var_mmx(a + 8, a_stride, b + 8, b_stride, &sse1, &sum1);
  39. vpx_get8x8var_mmx(a + 8 * a_stride, a_stride,
  40. b + 8 * b_stride, b_stride, &sse2, &sum2);
  41. vpx_get8x8var_mmx(a + 8 * a_stride + 8, a_stride,
  42. b + 8 * b_stride + 8, b_stride, &sse3, &sum3);
  43. var = sse0 + sse1 + sse2 + sse3;
  44. *sse = var;
  45. return var;
  46. }
  47. unsigned int vpx_variance16x16_mmx(const unsigned char *a, int a_stride,
  48. const unsigned char *b, int b_stride,
  49. unsigned int *sse) {
  50. unsigned int sse0, sse1, sse2, sse3, var;
  51. int sum0, sum1, sum2, sum3, avg;
  52. vpx_get8x8var_mmx(a, a_stride, b, b_stride, &sse0, &sum0);
  53. vpx_get8x8var_mmx(a + 8, a_stride, b + 8, b_stride, &sse1, &sum1);
  54. vpx_get8x8var_mmx(a + 8 * a_stride, a_stride,
  55. b + 8 * b_stride, b_stride, &sse2, &sum2);
  56. vpx_get8x8var_mmx(a + 8 * a_stride + 8, a_stride,
  57. b + 8 * b_stride + 8, b_stride, &sse3, &sum3);
  58. var = sse0 + sse1 + sse2 + sse3;
  59. avg = sum0 + sum1 + sum2 + sum3;
  60. *sse = var;
  61. return (var - (((unsigned int)avg * avg) >> 8));
  62. }
  63. unsigned int vpx_variance16x8_mmx(const unsigned char *a, int a_stride,
  64. const unsigned char *b, int b_stride,
  65. unsigned int *sse) {
  66. unsigned int sse0, sse1, var;
  67. int sum0, sum1, avg;
  68. vpx_get8x8var_mmx(a, a_stride, b, b_stride, &sse0, &sum0);
  69. vpx_get8x8var_mmx(a + 8, a_stride, b + 8, b_stride, &sse1, &sum1);
  70. var = sse0 + sse1;
  71. avg = sum0 + sum1;
  72. *sse = var;
  73. return (var - (((unsigned int)avg * avg) >> 7));
  74. }
  75. unsigned int vpx_variance8x16_mmx(const unsigned char *a, int a_stride,
  76. const unsigned char *b, int b_stride,
  77. unsigned int *sse) {
  78. unsigned int sse0, sse1, var;
  79. int sum0, sum1, avg;
  80. vpx_get8x8var_mmx(a, a_stride, b, b_stride, &sse0, &sum0);
  81. vpx_get8x8var_mmx(a + 8 * a_stride, a_stride,
  82. b + 8 * b_stride, b_stride, &sse1, &sum1);
  83. var = sse0 + sse1;
  84. avg = sum0 + sum1;
  85. *sse = var;
  86. return (var - (((unsigned int)avg * avg) >> 7));
  87. }