Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Side by Side Diff: media/base/simd/convert_rgb_to_yuv_sse2.cc

Issue 656663002: Fix type truncation warnings in YUV-related code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove erroneous pragma Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | media/base/simd/filter_yuv.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "build/build_config.h" 5 #include "build/build_config.h"
6 #include "media/base/simd/convert_rgb_to_yuv.h" 6 #include "media/base/simd/convert_rgb_to_yuv.h"
7 #include "media/base/simd/yuv_to_rgb_table.h" 7 #include "media/base/simd/yuv_to_rgb_table.h"
8 8
9 #if defined(COMPILER_MSVC) 9 #if defined(COMPILER_MSVC)
10 #include <intrin.h> 10 #include <intrin.h>
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 }; 43 };
44 #endif 44 #endif
45 45
46 #undef INT16_FIX 46 #undef INT16_FIX
47 47
48 // This is the final offset for the conversion from signed yuv values to 48 // This is the final offset for the conversion from signed yuv values to
49 // unsigned values. It is arranged so that offset of 16 is applied to Y 49 // unsigned values. It is arranged so that offset of 16 is applied to Y
50 // components and 128 is added to UV components for 2 pixels. 50 // components and 128 is added to UV components for 2 pixels.
51 SIMD_ALIGNED(const int32 kYOffset[4]) = {16, 16, 16, 16}; 51 SIMD_ALIGNED(const int32 kYOffset[4]) = {16, 16, 16, 16};
52 52
53 static inline int Clamp(int value) { 53 static inline uint8 Clamp(int value) {
54 if (value < 0) 54 if (value < 0)
55 return 0; 55 return 0;
56 if (value > 255) 56 if (value > 255)
57 return 255; 57 return 255;
58 return value; 58 return static_cast<uint8>(value);
59 } 59 }
60 60
61 static inline int RGBToY(int r, int g, int b) { 61 static inline uint8 RGBToY(int r, int g, int b) {
62 int y = ConvertRGBAToYUV_kTable[0] * b + 62 int y = ConvertRGBAToYUV_kTable[0] * b +
63 ConvertRGBAToYUV_kTable[1] * g + 63 ConvertRGBAToYUV_kTable[1] * g +
64 ConvertRGBAToYUV_kTable[2] * r; 64 ConvertRGBAToYUV_kTable[2] * r;
65 y >>= FIX_SHIFT; 65 y >>= FIX_SHIFT;
66 return Clamp(y + 16); 66 return Clamp(y + 16);
67 } 67 }
68 68
69 static inline int RGBToU(int r, int g, int b, int shift) { 69 static inline uint8 RGBToU(int r, int g, int b, int shift) {
70 int u = ConvertRGBAToYUV_kTable[8] * b + 70 int u = ConvertRGBAToYUV_kTable[8] * b +
71 ConvertRGBAToYUV_kTable[9] * g + 71 ConvertRGBAToYUV_kTable[9] * g +
72 ConvertRGBAToYUV_kTable[10] * r; 72 ConvertRGBAToYUV_kTable[10] * r;
73 u >>= FIX_SHIFT + shift; 73 u >>= FIX_SHIFT + shift;
74 return Clamp(u + 128); 74 return Clamp(u + 128);
75 } 75 }
76 76
77 static inline int RGBToV(int r, int g, int b, int shift) { 77 static inline uint8 RGBToV(int r, int g, int b, int shift) {
78 int v = ConvertRGBAToYUV_kTable[16] * b + 78 int v = ConvertRGBAToYUV_kTable[16] * b +
79 ConvertRGBAToYUV_kTable[17] * g + 79 ConvertRGBAToYUV_kTable[17] * g +
80 ConvertRGBAToYUV_kTable[18] * r; 80 ConvertRGBAToYUV_kTable[18] * r;
81 v >>= FIX_SHIFT + shift; 81 v >>= FIX_SHIFT + shift;
82 return Clamp(v + 128); 82 return Clamp(v + 128);
83 } 83 }
84 84
85 #define CONVERT_Y(rgb_buf, y_buf) \ 85 #define CONVERT_Y(rgb_buf, y_buf) \
86 b = *rgb_buf++; \ 86 b = *rgb_buf++; \
87 g = *rgb_buf++; \ 87 g = *rgb_buf++; \
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 _mm_load_si128( 262 _mm_load_si128(
263 reinterpret_cast<const __m128i*>(ConvertRGBAToYUV_kTable + 8))); 263 reinterpret_cast<const __m128i*>(ConvertRGBAToYUV_kTable + 8)));
264 u_a_b = _mm_add_epi32(_mm_shuffle_epi32(u_a_b, ((3 << 2) | 1)), 264 u_a_b = _mm_add_epi32(_mm_shuffle_epi32(u_a_b, ((3 << 2) | 1)),
265 _mm_shuffle_epi32(u_a_b, (2 << 2))); 265 _mm_shuffle_epi32(u_a_b, (2 << 2)));
266 // Right shift 14 because of 12 from fixed point and 2 from subsampling. 266 // Right shift 14 because of 12 from fixed point and 2 from subsampling.
267 u_a_b = _mm_srai_epi32(u_a_b, FIX_SHIFT + 2); 267 u_a_b = _mm_srai_epi32(u_a_b, FIX_SHIFT + 2);
268 __m128i uv_offset = _mm_slli_epi32(y_offset, 3); 268 __m128i uv_offset = _mm_slli_epi32(y_offset, 3);
269 u_a_b = _mm_add_epi32(u_a_b, uv_offset); 269 u_a_b = _mm_add_epi32(u_a_b, uv_offset);
270 u_a_b = _mm_packs_epi32(u_a_b, u_a_b); 270 u_a_b = _mm_packs_epi32(u_a_b, u_a_b);
271 u_a_b = _mm_packus_epi16(u_a_b, u_a_b); 271 u_a_b = _mm_packus_epi16(u_a_b, u_a_b);
272 *reinterpret_cast<uint16*>(u_buf) = _mm_extract_epi16(u_a_b, 0); 272 *reinterpret_cast<uint16*>(u_buf) =
273 static_cast<uint16>(_mm_extract_epi16(u_a_b, 0));
273 u_buf += 2; 274 u_buf += 2;
274 275
275 __m128i v_a_b = _mm_madd_epi16( 276 __m128i v_a_b = _mm_madd_epi16(
276 rgb_abef_cdgh, 277 rgb_abef_cdgh,
277 _mm_load_si128( 278 _mm_load_si128(
278 reinterpret_cast<const __m128i*>(ConvertRGBAToYUV_kTable + 16))); 279 reinterpret_cast<const __m128i*>(ConvertRGBAToYUV_kTable + 16)));
279 v_a_b = _mm_add_epi32(_mm_shuffle_epi32(v_a_b, ((3 << 2) | 1)), 280 v_a_b = _mm_add_epi32(_mm_shuffle_epi32(v_a_b, ((3 << 2) | 1)),
280 _mm_shuffle_epi32(v_a_b, (2 << 2))); 281 _mm_shuffle_epi32(v_a_b, (2 << 2)));
281 v_a_b = _mm_srai_epi32(v_a_b, FIX_SHIFT + 2); 282 v_a_b = _mm_srai_epi32(v_a_b, FIX_SHIFT + 2);
282 v_a_b = _mm_add_epi32(v_a_b, uv_offset); 283 v_a_b = _mm_add_epi32(v_a_b, uv_offset);
283 v_a_b = _mm_packs_epi32(v_a_b, v_a_b); 284 v_a_b = _mm_packs_epi32(v_a_b, v_a_b);
284 v_a_b = _mm_packus_epi16(v_a_b, v_a_b); 285 v_a_b = _mm_packus_epi16(v_a_b, v_a_b);
285 *reinterpret_cast<uint16*>(v_buf) = _mm_extract_epi16(v_a_b, 0); 286 *reinterpret_cast<uint16*>(v_buf) =
287 static_cast<uint16>(_mm_extract_epi16(v_a_b, 0));
286 v_buf += 2; 288 v_buf += 2;
287 289
288 rgb_buf_1 += 16; 290 rgb_buf_1 += 16;
289 rgb_buf_2 += 16; 291 rgb_buf_2 += 16;
290 292
291 // Move forward by 4 pixels. 293 // Move forward by 4 pixels.
292 width -= 4; 294 width -= 4;
293 } 295 }
294 296
295 // Just use C code to convert the remaining pixels. 297 // Just use C code to convert the remaining pixels.
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 ++vplane; 403 ++vplane;
402 width -= 2; 404 width -= 2;
403 } 405 }
404 406
405 // Handle the last pixel in the last row. 407 // Handle the last pixel in the last row.
406 if (width) 408 if (width)
407 ConvertRGBToYUV_V1H1(rgbframe, yplane, uplane, vplane); 409 ConvertRGBToYUV_V1H1(rgbframe, yplane, uplane, vplane);
408 } 410 }
409 411
410 } // namespace media 412 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/base/simd/filter_yuv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698