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