convert_yuv_to_rgb.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)#ifndef MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/yuv_convert.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ConvertYUVToRGB32Proc)(const uint8*,
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const uint8*,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const uint8*,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      uint8*,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      YUVType);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_C(const uint8* yplane,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const uint8* uplane,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const uint8* vplane,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint8* rgbframe,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int width,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int height,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int ystride,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int uvstride,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int rgbstride,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         YUVType yuv_type);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_SSE(const uint8* yplane,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* uplane,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* vplane,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint8* rgbframe,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int width,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int height,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int ystride,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int uvstride,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int rgbstride,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           YUVType yuv_type);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32_MMX(const uint8* yplane,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* uplane,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const uint8* vplane,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint8* rgbframe,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int width,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int height,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int ystride,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int uvstride,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int rgbstride,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           YUVType yuv_type);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assembly functions are declared without namespace.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We use ptrdiff_t instead of int for yasm routine parameters to portably
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sign-extend int. On Win64, MSVC does not sign-extend the value in the stack
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// home of int function parameters, and yasm routines are unaware of this lack
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of extension and fault.  ptrdiff_t is portably sign-extended and fixes this
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// issue on at least Win64.  The C-equivalent RowProc versions' prototypes
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// include the same change to ptrdiff_t to reuse the typedefs.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ConvertYUVToRGB32RowProc)(const uint8*,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const uint8*,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const uint8*,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          uint8*,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          ptrdiff_t);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*ScaleYUVToRGB32RowProc)(const uint8*,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const uint8*,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const uint8*,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       uint8*,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       ptrdiff_t,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       ptrdiff_t);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_C(const uint8* yplane,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* uplane,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* vplane,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint8* rgbframe,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ptrdiff_t width);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_MMX(const uint8* yplane,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const uint8* uplane,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const uint8* vplane,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              uint8* rgbframe,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ptrdiff_t width);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ConvertYUVToRGB32Row_SSE(const uint8* yplane,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const uint8* uplane,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const uint8* vplane,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              uint8* rgbframe,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ptrdiff_t width);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_C(const uint8* y_buf,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const uint8* u_buf,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const uint8* v_buf,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint8* rgb_buf,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ptrdiff_t width,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ptrdiff_t source_dx);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_MMX(const uint8* y_buf,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* u_buf,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* v_buf,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint8* rgb_buf,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ptrdiff_t width,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ptrdiff_t source_dx);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_SSE(const uint8* y_buf,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* u_buf,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const uint8* v_buf,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint8* rgb_buf,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ptrdiff_t width,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ptrdiff_t source_dx);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScaleYUVToRGB32Row_SSE2_X64(const uint8* y_buf,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const uint8* u_buf,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const uint8* v_buf,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 uint8* rgb_buf,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 ptrdiff_t width,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 ptrdiff_t source_dx);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_C(const uint8* y_buf,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const uint8* u_buf,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const uint8* v_buf,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                uint8* rgb_buf,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                ptrdiff_t width,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                ptrdiff_t source_dx);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32RowWithRange_C(const uint8* y_buf,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const uint8* u_buf,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const uint8* v_buf,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         uint8* rgb_buf,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int dest_width,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int source_x,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int source_dx);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_MMX(const uint8* y_buf,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const uint8* u_buf,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const uint8* v_buf,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint8* rgb_buf,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  ptrdiff_t width,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  ptrdiff_t source_dx);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_SSE(const uint8* y_buf,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const uint8* u_buf,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const uint8* v_buf,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint8* rgb_buf,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  ptrdiff_t width,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  ptrdiff_t source_dx);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LinearScaleYUVToRGB32Row_MMX_X64(const uint8* y_buf,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const uint8* u_buf,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const uint8* v_buf,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      uint8* rgb_buf,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ptrdiff_t width,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ptrdiff_t source_dx);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // extern "C"
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_BASE_SIMD_CONVERT_YUV_TO_RGB_H_
167