15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#include "media/base/simd/convert_rgb_to_yuv.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int clip_byte(int x) {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (x > 255)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 255;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (x < 0)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return x;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertRGB32ToYUV_C(const uint8* rgbframe,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* yplane,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* uplane,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* vplane,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int width,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int height,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int rgbstride,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int ystride,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int uvstride) {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int r = 0;
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int g = 1;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int b = 2;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int r = 2;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int g = 1;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int b = 0;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < height; ++i) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 0; j < width; ++j) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Since the input pixel format is RGB32, there are 4 bytes per pixel.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const uint8* pixel = rgbframe + 4 * j;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      yplane[j] = clip_byte(((pixel[r] * 66 + pixel[g] * 129 +
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             pixel[b] * 25 + 128) >> 8) + 16);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i % 2 == 0 && j % 2 == 0) {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        uplane[j / 2] = clip_byte(((pixel[r] * -38 + pixel[g] * -74 +
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   pixel[b] * 112 + 128) >> 8) + 128);
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        vplane[j / 2] = clip_byte(((pixel[r] * 112 + pixel[g] * -94 +
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    pixel[b] * -18 + 128) >> 8) + 128);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rgbframe += rgbstride;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    yplane += ystride;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i % 2 == 0) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uplane += uvstride;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vplane += uvstride;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertRGB24ToYUV_C(const uint8* rgbframe,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* yplane,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* uplane,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* vplane,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int width,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int height,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int rgbstride,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int ystride,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int uvstride) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < height; ++i) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 0; j < width; ++j) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Since the input pixel format is RGB24, there are 3 bytes per pixel.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const uint8* pixel = rgbframe + 3 * j;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      yplane[j] = clip_byte(((pixel[2] * 66 + pixel[1] * 129 +
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              pixel[0] * 25 + 128) >> 8) + 16);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i % 2 == 0 && j % 2 == 0) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uplane[j / 2] = clip_byte(((pixel[2] * -38 + pixel[1] * -74 +
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    pixel[0] * 112 + 128) >> 8) + 128);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        vplane[j / 2] = clip_byte(((pixel[2] * 112 + pixel[1] * -94 +
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    pixel[0] * -18 + 128) >> 8) + 128);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rgbframe += rgbstride;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    yplane += ystride;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i % 2 == 0) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uplane += uvstride;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vplane += uvstride;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
92