133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// Copyright 2014 Google Inc. All Rights Reserved.
233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//
333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// Use of this source code is governed by a BSD-style license
433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// that can be found in the COPYING file in the root of the source
533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// tree. An additional intellectual property rights grant can be found
633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// in the file PATENTS. All contributing project authors may
733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// be found in the AUTHORS file in the root of the source tree.
833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// -----------------------------------------------------------------------------
933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//
1033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// MIPS version of YUV to RGB upsampling functions.
1133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//
1233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// Author(s):  Djordje Pesut    (djordje.pesut@imgtec.com)
1333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//             Jovan Zelincevic (jovan.zelincevic@imgtec.com)
1433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
1533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora#include "./dsp.h"
1633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
170912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern#if defined(WEBP_USE_MIPS32)
1833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
1933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora#include "./yuv.h"
2033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
2133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//------------------------------------------------------------------------------
2233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora// simple point-sampling
2333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
2433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora#define ROW_FUNC(FUNC_NAME, XSTEP, R, G, B, A)                                 \
2533f74dabbc7920a65ed435d7417987589febdc16Vikas Arorastatic void FUNC_NAME(const uint8_t* y,                                        \
2633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora                      const uint8_t* u, const uint8_t* v,                      \
2733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora                      uint8_t* dst, int len) {                                 \
2833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  int i, r, g, b;                                                              \
2933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  int temp0, temp1, temp2, temp3, temp4;                                       \
3033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  for (i = 0; i < (len >> 1); i++) {                                           \
310912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp1 = MultHi(v[0], 26149);                                               \
320912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp3 = MultHi(v[0], 13320);                                               \
330912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp2 = MultHi(u[0], 6419);                                                \
340912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp4 = MultHi(u[0], 33050);                                               \
350912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp0 = MultHi(y[0], 19077);                                               \
360912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp1 -= 14234;                                                            \
370912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp3 -= 8708;                                                             \
3833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    temp2 += temp3;                                                            \
390912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp4 -= 17685;                                                            \
4033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    r = VP8Clip8(temp0 + temp1);                                               \
4133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    g = VP8Clip8(temp0 - temp2);                                               \
4233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    b = VP8Clip8(temp0 + temp4);                                               \
430912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp0 = MultHi(y[1], 19077);                                               \
4433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[R] = r;                                                                \
4533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[G] = g;                                                                \
4633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[B] = b;                                                                \
4733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    if (A) dst[A] = 0xff;                                                      \
4833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    r = VP8Clip8(temp0 + temp1);                                               \
4933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    g = VP8Clip8(temp0 - temp2);                                               \
5033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    b = VP8Clip8(temp0 + temp4);                                               \
5133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[R + XSTEP] = r;                                                        \
5233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[G + XSTEP] = g;                                                        \
5333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[B + XSTEP] = b;                                                        \
5433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    if (A) dst[A + XSTEP] = 0xff;                                              \
5533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    y += 2;                                                                    \
5633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    ++u;                                                                       \
5733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    ++v;                                                                       \
5833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst += 2 * XSTEP;                                                          \
5933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  }                                                                            \
6033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  if (len & 1) {                                                               \
610912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp1 = MultHi(v[0], 26149);                                               \
620912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp3 = MultHi(v[0], 13320);                                               \
630912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp2 = MultHi(u[0], 6419);                                                \
640912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp4 = MultHi(u[0], 33050);                                               \
650912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp0 = MultHi(y[0], 19077);                                               \
660912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp1 -= 14234;                                                            \
670912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp3 -= 8708;                                                             \
6833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    temp2 += temp3;                                                            \
690912efc2528d03c59d45dd9bdc9ff9ec800a3fc1James Zern    temp4 -= 17685;                                                            \
7033f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    r = VP8Clip8(temp0 + temp1);                                               \
7133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    g = VP8Clip8(temp0 - temp2);                                               \
7233f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    b = VP8Clip8(temp0 + temp4);                                               \
7333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[R] = r;                                                                \
7433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[G] = g;                                                                \
7533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    dst[B] = b;                                                                \
7633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora    if (A) dst[A] = 0xff;                                                      \
7733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  }                                                                            \
7833f74dabbc7920a65ed435d7417987589febdc16Vikas Arora}
7933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
8033f74dabbc7920a65ed435d7417987589febdc16Vikas AroraROW_FUNC(YuvToRgbRow,      3, 0, 1, 2, 0)
8133f74dabbc7920a65ed435d7417987589febdc16Vikas AroraROW_FUNC(YuvToRgbaRow,     4, 0, 1, 2, 3)
8233f74dabbc7920a65ed435d7417987589febdc16Vikas AroraROW_FUNC(YuvToBgrRow,      3, 2, 1, 0, 0)
8333f74dabbc7920a65ed435d7417987589febdc16Vikas AroraROW_FUNC(YuvToBgraRow,     4, 2, 1, 0, 3)
8433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
8533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora#undef ROW_FUNC
8633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
8733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora//------------------------------------------------------------------------------
887c8da7ce66017295a65ec028084b90800be377f8James Zern// Entry point
8933f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
9033f74dabbc7920a65ed435d7417987589febdc16Vikas Aroraextern void WebPInitSamplersMIPS32(void);
9133f74dabbc7920a65ed435d7417987589febdc16Vikas Arora
927c8da7ce66017295a65ec028084b90800be377f8James ZernWEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersMIPS32(void) {
9333f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  WebPSamplers[MODE_RGB]  = YuvToRgbRow;
9433f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  WebPSamplers[MODE_RGBA] = YuvToRgbaRow;
9533f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  WebPSamplers[MODE_BGR]  = YuvToBgrRow;
9633f74dabbc7920a65ed435d7417987589febdc16Vikas Arora  WebPSamplers[MODE_BGRA] = YuvToBgraRow;
9733f74dabbc7920a65ed435d7417987589febdc16Vikas Arora}
987c8da7ce66017295a65ec028084b90800be377f8James Zern
997c8da7ce66017295a65ec028084b90800be377f8James Zern#else  // !WEBP_USE_MIPS32
1007c8da7ce66017295a65ec028084b90800be377f8James Zern
1017c8da7ce66017295a65ec028084b90800be377f8James ZernWEBP_DSP_INIT_STUB(WebPInitSamplersMIPS32)
1027c8da7ce66017295a65ec028084b90800be377f8James Zern
1037c8da7ce66017295a65ec028084b90800be377f8James Zern#endif  // WEBP_USE_MIPS32
104