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_YUV_CONVERT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_YUV_CONVERT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "media/base/media_export.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/base/simd/yuv_to_rgb_table.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Visual Studio 2010 does not support MMX intrinsics on x64. 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Some win64 yuv_convert code paths use SSE+MMX yasm, so without rewriting 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// them, we use yasm EmptyRegisterState_MMX in place of _mm_empty() or 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// hide the versions implemented with heavy use of MMX intrinsics. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(wolenetz): Use MMX intrinsics when compiling win64 with Visual 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Studio 2012? http://crbug.com/173450 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ARCH_CPU_X86_FAMILY) && \ 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !(defined(ARCH_CPU_X86_64) && defined(COMPILER_MSVC)) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_MMX_INTRINSICS_AVAILABLE 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Type of YUV surface. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum YUVType { 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) YV16 = 0, // YV16 is half width and full height chroma channels. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) YV12 = 1, // YV12 is half width and half height chroma channels. 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) YV12J = 2, // YV12J is the same as YV12, but in JPEG color range. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Get the appropriate value to bitshift by for vertical indices. 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MEDIA_EXPORT int GetVerticalShift(YUVType type); 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Get the appropriate lookup table for a given YUV format. 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MEDIA_EXPORT const int16 (&GetLookupTable(YUVType type))[1024][4]; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mirror means flip the image horizontally, as in looking in a mirror. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rotate happens after mirroring. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Rotate { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ROTATE_0, // Rotation off. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ROTATE_90, // Rotate clockwise. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ROTATE_180, // Rotate upside down. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ROTATE_270, // Rotate counter clockwise. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MIRROR_ROTATE_0, // Mirror horizontally. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MIRROR_ROTATE_90, // Mirror then Rotate clockwise. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MIRROR_ROTATE_180, // Mirror vertically. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MIRROR_ROTATE_270, // Transpose. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Filter affects how scaling looks. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ScaleFilter { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_NONE = 0, // No filter (point sampled). 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_BILINEAR_H = 1, // Bilinear horizontal filter. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_BILINEAR_V = 2, // Bilinear vertical filter. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_BILINEAR = 3, // Bilinear filter. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MEDIA_EXPORT void InitializeCPUSpecificYUVConversions(); 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert a frame of YUV to 32 bit ARGB. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pass in YV16/YV12 depending on source format 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertYUVToRGB32(const uint8* yplane, 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* uplane, 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* vplane, 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* rgbframe, 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride, 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride, 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) YUVType yuv_type); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Convert a frame of YUVA to 32 bit ARGB. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Pass in YV12A 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertYUVAToARGB(const uint8* yplane, 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* uplane, 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* vplane, 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* aplane, 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* rgbframe, 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride, 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int astride, 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride, 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) YUVType yuv_type); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scale a frame of YUV to 32 bit ARGB. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Supports rotation and mirroring. 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ScaleYUVToRGB32(const uint8* yplane, 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* uplane, 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* vplane, 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* rgbframe, 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int source_width, 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int source_height, 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride, 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride, 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) YUVType yuv_type, 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Rotate view_rotate, 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScaleFilter filter); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Biliner Scale a frame of YV12 to 32 bits ARGB on a specified rectangle. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |yplane|, etc and |rgbframe| should point to the top-left pixels of the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// source and destination buffers. 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ScaleYUVToRGB32WithRect(const uint8* yplane, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* uplane, 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* vplane, 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* rgbframe, 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int source_width, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int source_height, 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_width, 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_height, 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_rect_left, 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_rect_top, 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_rect_right, 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int dest_rect_bottom, 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride, 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride); 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertRGB32ToYUV(const uint8* rgbframe, 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* yplane, 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* uplane, 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* vplane, 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride, 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride); 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertRGB24ToYUV(const uint8* rgbframe, 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* yplane, 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* uplane, 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* vplane, 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int rgbstride, 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int ystride, 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int uvstride); 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertYUY2ToYUV(const uint8* src, 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* yplane, 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* uplane, 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* vplane, 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height); 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void ConvertNV21ToYUV(const uint8* src, 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* yplane, 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* uplane, 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8* vplane, 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int width, 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Empty SIMD register state after calling optimized scaler functions. 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)MEDIA_EXPORT void EmptyRegisterState(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_YUV_CONVERT_H_ 165