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