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)#if defined(_MSC_VER)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <intrin.h>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mmintrin.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/simd/convert_yuv_to_rgb.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/base/simd/yuv_to_rgb_table.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/yuv_convert.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ConvertYUVAToARGB_MMX(const uint8* yplane,
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const uint8* uplane,
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const uint8* vplane,
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const uint8* aplane,
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           uint8* rgbframe,
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int width,
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int height,
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int ystride,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int uvstride,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int astride,
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int rgbstride,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           YUVType yuv_type) {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  unsigned int y_shift = GetVerticalShift(yuv_type);
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int y = 0; y < height; ++y) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint8* rgb_row = rgbframe + y * rgbstride;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const uint8* y_ptr = yplane + y * ystride;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const uint8* a_ptr = aplane + y * astride;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ConvertYUVAToARGBRow_MMX(y_ptr,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             u_ptr,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             v_ptr,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             a_ptr,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             rgb_row,
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             width,
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             GetLookupTable(yuv_type));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EmptyRegisterState();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_SSE(const uint8* yplane,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* uplane,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* vplane,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint8* rgbframe,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int width,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int height,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int ystride,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int uvstride,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int rgbstride,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           YUVType yuv_type) {
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  unsigned int y_shift = GetVerticalShift(yuv_type);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int y = 0; y < height; ++y) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* rgb_row = rgbframe + y * rgbstride;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* y_ptr = yplane + y * ystride;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConvertYUVToRGB32Row_SSE(y_ptr,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             u_ptr,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             v_ptr,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             rgb_row,
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             width,
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             GetLookupTable(yuv_type));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EmptyRegisterState();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
78