unsigned short DataInput::ReadU16() { unsigned short value; Read(&value, 2); ConvertU16(value); return value; }
template <bool align> SIMD_INLINE void BgraToYuv422p(const uint8_t * bgra, uint8_t * y, uint8_t * u, uint8_t * v) { __m128i _b16_r16[2][2], _g16_1[2][2]; Store<align>((__m128i*)y + 0, LoadAndConvertY8<align>((__m128i*)bgra + 0, _b16_r16[0], _g16_1[0])); Store<align>((__m128i*)y + 1, LoadAndConvertY8<align>((__m128i*)bgra + 4, _b16_r16[1], _g16_1[1])); Average16(_b16_r16); Average16(_g16_1); Store<align>((__m128i*)u, _mm_packus_epi16(ConvertU16(_b16_r16[0], _g16_1[0]), ConvertU16(_b16_r16[1], _g16_1[1]))); Store<align>((__m128i*)v, _mm_packus_epi16(ConvertV16(_b16_r16[0], _g16_1[0]), ConvertV16(_b16_r16[1], _g16_1[1]))); }
template <bool align> SIMD_INLINE void BgraToYuv420p(const uint8_t * bgra0, size_t bgraStride, uint8_t * y0, size_t yStride, uint8_t * u, uint8_t * v) { const uint8_t * bgra1 = bgra0 + bgraStride; uint8_t * y1 = y0 + yStride; __m128i _b16_r16[2][2][2], _g16_1[2][2][2]; Store<align>((__m128i*)y0 + 0, LoadAndConvertY8<align>((__m128i*)bgra0 + 0, _b16_r16[0][0], _g16_1[0][0])); Store<align>((__m128i*)y0 + 1, LoadAndConvertY8<align>((__m128i*)bgra0 + 4, _b16_r16[0][1], _g16_1[0][1])); Store<align>((__m128i*)y1 + 0, LoadAndConvertY8<align>((__m128i*)bgra1 + 0, _b16_r16[1][0], _g16_1[1][0])); Store<align>((__m128i*)y1 + 1, LoadAndConvertY8<align>((__m128i*)bgra1 + 4, _b16_r16[1][1], _g16_1[1][1])); Average16(_b16_r16[0][0][0], _b16_r16[1][0][0]); Average16(_b16_r16[0][0][1], _b16_r16[1][0][1]); Average16(_b16_r16[0][1][0], _b16_r16[1][1][0]); Average16(_b16_r16[0][1][1], _b16_r16[1][1][1]); Average16(_g16_1[0][0][0], _g16_1[1][0][0]); Average16(_g16_1[0][0][1], _g16_1[1][0][1]); Average16(_g16_1[0][1][0], _g16_1[1][1][0]); Average16(_g16_1[0][1][1], _g16_1[1][1][1]); Store<align>((__m128i*)u, _mm_packus_epi16(ConvertU16(_b16_r16[0][0], _g16_1[0][0]), ConvertU16(_b16_r16[0][1], _g16_1[0][1]))); Store<align>((__m128i*)v, _mm_packus_epi16(ConvertV16(_b16_r16[0][0], _g16_1[0][0]), ConvertV16(_b16_r16[0][1], _g16_1[0][1]))); }
void DataOutput::WriteU16(unsigned short value) { ConvertU16(value); Write(&value, 2); }