1*b2055c35SXin Li // Copyright 2014 Google Inc. All Rights Reserved.
2*b2055c35SXin Li //
3*b2055c35SXin Li // Use of this source code is governed by a BSD-style license
4*b2055c35SXin Li // that can be found in the COPYING file in the root of the source
5*b2055c35SXin Li // tree. An additional intellectual property rights grant can be found
6*b2055c35SXin Li // in the file PATENTS. All contributing project authors may
7*b2055c35SXin Li // be found in the AUTHORS file in the root of the source tree.
8*b2055c35SXin Li // -----------------------------------------------------------------------------
9*b2055c35SXin Li //
10*b2055c35SXin Li // MIPS version of YUV to RGB upsampling functions.
11*b2055c35SXin Li //
12*b2055c35SXin Li // Author(s): Djordje Pesut ([email protected])
13*b2055c35SXin Li // Jovan Zelincevic ([email protected])
14*b2055c35SXin Li
15*b2055c35SXin Li #include "src/dsp/dsp.h"
16*b2055c35SXin Li
17*b2055c35SXin Li #if defined(WEBP_USE_MIPS32)
18*b2055c35SXin Li
19*b2055c35SXin Li #include "src/dsp/yuv.h"
20*b2055c35SXin Li
21*b2055c35SXin Li //------------------------------------------------------------------------------
22*b2055c35SXin Li // simple point-sampling
23*b2055c35SXin Li
24*b2055c35SXin Li #define ROW_FUNC(FUNC_NAME, XSTEP, R, G, B, A) \
25*b2055c35SXin Li static void FUNC_NAME(const uint8_t* y, \
26*b2055c35SXin Li const uint8_t* u, const uint8_t* v, \
27*b2055c35SXin Li uint8_t* dst, int len) { \
28*b2055c35SXin Li int i, r, g, b; \
29*b2055c35SXin Li int temp0, temp1, temp2, temp3, temp4; \
30*b2055c35SXin Li for (i = 0; i < (len >> 1); i++) { \
31*b2055c35SXin Li temp1 = MultHi(v[0], 26149); \
32*b2055c35SXin Li temp3 = MultHi(v[0], 13320); \
33*b2055c35SXin Li temp2 = MultHi(u[0], 6419); \
34*b2055c35SXin Li temp4 = MultHi(u[0], 33050); \
35*b2055c35SXin Li temp0 = MultHi(y[0], 19077); \
36*b2055c35SXin Li temp1 -= 14234; \
37*b2055c35SXin Li temp3 -= 8708; \
38*b2055c35SXin Li temp2 += temp3; \
39*b2055c35SXin Li temp4 -= 17685; \
40*b2055c35SXin Li r = VP8Clip8(temp0 + temp1); \
41*b2055c35SXin Li g = VP8Clip8(temp0 - temp2); \
42*b2055c35SXin Li b = VP8Clip8(temp0 + temp4); \
43*b2055c35SXin Li temp0 = MultHi(y[1], 19077); \
44*b2055c35SXin Li dst[R] = r; \
45*b2055c35SXin Li dst[G] = g; \
46*b2055c35SXin Li dst[B] = b; \
47*b2055c35SXin Li if (A) dst[A] = 0xff; \
48*b2055c35SXin Li r = VP8Clip8(temp0 + temp1); \
49*b2055c35SXin Li g = VP8Clip8(temp0 - temp2); \
50*b2055c35SXin Li b = VP8Clip8(temp0 + temp4); \
51*b2055c35SXin Li dst[R + XSTEP] = r; \
52*b2055c35SXin Li dst[G + XSTEP] = g; \
53*b2055c35SXin Li dst[B + XSTEP] = b; \
54*b2055c35SXin Li if (A) dst[A + XSTEP] = 0xff; \
55*b2055c35SXin Li y += 2; \
56*b2055c35SXin Li ++u; \
57*b2055c35SXin Li ++v; \
58*b2055c35SXin Li dst += 2 * XSTEP; \
59*b2055c35SXin Li } \
60*b2055c35SXin Li if (len & 1) { \
61*b2055c35SXin Li temp1 = MultHi(v[0], 26149); \
62*b2055c35SXin Li temp3 = MultHi(v[0], 13320); \
63*b2055c35SXin Li temp2 = MultHi(u[0], 6419); \
64*b2055c35SXin Li temp4 = MultHi(u[0], 33050); \
65*b2055c35SXin Li temp0 = MultHi(y[0], 19077); \
66*b2055c35SXin Li temp1 -= 14234; \
67*b2055c35SXin Li temp3 -= 8708; \
68*b2055c35SXin Li temp2 += temp3; \
69*b2055c35SXin Li temp4 -= 17685; \
70*b2055c35SXin Li r = VP8Clip8(temp0 + temp1); \
71*b2055c35SXin Li g = VP8Clip8(temp0 - temp2); \
72*b2055c35SXin Li b = VP8Clip8(temp0 + temp4); \
73*b2055c35SXin Li dst[R] = r; \
74*b2055c35SXin Li dst[G] = g; \
75*b2055c35SXin Li dst[B] = b; \
76*b2055c35SXin Li if (A) dst[A] = 0xff; \
77*b2055c35SXin Li } \
78*b2055c35SXin Li }
79*b2055c35SXin Li
80*b2055c35SXin Li ROW_FUNC(YuvToRgbRow_MIPS32, 3, 0, 1, 2, 0)
81*b2055c35SXin Li ROW_FUNC(YuvToRgbaRow_MIPS32, 4, 0, 1, 2, 3)
82*b2055c35SXin Li ROW_FUNC(YuvToBgrRow_MIPS32, 3, 2, 1, 0, 0)
83*b2055c35SXin Li ROW_FUNC(YuvToBgraRow_MIPS32, 4, 2, 1, 0, 3)
84*b2055c35SXin Li
85*b2055c35SXin Li #undef ROW_FUNC
86*b2055c35SXin Li
87*b2055c35SXin Li //------------------------------------------------------------------------------
88*b2055c35SXin Li // Entry point
89*b2055c35SXin Li
90*b2055c35SXin Li extern void WebPInitSamplersMIPS32(void);
91*b2055c35SXin Li
WebPInitSamplersMIPS32(void)92*b2055c35SXin Li WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersMIPS32(void) {
93*b2055c35SXin Li WebPSamplers[MODE_RGB] = YuvToRgbRow_MIPS32;
94*b2055c35SXin Li WebPSamplers[MODE_RGBA] = YuvToRgbaRow_MIPS32;
95*b2055c35SXin Li WebPSamplers[MODE_BGR] = YuvToBgrRow_MIPS32;
96*b2055c35SXin Li WebPSamplers[MODE_BGRA] = YuvToBgraRow_MIPS32;
97*b2055c35SXin Li }
98*b2055c35SXin Li
99*b2055c35SXin Li #else // !WEBP_USE_MIPS32
100*b2055c35SXin Li
101*b2055c35SXin Li WEBP_DSP_INIT_STUB(WebPInitSamplersMIPS32)
102*b2055c35SXin Li
103*b2055c35SXin Li #endif // WEBP_USE_MIPS32
104