// Can handle 128 pixels' diff sum (such as 8x16 or 16x8) // Slightly faster than variance_final_256_pel_sse2() static INLINE void variance_final_128_pel_sse2(__m128i vsse, __m128i vsum, unsigned int *const sse,
int *const sum) {
*sse = add32x4_sse2(vsse);
// Can handle 512 pixels' diff sum (such as 16x32 or 32x16) static INLINE void variance_final_512_pel_sse2(__m128i vsse, __m128i vsum, unsigned int *const sse,
int *const sum) {
*sse = add32x4_sse2(vsse);
// Can handle 1024 pixels' diff sum (such as 32x32) static INLINE int sum_final_sse2(const __m128i sum) { const __m128i t = sum_to_32bit_sse2(sum); return (int)add32x4_sse2(t);
}
static INLINE void variance4_sse2(const uint8_t *src_ptr, const int src_stride, const uint8_t *ref_ptr, const int ref_stride, const int h, __m128i *const sse,
__m128i *const sum) {
int i;
assert(h <= 256); // May overflow for larger height.
*sse = _mm_setzero_si128();
*sum = _mm_setzero_si128();
for (i = 0; i < h; i += 2) { const __m128i s = load4x2_sse2(src_ptr, src_stride); const __m128i r = load4x2_sse2(ref_ptr, ref_stride);
static INLINE void variance8_sse2(const uint8_t *src_ptr, const int src_stride, const uint8_t *ref_ptr, const int ref_stride, const int h, __m128i *const sse,
__m128i *const sum) { const __m128i zero = _mm_setzero_si128();
int i;
assert(h <= 128); // May overflow for larger height.
*sse = _mm_setzero_si128();
*sum = _mm_setzero_si128();
for (i = 0; i < h; i++) { const __m128i s =
_mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i *)src_ptr), zero); const __m128i r =
_mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i *)ref_ptr), zero);
void vpx_get8x8var_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse, int *sum) {
__m128i vsse, vsum;
variance8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 8, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, sum);
}
void vpx_get16x16var_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse, int *sum) {
__m128i vsse, vsum;
variance16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 16, &vsse, &vsum);
variance_final_256_pel_sse2(vsse, vsum, sse, sum);
}
unsigned int vpx_variance4x4_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance4_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 4, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 4);
}
unsigned int vpx_variance4x8_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance4_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 8, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 5);
}
unsigned int vpx_variance8x4_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 4, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 5);
}
unsigned int vpx_variance8x8_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 8, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 6);
}
unsigned int vpx_variance8x16_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 16, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 7);
}
unsigned int vpx_variance16x8_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 8, &vsse, &vsum);
variance_final_128_pel_sse2(vsse, vsum, sse, &sum); return *sse - ((sum * sum) >> 7);
}
unsigned int vpx_variance16x16_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 16, &vsse, &vsum);
variance_final_256_pel_sse2(vsse, vsum, sse, &sum); return *sse - (uint32_t)(((int64_t)sum * sum) >> 8);
}
unsigned int vpx_variance16x32_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse, vsum;
int sum;
variance16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 32, &vsse, &vsum);
variance_final_512_pel_sse2(vsse, vsum, sse, &sum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 9);
}
unsigned int vpx_variance32x16_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse = _mm_setzero_si128();
__m128i vsum;
int sum;
variance32_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 16, &vsse, &vsum);
variance_final_512_pel_sse2(vsse, vsum, sse, &sum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 9);
}
unsigned int vpx_variance32x32_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse = _mm_setzero_si128();
__m128i vsum;
int sum;
variance32_sse2(src_ptr, src_stride, ref_ptr, ref_stride, 32, &vsse, &vsum);
*sse = add32x4_sse2(vsse);
sum = sum_final_sse2(vsum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 10);
}
unsigned int vpx_variance32x64_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse = _mm_setzero_si128();
__m128i vsum = _mm_setzero_si128();
int sum;
int i = 0;
for (i = 0; i < 2; i++) {
__m128i vsum16;
variance32_sse2(src_ptr + 32 * i * src_stride, src_stride,
ref_ptr + 32 * i * ref_stride, ref_stride, 32, &vsse,
&vsum16);
vsum = _mm_add_epi32(vsum, sum_to_32bit_sse2(vsum16));
}
*sse = add32x4_sse2(vsse);
sum = (int)add32x4_sse2(vsum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 11);
}
unsigned int vpx_variance64x32_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse = _mm_setzero_si128();
__m128i vsum = _mm_setzero_si128();
int sum;
int i = 0;
for (i = 0; i < 2; i++) {
__m128i vsum16;
variance64_sse2(src_ptr + 16 * i * src_stride, src_stride,
ref_ptr + 16 * i * ref_stride, ref_stride, 16, &vsse,
&vsum16);
vsum = _mm_add_epi32(vsum, sum_to_32bit_sse2(vsum16));
}
*sse = add32x4_sse2(vsse);
sum = (int)add32x4_sse2(vsum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 11);
}
unsigned int vpx_variance64x64_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
__m128i vsse = _mm_setzero_si128();
__m128i vsum = _mm_setzero_si128();
int sum;
int i = 0;
for (i = 0; i < 4; i++) {
__m128i vsum16;
variance64_sse2(src_ptr + 16 * i * src_stride, src_stride,
ref_ptr + 16 * i * ref_stride, ref_stride, 16, &vsse,
&vsum16);
vsum = _mm_add_epi32(vsum, sum_to_32bit_sse2(vsum16));
}
*sse = add32x4_sse2(vsse);
sum = (int)add32x4_sse2(vsum); return *sse - (unsigned int)(((int64_t)sum * sum) >> 12);
}
unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
vpx_variance8x8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, sse); return *sse;
}
unsigned int vpx_mse8x16_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
vpx_variance8x16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, sse); return *sse;
}
unsigned int vpx_mse16x8_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
vpx_variance16x8_sse2(src_ptr, src_stride, ref_ptr, ref_stride, sse); return *sse;
}
unsigned int vpx_mse16x16_sse2(const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, unsigned int *sse) {
vpx_variance16x16_sse2(src_ptr, src_stride, ref_ptr, ref_stride, sse); return *sse;
}
#if HAVE_X86_ASM // The 2 unused parameters are place holders for PIC enabled build. // These definitions are for functions defined in subpel_variance.asm #define DECL(w, opt) \
int vpx_sub_pixel_variance##w##xh_##opt( \ const uint8_t *src_ptr, ptrdiff_t src_stride, int x_offset, \
int y_offset, const uint8_t *ref_ptr, ptrdiff_t ref_stride, int height, \ unsigned int *sse, void *unused0, void *unused) #define DECLS(opt1, opt2) \
DECL(4, opt1); \
DECL(8, opt1); \
DECL(16, opt1)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.