1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #if defined(_MSC_VER)
6 #include <intrin.h>
7 #else
8 #include <mmintrin.h>
9 #endif
10
11 #include "media/base/simd/convert_yuv_to_rgb.h"
12 #include "media/base/yuv_convert.h"
13
14 namespace media {
15
ConvertYUVToRGB32_MMX(const uint8 * yplane,const uint8 * uplane,const uint8 * vplane,uint8 * rgbframe,int width,int height,int ystride,int uvstride,int rgbstride,YUVType yuv_type)16 void ConvertYUVToRGB32_MMX(const uint8* yplane,
17 const uint8* uplane,
18 const uint8* vplane,
19 uint8* rgbframe,
20 int width,
21 int height,
22 int ystride,
23 int uvstride,
24 int rgbstride,
25 YUVType yuv_type) {
26 unsigned int y_shift = yuv_type;
27 for (int y = 0; y < height; ++y) {
28 uint8* rgb_row = rgbframe + y * rgbstride;
29 const uint8* y_ptr = yplane + y * ystride;
30 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
31 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
32
33 ConvertYUVToRGB32Row_MMX(y_ptr,
34 u_ptr,
35 v_ptr,
36 rgb_row,
37 width);
38 }
39
40 EmptyRegisterState();
41 }
42
ConvertYUVAToARGB_MMX(const uint8 * yplane,const uint8 * uplane,const uint8 * vplane,const uint8 * aplane,uint8 * rgbframe,int width,int height,int ystride,int uvstride,int astride,int rgbstride,YUVType yuv_type)43 void ConvertYUVAToARGB_MMX(const uint8* yplane,
44 const uint8* uplane,
45 const uint8* vplane,
46 const uint8* aplane,
47 uint8* rgbframe,
48 int width,
49 int height,
50 int ystride,
51 int uvstride,
52 int astride,
53 int rgbstride,
54 YUVType yuv_type) {
55 unsigned int y_shift = yuv_type;
56 for (int y = 0; y < height; ++y) {
57 uint8* rgb_row = rgbframe + y * rgbstride;
58 const uint8* y_ptr = yplane + y * ystride;
59 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
60 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
61 const uint8* a_ptr = aplane + y * astride;
62
63 ConvertYUVAToARGBRow_MMX(y_ptr,
64 u_ptr,
65 v_ptr,
66 a_ptr,
67 rgb_row,
68 width);
69 }
70
71 EmptyRegisterState();
72 }
73
ConvertYUVToRGB32_SSE(const uint8 * yplane,const uint8 * uplane,const uint8 * vplane,uint8 * rgbframe,int width,int height,int ystride,int uvstride,int rgbstride,YUVType yuv_type)74 void ConvertYUVToRGB32_SSE(const uint8* yplane,
75 const uint8* uplane,
76 const uint8* vplane,
77 uint8* rgbframe,
78 int width,
79 int height,
80 int ystride,
81 int uvstride,
82 int rgbstride,
83 YUVType yuv_type) {
84 unsigned int y_shift = yuv_type;
85 for (int y = 0; y < height; ++y) {
86 uint8* rgb_row = rgbframe + y * rgbstride;
87 const uint8* y_ptr = yplane + y * ystride;
88 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
89 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
90
91 ConvertYUVToRGB32Row_SSE(y_ptr,
92 u_ptr,
93 v_ptr,
94 rgb_row,
95 width);
96 }
97
98 EmptyRegisterState();
99 }
100
101 } // namespace media
102