SIMD_INLINE void BgrToYuv422p(const uint8_t * bgr, uint8_t * y, uint8_t * u, uint8_t * v) { y[0] = BgrToY(bgr[0], bgr[1], bgr[2]); y[1] = BgrToY(bgr[3], bgr[4], bgr[5]); int blue = Average(bgr[0], bgr[3]); int green = Average(bgr[1], bgr[4]); int red = Average(bgr[2], bgr[5]); u[0] = BgrToU(blue, green, red); v[0] = BgrToV(blue, green, red); }
SIMD_INLINE void BgrToYuv444p(const uint8_t * bgr, uint8_t * y, uint8_t * u, uint8_t * v) { const int blue = bgr[0], green = bgr[1], red = bgr[2]; y[0] = BgrToY(blue, green, red); u[0] = BgrToU(blue, green, red); v[0] = BgrToV(blue, green, red); }
SIMD_INLINE void BgrToYuv420p(const uint8_t * bgr0, size_t bgrStride, uint8_t * y0, size_t yStride, uint8_t * u, uint8_t * v) { const uint8_t * bgr1 = bgr0 + bgrStride; uint8_t * y1 = y0 + yStride; y0[0] = BgrToY(bgr0[0], bgr0[1], bgr0[2]); y0[1] = BgrToY(bgr0[3], bgr0[4], bgr0[5]); y1[0] = BgrToY(bgr1[0], bgr1[1], bgr1[2]); y1[1] = BgrToY(bgr1[3], bgr1[4], bgr1[5]); int blue = Average(bgr0[0], bgr0[3], bgr1[0], bgr1[3]); int green = Average(bgr0[1], bgr0[4], bgr1[1], bgr1[4]); int red = Average(bgr0[2], bgr0[5], bgr1[2], bgr1[5]); u[0] = BgrToU(blue, green, red); v[0] = BgrToV(blue, green, red); }
template <bool align, bool first> SIMD_INLINE void BgrToYuv444p(const uint8_t * bgr, Storer<align> & y, Storer<align> & u, Storer<align> & v) { v128_u8 blue, green, red; LoadBgr<align>(bgr, blue, green, red); Store<align, first>(y, BgrToY(blue, green, red)); Store<align, first>(u, BgrToU(blue, green, red)); Store<align, first>(v, BgrToV(blue, green, red)); }
template <bool align, bool first> SIMD_INLINE void BgrToYuv422p(const uint8_t * bgr, Storer<align> & y, Storer<align> & u, Storer<align> & v) { v128_u8 blue[2], green[2], red[2]; LoadBgr<align>(bgr, blue[0], green[0], red[0]); Store<align, first>(y, BgrToY(blue[0], green[0], red[0])); LoadBgr<align>(bgr + 3 * A, blue[1], green[1], red[1]); Store<align, false>(y, BgrToY(blue[1], green[1], red[1])); v128_s16 blueAvg[2], greenAvg[2], redAvg[2]; blueAvg[0] = Average(blue[0]); blueAvg[1] = Average(blue[1]); greenAvg[0] = Average(green[0]); greenAvg[1] = Average(green[1]); redAvg[0] = Average(red[0]); redAvg[1] = Average(red[1]); Store<align, first>(u, vec_pack(BgrToU(blueAvg[0], greenAvg[0], redAvg[0]), BgrToU(blueAvg[1], greenAvg[1], redAvg[1]))); Store<align, first>(v, vec_pack(BgrToV(blueAvg[0], greenAvg[0], redAvg[0]), BgrToV(blueAvg[1], greenAvg[1], redAvg[1]))); }
template <bool align, bool first> SIMD_INLINE void BgrToYuv420p(const uint8_t * bgr0, size_t bgrStride, Storer<align> & y0, Storer<align> & y1, Storer<align> & u, Storer<align> & v) { const uint8_t * bgr1 = bgr0 + bgrStride; v128_u8 blue[2][2], green[2][2], red[2][2]; LoadBgr<align>(bgr0, blue[0][0], green[0][0], red[0][0]); Store<align, first>(y0, BgrToY(blue[0][0], green[0][0], red[0][0])); LoadBgr<align>(bgr0 + 3 * A, blue[0][1], green[0][1], red[0][1]); Store<align, false>(y0, BgrToY(blue[0][1], green[0][1], red[0][1])); LoadBgr<align>(bgr1, blue[1][0], green[1][0], red[1][0]); Store<align, first>(y1, BgrToY(blue[1][0], green[1][0], red[1][0])); LoadBgr<align>(bgr1 + 3 * A, blue[1][1], green[1][1], red[1][1]); Store<align, false>(y1, BgrToY(blue[1][1], green[1][1], red[1][1])); v128_s16 blueAvg[2], greenAvg[2], redAvg[2]; blueAvg[0] = Average(blue[0][0], blue[1][0]); blueAvg[1] = Average(blue[0][1], blue[1][1]); greenAvg[0] = Average(green[0][0], green[1][0]); greenAvg[1] = Average(green[0][1], green[1][1]); redAvg[0] = Average(red[0][0], red[1][0]); redAvg[1] = Average(red[0][1], red[1][1]); Store<align, first>(u, vec_pack(BgrToU(blueAvg[0], greenAvg[0], redAvg[0]), BgrToU(blueAvg[1], greenAvg[1], redAvg[1]))); Store<align, first>(v, vec_pack(BgrToV(blueAvg[0], greenAvg[0], redAvg[0]), BgrToV(blueAvg[1], greenAvg[1], redAvg[1]))); }