libswscale/input.c
2dd7a1c0
 /*
18d0a16f
  * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
2dd7a1c0
  *
18d0a16f
  * This file is part of FFmpeg.
2dd7a1c0
  *
18d0a16f
  * FFmpeg is free software; you can redistribute it and/or
2dd7a1c0
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
18d0a16f
  * FFmpeg is distributed in the hope that it will be useful,
2dd7a1c0
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
18d0a16f
  * License along with FFmpeg; if not, write to the Free Software
2dd7a1c0
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <math.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 
 #include "libavutil/avutil.h"
 #include "libavutil/bswap.h"
 #include "libavutil/cpu.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/pixdesc.h"
ba0e6999
 #include "libavutil/avassert.h"
2dd7a1c0
 #include "config.h"
 #include "rgb2rgb.h"
 #include "swscale.h"
 #include "swscale_internal.h"
 
 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
 
37f69cd9
 #define r ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? b_r : r_b)
 #define b ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? r_b : b_r)
2dd7a1c0
 
 static av_always_inline void
f972193a
 rgb64ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
d4956b0b
                     enum AVPixelFormat origin, int32_t *rgb2yuv)
f972193a
 {
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
f972193a
     int i;
     for (i = 0; i < width; i++) {
         unsigned int r_b = input_pixel(&src[i*4+0]);
         unsigned int   g = input_pixel(&src[i*4+1]);
         unsigned int b_r = input_pixel(&src[i*4+2]);
 
d4956b0b
         dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
f972193a
     }
 }
 
 static av_always_inline void
 rgb64ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
                     const uint16_t *src1, const uint16_t *src2,
d4956b0b
                     int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
f972193a
 {
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1==src2);
f972193a
     for (i = 0; i < width; i++) {
         int r_b = input_pixel(&src1[i*4+0]);
         int   g = input_pixel(&src1[i*4+1]);
         int b_r = input_pixel(&src1[i*4+2]);
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
         dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
f972193a
     }
 }
 
 static av_always_inline void
 rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
                           const uint16_t *src1, const uint16_t *src2,
d4956b0b
                           int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
f972193a
 {
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1==src2);
f972193a
     for (i = 0; i < width; i++) {
         int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
         int   g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
         int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
 
d4956b0b
         dstU[i]= (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
         dstV[i]= (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
f972193a
     }
 }
 
 #define rgb64funcs(pattern, BE_LE, origin) \
 static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
d4956b0b
                                     int width, uint32_t *rgb2yuv) \
f972193a
 { \
     const uint16_t *src = (const uint16_t *) _src; \
     uint16_t *dst = (uint16_t *) _dst; \
d4956b0b
     rgb64ToY_c_template(dst, src, width, origin, rgb2yuv); \
f972193a
 } \
  \
 static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
                                     const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
d4956b0b
                                     int width, uint32_t *rgb2yuv) \
f972193a
 { \
     const uint16_t *src1 = (const uint16_t *) _src1, \
                    *src2 = (const uint16_t *) _src2; \
     uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
d4956b0b
     rgb64ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
f972193a
 } \
  \
 static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
                                     const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
d4956b0b
                                     int width, uint32_t *rgb2yuv) \
f972193a
 { \
     const uint16_t *src1 = (const uint16_t *) _src1, \
                    *src2 = (const uint16_t *) _src2; \
     uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
d4956b0b
     rgb64ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
f972193a
 }
 
ac627b3d
 rgb64funcs(rgb, LE, AV_PIX_FMT_RGBA64LE)
 rgb64funcs(rgb, BE, AV_PIX_FMT_RGBA64BE)
37f69cd9
 rgb64funcs(bgr, LE, AV_PIX_FMT_BGRA64LE)
 rgb64funcs(bgr, BE, AV_PIX_FMT_BGRA64BE)
f972193a
 
9b75ae05
 static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
                                                  const uint16_t *src, int width,
d4956b0b
                                                  enum AVPixelFormat origin,
                                                  int32_t *rgb2yuv)
2dd7a1c0
 {
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
2dd7a1c0
     int i;
     for (i = 0; i < width; i++) {
9b75ae05
         unsigned int r_b = input_pixel(&src[i * 3 + 0]);
         unsigned int g   = input_pixel(&src[i * 3 + 1]);
         unsigned int b_r = input_pixel(&src[i * 3 + 2]);
2dd7a1c0
 
d4956b0b
         dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
     }
 }
 
9b75ae05
 static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
                                                   uint16_t *dstV,
                                                   const uint16_t *src1,
                                                   const uint16_t *src2,
                                                   int width,
d4956b0b
                                                   enum AVPixelFormat origin,
                                                   int32_t *rgb2yuv)
2dd7a1c0
 {
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
     for (i = 0; i < width; i++) {
9b75ae05
         int r_b = input_pixel(&src1[i * 3 + 0]);
         int g   = input_pixel(&src1[i * 3 + 1]);
         int b_r = input_pixel(&src1[i * 3 + 2]);
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
         dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
     }
 }
 
9b75ae05
 static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
                                                        uint16_t *dstV,
                                                        const uint16_t *src1,
                                                        const uint16_t *src2,
                                                        int width,
d4956b0b
                                                        enum AVPixelFormat origin,
                                                        int32_t *rgb2yuv)
2dd7a1c0
 {
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
     for (i = 0; i < width; i++) {
9b75ae05
         int r_b = (input_pixel(&src1[6 * i + 0]) +
                    input_pixel(&src1[6 * i + 3]) + 1) >> 1;
         int g   = (input_pixel(&src1[6 * i + 1]) +
                    input_pixel(&src1[6 * i + 4]) + 1) >> 1;
         int b_r = (input_pixel(&src1[6 * i + 2]) +
                    input_pixel(&src1[6 * i + 5]) + 1) >> 1;
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
         dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
     }
 }
 
 #undef r
 #undef b
 #undef input_pixel
 
9b75ae05
 #define rgb48funcs(pattern, BE_LE, origin)                              \
 static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst,              \
                                             const uint8_t *_src,        \
3bbf3f7e
                                             const uint8_t *unused0, const uint8_t *unused1,\
9b75ae05
                                             int width,                  \
d4956b0b
                                             uint32_t *rgb2yuv)          \
9b75ae05
 {                                                                       \
     const uint16_t *src = (const uint16_t *)_src;                       \
     uint16_t *dst       = (uint16_t *)_dst;                             \
d4956b0b
     rgb48ToY_c_template(dst, src, width, origin, rgb2yuv);              \
9b75ae05
 }                                                                       \
                                                                         \
 static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU,            \
                                              uint8_t *_dstV,            \
3bbf3f7e
                                              const uint8_t *unused0,    \
9b75ae05
                                              const uint8_t *_src1,      \
                                              const uint8_t *_src2,      \
                                              int width,                 \
d4956b0b
                                              uint32_t *rgb2yuv)         \
9b75ae05
 {                                                                       \
     const uint16_t *src1 = (const uint16_t *)_src1,                     \
                    *src2 = (const uint16_t *)_src2;                     \
     uint16_t *dstU = (uint16_t *)_dstU,                                 \
              *dstV = (uint16_t *)_dstV;                                 \
d4956b0b
     rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv);        \
9b75ae05
 }                                                                       \
                                                                         \
 static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU,       \
                                                   uint8_t *_dstV,       \
3bbf3f7e
                                                   const uint8_t *unused0,    \
9b75ae05
                                                   const uint8_t *_src1, \
                                                   const uint8_t *_src2, \
                                                   int width,            \
d4956b0b
                                                   uint32_t *rgb2yuv)    \
9b75ae05
 {                                                                       \
     const uint16_t *src1 = (const uint16_t *)_src1,                     \
                    *src2 = (const uint16_t *)_src2;                     \
     uint16_t *dstU = (uint16_t *)_dstU,                                 \
              *dstV = (uint16_t *)_dstV;                                 \
d4956b0b
     rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv);   \
2dd7a1c0
 }
 
716d413c
 rgb48funcs(rgb, LE, AV_PIX_FMT_RGB48LE)
 rgb48funcs(rgb, BE, AV_PIX_FMT_RGB48BE)
 rgb48funcs(bgr, LE, AV_PIX_FMT_BGR48LE)
 rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)
2dd7a1c0
 
716d413c
 #define input_pixel(i) ((origin == AV_PIX_FMT_RGBA ||                      \
                          origin == AV_PIX_FMT_BGRA ||                      \
                          origin == AV_PIX_FMT_ARGB ||                      \
                          origin == AV_PIX_FMT_ABGR)                        \
9b75ae05
                         ? AV_RN32A(&src[(i) * 4])                       \
                         : (isBE(origin) ? AV_RB16(&src[(i) * 2])        \
                                         : AV_RL16(&src[(i) * 2])))
 
3bbf3f7e
 static av_always_inline void rgb16_32ToY_c_template(int16_t *dst,
9b75ae05
                                                     const uint8_t *src,
                                                     int width,
716d413c
                                                     enum AVPixelFormat origin,
9b75ae05
                                                     int shr, int shg,
                                                     int shb, int shp,
                                                     int maskr, int maskg,
                                                     int maskb, int rsh,
d4956b0b
                                                     int gsh, int bsh, int S,
                                                     int32_t *rgb2yuv)
2dd7a1c0
 {
d4956b0b
     const int ry       = rgb2yuv[RY_IDX]<<rsh, gy = rgb2yuv[GY_IDX]<<gsh, by = rgb2yuv[BY_IDX]<<bsh;
18d0a16f
     const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
2dd7a1c0
     int i;
 
     for (i = 0; i < width; i++) {
         int px = input_pixel(i) >> shp;
9b75ae05
         int b  = (px & maskb) >> shb;
         int g  = (px & maskg) >> shg;
         int r  = (px & maskr) >> shr;
2dd7a1c0
 
18d0a16f
         dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
2dd7a1c0
     }
 }
 
3bbf3f7e
 static av_always_inline void rgb16_32ToUV_c_template(int16_t *dstU,
                                                      int16_t *dstV,
9b75ae05
                                                      const uint8_t *src,
                                                      int width,
716d413c
                                                      enum AVPixelFormat origin,
9b75ae05
                                                      int shr, int shg,
                                                      int shb, int shp,
                                                      int maskr, int maskg,
                                                      int maskb, int rsh,
d4956b0b
                                                      int gsh, int bsh, int S,
                                                      int32_t *rgb2yuv)
2dd7a1c0
 {
d4956b0b
     const int ru       = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
               rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh;
18d0a16f
     const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
2dd7a1c0
     int i;
 
     for (i = 0; i < width; i++) {
         int px = input_pixel(i) >> shp;
9b75ae05
         int b  = (px & maskb)   >> shb;
         int g  = (px & maskg)   >> shg;
         int r  = (px & maskr)   >> shr;
2dd7a1c0
 
18d0a16f
         dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
         dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
2dd7a1c0
     }
 }
 
3bbf3f7e
 static av_always_inline void rgb16_32ToUV_half_c_template(int16_t *dstU,
                                                           int16_t *dstV,
9b75ae05
                                                           const uint8_t *src,
                                                           int width,
716d413c
                                                           enum AVPixelFormat origin,
9b75ae05
                                                           int shr, int shg,
                                                           int shb, int shp,
                                                           int maskr, int maskg,
                                                           int maskb, int rsh,
d4956b0b
                                                           int gsh, int bsh, int S,
                                                           int32_t *rgb2yuv)
2dd7a1c0
 {
d4956b0b
     const int ru       = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
               rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh,
9b75ae05
               maskgx   = ~(maskr | maskb);
18d0a16f
     const unsigned rnd = (256U<<(S)) + (1<<(S-6));
2dd7a1c0
     int i;
 
9b75ae05
     maskr |= maskr << 1;
     maskb |= maskb << 1;
     maskg |= maskg << 1;
2dd7a1c0
     for (i = 0; i < width; i++) {
293d5d7a
         unsigned px0 = input_pixel(2 * i + 0) >> shp;
         unsigned px1 = input_pixel(2 * i + 1) >> shp;
2dd7a1c0
         int b, r, g = (px0 & maskgx) + (px1 & maskgx);
         int rb = px0 + px1 - g;
 
         b = (rb & maskb) >> shb;
9b75ae05
         if (shp ||
716d413c
             origin == AV_PIX_FMT_BGR565LE || origin == AV_PIX_FMT_BGR565BE ||
             origin == AV_PIX_FMT_RGB565LE || origin == AV_PIX_FMT_RGB565BE) {
2dd7a1c0
             g >>= shg;
         } else {
9b75ae05
             g = (g & maskg) >> shg;
2dd7a1c0
         }
         r = (rb & maskr) >> shr;
 
18d0a16f
         dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
         dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
2dd7a1c0
     }
 }
 
 #undef input_pixel
 
9b75ae05
 #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr,          \
                          maskg, maskb, rsh, gsh, bsh, S)                \
3bbf3f7e
 static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,            \
d4956b0b
                           int width, uint32_t *tab)                     \
9b75ae05
 {                                                                       \
3bbf3f7e
     rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp,    \
d4956b0b
                            maskr, maskg, maskb, rsh, gsh, bsh, S, tab); \
9b75ae05
 }                                                                       \
                                                                         \
 static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV,                \
3bbf3f7e
                            const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy,    \
d4956b0b
                            int width, uint32_t *tab)                    \
9b75ae05
 {                                                                       \
3bbf3f7e
     rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt,                \
9b75ae05
                             shr, shg, shb, shp,                         \
d4956b0b
                             maskr, maskg, maskb, rsh, gsh, bsh, S, tab);\
9b75ae05
 }                                                                       \
                                                                         \
 static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV,           \
3bbf3f7e
                                 const uint8_t *unused0, const uint8_t *src,                     \
9b75ae05
                                 const uint8_t *dummy,                   \
d4956b0b
                                 int width, uint32_t *tab)               \
9b75ae05
 {                                                                       \
3bbf3f7e
     rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt,           \
9b75ae05
                                  shr, shg, shb, shp,                    \
                                  maskr, maskg, maskb,                   \
d4956b0b
                                  rsh, gsh, bsh, S, tab);                \
9b75ae05
 }
 
716d413c
 rgb16_32_wrapper(AV_PIX_FMT_BGR32,    bgr32,  16, 0,  0, 0, 0xFF0000, 0xFF00,   0x00FF,  8, 0,  8, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_BGR32_1,  bgr321, 16, 0,  0, 8, 0xFF0000, 0xFF00,   0x00FF,  8, 0,  8, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_RGB32,    rgb32,   0, 0, 16, 0,   0x00FF, 0xFF00, 0xFF0000,  8, 0,  8, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_RGB32_1,  rgb321,  0, 0, 16, 8,   0x00FF, 0xFF00, 0xFF0000,  8, 0,  8, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_BGR565LE, bgr16le, 0, 0,  0, 0,   0x001F, 0x07E0,   0xF800, 11, 5,  0, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_BGR555LE, bgr15le, 0, 0,  0, 0,   0x001F, 0x03E0,   0x7C00, 10, 5,  0, RGB2YUV_SHIFT + 7)
 rgb16_32_wrapper(AV_PIX_FMT_BGR444LE, bgr12le, 0, 0,  0, 0,   0x000F, 0x00F0,   0x0F00,  8, 4,  0, RGB2YUV_SHIFT + 4)
 rgb16_32_wrapper(AV_PIX_FMT_RGB565LE, rgb16le, 0, 0,  0, 0,   0xF800, 0x07E0,   0x001F,  0, 5, 11, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_RGB555LE, rgb15le, 0, 0,  0, 0,   0x7C00, 0x03E0,   0x001F,  0, 5, 10, RGB2YUV_SHIFT + 7)
 rgb16_32_wrapper(AV_PIX_FMT_RGB444LE, rgb12le, 0, 0,  0, 0,   0x0F00, 0x00F0,   0x000F,  0, 4,  8, RGB2YUV_SHIFT + 4)
 rgb16_32_wrapper(AV_PIX_FMT_BGR565BE, bgr16be, 0, 0,  0, 0,   0x001F, 0x07E0,   0xF800, 11, 5,  0, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_BGR555BE, bgr15be, 0, 0,  0, 0,   0x001F, 0x03E0,   0x7C00, 10, 5,  0, RGB2YUV_SHIFT + 7)
 rgb16_32_wrapper(AV_PIX_FMT_BGR444BE, bgr12be, 0, 0,  0, 0,   0x000F, 0x00F0,   0x0F00,  8, 4,  0, RGB2YUV_SHIFT + 4)
 rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0,  0, 0,   0xF800, 0x07E0,   0x001F,  0, 5, 11, RGB2YUV_SHIFT + 8)
 rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0,  0, 0,   0x7C00, 0x03E0,   0x001F,  0, 5, 10, RGB2YUV_SHIFT + 7)
 rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0,  0, 0,   0x0F00, 0x00F0,   0x000F,  0, 4,  8, RGB2YUV_SHIFT + 4)
2dd7a1c0
 
5c858a0a
 static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
18d0a16f
                          const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
d4956b0b
                          int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     uint16_t *dstU = (uint16_t *)_dstU;
     uint16_t *dstV = (uint16_t *)_dstV;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
 
2dd7a1c0
     int i;
3bbf3f7e
     for (i = 0; i < width; i++) {
18d0a16f
         unsigned int g   = gsrc[2*i] + gsrc[2*i+1];
         unsigned int b   = bsrc[2*i] + bsrc[2*i+1];
         unsigned int r   = rsrc[2*i] + rsrc[2*i+1];
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
         dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
18d0a16f
     }
 }
 
f3079858
 static void rgba64leToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
                           const uint8_t *unused2, int width, uint32_t *unused)
f972193a
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
     const uint16_t *src = (const uint16_t *)_src;
f972193a
     int i;
9b75ae05
     for (i = 0; i < width; i++)
f3079858
         dst[i] = AV_RL16(src + 4 * i + 3);
 }
 
 static void rgba64beToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
                           const uint8_t *unused2, int width, uint32_t *unused)
 {
     int16_t *dst = (int16_t *)_dst;
     const uint16_t *src = (const uint16_t *)_src;
     int i;
     for (i = 0; i < width; i++)
         dst[i] = AV_RB16(src + 4 * i + 3);
f972193a
 }
 
5c858a0a
 static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
18d0a16f
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
18d0a16f
     int i;
     for (i=0; i<width; i++) {
         dst[i]= src[4*i]<<6;
     }
 }
 
5c858a0a
 static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
18d0a16f
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
18d0a16f
     int i;
     for (i=0; i<width; i++) {
         dst[i]= src[4*i+3]<<6;
2dd7a1c0
     }
 }
 
5c858a0a
 static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
2dd7a1c0
     int i;
     for (i=0; i<width; i++) {
18d0a16f
         int d= src[i];
 
         dst[i]= (pal[d] >> 24)<<6;
2dd7a1c0
     }
 }
 
5c858a0a
 static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
2dd7a1c0
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         int d = src[i];
2dd7a1c0
 
3bbf3f7e
         dst[i] = (pal[d] & 0xFF)<<6;
2dd7a1c0
     }
 }
 
5c858a0a
 static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
18d0a16f
                            const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
2dd7a1c0
                       int width, uint32_t *pal)
 {
5c858a0a
     uint16_t *dstU = (uint16_t *)_dstU;
     int16_t *dstV = (int16_t *)_dstV;
2dd7a1c0
     int i;
ba0e6999
     av_assert1(src1 == src2);
9b75ae05
     for (i = 0; i < width; i++) {
         int p = pal[src1[i]];
2dd7a1c0
 
3bbf3f7e
         dstU[i] = (uint8_t)(p>> 8)<<6;
         dstV[i] = (uint8_t)(p>>16)<<6;
2dd7a1c0
     }
 }
 
5c858a0a
 static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
2dd7a1c0
     int i, j;
bc0bdda7
     width = (width + 7) >> 3;
     for (i = 0; i < width; i++) {
9b75ae05
         int d = ~src[i];
         for (j = 0; j < 8; j++)
3bbf3f7e
             dst[8*i+j]= ((d>>(7-j))&1) * 16383;
18d0a16f
     }
     if(width&7){
         int d= ~src[i];
3bbf3f7e
         for (j = 0; j < (width&7); j++)
             dst[8*i+j]= ((d>>(7-j))&1) * 16383;
2dd7a1c0
     }
 }
 
5c858a0a
 static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
2dd7a1c0
     int i, j;
bc0bdda7
     width = (width + 7) >> 3;
     for (i = 0; i < width; i++) {
9b75ae05
         int d = src[i];
         for (j = 0; j < 8; j++)
3bbf3f7e
             dst[8*i+j]= ((d>>(7-j))&1) * 16383;
18d0a16f
     }
     if(width&7){
3bbf3f7e
         int d = src[i];
         for (j = 0; j < (width&7); j++)
             dst[8*i+j] = ((d>>(7-j))&1) * 16383;
2dd7a1c0
     }
 }
 
18d0a16f
 static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
2dd7a1c0
                       uint32_t *unused)
 {
     int i;
9b75ae05
     for (i = 0; i < width; i++)
         dst[i] = src[2 * i];
2dd7a1c0
 }
 
18d0a16f
 static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
2dd7a1c0
                        const uint8_t *src2, int width, uint32_t *unused)
 {
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         dstU[i] = src1[4 * i + 1];
         dstV[i] = src1[4 * i + 3];
2dd7a1c0
     }
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
 }
 
ed962414
 static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
92b099da
                        const uint8_t *src2, int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         dstV[i] = src1[4 * i + 1];
         dstU[i] = src1[4 * i + 3];
     }
d98688ef
     av_assert1(src1 == src2);
92b099da
 }
 
ed962414
 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
9b75ae05
                        uint32_t *unused)
2dd7a1c0
 {
     int i;
9b75ae05
     const uint16_t *src = (const uint16_t *)_src;
     uint16_t *dst       = (uint16_t *)_dst;
     for (i = 0; i < width; i++)
2dd7a1c0
         dst[i] = av_bswap16(src[i]);
 }
 
18d0a16f
 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
2dd7a1c0
                         const uint8_t *_src2, int width, uint32_t *unused)
 {
     int i;
9b75ae05
     const uint16_t *src1 = (const uint16_t *)_src1,
     *src2                = (const uint16_t *)_src2;
     uint16_t *dstU       = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
     for (i = 0; i < width; i++) {
2dd7a1c0
         dstU[i] = av_bswap16(src1[i]);
         dstV[i] = av_bswap16(src2[i]);
     }
 }
 
2f5bf2f7
 static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
f84a1b59
                                uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
 }
 
2f5bf2f7
 static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
f84a1b59
                                 uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
 }
 
2f5bf2f7
 static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
f84a1b59
                                uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
 }
 
2f5bf2f7
 static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
f84a1b59
                                 uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
 }
 
052f64ec
 static void read_ayuv64le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
                                uint32_t *unused2)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RL16(src + i * 8 + 2));
 }
 
 
 static void read_ayuv64le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
                                const uint8_t *unused1, int width, uint32_t *unused2)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dstU + i * 2, AV_RL16(src + i * 8 + 4));
         AV_WN16(dstV + i * 2, AV_RL16(src + i * 8 + 6));
     }
 }
 
 static void read_ayuv64le_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
                                 uint32_t *unused2)
 {
     int i;
     for (i = 0; i < width; i++)
         AV_WN16(dst + i * 2, AV_RL16(src + i * 8));
 }
 
2dd7a1c0
 /* This is almost identical to the previous, end exists only because
9b75ae05
  * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
18d0a16f
 static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
2dd7a1c0
                       uint32_t *unused)
 {
     int i;
9b75ae05
     for (i = 0; i < width; i++)
         dst[i] = src[2 * i + 1];
2dd7a1c0
 }
 
18d0a16f
 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
2dd7a1c0
                        const uint8_t *src2, int width, uint32_t *unused)
 {
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         dstU[i] = src1[4 * i + 0];
         dstV[i] = src1[4 * i + 2];
2dd7a1c0
     }
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
 }
 
 static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
                                         const uint8_t *src, int width)
 {
     int i;
     for (i = 0; i < width; i++) {
9b75ae05
         dst1[i] = src[2 * i + 0];
         dst2[i] = src[2 * i + 1];
2dd7a1c0
     }
 }
 
 static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
18d0a16f
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
2dd7a1c0
                        int width, uint32_t *unused)
 {
     nvXXtoUV_c(dstU, dstV, src1, width);
 }
 
 static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
18d0a16f
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
2dd7a1c0
                        int width, uint32_t *unused)
 {
     nvXXtoUV_c(dstV, dstU, src1, width);
 }
 
2e31434d
 static void p010LEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
                         const uint8_t *unused2, int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dst + i * 2, AV_RL16(src + i * 2) >> 6);
     }
 }
 
 static void p010BEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
                         const uint8_t *unused2, int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dst + i * 2, AV_RB16(src + i * 2) >> 6);
     }
 }
 
 static void p010LEToUV_c(uint8_t *dstU, uint8_t *dstV,
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0) >> 6);
         AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2) >> 6);
     }
 }
 
 static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0) >> 6);
         AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2) >> 6);
     }
 }
 
4c2176d4
 static void p016LEToUV_c(uint8_t *dstU, uint8_t *dstV,
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0));
         AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2));
     }
 }
 
 static void p016BEToUV_c(uint8_t *dstU, uint8_t *dstV,
                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *unused)
 {
     int i;
     for (i = 0; i < width; i++) {
         AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0));
         AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2));
     }
 }
 
2dd7a1c0
 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
 
5c858a0a
 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
d4956b0b
                        int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
2dd7a1c0
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         int b = src[i * 3 + 0];
         int g = src[i * 3 + 1];
         int r = src[i * 3 + 2];
2dd7a1c0
 
d4956b0b
         dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
2dd7a1c0
     }
 }
 
5c858a0a
 static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
d4956b0b
                         const uint8_t *src2, int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dstU = (int16_t *)_dstU;
     int16_t *dstV = (int16_t *)_dstV;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
2dd7a1c0
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         int b = src1[3 * i + 0];
         int g = src1[3 * i + 1];
         int r = src1[3 * i + 2];
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
         dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
2dd7a1c0
     }
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
 }
 
5c858a0a
 static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
d4956b0b
                              const uint8_t *src2, int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dstU = (int16_t *)_dstU;
     int16_t *dstV = (int16_t *)_dstV;
2dd7a1c0
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
9b75ae05
     for (i = 0; i < width; i++) {
         int b = src1[6 * i + 0] + src1[6 * i + 3];
         int g = src1[6 * i + 1] + src1[6 * i + 4];
         int r = src1[6 * i + 2] + src1[6 * i + 5];
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
         dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
2dd7a1c0
     }
ba0e6999
     av_assert1(src1 == src2);
2dd7a1c0
 }
 
5c858a0a
 static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
d4956b0b
                        uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dst = (int16_t *)_dst;
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
2dd7a1c0
     int i;
9b75ae05
     for (i = 0; i < width; i++) {
         int r = src[i * 3 + 0];
         int g = src[i * 3 + 1];
         int b = src[i * 3 + 2];
2dd7a1c0
 
d4956b0b
         dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
2dd7a1c0
     }
 }
 
5c858a0a
 static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
d4956b0b
                         const uint8_t *src2, int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dstU = (int16_t *)_dstU;
     int16_t *dstV = (int16_t *)_dstV;
2dd7a1c0
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1 == src2);
9b75ae05
     for (i = 0; i < width; i++) {
         int r = src1[3 * i + 0];
         int g = src1[3 * i + 1];
         int b = src1[3 * i + 2];
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
         dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
2dd7a1c0
     }
 }
 
5c858a0a
 static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
d4956b0b
                              const uint8_t *src2, int width, uint32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     int16_t *dstU = (int16_t *)_dstU;
     int16_t *dstV = (int16_t *)_dstV;
2dd7a1c0
     int i;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
ba0e6999
     av_assert1(src1 == src2);
9b75ae05
     for (i = 0; i < width; i++) {
         int r = src1[6 * i + 0] + src1[6 * i + 3];
         int g = src1[6 * i + 1] + src1[6 * i + 4];
         int b = src1[6 * i + 2] + src1[6 * i + 5];
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
         dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
2dd7a1c0
     }
 }
 
d4956b0b
 static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     uint16_t *dst = (uint16_t *)_dst;
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
2dd7a1c0
     int i;
     for (i = 0; i < width; i++) {
         int g = src[0][i];
         int b = src[1][i];
         int r = src[2][i];
 
d4956b0b
         dst[i] = (ry*r + gy*g + by*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
2dd7a1c0
     }
 }
 
5c057433
 static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused)
 {
     uint16_t *dst = (uint16_t *)_dst;
     int i;
     for (i = 0; i < width; i++)
         dst[i] = src[3][i] << 6;
 }
 
d4956b0b
 static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
2dd7a1c0
 {
5c858a0a
     uint16_t *dstU = (uint16_t *)_dstU;
     uint16_t *dstV = (uint16_t *)_dstV;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
2dd7a1c0
     int i;
     for (i = 0; i < width; i++) {
404410a5
         int g = src[0][i];
         int b = src[1][i];
         int r = src[2][i];
2dd7a1c0
 
d4956b0b
         dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
         dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
2dd7a1c0
     }
 }
 
404410a5
 #define rdpx(src) \
     is_be ? AV_RB16(src) : AV_RL16(src)
 static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
d4956b0b
                                                int width, int bpc, int is_be, int32_t *rgb2yuv)
2dd7a1c0
 {
     int i;
9b75ae05
     const uint16_t **src = (const uint16_t **)_src;
     uint16_t *dst        = (uint16_t *)_dst;
d4956b0b
     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
a4b55bbb
     int shift = bpc < 16 ? bpc : 14;
2dd7a1c0
     for (i = 0; i < width; i++) {
404410a5
         int g = rdpx(src[0] + i);
         int b = rdpx(src[1] + i);
         int r = rdpx(src[2] + i);
2dd7a1c0
 
a4b55bbb
         dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
2dd7a1c0
     }
 }
 
df36257a
 static av_always_inline void planar_rgb16_to_a(uint8_t *_dst, const uint8_t *_src[4],
                                                int width, int bpc, int is_be, int32_t *rgb2yuv)
 {
     int i;
     const uint16_t **src = (const uint16_t **)_src;
     uint16_t *dst        = (uint16_t *)_dst;
     int shift = bpc < 16 ? bpc : 14;
 
     for (i = 0; i < width; i++) {
         dst[i] = rdpx(src[3] + i) << (14 - shift);
     }
 }
 
404410a5
 static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
                                                 const uint8_t *_src[4], int width,
d4956b0b
                                                 int bpc, int is_be, int32_t *rgb2yuv)
2dd7a1c0
 {
     int i;
9b75ae05
     const uint16_t **src = (const uint16_t **)_src;
     uint16_t *dstU       = (uint16_t *)_dstU;
     uint16_t *dstV       = (uint16_t *)_dstV;
d4956b0b
     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
a4b55bbb
     int shift = bpc < 16 ? bpc : 14;
2dd7a1c0
     for (i = 0; i < width; i++) {
404410a5
         int g = rdpx(src[0] + i);
         int b = rdpx(src[1] + i);
         int r = rdpx(src[2] + i);
2dd7a1c0
 
a4b55bbb
         dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
         dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
2dd7a1c0
     }
 }
404410a5
 #undef rdpx
 
c3dcd3a2
 #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian)                                    \
 static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],              \
                                                   int w, int32_t *rgb2yuv)                          \
 {                                                                                                   \
     planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv);                                         \
 }                                                                                                   \
 static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                    \
                                                    const uint8_t *src[4], int w, int32_t *rgb2yuv)  \
 {                                                                                                   \
     planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                                 \
 }                                                                                                   \
 
a9c20598
 #define rgb9plus_planar_transparency_funcs(nbits)                           \
 static void planar_rgb##nbits##le_to_a(uint8_t *dst, const uint8_t *src[4], \
                                        int w, int32_t *rgb2yuv)             \
 {                                                                           \
     planar_rgb16_to_a(dst, src, w, nbits, 0, rgb2yuv);                      \
 }                                                                           \
 static void planar_rgb##nbits##be_to_a(uint8_t *dst, const uint8_t *src[4], \
                                        int w, int32_t *rgb2yuv)             \
 {                                                                           \
     planar_rgb16_to_a(dst, src, w, nbits, 1, rgb2yuv);                      \
 }
 
c3dcd3a2
 #define rgb9plus_planar_funcs(nbits)            \
     rgb9plus_planar_funcs_endian(nbits, le, 0)  \
     rgb9plus_planar_funcs_endian(nbits, be, 1)
 
 rgb9plus_planar_funcs(9)
 rgb9plus_planar_funcs(10)
 rgb9plus_planar_funcs(12)
 rgb9plus_planar_funcs(14)
 rgb9plus_planar_funcs(16)
2dd7a1c0
 
a9c20598
 rgb9plus_planar_transparency_funcs(10)
 rgb9plus_planar_transparency_funcs(12)
 rgb9plus_planar_transparency_funcs(16)
 
2dd7a1c0
 av_cold void ff_sws_init_input_funcs(SwsContext *c)
 {
716d413c
     enum AVPixelFormat srcFormat = c->srcFormat;
2dd7a1c0
 
     c->chrToYV12 = NULL;
9b75ae05
     switch (srcFormat) {
716d413c
     case AV_PIX_FMT_YUYV422:
9b75ae05
         c->chrToYV12 = yuy2ToUV_c;
         break;
92b099da
     case AV_PIX_FMT_YVYU422:
         c->chrToYV12 = yvy2ToUV_c;
         break;
716d413c
     case AV_PIX_FMT_UYVY422:
9b75ae05
         c->chrToYV12 = uyvyToUV_c;
         break;
716d413c
     case AV_PIX_FMT_NV12:
9b75ae05
         c->chrToYV12 = nv12ToUV_c;
         break;
716d413c
     case AV_PIX_FMT_NV21:
9b75ae05
         c->chrToYV12 = nv21ToUV_c;
         break;
716d413c
     case AV_PIX_FMT_RGB8:
     case AV_PIX_FMT_BGR8:
     case AV_PIX_FMT_PAL8:
     case AV_PIX_FMT_BGR4_BYTE:
     case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
         c->chrToYV12 = palToUV_c;
         break;
716d413c
     case AV_PIX_FMT_GBRP9LE:
404410a5
         c->readChrPlanar = planar_rgb9le_to_uv;
         break;
9d30690f
     case AV_PIX_FMT_GBRAP10LE:
716d413c
     case AV_PIX_FMT_GBRP10LE:
404410a5
         c->readChrPlanar = planar_rgb10le_to_uv;
         break;
4170a44b
     case AV_PIX_FMT_GBRAP12LE:
ac627b3d
     case AV_PIX_FMT_GBRP12LE:
fa36f334
         c->readChrPlanar = planar_rgb12le_to_uv;
         break;
ac627b3d
     case AV_PIX_FMT_GBRP14LE:
fa36f334
         c->readChrPlanar = planar_rgb14le_to_uv;
         break;
5c057433
     case AV_PIX_FMT_GBRAP16LE:
716d413c
     case AV_PIX_FMT_GBRP16LE:
9b75ae05
         c->readChrPlanar = planar_rgb16le_to_uv;
         break;
716d413c
     case AV_PIX_FMT_GBRP9BE:
404410a5
         c->readChrPlanar = planar_rgb9be_to_uv;
         break;
9d30690f
     case AV_PIX_FMT_GBRAP10BE:
716d413c
     case AV_PIX_FMT_GBRP10BE:
404410a5
         c->readChrPlanar = planar_rgb10be_to_uv;
         break;
4170a44b
     case AV_PIX_FMT_GBRAP12BE:
ac627b3d
     case AV_PIX_FMT_GBRP12BE:
fa36f334
         c->readChrPlanar = planar_rgb12be_to_uv;
         break;
ac627b3d
     case AV_PIX_FMT_GBRP14BE:
fa36f334
         c->readChrPlanar = planar_rgb14be_to_uv;
         break;
5c057433
     case AV_PIX_FMT_GBRAP16BE:
716d413c
     case AV_PIX_FMT_GBRP16BE:
9b75ae05
         c->readChrPlanar = planar_rgb16be_to_uv;
         break;
5c057433
     case AV_PIX_FMT_GBRAP:
716d413c
     case AV_PIX_FMT_GBRP:
9b75ae05
         c->readChrPlanar = planar_rgb_to_uv;
         break;
2dd7a1c0
 #if HAVE_BIGENDIAN
716d413c
     case AV_PIX_FMT_YUV420P9LE:
de8e096c
     case AV_PIX_FMT_YUV422P9LE:
     case AV_PIX_FMT_YUV444P9LE:
     case AV_PIX_FMT_YUV420P10LE:
716d413c
     case AV_PIX_FMT_YUV422P10LE:
711d8812
     case AV_PIX_FMT_YUV440P10LE:
716d413c
     case AV_PIX_FMT_YUV444P10LE:
fa8db3f5
     case AV_PIX_FMT_YUV420P12LE:
ac627b3d
     case AV_PIX_FMT_YUV422P12LE:
711d8812
     case AV_PIX_FMT_YUV440P12LE:
ac627b3d
     case AV_PIX_FMT_YUV444P12LE:
fa8db3f5
     case AV_PIX_FMT_YUV420P14LE:
ac627b3d
     case AV_PIX_FMT_YUV422P14LE:
     case AV_PIX_FMT_YUV444P14LE:
716d413c
     case AV_PIX_FMT_YUV420P16LE:
     case AV_PIX_FMT_YUV422P16LE:
     case AV_PIX_FMT_YUV444P16LE:
a201639a
 
     case AV_PIX_FMT_YUVA420P9LE:
de8e096c
     case AV_PIX_FMT_YUVA422P9LE:
     case AV_PIX_FMT_YUVA444P9LE:
a201639a
     case AV_PIX_FMT_YUVA420P10LE:
38fdf725
     case AV_PIX_FMT_YUVA422P10LE:
     case AV_PIX_FMT_YUVA444P10LE:
a201639a
     case AV_PIX_FMT_YUVA420P16LE:
     case AV_PIX_FMT_YUVA422P16LE:
     case AV_PIX_FMT_YUVA444P16LE:
9b75ae05
         c->chrToYV12 = bswap16UV_c;
         break;
2dd7a1c0
 #else
716d413c
     case AV_PIX_FMT_YUV420P9BE:
de8e096c
     case AV_PIX_FMT_YUV422P9BE:
     case AV_PIX_FMT_YUV444P9BE:
716d413c
     case AV_PIX_FMT_YUV420P10BE:
de8e096c
     case AV_PIX_FMT_YUV422P10BE:
711d8812
     case AV_PIX_FMT_YUV440P10BE:
716d413c
     case AV_PIX_FMT_YUV444P10BE:
fa8db3f5
     case AV_PIX_FMT_YUV420P12BE:
     case AV_PIX_FMT_YUV422P12BE:
711d8812
     case AV_PIX_FMT_YUV440P12BE:
ac627b3d
     case AV_PIX_FMT_YUV444P12BE:
     case AV_PIX_FMT_YUV420P14BE:
fa8db3f5
     case AV_PIX_FMT_YUV422P14BE:
     case AV_PIX_FMT_YUV444P14BE:
716d413c
     case AV_PIX_FMT_YUV420P16BE:
     case AV_PIX_FMT_YUV422P16BE:
     case AV_PIX_FMT_YUV444P16BE:
a201639a
 
     case AV_PIX_FMT_YUVA420P9BE:
de8e096c
     case AV_PIX_FMT_YUVA422P9BE:
     case AV_PIX_FMT_YUVA444P9BE:
a201639a
     case AV_PIX_FMT_YUVA420P10BE:
38fdf725
     case AV_PIX_FMT_YUVA422P10BE:
     case AV_PIX_FMT_YUVA444P10BE:
a201639a
     case AV_PIX_FMT_YUVA420P16BE:
     case AV_PIX_FMT_YUVA422P16BE:
     case AV_PIX_FMT_YUVA444P16BE:
9b75ae05
         c->chrToYV12 = bswap16UV_c;
         break;
2dd7a1c0
 #endif
052f64ec
     case AV_PIX_FMT_AYUV64LE:
         c->chrToYV12 = read_ayuv64le_UV_c;
         break;
2e31434d
     case AV_PIX_FMT_P010LE:
         c->chrToYV12 = p010LEToUV_c;
         break;
     case AV_PIX_FMT_P010BE:
         c->chrToYV12 = p010BEToUV_c;
         break;
4c2176d4
     case AV_PIX_FMT_P016LE:
         c->chrToYV12 = p016LEToUV_c;
         break;
     case AV_PIX_FMT_P016BE:
         c->chrToYV12 = p016BEToUV_c;
         break;
2dd7a1c0
     }
     if (c->chrSrcHSubSample) {
9b75ae05
         switch (srcFormat) {
ac627b3d
         case AV_PIX_FMT_RGBA64BE:
3bbf3f7e
             c->chrToYV12 = rgb64BEToUV_half_c;
             break;
ac627b3d
         case AV_PIX_FMT_RGBA64LE:
3bbf3f7e
             c->chrToYV12 = rgb64LEToUV_half_c;
             break;
37f69cd9
         case AV_PIX_FMT_BGRA64BE:
             c->chrToYV12 = bgr64BEToUV_half_c;
             break;
         case AV_PIX_FMT_BGRA64LE:
             c->chrToYV12 = bgr64LEToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB48BE:
9b75ae05
             c->chrToYV12 = rgb48BEToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB48LE:
9b75ae05
             c->chrToYV12 = rgb48LEToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR48BE:
9b75ae05
             c->chrToYV12 = bgr48BEToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR48LE:
9b75ae05
             c->chrToYV12 = bgr48LEToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB32:
9b75ae05
             c->chrToYV12 = bgr32ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB32_1:
9b75ae05
             c->chrToYV12 = bgr321ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR24:
9b75ae05
             c->chrToYV12 = bgr24ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR565LE:
9b75ae05
             c->chrToYV12 = bgr16leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR565BE:
9b75ae05
             c->chrToYV12 = bgr16beToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR555LE:
9b75ae05
             c->chrToYV12 = bgr15leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR555BE:
9b75ae05
             c->chrToYV12 = bgr15beToUV_half_c;
             break;
5c057433
         case AV_PIX_FMT_GBRAP:
         case AV_PIX_FMT_GBRP:
3bbf3f7e
             c->chrToYV12 = gbr24pToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR444LE:
9b75ae05
             c->chrToYV12 = bgr12leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR444BE:
9b75ae05
             c->chrToYV12 = bgr12beToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR32:
9b75ae05
             c->chrToYV12 = rgb32ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_BGR32_1:
9b75ae05
             c->chrToYV12 = rgb321ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB24:
9b75ae05
             c->chrToYV12 = rgb24ToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB565LE:
9b75ae05
             c->chrToYV12 = rgb16leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB565BE:
9b75ae05
             c->chrToYV12 = rgb16beToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB555LE:
9b75ae05
             c->chrToYV12 = rgb15leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB555BE:
9b75ae05
             c->chrToYV12 = rgb15beToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB444LE:
9b75ae05
             c->chrToYV12 = rgb12leToUV_half_c;
             break;
716d413c
         case AV_PIX_FMT_RGB444BE:
9b75ae05
             c->chrToYV12 = rgb12beToUV_half_c;
             break;
2dd7a1c0
         }
     } else {
9b75ae05
         switch (srcFormat) {
ac627b3d
         case AV_PIX_FMT_RGBA64BE:
3bbf3f7e
             c->chrToYV12 = rgb64BEToUV_c;
             break;
ac627b3d
         case AV_PIX_FMT_RGBA64LE:
3bbf3f7e
             c->chrToYV12 = rgb64LEToUV_c;
             break;
37f69cd9
         case AV_PIX_FMT_BGRA64BE:
             c->chrToYV12 = bgr64BEToUV_c;
             break;
         case AV_PIX_FMT_BGRA64LE:
             c->chrToYV12 = bgr64LEToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB48BE:
9b75ae05
             c->chrToYV12 = rgb48BEToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB48LE:
9b75ae05
             c->chrToYV12 = rgb48LEToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR48BE:
9b75ae05
             c->chrToYV12 = bgr48BEToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR48LE:
9b75ae05
             c->chrToYV12 = bgr48LEToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB32:
9b75ae05
             c->chrToYV12 = bgr32ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB32_1:
9b75ae05
             c->chrToYV12 = bgr321ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR24:
9b75ae05
             c->chrToYV12 = bgr24ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR565LE:
9b75ae05
             c->chrToYV12 = bgr16leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR565BE:
9b75ae05
             c->chrToYV12 = bgr16beToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR555LE:
9b75ae05
             c->chrToYV12 = bgr15leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR555BE:
9b75ae05
             c->chrToYV12 = bgr15beToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR444LE:
9b75ae05
             c->chrToYV12 = bgr12leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR444BE:
9b75ae05
             c->chrToYV12 = bgr12beToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR32:
9b75ae05
             c->chrToYV12 = rgb32ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_BGR32_1:
9b75ae05
             c->chrToYV12 = rgb321ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB24:
9b75ae05
             c->chrToYV12 = rgb24ToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB565LE:
9b75ae05
             c->chrToYV12 = rgb16leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB565BE:
9b75ae05
             c->chrToYV12 = rgb16beToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB555LE:
9b75ae05
             c->chrToYV12 = rgb15leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB555BE:
9b75ae05
             c->chrToYV12 = rgb15beToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB444LE:
9b75ae05
             c->chrToYV12 = rgb12leToUV_c;
             break;
716d413c
         case AV_PIX_FMT_RGB444BE:
9b75ae05
             c->chrToYV12 = rgb12beToUV_c;
             break;
2dd7a1c0
         }
     }
 
     c->lumToYV12 = NULL;
     c->alpToYV12 = NULL;
     switch (srcFormat) {
716d413c
     case AV_PIX_FMT_GBRP9LE:
404410a5
         c->readLumPlanar = planar_rgb9le_to_y;
         break;
9d30690f
     case AV_PIX_FMT_GBRAP10LE:
         c->readAlpPlanar = planar_rgb10le_to_a;
716d413c
     case AV_PIX_FMT_GBRP10LE:
404410a5
         c->readLumPlanar = planar_rgb10le_to_y;
         break;
4170a44b
     case AV_PIX_FMT_GBRAP12LE:
         c->readAlpPlanar = planar_rgb12le_to_a;
ac627b3d
     case AV_PIX_FMT_GBRP12LE:
fa36f334
         c->readLumPlanar = planar_rgb12le_to_y;
         break;
ac627b3d
     case AV_PIX_FMT_GBRP14LE:
fa36f334
         c->readLumPlanar = planar_rgb14le_to_y;
         break;
5c057433
     case AV_PIX_FMT_GBRAP16LE:
df36257a
         c->readAlpPlanar = planar_rgb16le_to_a;
716d413c
     case AV_PIX_FMT_GBRP16LE:
9b75ae05
         c->readLumPlanar = planar_rgb16le_to_y;
         break;
716d413c
     case AV_PIX_FMT_GBRP9BE:
404410a5
         c->readLumPlanar = planar_rgb9be_to_y;
         break;
9d30690f
     case AV_PIX_FMT_GBRAP10BE:
         c->readAlpPlanar = planar_rgb10be_to_a;
716d413c
     case AV_PIX_FMT_GBRP10BE:
404410a5
         c->readLumPlanar = planar_rgb10be_to_y;
         break;
4170a44b
     case AV_PIX_FMT_GBRAP12BE:
         c->readAlpPlanar = planar_rgb12be_to_a;
ac627b3d
     case AV_PIX_FMT_GBRP12BE:
fa36f334
         c->readLumPlanar = planar_rgb12be_to_y;
         break;
ac627b3d
     case AV_PIX_FMT_GBRP14BE:
fa36f334
         c->readLumPlanar = planar_rgb14be_to_y;
         break;
5c057433
     case AV_PIX_FMT_GBRAP16BE:
df36257a
         c->readAlpPlanar = planar_rgb16be_to_a;
716d413c
     case AV_PIX_FMT_GBRP16BE:
9b75ae05
         c->readLumPlanar = planar_rgb16be_to_y;
         break;
5c057433
     case AV_PIX_FMT_GBRAP:
         c->readAlpPlanar = planar_rgb_to_a;
716d413c
     case AV_PIX_FMT_GBRP:
9b75ae05
         c->readLumPlanar = planar_rgb_to_y;
         break;
2dd7a1c0
 #if HAVE_BIGENDIAN
716d413c
     case AV_PIX_FMT_YUV420P9LE:
de8e096c
     case AV_PIX_FMT_YUV422P9LE:
     case AV_PIX_FMT_YUV444P9LE:
716d413c
     case AV_PIX_FMT_YUV420P10LE:
de8e096c
     case AV_PIX_FMT_YUV422P10LE:
fa8db3f5
     case AV_PIX_FMT_YUV440P10LE:
de8e096c
     case AV_PIX_FMT_YUV444P10LE:
ac627b3d
     case AV_PIX_FMT_YUV420P12LE:
fa8db3f5
     case AV_PIX_FMT_YUV422P12LE:
     case AV_PIX_FMT_YUV440P12LE:
     case AV_PIX_FMT_YUV444P12LE:
ac627b3d
     case AV_PIX_FMT_YUV420P14LE:
fa8db3f5
     case AV_PIX_FMT_YUV422P14LE:
     case AV_PIX_FMT_YUV444P14LE:
716d413c
     case AV_PIX_FMT_YUV420P16LE:
     case AV_PIX_FMT_YUV422P16LE:
     case AV_PIX_FMT_YUV444P16LE:
a201639a
 
de48710c
     case AV_PIX_FMT_GRAY9LE:
b5177c70
     case AV_PIX_FMT_GRAY10LE:
19be5fb7
     case AV_PIX_FMT_GRAY12LE:
716d413c
     case AV_PIX_FMT_GRAY16LE:
4c2176d4
 
     case AV_PIX_FMT_P016LE:
9b75ae05
         c->lumToYV12 = bswap16Y_c;
         break;
a201639a
     case AV_PIX_FMT_YUVA420P9LE:
de8e096c
     case AV_PIX_FMT_YUVA422P9LE:
     case AV_PIX_FMT_YUVA444P9LE:
a201639a
     case AV_PIX_FMT_YUVA420P10LE:
de8e096c
     case AV_PIX_FMT_YUVA422P10LE:
     case AV_PIX_FMT_YUVA444P10LE:
a201639a
     case AV_PIX_FMT_YUVA420P16LE:
     case AV_PIX_FMT_YUVA422P16LE:
     case AV_PIX_FMT_YUVA444P16LE:
9b75ae05
         c->lumToYV12 = bswap16Y_c;
38fdf725
         c->alpToYV12 = bswap16Y_c;
9b75ae05
         break;
2dd7a1c0
 #else
716d413c
     case AV_PIX_FMT_YUV420P9BE:
de8e096c
     case AV_PIX_FMT_YUV422P9BE:
     case AV_PIX_FMT_YUV444P9BE:
716d413c
     case AV_PIX_FMT_YUV420P10BE:
de8e096c
     case AV_PIX_FMT_YUV422P10BE:
fa8db3f5
     case AV_PIX_FMT_YUV440P10BE:
de8e096c
     case AV_PIX_FMT_YUV444P10BE:
ac627b3d
     case AV_PIX_FMT_YUV420P12BE:
fa8db3f5
     case AV_PIX_FMT_YUV422P12BE:
     case AV_PIX_FMT_YUV440P12BE:
     case AV_PIX_FMT_YUV444P12BE:
ac627b3d
     case AV_PIX_FMT_YUV420P14BE:
fa8db3f5
     case AV_PIX_FMT_YUV422P14BE:
     case AV_PIX_FMT_YUV444P14BE:
716d413c
     case AV_PIX_FMT_YUV420P16BE:
     case AV_PIX_FMT_YUV422P16BE:
     case AV_PIX_FMT_YUV444P16BE:
a201639a
 
de48710c
     case AV_PIX_FMT_GRAY9BE:
b5177c70
     case AV_PIX_FMT_GRAY10BE:
19be5fb7
     case AV_PIX_FMT_GRAY12BE:
716d413c
     case AV_PIX_FMT_GRAY16BE:
4c2176d4
 
     case AV_PIX_FMT_P016BE:
9b75ae05
         c->lumToYV12 = bswap16Y_c;
         break;
a201639a
     case AV_PIX_FMT_YUVA420P9BE:
de8e096c
     case AV_PIX_FMT_YUVA422P9BE:
     case AV_PIX_FMT_YUVA444P9BE:
a201639a
     case AV_PIX_FMT_YUVA420P10BE:
de8e096c
     case AV_PIX_FMT_YUVA422P10BE:
     case AV_PIX_FMT_YUVA444P10BE:
a201639a
     case AV_PIX_FMT_YUVA420P16BE:
     case AV_PIX_FMT_YUVA422P16BE:
     case AV_PIX_FMT_YUVA444P16BE:
9b75ae05
         c->lumToYV12 = bswap16Y_c;
38fdf725
         c->alpToYV12 = bswap16Y_c;
9b75ae05
         break;
2dd7a1c0
 #endif
f84a1b59
     case AV_PIX_FMT_YA16LE:
         c->lumToYV12 = read_ya16le_gray_c;
         break;
     case AV_PIX_FMT_YA16BE:
         c->lumToYV12 = read_ya16be_gray_c;
         break;
052f64ec
     case AV_PIX_FMT_AYUV64LE:
         c->lumToYV12 = read_ayuv64le_Y_c;
         break;
716d413c
     case AV_PIX_FMT_YUYV422:
92b099da
     case AV_PIX_FMT_YVYU422:
e96c3b81
     case AV_PIX_FMT_YA8:
9b75ae05
         c->lumToYV12 = yuy2ToY_c;
         break;
716d413c
     case AV_PIX_FMT_UYVY422:
9b75ae05
         c->lumToYV12 = uyvyToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR24:
9b75ae05
         c->lumToYV12 = bgr24ToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR565LE:
9b75ae05
         c->lumToYV12 = bgr16leToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR565BE:
9b75ae05
         c->lumToYV12 = bgr16beToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR555LE:
9b75ae05
         c->lumToYV12 = bgr15leToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR555BE:
9b75ae05
         c->lumToYV12 = bgr15beToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR444LE:
9b75ae05
         c->lumToYV12 = bgr12leToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR444BE:
9b75ae05
         c->lumToYV12 = bgr12beToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB24:
9b75ae05
         c->lumToYV12 = rgb24ToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB565LE:
9b75ae05
         c->lumToYV12 = rgb16leToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB565BE:
9b75ae05
         c->lumToYV12 = rgb16beToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB555LE:
9b75ae05
         c->lumToYV12 = rgb15leToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB555BE:
9b75ae05
         c->lumToYV12 = rgb15beToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB444LE:
9b75ae05
         c->lumToYV12 = rgb12leToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB444BE:
9b75ae05
         c->lumToYV12 = rgb12beToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB8:
     case AV_PIX_FMT_BGR8:
     case AV_PIX_FMT_PAL8:
     case AV_PIX_FMT_BGR4_BYTE:
     case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
         c->lumToYV12 = palToY_c;
         break;
716d413c
     case AV_PIX_FMT_MONOBLACK:
9b75ae05
         c->lumToYV12 = monoblack2Y_c;
         break;
716d413c
     case AV_PIX_FMT_MONOWHITE:
9b75ae05
         c->lumToYV12 = monowhite2Y_c;
         break;
716d413c
     case AV_PIX_FMT_RGB32:
9b75ae05
         c->lumToYV12 = bgr32ToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB32_1:
9b75ae05
         c->lumToYV12 = bgr321ToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR32:
9b75ae05
         c->lumToYV12 = rgb32ToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR32_1:
9b75ae05
         c->lumToYV12 = rgb321ToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB48BE:
9b75ae05
         c->lumToYV12 = rgb48BEToY_c;
         break;
716d413c
     case AV_PIX_FMT_RGB48LE:
9b75ae05
         c->lumToYV12 = rgb48LEToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR48BE:
9b75ae05
         c->lumToYV12 = bgr48BEToY_c;
         break;
716d413c
     case AV_PIX_FMT_BGR48LE:
9b75ae05
         c->lumToYV12 = bgr48LEToY_c;
         break;
ac627b3d
     case AV_PIX_FMT_RGBA64BE:
3bbf3f7e
         c->lumToYV12 = rgb64BEToY_c;
         break;
ac627b3d
     case AV_PIX_FMT_RGBA64LE:
3bbf3f7e
         c->lumToYV12 = rgb64LEToY_c;
         break;
37f69cd9
     case AV_PIX_FMT_BGRA64BE:
         c->lumToYV12 = bgr64BEToY_c;
         break;
     case AV_PIX_FMT_BGRA64LE:
         c->lumToYV12 = bgr64LEToY_c;
2e31434d
         break;
     case AV_PIX_FMT_P010LE:
         c->lumToYV12 = p010LEToY_c;
         break;
     case AV_PIX_FMT_P010BE:
         c->lumToYV12 = p010BEToY_c;
         break;
2dd7a1c0
     }
6de58b49
     if (c->needAlpha) {
370e3972
         if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
a340cfef
             if (HAVE_BIGENDIAN == !isBE(srcFormat) && !c->readAlpPlanar)
370e3972
                 c->alpToYV12 = bswap16Y_c;
         }
2dd7a1c0
         switch (srcFormat) {
37f69cd9
         case AV_PIX_FMT_BGRA64LE:
f3079858
         case AV_PIX_FMT_RGBA64LE:  c->alpToYV12 = rgba64leToA_c; break;
37f69cd9
         case AV_PIX_FMT_BGRA64BE:
f3079858
         case AV_PIX_FMT_RGBA64BE:  c->alpToYV12 = rgba64beToA_c; break;
716d413c
         case AV_PIX_FMT_BGRA:
         case AV_PIX_FMT_RGBA:
9b75ae05
             c->alpToYV12 = rgbaToA_c;
             break;
716d413c
         case AV_PIX_FMT_ABGR:
         case AV_PIX_FMT_ARGB:
9b75ae05
             c->alpToYV12 = abgrToA_c;
             break;
e96c3b81
         case AV_PIX_FMT_YA8:
9b75ae05
             c->alpToYV12 = uyvyToY_c;
             break;
95d04690
         case AV_PIX_FMT_YA16LE:
             c->alpToYV12 = read_ya16le_alpha_c;
             break;
         case AV_PIX_FMT_YA16BE:
             c->alpToYV12 = read_ya16be_alpha_c;
             break;
052f64ec
         case AV_PIX_FMT_AYUV64LE:
             c->alpToYV12 = read_ayuv64le_A_c;
             break;
ac627b3d
         case AV_PIX_FMT_PAL8 :
3bbf3f7e
             c->alpToYV12 = palToA_c;
             break;
2dd7a1c0
         }
     }
 }