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