17c8da7ce66017295a65ec028084b90800be377f8James Zern// Copyright 2014 Google Inc. All Rights Reserved. 27c8da7ce66017295a65ec028084b90800be377f8James Zern// 37c8da7ce66017295a65ec028084b90800be377f8James Zern// Use of this source code is governed by a BSD-style license 47c8da7ce66017295a65ec028084b90800be377f8James Zern// that can be found in the COPYING file in the root of the source 57c8da7ce66017295a65ec028084b90800be377f8James Zern// tree. An additional intellectual property rights grant can be found 67c8da7ce66017295a65ec028084b90800be377f8James Zern// in the file PATENTS. All contributing project authors may 77c8da7ce66017295a65ec028084b90800be377f8James Zern// be found in the AUTHORS file in the root of the source tree. 87c8da7ce66017295a65ec028084b90800be377f8James Zern// ----------------------------------------------------------------------------- 97c8da7ce66017295a65ec028084b90800be377f8James Zern// 107c8da7ce66017295a65ec028084b90800be377f8James Zern// Rescaling functions 117c8da7ce66017295a65ec028084b90800be377f8James Zern// 127c8da7ce66017295a65ec028084b90800be377f8James Zern// Author: Skal (pascal.massimino@gmail.com) 137c8da7ce66017295a65ec028084b90800be377f8James Zern 147c8da7ce66017295a65ec028084b90800be377f8James Zern#include <assert.h> 157c8da7ce66017295a65ec028084b90800be377f8James Zern 167c8da7ce66017295a65ec028084b90800be377f8James Zern#include "./dsp.h" 17fa39824bb690c5806358871f46940d0450973d8aJames Zern#include "../utils/rescaler_utils.h" 187c8da7ce66017295a65ec028084b90800be377f8James Zern 197c8da7ce66017295a65ec028084b90800be377f8James Zern//------------------------------------------------------------------------------ 207c8da7ce66017295a65ec028084b90800be377f8James Zern// Implementations of critical functions ImportRow / ExportRow 217c8da7ce66017295a65ec028084b90800be377f8James Zern 227c8da7ce66017295a65ec028084b90800be377f8James Zern#define ROUNDER (WEBP_RESCALER_ONE >> 1) 237c8da7ce66017295a65ec028084b90800be377f8James Zern#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) 247c8da7ce66017295a65ec028084b90800be377f8James Zern 257c8da7ce66017295a65ec028084b90800be377f8James Zern//------------------------------------------------------------------------------ 267c8da7ce66017295a65ec028084b90800be377f8James Zern// Row import 277c8da7ce66017295a65ec028084b90800be377f8James Zern 287c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerImportRowExpandC(WebPRescaler* const wrk, const uint8_t* src) { 297c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_stride = wrk->num_channels; 307c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_out_max = wrk->dst_width * wrk->num_channels; 317c8da7ce66017295a65ec028084b90800be377f8James Zern int channel; 327c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerInputDone(wrk)); 337c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->x_expand); 347c8da7ce66017295a65ec028084b90800be377f8James Zern for (channel = 0; channel < x_stride; ++channel) { 357c8da7ce66017295a65ec028084b90800be377f8James Zern int x_in = channel; 367c8da7ce66017295a65ec028084b90800be377f8James Zern int x_out = channel; 377c8da7ce66017295a65ec028084b90800be377f8James Zern // simple bilinear interpolation 387c8da7ce66017295a65ec028084b90800be377f8James Zern int accum = wrk->x_add; 397c8da7ce66017295a65ec028084b90800be377f8James Zern int left = src[x_in]; 407c8da7ce66017295a65ec028084b90800be377f8James Zern int right = (wrk->src_width > 1) ? src[x_in + x_stride] : left; 417c8da7ce66017295a65ec028084b90800be377f8James Zern x_in += x_stride; 427c8da7ce66017295a65ec028084b90800be377f8James Zern while (1) { 437c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->frow[x_out] = right * wrk->x_add + (left - right) * accum; 447c8da7ce66017295a65ec028084b90800be377f8James Zern x_out += x_stride; 457c8da7ce66017295a65ec028084b90800be377f8James Zern if (x_out >= x_out_max) break; 467c8da7ce66017295a65ec028084b90800be377f8James Zern accum -= wrk->x_sub; 477c8da7ce66017295a65ec028084b90800be377f8James Zern if (accum < 0) { 487c8da7ce66017295a65ec028084b90800be377f8James Zern left = right; 497c8da7ce66017295a65ec028084b90800be377f8James Zern x_in += x_stride; 507c8da7ce66017295a65ec028084b90800be377f8James Zern assert(x_in < wrk->src_width * x_stride); 517c8da7ce66017295a65ec028084b90800be377f8James Zern right = src[x_in]; 527c8da7ce66017295a65ec028084b90800be377f8James Zern accum += wrk->x_add; 537c8da7ce66017295a65ec028084b90800be377f8James Zern } 547c8da7ce66017295a65ec028084b90800be377f8James Zern } 557c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->x_sub == 0 /* <- special case for src_width=1 */ || accum == 0); 567c8da7ce66017295a65ec028084b90800be377f8James Zern } 577c8da7ce66017295a65ec028084b90800be377f8James Zern} 587c8da7ce66017295a65ec028084b90800be377f8James Zern 597c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerImportRowShrinkC(WebPRescaler* const wrk, const uint8_t* src) { 607c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_stride = wrk->num_channels; 617c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_out_max = wrk->dst_width * wrk->num_channels; 627c8da7ce66017295a65ec028084b90800be377f8James Zern int channel; 637c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerInputDone(wrk)); 647c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!wrk->x_expand); 657c8da7ce66017295a65ec028084b90800be377f8James Zern for (channel = 0; channel < x_stride; ++channel) { 667c8da7ce66017295a65ec028084b90800be377f8James Zern int x_in = channel; 677c8da7ce66017295a65ec028084b90800be377f8James Zern int x_out = channel; 687c8da7ce66017295a65ec028084b90800be377f8James Zern uint32_t sum = 0; 697c8da7ce66017295a65ec028084b90800be377f8James Zern int accum = 0; 707c8da7ce66017295a65ec028084b90800be377f8James Zern while (x_out < x_out_max) { 717c8da7ce66017295a65ec028084b90800be377f8James Zern uint32_t base = 0; 727c8da7ce66017295a65ec028084b90800be377f8James Zern accum += wrk->x_add; 737c8da7ce66017295a65ec028084b90800be377f8James Zern while (accum > 0) { 747c8da7ce66017295a65ec028084b90800be377f8James Zern accum -= wrk->x_sub; 757c8da7ce66017295a65ec028084b90800be377f8James Zern assert(x_in < wrk->src_width * x_stride); 767c8da7ce66017295a65ec028084b90800be377f8James Zern base = src[x_in]; 777c8da7ce66017295a65ec028084b90800be377f8James Zern sum += base; 787c8da7ce66017295a65ec028084b90800be377f8James Zern x_in += x_stride; 797c8da7ce66017295a65ec028084b90800be377f8James Zern } 807c8da7ce66017295a65ec028084b90800be377f8James Zern { // Emit next horizontal pixel. 817c8da7ce66017295a65ec028084b90800be377f8James Zern const rescaler_t frac = base * (-accum); 827c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->frow[x_out] = sum * wrk->x_sub - frac; 837c8da7ce66017295a65ec028084b90800be377f8James Zern // fresh fractional start for next pixel 847c8da7ce66017295a65ec028084b90800be377f8James Zern sum = (int)MULT_FIX(frac, wrk->fx_scale); 857c8da7ce66017295a65ec028084b90800be377f8James Zern } 867c8da7ce66017295a65ec028084b90800be377f8James Zern x_out += x_stride; 877c8da7ce66017295a65ec028084b90800be377f8James Zern } 887c8da7ce66017295a65ec028084b90800be377f8James Zern assert(accum == 0); 897c8da7ce66017295a65ec028084b90800be377f8James Zern } 907c8da7ce66017295a65ec028084b90800be377f8James Zern} 917c8da7ce66017295a65ec028084b90800be377f8James Zern 927c8da7ce66017295a65ec028084b90800be377f8James Zern//------------------------------------------------------------------------------ 937c8da7ce66017295a65ec028084b90800be377f8James Zern// Row export 947c8da7ce66017295a65ec028084b90800be377f8James Zern 957c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerExportRowExpandC(WebPRescaler* const wrk) { 967c8da7ce66017295a65ec028084b90800be377f8James Zern int x_out; 977c8da7ce66017295a65ec028084b90800be377f8James Zern uint8_t* const dst = wrk->dst; 987c8da7ce66017295a65ec028084b90800be377f8James Zern rescaler_t* const irow = wrk->irow; 997c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_out_max = wrk->dst_width * wrk->num_channels; 1007c8da7ce66017295a65ec028084b90800be377f8James Zern const rescaler_t* const frow = wrk->frow; 1017c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerOutputDone(wrk)); 1027c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->y_accum <= 0); 1037c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->y_expand); 1047c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->y_sub != 0); 1057c8da7ce66017295a65ec028084b90800be377f8James Zern if (wrk->y_accum == 0) { 1067c8da7ce66017295a65ec028084b90800be377f8James Zern for (x_out = 0; x_out < x_out_max; ++x_out) { 1077c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t J = frow[x_out]; 1087c8da7ce66017295a65ec028084b90800be377f8James Zern const int v = (int)MULT_FIX(J, wrk->fy_scale); 1097c8da7ce66017295a65ec028084b90800be377f8James Zern assert(v >= 0 && v <= 255); 1107c8da7ce66017295a65ec028084b90800be377f8James Zern dst[x_out] = v; 1117c8da7ce66017295a65ec028084b90800be377f8James Zern } 1127c8da7ce66017295a65ec028084b90800be377f8James Zern } else { 1137c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); 1147c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); 1157c8da7ce66017295a65ec028084b90800be377f8James Zern for (x_out = 0; x_out < x_out_max; ++x_out) { 1167c8da7ce66017295a65ec028084b90800be377f8James Zern const uint64_t I = (uint64_t)A * frow[x_out] 1177c8da7ce66017295a65ec028084b90800be377f8James Zern + (uint64_t)B * irow[x_out]; 1187c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); 1197c8da7ce66017295a65ec028084b90800be377f8James Zern const int v = (int)MULT_FIX(J, wrk->fy_scale); 1207c8da7ce66017295a65ec028084b90800be377f8James Zern assert(v >= 0 && v <= 255); 1217c8da7ce66017295a65ec028084b90800be377f8James Zern dst[x_out] = v; 1227c8da7ce66017295a65ec028084b90800be377f8James Zern } 1237c8da7ce66017295a65ec028084b90800be377f8James Zern } 1247c8da7ce66017295a65ec028084b90800be377f8James Zern} 1257c8da7ce66017295a65ec028084b90800be377f8James Zern 1267c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerExportRowShrinkC(WebPRescaler* const wrk) { 1277c8da7ce66017295a65ec028084b90800be377f8James Zern int x_out; 1287c8da7ce66017295a65ec028084b90800be377f8James Zern uint8_t* const dst = wrk->dst; 1297c8da7ce66017295a65ec028084b90800be377f8James Zern rescaler_t* const irow = wrk->irow; 1307c8da7ce66017295a65ec028084b90800be377f8James Zern const int x_out_max = wrk->dst_width * wrk->num_channels; 1317c8da7ce66017295a65ec028084b90800be377f8James Zern const rescaler_t* const frow = wrk->frow; 1327c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum); 1337c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerOutputDone(wrk)); 1347c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->y_accum <= 0); 1357c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!wrk->y_expand); 1367c8da7ce66017295a65ec028084b90800be377f8James Zern if (yscale) { 1377c8da7ce66017295a65ec028084b90800be377f8James Zern for (x_out = 0; x_out < x_out_max; ++x_out) { 1387c8da7ce66017295a65ec028084b90800be377f8James Zern const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale); 1397c8da7ce66017295a65ec028084b90800be377f8James Zern const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale); 1407c8da7ce66017295a65ec028084b90800be377f8James Zern assert(v >= 0 && v <= 255); 1417c8da7ce66017295a65ec028084b90800be377f8James Zern dst[x_out] = v; 1427c8da7ce66017295a65ec028084b90800be377f8James Zern irow[x_out] = frac; // new fractional start 1437c8da7ce66017295a65ec028084b90800be377f8James Zern } 1447c8da7ce66017295a65ec028084b90800be377f8James Zern } else { 1457c8da7ce66017295a65ec028084b90800be377f8James Zern for (x_out = 0; x_out < x_out_max; ++x_out) { 1467c8da7ce66017295a65ec028084b90800be377f8James Zern const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale); 1477c8da7ce66017295a65ec028084b90800be377f8James Zern assert(v >= 0 && v <= 255); 1487c8da7ce66017295a65ec028084b90800be377f8James Zern dst[x_out] = v; 1497c8da7ce66017295a65ec028084b90800be377f8James Zern irow[x_out] = 0; 1507c8da7ce66017295a65ec028084b90800be377f8James Zern } 1517c8da7ce66017295a65ec028084b90800be377f8James Zern } 1527c8da7ce66017295a65ec028084b90800be377f8James Zern} 1537c8da7ce66017295a65ec028084b90800be377f8James Zern 1547c8da7ce66017295a65ec028084b90800be377f8James Zern#undef MULT_FIX 1557c8da7ce66017295a65ec028084b90800be377f8James Zern#undef ROUNDER 1567c8da7ce66017295a65ec028084b90800be377f8James Zern 1577c8da7ce66017295a65ec028084b90800be377f8James Zern//------------------------------------------------------------------------------ 1587c8da7ce66017295a65ec028084b90800be377f8James Zern// Main entry calls 1597c8da7ce66017295a65ec028084b90800be377f8James Zern 1607c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerImportRow(WebPRescaler* const wrk, const uint8_t* src) { 1617c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerInputDone(wrk)); 1627c8da7ce66017295a65ec028084b90800be377f8James Zern if (!wrk->x_expand) { 1637c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerImportRowShrink(wrk, src); 1647c8da7ce66017295a65ec028084b90800be377f8James Zern } else { 1657c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerImportRowExpand(wrk, src); 1667c8da7ce66017295a65ec028084b90800be377f8James Zern } 1677c8da7ce66017295a65ec028084b90800be377f8James Zern} 1687c8da7ce66017295a65ec028084b90800be377f8James Zern 1697c8da7ce66017295a65ec028084b90800be377f8James Zernvoid WebPRescalerExportRow(WebPRescaler* const wrk) { 1707c8da7ce66017295a65ec028084b90800be377f8James Zern if (wrk->y_accum <= 0) { 1717c8da7ce66017295a65ec028084b90800be377f8James Zern assert(!WebPRescalerOutputDone(wrk)); 1727c8da7ce66017295a65ec028084b90800be377f8James Zern if (wrk->y_expand) { 1737c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerExportRowExpand(wrk); 1747c8da7ce66017295a65ec028084b90800be377f8James Zern } else if (wrk->fxy_scale) { 1757c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerExportRowShrink(wrk); 17698a63a77eb8652c81d64b5b7c3d8a347111807caJames Zern } else { // special case 1777c8da7ce66017295a65ec028084b90800be377f8James Zern int i; 17898a63a77eb8652c81d64b5b7c3d8a347111807caJames Zern assert(wrk->src_height == wrk->dst_height && wrk->x_add == 1); 1797c8da7ce66017295a65ec028084b90800be377f8James Zern assert(wrk->src_width == 1 && wrk->dst_width <= 2); 1807c8da7ce66017295a65ec028084b90800be377f8James Zern for (i = 0; i < wrk->num_channels * wrk->dst_width; ++i) { 1817c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->dst[i] = wrk->irow[i]; 1827c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->irow[i] = 0; 1837c8da7ce66017295a65ec028084b90800be377f8James Zern } 1847c8da7ce66017295a65ec028084b90800be377f8James Zern } 1857c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->y_accum += wrk->y_add; 1867c8da7ce66017295a65ec028084b90800be377f8James Zern wrk->dst += wrk->dst_stride; 1877c8da7ce66017295a65ec028084b90800be377f8James Zern ++wrk->dst_y; 1887c8da7ce66017295a65ec028084b90800be377f8James Zern } 1897c8da7ce66017295a65ec028084b90800be377f8James Zern} 1907c8da7ce66017295a65ec028084b90800be377f8James Zern 1917c8da7ce66017295a65ec028084b90800be377f8James Zern//------------------------------------------------------------------------------ 1927c8da7ce66017295a65ec028084b90800be377f8James Zern 1937c8da7ce66017295a65ec028084b90800be377f8James ZernWebPRescalerImportRowFunc WebPRescalerImportRowExpand; 1947c8da7ce66017295a65ec028084b90800be377f8James ZernWebPRescalerImportRowFunc WebPRescalerImportRowShrink; 1957c8da7ce66017295a65ec028084b90800be377f8James Zern 1967c8da7ce66017295a65ec028084b90800be377f8James ZernWebPRescalerExportRowFunc WebPRescalerExportRowExpand; 1977c8da7ce66017295a65ec028084b90800be377f8James ZernWebPRescalerExportRowFunc WebPRescalerExportRowShrink; 1987c8da7ce66017295a65ec028084b90800be377f8James Zern 1997c8da7ce66017295a65ec028084b90800be377f8James Zernextern void WebPRescalerDspInitSSE2(void); 2007c8da7ce66017295a65ec028084b90800be377f8James Zernextern void WebPRescalerDspInitMIPS32(void); 2017c8da7ce66017295a65ec028084b90800be377f8James Zernextern void WebPRescalerDspInitMIPSdspR2(void); 202fa39824bb690c5806358871f46940d0450973d8aJames Zernextern void WebPRescalerDspInitMSA(void); 2037c8da7ce66017295a65ec028084b90800be377f8James Zernextern void WebPRescalerDspInitNEON(void); 2047c8da7ce66017295a65ec028084b90800be377f8James Zern 2057c8da7ce66017295a65ec028084b90800be377f8James Zernstatic volatile VP8CPUInfo rescaler_last_cpuinfo_used = 2067c8da7ce66017295a65ec028084b90800be377f8James Zern (VP8CPUInfo)&rescaler_last_cpuinfo_used; 2077c8da7ce66017295a65ec028084b90800be377f8James Zern 2087c8da7ce66017295a65ec028084b90800be377f8James ZernWEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInit(void) { 2097c8da7ce66017295a65ec028084b90800be377f8James Zern if (rescaler_last_cpuinfo_used == VP8GetCPUInfo) return; 2107c8da7ce66017295a65ec028084b90800be377f8James Zern 2117c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerImportRowExpand = WebPRescalerImportRowExpandC; 2127c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerImportRowShrink = WebPRescalerImportRowShrinkC; 2137c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerExportRowExpand = WebPRescalerExportRowExpandC; 2147c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerExportRowShrink = WebPRescalerExportRowShrinkC; 2157c8da7ce66017295a65ec028084b90800be377f8James Zern 2167c8da7ce66017295a65ec028084b90800be377f8James Zern if (VP8GetCPUInfo != NULL) { 2177c8da7ce66017295a65ec028084b90800be377f8James Zern#if defined(WEBP_USE_SSE2) 2187c8da7ce66017295a65ec028084b90800be377f8James Zern if (VP8GetCPUInfo(kSSE2)) { 2197c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerDspInitSSE2(); 2207c8da7ce66017295a65ec028084b90800be377f8James Zern } 2217c8da7ce66017295a65ec028084b90800be377f8James Zern#endif 2227c8da7ce66017295a65ec028084b90800be377f8James Zern#if defined(WEBP_USE_NEON) 2237c8da7ce66017295a65ec028084b90800be377f8James Zern if (VP8GetCPUInfo(kNEON)) { 2247c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerDspInitNEON(); 2257c8da7ce66017295a65ec028084b90800be377f8James Zern } 2267c8da7ce66017295a65ec028084b90800be377f8James Zern#endif 2277c8da7ce66017295a65ec028084b90800be377f8James Zern#if defined(WEBP_USE_MIPS32) 2287c8da7ce66017295a65ec028084b90800be377f8James Zern if (VP8GetCPUInfo(kMIPS32)) { 2297c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerDspInitMIPS32(); 2307c8da7ce66017295a65ec028084b90800be377f8James Zern } 2317c8da7ce66017295a65ec028084b90800be377f8James Zern#endif 2327c8da7ce66017295a65ec028084b90800be377f8James Zern#if defined(WEBP_USE_MIPS_DSP_R2) 2337c8da7ce66017295a65ec028084b90800be377f8James Zern if (VP8GetCPUInfo(kMIPSdspR2)) { 2347c8da7ce66017295a65ec028084b90800be377f8James Zern WebPRescalerDspInitMIPSdspR2(); 2357c8da7ce66017295a65ec028084b90800be377f8James Zern } 2367c8da7ce66017295a65ec028084b90800be377f8James Zern#endif 237fa39824bb690c5806358871f46940d0450973d8aJames Zern#if defined(WEBP_USE_MSA) 238fa39824bb690c5806358871f46940d0450973d8aJames Zern if (VP8GetCPUInfo(kMSA)) { 239fa39824bb690c5806358871f46940d0450973d8aJames Zern WebPRescalerDspInitMSA(); 240fa39824bb690c5806358871f46940d0450973d8aJames Zern } 241fa39824bb690c5806358871f46940d0450973d8aJames Zern#endif 2427c8da7ce66017295a65ec028084b90800be377f8James Zern } 2437c8da7ce66017295a65ec028084b90800be377f8James Zern rescaler_last_cpuinfo_used = VP8GetCPUInfo; 2447c8da7ce66017295a65ec028084b90800be377f8James Zern} 245