15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// YUV to RGB upsampling functions. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: somnath@google.com (Somnath Banerjee) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./dsp.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./yuv.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <assert.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fancy upsampler 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef FANCY_UPSAMPLING 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fancy upsampling functions to convert YUV to RGB 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPUpsampleLinePairFunc WebPUpsamplers[MODE_LAST]; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given samples laid out in a square as: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [a b] 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [c d] 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we interpolate u/v as: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ([9*a + 3*b + 3*c + d 3*a + 9*b + 3*c + d] + [8 8]) / 16 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ([3*a + b + 9*c + 3*d a + 3*b + 3*c + 9*d] [8 8]) / 16 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We process u and v together stashed into 32bit (16bit each). 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define LOAD_UV(u, v) ((u) | ((v) << 16)) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* top_u, const uint8_t* top_v, \ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* cur_u, const uint8_t* cur_v, \ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x; \ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int last_pixel_pair = (len - 1) >> 1; \ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t tl_uv = LOAD_UV(top_u[0], top_v[0]); /* top-left sample */ \ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t l_uv = LOAD_UV(cur_u[0], cur_v[0]); /* left-sample */ \ 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(top_y != NULL); \ 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { \ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bottom_y != NULL) { \ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bottom_y[0], uv0 & 0xff, (uv0 >> 16), bottom_dst); \ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (x = 1; x <= last_pixel_pair; ++x) { \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t t_uv = LOAD_UV(top_u[x], top_v[x]); /* top sample */ \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv = LOAD_UV(cur_u[x], cur_v[x]); /* sample */ \ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* precompute invariant values associated with first and second diagonals*/\ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t avg = tl_uv + t_uv + l_uv + uv + 0x00080008u; \ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t diag_12 = (avg + 2 * (t_uv + l_uv)) >> 3; \ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t diag_03 = (avg + 2 * (tl_uv + uv)) >> 3; \ 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { \ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (diag_12 + tl_uv) >> 1; \ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv1 = (diag_03 + t_uv) >> 1; \ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dst + (2 * x - 1) * XSTEP); \ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[2 * x - 0], uv1 & 0xff, (uv1 >> 16), \ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dst + (2 * x - 0) * XSTEP); \ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bottom_y != NULL) { \ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (diag_03 + l_uv) >> 1; \ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv1 = (diag_12 + uv) >> 1; \ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bottom_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom_dst + (2 * x - 1) * XSTEP); \ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bottom_y[2 * x + 0], uv1 & 0xff, (uv1 >> 16), \ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom_dst + (2 * x + 0) * XSTEP); \ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tl_uv = t_uv; \ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l_uv = uv; \ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(len & 1)) { \ 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { \ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dst + (len - 1) * XSTEP); \ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bottom_y != NULL) { \ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bottom_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom_dst + (len - 1) * XSTEP); \ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All variants implemented. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleRgbLinePair, VP8YuvToRgb, 3) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleBgrLinePair, VP8YuvToBgr, 3) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleRgbaLinePair, VP8YuvToRgba, 4) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleBgraLinePair, VP8YuvToBgra, 4) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleArgbLinePair, VP8YuvToArgb, 4) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleRgba4444LinePair, VP8YuvToRgba4444, 2) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UPSAMPLE_FUNC(UpsampleRgb565LinePair, VP8YuvToRgb565, 2) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef LOAD_UV 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef UPSAMPLE_FUNC 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // FANCY_UPSAMPLING 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(FANCY_UPSAMPLING) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DUAL_SAMPLE_FUNC(FUNC_NAME, FUNC) \ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y, \ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* top_u, const uint8_t* top_v, \ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* bot_u, const uint8_t* bot_v, \ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* top_dst, uint8_t* bot_dst, int len) { \ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int half_len = len >> 1; \ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x; \ 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(top_dst != NULL); \ 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { \ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (x = 0; x < half_len; ++x) { \ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x + 0); \ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(top_y[2 * x + 1], top_u[x], top_v[x], top_dst + 8 * x + 4); \ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len & 1) FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x); \ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bot_dst != NULL) { \ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (x = 0; x < half_len; ++x) { \ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x + 0); \ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FUNC(bot_y[2 * x + 1], bot_u[x], bot_v[x], bot_dst + 8 * x + 4); \ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len & 1) FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x); \ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DUAL_SAMPLE_FUNC(DualLineSamplerBGRA, VP8YuvToBgra) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DUAL_SAMPLE_FUNC(DualLineSamplerARGB, VP8YuvToArgb) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef DUAL_SAMPLE_FUNC 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !FANCY_UPSAMPLING 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPUpsampleLinePairFunc WebPGetLinePairConverter(int alpha_is_last) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPInitUpsamplers(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8YUVInit(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef FANCY_UPSAMPLING 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebPUpsamplers[alpha_is_last ? MODE_BGRA : MODE_ARGB]; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (alpha_is_last ? DualLineSamplerBGRA : DualLineSamplerARGB); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// YUV444 converter 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YUV444_FUNC(FUNC_NAME, FUNC, XSTEP) \ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* dst, int len) { \ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; \ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < len; ++i) FUNC(y[i], u[i], v[i], &dst[i * XSTEP]); \ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToRgb, VP8YuvToRgb, 3) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToBgr, VP8YuvToBgr, 3) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToRgba, VP8YuvToRgba, 4) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToBgra, VP8YuvToBgra, 4) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToArgb, VP8YuvToArgb, 4) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToRgba4444, VP8YuvToRgba4444, 2) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)YUV444_FUNC(Yuv444ToRgb565, VP8YuvToRgb565, 2) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef YUV444_FUNC 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const WebPYUV444Converter WebPYUV444Converters[MODE_LAST] = { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgb, // MODE_RGB 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgba, // MODE_RGBA 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToBgr, // MODE_BGR 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToBgra, // MODE_BGRA 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToArgb, // MODE_ARGB 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgba4444, // MODE_RGBA_4444 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgb565, // MODE_RGB_565 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgba, // MODE_rgbA 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToBgra, // MODE_bgrA 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToArgb, // MODE_Argb 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Yuv444ToRgba4444 // MODE_rgbA_4444 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Main calls 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)extern void WebPInitUpsamplersSSE2(void); 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)extern void WebPInitUpsamplersNEON(void); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPInitUpsamplers(void) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef FANCY_UPSAMPLING 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // If defined, use CPUInfo() to overwrite some pointers with faster versions. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (VP8GetCPUInfo != NULL) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WEBP_USE_SSE2) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (VP8GetCPUInfo(kSSE2)) { 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebPInitUpsamplersSSE2(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(WEBP_USE_NEON) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (VP8GetCPUInfo(kNEON)) { 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebPInitUpsamplersNEON(); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // FANCY_UPSAMPLING 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//------------------------------------------------------------------------------ 223