123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // Copyright 2014 Google Inc. All Rights Reserved.
- //
- // Use of this source code is governed by a BSD-style license
- // that can be found in the COPYING file in the root of the source
- // tree. An additional intellectual property rights grant can be found
- // in the file PATENTS. All contributing project authors may
- // be found in the AUTHORS file in the root of the source tree.
- // -----------------------------------------------------------------------------
- //
- // MIPS version of YUV to RGB upsampling functions.
- //
- // Author(s): Djordje Pesut (djordje.pesut@imgtec.com)
- // Jovan Zelincevic (jovan.zelincevic@imgtec.com)
- #include "./dsp.h"
- #if defined(WEBP_USE_MIPS32)
- #include "./yuv.h"
- //------------------------------------------------------------------------------
- // simple point-sampling
- #define ROW_FUNC(FUNC_NAME, XSTEP, R, G, B, A) \
- static void FUNC_NAME(const uint8_t* y, \
- const uint8_t* u, const uint8_t* v, \
- uint8_t* dst, int len) { \
- int i, r, g, b; \
- int temp0, temp1, temp2, temp3, temp4; \
- for (i = 0; i < (len >> 1); i++) { \
- temp1 = MultHi(v[0], 26149); \
- temp3 = MultHi(v[0], 13320); \
- temp2 = MultHi(u[0], 6419); \
- temp4 = MultHi(u[0], 33050); \
- temp0 = MultHi(y[0], 19077); \
- temp1 -= 14234; \
- temp3 -= 8708; \
- temp2 += temp3; \
- temp4 -= 17685; \
- r = VP8Clip8(temp0 + temp1); \
- g = VP8Clip8(temp0 - temp2); \
- b = VP8Clip8(temp0 + temp4); \
- temp0 = MultHi(y[1], 19077); \
- dst[R] = r; \
- dst[G] = g; \
- dst[B] = b; \
- if (A) dst[A] = 0xff; \
- r = VP8Clip8(temp0 + temp1); \
- g = VP8Clip8(temp0 - temp2); \
- b = VP8Clip8(temp0 + temp4); \
- dst[R + XSTEP] = r; \
- dst[G + XSTEP] = g; \
- dst[B + XSTEP] = b; \
- if (A) dst[A + XSTEP] = 0xff; \
- y += 2; \
- ++u; \
- ++v; \
- dst += 2 * XSTEP; \
- } \
- if (len & 1) { \
- temp1 = MultHi(v[0], 26149); \
- temp3 = MultHi(v[0], 13320); \
- temp2 = MultHi(u[0], 6419); \
- temp4 = MultHi(u[0], 33050); \
- temp0 = MultHi(y[0], 19077); \
- temp1 -= 14234; \
- temp3 -= 8708; \
- temp2 += temp3; \
- temp4 -= 17685; \
- r = VP8Clip8(temp0 + temp1); \
- g = VP8Clip8(temp0 - temp2); \
- b = VP8Clip8(temp0 + temp4); \
- dst[R] = r; \
- dst[G] = g; \
- dst[B] = b; \
- if (A) dst[A] = 0xff; \
- } \
- }
- ROW_FUNC(YuvToRgbRow_MIPS32, 3, 0, 1, 2, 0)
- ROW_FUNC(YuvToRgbaRow_MIPS32, 4, 0, 1, 2, 3)
- ROW_FUNC(YuvToBgrRow_MIPS32, 3, 2, 1, 0, 0)
- ROW_FUNC(YuvToBgraRow_MIPS32, 4, 2, 1, 0, 3)
- #undef ROW_FUNC
- //------------------------------------------------------------------------------
- // Entry point
- extern void WebPInitSamplersMIPS32(void);
- WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersMIPS32(void) {
- WebPSamplers[MODE_RGB] = YuvToRgbRow_MIPS32;
- WebPSamplers[MODE_RGBA] = YuvToRgbaRow_MIPS32;
- WebPSamplers[MODE_BGR] = YuvToBgrRow_MIPS32;
- WebPSamplers[MODE_BGRA] = YuvToBgraRow_MIPS32;
- }
- #else // !WEBP_USE_MIPS32
- WEBP_DSP_INIT_STUB(WebPInitSamplersMIPS32)
- #endif // WEBP_USE_MIPS32
|