convert_yuv_to_rgb.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/yuv_convert.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ConvertYUVToRGB32Proc)(const uint8*, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8*, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YUVType); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_C(const uint8* yplane, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ystride, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int uvstride, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rgbstride, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YUVType yuv_type); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_SSE(const uint8* yplane, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ystride, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int uvstride, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rgbstride, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YUVType yuv_type); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_MMX(const uint8* yplane, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ystride, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int uvstride, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rgbstride, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) YUVType yuv_type); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assembly functions are declared without namespace. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We use ptrdiff_t instead of int for yasm routine parameters to portably 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sign-extend int. On Win64, MSVC does not sign-extend the value in the stack 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// home of int function parameters, and yasm routines are unaware of this lack 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of extension and fault. ptrdiff_t is portably sign-extended and fixes this 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// issue on at least Win64. The C-equivalent RowProc versions' prototypes 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// include the same change to ptrdiff_t to reuse the typedefs. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ConvertYUVToRGB32RowProc)(const uint8*, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8*, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ScaleYUVToRGB32RowProc)(const uint8*, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8*, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8*, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_C(const uint8* yplane, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_MMX(const uint8* yplane, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_SSE(const uint8* yplane, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* uplane, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* vplane, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgbframe, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_C(const uint8* y_buf, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_MMX(const uint8* y_buf, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_SSE(const uint8* y_buf, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_SSE2_X64(const uint8* y_buf, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_C(const uint8* y_buf, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32RowWithRange_C(const uint8* y_buf, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dest_width, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source_x, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source_dx); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_MMX(const uint8* y_buf, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_SSE(const uint8* y_buf, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_MMX_X64(const uint8* y_buf, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* u_buf, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* v_buf, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* rgb_buf, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t width, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ptrdiff_t source_dx); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // extern "C" 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_ 167