1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2011 Google Inc. All Rights Reserved. 2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license 40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source 50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found 60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may 70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree. 8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// ----------------------------------------------------------------------------- 9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// YUV to RGB upsampling functions. 11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 12a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Author: somnath@google.com (Somnath Banerjee) 13a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "./dsp.h" 15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "./yuv.h" 16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 178b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#include <assert.h> 18a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 19a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Fancy upsampler 21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifdef FANCY_UPSAMPLING 23a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Fancy upsampling functions to convert YUV to RGB 25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraWebPUpsampleLinePairFunc WebPUpsamplers[MODE_LAST]; 26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Given samples laid out in a square as: 28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// [a b] 29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// [c d] 30a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// we interpolate u/v as: 31a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// ([9*a + 3*b + 3*c + d 3*a + 9*b + 3*c + d] + [8 8]) / 16 32a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// ([3*a + b + 9*c + 3*d a + 3*b + 3*c + 9*d] [8 8]) / 16 33a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 34a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// We process u and v together stashed into 32bit (16bit each). 350406ce1417f76f2034833414dcecc9f56253640cVikas Arora#define LOAD_UV(u, v) ((u) | ((v) << 16)) 36a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 37a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ 38a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arorastatic void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ 39a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* top_u, const uint8_t* top_v, \ 40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* cur_u, const uint8_t* cur_v, \ 41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ 42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int x; \ 43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const int last_pixel_pair = (len - 1) >> 1; \ 44a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint32_t tl_uv = LOAD_UV(top_u[0], top_v[0]); /* top-left sample */ \ 45a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint32_t l_uv = LOAD_UV(cur_u[0], cur_v[0]); /* left-sample */ \ 468b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora assert(top_y != NULL); \ 478b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { \ 48a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ 49a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \ 50a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 518b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (bottom_y != NULL) { \ 52a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ 53a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bottom_y[0], uv0 & 0xff, (uv0 >> 16), bottom_dst); \ 54a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 55a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora for (x = 1; x <= last_pixel_pair; ++x) { \ 56a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t t_uv = LOAD_UV(top_u[x], top_v[x]); /* top sample */ \ 57a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv = LOAD_UV(cur_u[x], cur_v[x]); /* sample */ \ 58a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora /* precompute invariant values associated with first and second diagonals*/\ 59a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t avg = tl_uv + t_uv + l_uv + uv + 0x00080008u; \ 60a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t diag_12 = (avg + 2 * (t_uv + l_uv)) >> 3; \ 61a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t diag_03 = (avg + 2 * (tl_uv + uv)) >> 3; \ 628b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { \ 63a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (diag_12 + tl_uv) >> 1; \ 64a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv1 = (diag_03 + t_uv) >> 1; \ 65a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ 66a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora top_dst + (2 * x - 1) * XSTEP); \ 67a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[2 * x - 0], uv1 & 0xff, (uv1 >> 16), \ 68a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora top_dst + (2 * x - 0) * XSTEP); \ 69a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 708b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (bottom_y != NULL) { \ 71a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (diag_03 + l_uv) >> 1; \ 72a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv1 = (diag_12 + uv) >> 1; \ 73a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bottom_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ 74a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora bottom_dst + (2 * x - 1) * XSTEP); \ 75a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bottom_y[2 * x + 0], uv1 & 0xff, (uv1 >> 16), \ 76a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora bottom_dst + (2 * x + 0) * XSTEP); \ 77a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 78a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora tl_uv = t_uv; \ 79a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora l_uv = uv; \ 80a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 81a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (!(len & 1)) { \ 828b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { \ 83a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ 84a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ 85a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora top_dst + (len - 1) * XSTEP); \ 86a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 878b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (bottom_y != NULL) { \ 88a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ 89a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bottom_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ 90a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora bottom_dst + (len - 1) * XSTEP); \ 91a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 92a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 93a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} 94a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 95a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// All variants implemented. 96a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleRgbLinePair, VP8YuvToRgb, 3) 97a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleBgrLinePair, VP8YuvToBgr, 3) 98a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleRgbaLinePair, VP8YuvToRgba, 4) 99a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleBgraLinePair, VP8YuvToBgra, 4) 100a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleArgbLinePair, VP8YuvToArgb, 4) 101a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleRgba4444LinePair, VP8YuvToRgba4444, 2) 102a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraUPSAMPLE_FUNC(UpsampleRgb565LinePair, VP8YuvToRgb565, 2) 103a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 104a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#undef LOAD_UV 105a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#undef UPSAMPLE_FUNC 106a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 107a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif // FANCY_UPSAMPLING 108a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 109a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 110a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 111a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if !defined(FANCY_UPSAMPLING) 112a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define DUAL_SAMPLE_FUNC(FUNC_NAME, FUNC) \ 113a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arorastatic void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y, \ 114a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* top_u, const uint8_t* top_v, \ 115a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* bot_u, const uint8_t* bot_v, \ 116a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* top_dst, uint8_t* bot_dst, int len) { \ 117a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const int half_len = len >> 1; \ 118a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int x; \ 1198b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora assert(top_dst != NULL); \ 1208b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { \ 121a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora for (x = 0; x < half_len; ++x) { \ 122a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x + 0); \ 123a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(top_y[2 * x + 1], top_u[x], top_v[x], top_dst + 8 * x + 4); \ 124a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 125a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (len & 1) FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x); \ 126a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 127a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (bot_dst != NULL) { \ 128a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora for (x = 0; x < half_len; ++x) { \ 129a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x + 0); \ 130a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora FUNC(bot_y[2 * x + 1], bot_u[x], bot_v[x], bot_dst + 8 * x + 4); \ 131a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 132a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (len & 1) FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x); \ 133a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } \ 134a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} 135a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 136a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraDUAL_SAMPLE_FUNC(DualLineSamplerBGRA, VP8YuvToBgra) 137a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraDUAL_SAMPLE_FUNC(DualLineSamplerARGB, VP8YuvToArgb) 138a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#undef DUAL_SAMPLE_FUNC 139a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 140a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif // !FANCY_UPSAMPLING 141a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 142a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraWebPUpsampleLinePairFunc WebPGetLinePairConverter(int alpha_is_last) { 143a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPInitUpsamplers(); 144a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora VP8YUVInit(); 145a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifdef FANCY_UPSAMPLING 146a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return WebPUpsamplers[alpha_is_last ? MODE_BGRA : MODE_ARGB]; 147a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#else 148a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora return (alpha_is_last ? DualLineSamplerBGRA : DualLineSamplerARGB); 149a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 150a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} 151a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 152a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 153a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// YUV444 converter 154a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 155a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define YUV444_FUNC(FUNC_NAME, FUNC, XSTEP) \ 156a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arorastatic void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ 157a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* dst, int len) { \ 158a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int i; \ 159a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora for (i = 0; i < len; ++i) FUNC(y[i], u[i], v[i], &dst[i * XSTEP]); \ 160a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} 161a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 162a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToRgb, VP8YuvToRgb, 3) 163a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToBgr, VP8YuvToBgr, 3) 164a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToRgba, VP8YuvToRgba, 4) 165a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToBgra, VP8YuvToBgra, 4) 166a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToArgb, VP8YuvToArgb, 4) 167a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToRgba4444, VP8YuvToRgba4444, 2) 168a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraYUV444_FUNC(Yuv444ToRgb565, VP8YuvToRgb565, 2) 169a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 170a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#undef YUV444_FUNC 171a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 172a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraconst WebPYUV444Converter WebPYUV444Converters[MODE_LAST] = { 173a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgb, // MODE_RGB 174a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgba, // MODE_RGBA 175a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToBgr, // MODE_BGR 176a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToBgra, // MODE_BGRA 177a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToArgb, // MODE_ARGB 178a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgba4444, // MODE_RGBA_4444 179a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgb565, // MODE_RGB_565 180a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgba, // MODE_rgbA 181a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToBgra, // MODE_bgrA 182a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToArgb, // MODE_Argb 183a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora Yuv444ToRgba4444 // MODE_rgbA_4444 184a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}; 185a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 186a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 187af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Main calls 188e7492d303e42ac495966513a74d78918f9731bf7Vikas Arora 189af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern void WebPInitUpsamplersSSE2(void); 190af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern void WebPInitUpsamplersNEON(void); 191a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 192a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid WebPInitUpsamplers(void) { 193a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifdef FANCY_UPSAMPLING 194a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair; 195a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair; 196a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair; 197a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair; 198a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair; 199a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair; 200a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair; 201a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair; 202a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair; 203a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair; 204a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair; 205a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 206af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // If defined, use CPUInfo() to overwrite some pointers with faster versions. 207a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (VP8GetCPUInfo != NULL) { 208a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(WEBP_USE_SSE2) 209a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora if (VP8GetCPUInfo(kSSE2)) { 210af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora WebPInitUpsamplersSSE2(); 211a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } 212a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 2131e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#if defined(WEBP_USE_NEON) 2141e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora if (VP8GetCPUInfo(kNEON)) { 215af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora WebPInitUpsamplersNEON(); 2161e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora } 2171e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#endif 218a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora } 219a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif // FANCY_UPSAMPLING 220a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} 221a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 222af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora//------------------------------------------------------------------------------ 223