annotate ffmpeg/libswscale/input.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
yading@11 3 *
yading@11 4 * This file is part of FFmpeg.
yading@11 5 *
yading@11 6 * FFmpeg is free software; you can redistribute it and/or
yading@11 7 * modify it under the terms of the GNU Lesser General Public
yading@11 8 * License as published by the Free Software Foundation; either
yading@11 9 * version 2.1 of the License, or (at your option) any later version.
yading@11 10 *
yading@11 11 * FFmpeg is distributed in the hope that it will be useful,
yading@11 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 14 * Lesser General Public License for more details.
yading@11 15 *
yading@11 16 * You should have received a copy of the GNU Lesser General Public
yading@11 17 * License along with FFmpeg; if not, write to the Free Software
yading@11 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 19 */
yading@11 20
yading@11 21 #include <assert.h>
yading@11 22 #include <math.h>
yading@11 23 #include <stdint.h>
yading@11 24 #include <stdio.h>
yading@11 25 #include <string.h>
yading@11 26
yading@11 27 #include "libavutil/avutil.h"
yading@11 28 #include "libavutil/bswap.h"
yading@11 29 #include "libavutil/cpu.h"
yading@11 30 #include "libavutil/intreadwrite.h"
yading@11 31 #include "libavutil/mathematics.h"
yading@11 32 #include "libavutil/pixdesc.h"
yading@11 33 #include "libavutil/avassert.h"
yading@11 34 #include "config.h"
yading@11 35 #include "rgb2rgb.h"
yading@11 36 #include "swscale.h"
yading@11 37 #include "swscale_internal.h"
yading@11 38
yading@11 39 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
yading@11 40
yading@11 41 #define r ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE) ? b_r : r_b)
yading@11 42 #define b ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE) ? r_b : b_r)
yading@11 43
yading@11 44 static av_always_inline void
yading@11 45 rgb64ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
yading@11 46 enum AVPixelFormat origin, int32_t *rgb2yuv)
yading@11 47 {
yading@11 48 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 49 int i;
yading@11 50 for (i = 0; i < width; i++) {
yading@11 51 unsigned int r_b = input_pixel(&src[i*4+0]);
yading@11 52 unsigned int g = input_pixel(&src[i*4+1]);
yading@11 53 unsigned int b_r = input_pixel(&src[i*4+2]);
yading@11 54
yading@11 55 dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
yading@11 56 }
yading@11 57 }
yading@11 58
yading@11 59 static av_always_inline void
yading@11 60 rgb64ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
yading@11 61 const uint16_t *src1, const uint16_t *src2,
yading@11 62 int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
yading@11 63 {
yading@11 64 int i;
yading@11 65 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 66 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 67 av_assert1(src1==src2);
yading@11 68 for (i = 0; i < width; i++) {
yading@11 69 int r_b = input_pixel(&src1[i*4+0]);
yading@11 70 int g = input_pixel(&src1[i*4+1]);
yading@11 71 int b_r = input_pixel(&src1[i*4+2]);
yading@11 72
yading@11 73 dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
yading@11 74 dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
yading@11 75 }
yading@11 76 }
yading@11 77
yading@11 78 static av_always_inline void
yading@11 79 rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
yading@11 80 const uint16_t *src1, const uint16_t *src2,
yading@11 81 int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
yading@11 82 {
yading@11 83 int i;
yading@11 84 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 85 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 86 av_assert1(src1==src2);
yading@11 87 for (i = 0; i < width; i++) {
yading@11 88 int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
yading@11 89 int g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
yading@11 90 int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
yading@11 91
yading@11 92 dstU[i]= (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
yading@11 93 dstV[i]= (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
yading@11 94 }
yading@11 95 }
yading@11 96
yading@11 97 #define rgb64funcs(pattern, BE_LE, origin) \
yading@11 98 static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
yading@11 99 int width, uint32_t *rgb2yuv) \
yading@11 100 { \
yading@11 101 const uint16_t *src = (const uint16_t *) _src; \
yading@11 102 uint16_t *dst = (uint16_t *) _dst; \
yading@11 103 rgb64ToY_c_template(dst, src, width, origin, rgb2yuv); \
yading@11 104 } \
yading@11 105 \
yading@11 106 static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
yading@11 107 const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
yading@11 108 int width, uint32_t *rgb2yuv) \
yading@11 109 { \
yading@11 110 const uint16_t *src1 = (const uint16_t *) _src1, \
yading@11 111 *src2 = (const uint16_t *) _src2; \
yading@11 112 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
yading@11 113 rgb64ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
yading@11 114 } \
yading@11 115 \
yading@11 116 static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
yading@11 117 const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
yading@11 118 int width, uint32_t *rgb2yuv) \
yading@11 119 { \
yading@11 120 const uint16_t *src1 = (const uint16_t *) _src1, \
yading@11 121 *src2 = (const uint16_t *) _src2; \
yading@11 122 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
yading@11 123 rgb64ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
yading@11 124 }
yading@11 125
yading@11 126 rgb64funcs(rgb, LE, AV_PIX_FMT_RGBA64LE)
yading@11 127 rgb64funcs(rgb, BE, AV_PIX_FMT_RGBA64BE)
yading@11 128
yading@11 129 static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
yading@11 130 const uint16_t *src, int width,
yading@11 131 enum AVPixelFormat origin,
yading@11 132 int32_t *rgb2yuv)
yading@11 133 {
yading@11 134 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 135 int i;
yading@11 136 for (i = 0; i < width; i++) {
yading@11 137 unsigned int r_b = input_pixel(&src[i * 3 + 0]);
yading@11 138 unsigned int g = input_pixel(&src[i * 3 + 1]);
yading@11 139 unsigned int b_r = input_pixel(&src[i * 3 + 2]);
yading@11 140
yading@11 141 dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
yading@11 142 }
yading@11 143 }
yading@11 144
yading@11 145 static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
yading@11 146 uint16_t *dstV,
yading@11 147 const uint16_t *src1,
yading@11 148 const uint16_t *src2,
yading@11 149 int width,
yading@11 150 enum AVPixelFormat origin,
yading@11 151 int32_t *rgb2yuv)
yading@11 152 {
yading@11 153 int i;
yading@11 154 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 155 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 156 av_assert1(src1 == src2);
yading@11 157 for (i = 0; i < width; i++) {
yading@11 158 int r_b = input_pixel(&src1[i * 3 + 0]);
yading@11 159 int g = input_pixel(&src1[i * 3 + 1]);
yading@11 160 int b_r = input_pixel(&src1[i * 3 + 2]);
yading@11 161
yading@11 162 dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
yading@11 163 dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
yading@11 164 }
yading@11 165 }
yading@11 166
yading@11 167 static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
yading@11 168 uint16_t *dstV,
yading@11 169 const uint16_t *src1,
yading@11 170 const uint16_t *src2,
yading@11 171 int width,
yading@11 172 enum AVPixelFormat origin,
yading@11 173 int32_t *rgb2yuv)
yading@11 174 {
yading@11 175 int i;
yading@11 176 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 177 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 178 av_assert1(src1 == src2);
yading@11 179 for (i = 0; i < width; i++) {
yading@11 180 int r_b = (input_pixel(&src1[6 * i + 0]) +
yading@11 181 input_pixel(&src1[6 * i + 3]) + 1) >> 1;
yading@11 182 int g = (input_pixel(&src1[6 * i + 1]) +
yading@11 183 input_pixel(&src1[6 * i + 4]) + 1) >> 1;
yading@11 184 int b_r = (input_pixel(&src1[6 * i + 2]) +
yading@11 185 input_pixel(&src1[6 * i + 5]) + 1) >> 1;
yading@11 186
yading@11 187 dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
yading@11 188 dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
yading@11 189 }
yading@11 190 }
yading@11 191
yading@11 192 #undef r
yading@11 193 #undef b
yading@11 194 #undef input_pixel
yading@11 195
yading@11 196 #define rgb48funcs(pattern, BE_LE, origin) \
yading@11 197 static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, \
yading@11 198 const uint8_t *_src, \
yading@11 199 const uint8_t *unused0, const uint8_t *unused1,\
yading@11 200 int width, \
yading@11 201 uint32_t *rgb2yuv) \
yading@11 202 { \
yading@11 203 const uint16_t *src = (const uint16_t *)_src; \
yading@11 204 uint16_t *dst = (uint16_t *)_dst; \
yading@11 205 rgb48ToY_c_template(dst, src, width, origin, rgb2yuv); \
yading@11 206 } \
yading@11 207 \
yading@11 208 static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, \
yading@11 209 uint8_t *_dstV, \
yading@11 210 const uint8_t *unused0, \
yading@11 211 const uint8_t *_src1, \
yading@11 212 const uint8_t *_src2, \
yading@11 213 int width, \
yading@11 214 uint32_t *rgb2yuv) \
yading@11 215 { \
yading@11 216 const uint16_t *src1 = (const uint16_t *)_src1, \
yading@11 217 *src2 = (const uint16_t *)_src2; \
yading@11 218 uint16_t *dstU = (uint16_t *)_dstU, \
yading@11 219 *dstV = (uint16_t *)_dstV; \
yading@11 220 rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
yading@11 221 } \
yading@11 222 \
yading@11 223 static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, \
yading@11 224 uint8_t *_dstV, \
yading@11 225 const uint8_t *unused0, \
yading@11 226 const uint8_t *_src1, \
yading@11 227 const uint8_t *_src2, \
yading@11 228 int width, \
yading@11 229 uint32_t *rgb2yuv) \
yading@11 230 { \
yading@11 231 const uint16_t *src1 = (const uint16_t *)_src1, \
yading@11 232 *src2 = (const uint16_t *)_src2; \
yading@11 233 uint16_t *dstU = (uint16_t *)_dstU, \
yading@11 234 *dstV = (uint16_t *)_dstV; \
yading@11 235 rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
yading@11 236 }
yading@11 237
yading@11 238 rgb48funcs(rgb, LE, AV_PIX_FMT_RGB48LE)
yading@11 239 rgb48funcs(rgb, BE, AV_PIX_FMT_RGB48BE)
yading@11 240 rgb48funcs(bgr, LE, AV_PIX_FMT_BGR48LE)
yading@11 241 rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)
yading@11 242
yading@11 243 #define input_pixel(i) ((origin == AV_PIX_FMT_RGBA || \
yading@11 244 origin == AV_PIX_FMT_BGRA || \
yading@11 245 origin == AV_PIX_FMT_ARGB || \
yading@11 246 origin == AV_PIX_FMT_ABGR) \
yading@11 247 ? AV_RN32A(&src[(i) * 4]) \
yading@11 248 : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \
yading@11 249 : AV_RL16(&src[(i) * 2])))
yading@11 250
yading@11 251 static av_always_inline void rgb16_32ToY_c_template(int16_t *dst,
yading@11 252 const uint8_t *src,
yading@11 253 int width,
yading@11 254 enum AVPixelFormat origin,
yading@11 255 int shr, int shg,
yading@11 256 int shb, int shp,
yading@11 257 int maskr, int maskg,
yading@11 258 int maskb, int rsh,
yading@11 259 int gsh, int bsh, int S,
yading@11 260 int32_t *rgb2yuv)
yading@11 261 {
yading@11 262 const int ry = rgb2yuv[RY_IDX]<<rsh, gy = rgb2yuv[GY_IDX]<<gsh, by = rgb2yuv[BY_IDX]<<bsh;
yading@11 263 const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
yading@11 264 int i;
yading@11 265
yading@11 266 for (i = 0; i < width; i++) {
yading@11 267 int px = input_pixel(i) >> shp;
yading@11 268 int b = (px & maskb) >> shb;
yading@11 269 int g = (px & maskg) >> shg;
yading@11 270 int r = (px & maskr) >> shr;
yading@11 271
yading@11 272 dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
yading@11 273 }
yading@11 274 }
yading@11 275
yading@11 276 static av_always_inline void rgb16_32ToUV_c_template(int16_t *dstU,
yading@11 277 int16_t *dstV,
yading@11 278 const uint8_t *src,
yading@11 279 int width,
yading@11 280 enum AVPixelFormat origin,
yading@11 281 int shr, int shg,
yading@11 282 int shb, int shp,
yading@11 283 int maskr, int maskg,
yading@11 284 int maskb, int rsh,
yading@11 285 int gsh, int bsh, int S,
yading@11 286 int32_t *rgb2yuv)
yading@11 287 {
yading@11 288 const int ru = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
yading@11 289 rv = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh;
yading@11 290 const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
yading@11 291 int i;
yading@11 292
yading@11 293 for (i = 0; i < width; i++) {
yading@11 294 int px = input_pixel(i) >> shp;
yading@11 295 int b = (px & maskb) >> shb;
yading@11 296 int g = (px & maskg) >> shg;
yading@11 297 int r = (px & maskr) >> shr;
yading@11 298
yading@11 299 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
yading@11 300 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
yading@11 301 }
yading@11 302 }
yading@11 303
yading@11 304 static av_always_inline void rgb16_32ToUV_half_c_template(int16_t *dstU,
yading@11 305 int16_t *dstV,
yading@11 306 const uint8_t *src,
yading@11 307 int width,
yading@11 308 enum AVPixelFormat origin,
yading@11 309 int shr, int shg,
yading@11 310 int shb, int shp,
yading@11 311 int maskr, int maskg,
yading@11 312 int maskb, int rsh,
yading@11 313 int gsh, int bsh, int S,
yading@11 314 int32_t *rgb2yuv)
yading@11 315 {
yading@11 316 const int ru = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
yading@11 317 rv = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh,
yading@11 318 maskgx = ~(maskr | maskb);
yading@11 319 const unsigned rnd = (256U<<(S)) + (1<<(S-6));
yading@11 320 int i;
yading@11 321
yading@11 322 maskr |= maskr << 1;
yading@11 323 maskb |= maskb << 1;
yading@11 324 maskg |= maskg << 1;
yading@11 325 for (i = 0; i < width; i++) {
yading@11 326 int px0 = input_pixel(2 * i + 0) >> shp;
yading@11 327 int px1 = input_pixel(2 * i + 1) >> shp;
yading@11 328 int b, r, g = (px0 & maskgx) + (px1 & maskgx);
yading@11 329 int rb = px0 + px1 - g;
yading@11 330
yading@11 331 b = (rb & maskb) >> shb;
yading@11 332 if (shp ||
yading@11 333 origin == AV_PIX_FMT_BGR565LE || origin == AV_PIX_FMT_BGR565BE ||
yading@11 334 origin == AV_PIX_FMT_RGB565LE || origin == AV_PIX_FMT_RGB565BE) {
yading@11 335 g >>= shg;
yading@11 336 } else {
yading@11 337 g = (g & maskg) >> shg;
yading@11 338 }
yading@11 339 r = (rb & maskr) >> shr;
yading@11 340
yading@11 341 dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
yading@11 342 dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
yading@11 343 }
yading@11 344 }
yading@11 345
yading@11 346 #undef input_pixel
yading@11 347
yading@11 348 #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
yading@11 349 maskg, maskb, rsh, gsh, bsh, S) \
yading@11 350 static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \
yading@11 351 int width, uint32_t *tab) \
yading@11 352 { \
yading@11 353 rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp, \
yading@11 354 maskr, maskg, maskb, rsh, gsh, bsh, S, tab); \
yading@11 355 } \
yading@11 356 \
yading@11 357 static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
yading@11 358 const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
yading@11 359 int width, uint32_t *tab) \
yading@11 360 { \
yading@11 361 rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
yading@11 362 shr, shg, shb, shp, \
yading@11 363 maskr, maskg, maskb, rsh, gsh, bsh, S, tab);\
yading@11 364 } \
yading@11 365 \
yading@11 366 static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
yading@11 367 const uint8_t *unused0, const uint8_t *src, \
yading@11 368 const uint8_t *dummy, \
yading@11 369 int width, uint32_t *tab) \
yading@11 370 { \
yading@11 371 rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
yading@11 372 shr, shg, shb, shp, \
yading@11 373 maskr, maskg, maskb, \
yading@11 374 rsh, gsh, bsh, S, tab); \
yading@11 375 }
yading@11 376
yading@11 377 rgb16_32_wrapper(AV_PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
yading@11 378 rgb16_32_wrapper(AV_PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
yading@11 379 rgb16_32_wrapper(AV_PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
yading@11 380 rgb16_32_wrapper(AV_PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
yading@11 381 rgb16_32_wrapper(AV_PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
yading@11 382 rgb16_32_wrapper(AV_PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
yading@11 383 rgb16_32_wrapper(AV_PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
yading@11 384 rgb16_32_wrapper(AV_PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
yading@11 385 rgb16_32_wrapper(AV_PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
yading@11 386 rgb16_32_wrapper(AV_PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
yading@11 387 rgb16_32_wrapper(AV_PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
yading@11 388 rgb16_32_wrapper(AV_PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
yading@11 389 rgb16_32_wrapper(AV_PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
yading@11 390 rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
yading@11 391 rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
yading@11 392 rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
yading@11 393
yading@11 394 static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
yading@11 395 const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
yading@11 396 int width, uint32_t *rgb2yuv)
yading@11 397 {
yading@11 398 uint16_t *dstU = (uint16_t *)_dstU;
yading@11 399 uint16_t *dstV = (uint16_t *)_dstV;
yading@11 400 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 401 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 402
yading@11 403 int i;
yading@11 404 for (i = 0; i < width; i++) {
yading@11 405 unsigned int g = gsrc[2*i] + gsrc[2*i+1];
yading@11 406 unsigned int b = bsrc[2*i] + bsrc[2*i+1];
yading@11 407 unsigned int r = rsrc[2*i] + rsrc[2*i+1];
yading@11 408
yading@11 409 dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
yading@11 410 dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
yading@11 411 }
yading@11 412 }
yading@11 413
yading@11 414 static void rgba64ToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
yading@11 415 const uint8_t *unused2, int width, uint32_t *unused)
yading@11 416 {
yading@11 417 int16_t *dst = (int16_t *)_dst;
yading@11 418 const uint16_t *src = (const uint16_t *)_src;
yading@11 419 int i;
yading@11 420 for (i = 0; i < width; i++)
yading@11 421 dst[i] = src[4 * i + 3];
yading@11 422 }
yading@11 423
yading@11 424 static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
yading@11 425 {
yading@11 426 int16_t *dst = (int16_t *)_dst;
yading@11 427 int i;
yading@11 428 for (i=0; i<width; i++) {
yading@11 429 dst[i]= src[4*i]<<6;
yading@11 430 }
yading@11 431 }
yading@11 432
yading@11 433 static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
yading@11 434 {
yading@11 435 int16_t *dst = (int16_t *)_dst;
yading@11 436 int i;
yading@11 437 for (i=0; i<width; i++) {
yading@11 438 dst[i]= src[4*i+3]<<6;
yading@11 439 }
yading@11 440 }
yading@11 441
yading@11 442 static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
yading@11 443 {
yading@11 444 int16_t *dst = (int16_t *)_dst;
yading@11 445 int i;
yading@11 446 for (i=0; i<width; i++) {
yading@11 447 int d= src[i];
yading@11 448
yading@11 449 dst[i]= (pal[d] >> 24)<<6;
yading@11 450 }
yading@11 451 }
yading@11 452
yading@11 453 static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
yading@11 454 {
yading@11 455 int16_t *dst = (int16_t *)_dst;
yading@11 456 int i;
yading@11 457 for (i = 0; i < width; i++) {
yading@11 458 int d = src[i];
yading@11 459
yading@11 460 dst[i] = (pal[d] & 0xFF)<<6;
yading@11 461 }
yading@11 462 }
yading@11 463
yading@11 464 static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
yading@11 465 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
yading@11 466 int width, uint32_t *pal)
yading@11 467 {
yading@11 468 uint16_t *dstU = (uint16_t *)_dstU;
yading@11 469 int16_t *dstV = (int16_t *)_dstV;
yading@11 470 int i;
yading@11 471 av_assert1(src1 == src2);
yading@11 472 for (i = 0; i < width; i++) {
yading@11 473 int p = pal[src1[i]];
yading@11 474
yading@11 475 dstU[i] = (uint8_t)(p>> 8)<<6;
yading@11 476 dstV[i] = (uint8_t)(p>>16)<<6;
yading@11 477 }
yading@11 478 }
yading@11 479
yading@11 480 static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
yading@11 481 {
yading@11 482 int16_t *dst = (int16_t *)_dst;
yading@11 483 int i, j;
yading@11 484 width = (width + 7) >> 3;
yading@11 485 for (i = 0; i < width; i++) {
yading@11 486 int d = ~src[i];
yading@11 487 for (j = 0; j < 8; j++)
yading@11 488 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
yading@11 489 }
yading@11 490 if(width&7){
yading@11 491 int d= ~src[i];
yading@11 492 for (j = 0; j < (width&7); j++)
yading@11 493 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
yading@11 494 }
yading@11 495 }
yading@11 496
yading@11 497 static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
yading@11 498 {
yading@11 499 int16_t *dst = (int16_t *)_dst;
yading@11 500 int i, j;
yading@11 501 width = (width + 7) >> 3;
yading@11 502 for (i = 0; i < width; i++) {
yading@11 503 int d = src[i];
yading@11 504 for (j = 0; j < 8; j++)
yading@11 505 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
yading@11 506 }
yading@11 507 if(width&7){
yading@11 508 int d = src[i];
yading@11 509 for (j = 0; j < (width&7); j++)
yading@11 510 dst[8*i+j] = ((d>>(7-j))&1) * 16383;
yading@11 511 }
yading@11 512 }
yading@11 513
yading@11 514 static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
yading@11 515 uint32_t *unused)
yading@11 516 {
yading@11 517 int i;
yading@11 518 for (i = 0; i < width; i++)
yading@11 519 dst[i] = src[2 * i];
yading@11 520 }
yading@11 521
yading@11 522 static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 523 const uint8_t *src2, int width, uint32_t *unused)
yading@11 524 {
yading@11 525 int i;
yading@11 526 for (i = 0; i < width; i++) {
yading@11 527 dstU[i] = src1[4 * i + 1];
yading@11 528 dstV[i] = src1[4 * i + 3];
yading@11 529 }
yading@11 530 av_assert1(src1 == src2);
yading@11 531 }
yading@11 532
yading@11 533 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
yading@11 534 uint32_t *unused)
yading@11 535 {
yading@11 536 int i;
yading@11 537 const uint16_t *src = (const uint16_t *)_src;
yading@11 538 uint16_t *dst = (uint16_t *)_dst;
yading@11 539 for (i = 0; i < width; i++)
yading@11 540 dst[i] = av_bswap16(src[i]);
yading@11 541 }
yading@11 542
yading@11 543 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
yading@11 544 const uint8_t *_src2, int width, uint32_t *unused)
yading@11 545 {
yading@11 546 int i;
yading@11 547 const uint16_t *src1 = (const uint16_t *)_src1,
yading@11 548 *src2 = (const uint16_t *)_src2;
yading@11 549 uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
yading@11 550 for (i = 0; i < width; i++) {
yading@11 551 dstU[i] = av_bswap16(src1[i]);
yading@11 552 dstV[i] = av_bswap16(src2[i]);
yading@11 553 }
yading@11 554 }
yading@11 555
yading@11 556 /* This is almost identical to the previous, end exists only because
yading@11 557 * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
yading@11 558 static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
yading@11 559 uint32_t *unused)
yading@11 560 {
yading@11 561 int i;
yading@11 562 for (i = 0; i < width; i++)
yading@11 563 dst[i] = src[2 * i + 1];
yading@11 564 }
yading@11 565
yading@11 566 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 567 const uint8_t *src2, int width, uint32_t *unused)
yading@11 568 {
yading@11 569 int i;
yading@11 570 for (i = 0; i < width; i++) {
yading@11 571 dstU[i] = src1[4 * i + 0];
yading@11 572 dstV[i] = src1[4 * i + 2];
yading@11 573 }
yading@11 574 av_assert1(src1 == src2);
yading@11 575 }
yading@11 576
yading@11 577 static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
yading@11 578 const uint8_t *src, int width)
yading@11 579 {
yading@11 580 int i;
yading@11 581 for (i = 0; i < width; i++) {
yading@11 582 dst1[i] = src[2 * i + 0];
yading@11 583 dst2[i] = src[2 * i + 1];
yading@11 584 }
yading@11 585 }
yading@11 586
yading@11 587 static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
yading@11 588 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
yading@11 589 int width, uint32_t *unused)
yading@11 590 {
yading@11 591 nvXXtoUV_c(dstU, dstV, src1, width);
yading@11 592 }
yading@11 593
yading@11 594 static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
yading@11 595 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
yading@11 596 int width, uint32_t *unused)
yading@11 597 {
yading@11 598 nvXXtoUV_c(dstV, dstU, src1, width);
yading@11 599 }
yading@11 600
yading@11 601 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
yading@11 602
yading@11 603 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
yading@11 604 int width, uint32_t *rgb2yuv)
yading@11 605 {
yading@11 606 int16_t *dst = (int16_t *)_dst;
yading@11 607 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 608 int i;
yading@11 609 for (i = 0; i < width; i++) {
yading@11 610 int b = src[i * 3 + 0];
yading@11 611 int g = src[i * 3 + 1];
yading@11 612 int r = src[i * 3 + 2];
yading@11 613
yading@11 614 dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
yading@11 615 }
yading@11 616 }
yading@11 617
yading@11 618 static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 619 const uint8_t *src2, int width, uint32_t *rgb2yuv)
yading@11 620 {
yading@11 621 int16_t *dstU = (int16_t *)_dstU;
yading@11 622 int16_t *dstV = (int16_t *)_dstV;
yading@11 623 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 624 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 625 int i;
yading@11 626 for (i = 0; i < width; i++) {
yading@11 627 int b = src1[3 * i + 0];
yading@11 628 int g = src1[3 * i + 1];
yading@11 629 int r = src1[3 * i + 2];
yading@11 630
yading@11 631 dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
yading@11 632 dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
yading@11 633 }
yading@11 634 av_assert1(src1 == src2);
yading@11 635 }
yading@11 636
yading@11 637 static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 638 const uint8_t *src2, int width, uint32_t *rgb2yuv)
yading@11 639 {
yading@11 640 int16_t *dstU = (int16_t *)_dstU;
yading@11 641 int16_t *dstV = (int16_t *)_dstV;
yading@11 642 int i;
yading@11 643 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 644 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 645 for (i = 0; i < width; i++) {
yading@11 646 int b = src1[6 * i + 0] + src1[6 * i + 3];
yading@11 647 int g = src1[6 * i + 1] + src1[6 * i + 4];
yading@11 648 int r = src1[6 * i + 2] + src1[6 * i + 5];
yading@11 649
yading@11 650 dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
yading@11 651 dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
yading@11 652 }
yading@11 653 av_assert1(src1 == src2);
yading@11 654 }
yading@11 655
yading@11 656 static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
yading@11 657 uint32_t *rgb2yuv)
yading@11 658 {
yading@11 659 int16_t *dst = (int16_t *)_dst;
yading@11 660 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 661 int i;
yading@11 662 for (i = 0; i < width; i++) {
yading@11 663 int r = src[i * 3 + 0];
yading@11 664 int g = src[i * 3 + 1];
yading@11 665 int b = src[i * 3 + 2];
yading@11 666
yading@11 667 dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
yading@11 668 }
yading@11 669 }
yading@11 670
yading@11 671 static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 672 const uint8_t *src2, int width, uint32_t *rgb2yuv)
yading@11 673 {
yading@11 674 int16_t *dstU = (int16_t *)_dstU;
yading@11 675 int16_t *dstV = (int16_t *)_dstV;
yading@11 676 int i;
yading@11 677 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 678 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 679 av_assert1(src1 == src2);
yading@11 680 for (i = 0; i < width; i++) {
yading@11 681 int r = src1[3 * i + 0];
yading@11 682 int g = src1[3 * i + 1];
yading@11 683 int b = src1[3 * i + 2];
yading@11 684
yading@11 685 dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
yading@11 686 dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
yading@11 687 }
yading@11 688 }
yading@11 689
yading@11 690 static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
yading@11 691 const uint8_t *src2, int width, uint32_t *rgb2yuv)
yading@11 692 {
yading@11 693 int16_t *dstU = (int16_t *)_dstU;
yading@11 694 int16_t *dstV = (int16_t *)_dstV;
yading@11 695 int i;
yading@11 696 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 697 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 698 av_assert1(src1 == src2);
yading@11 699 for (i = 0; i < width; i++) {
yading@11 700 int r = src1[6 * i + 0] + src1[6 * i + 3];
yading@11 701 int g = src1[6 * i + 1] + src1[6 * i + 4];
yading@11 702 int b = src1[6 * i + 2] + src1[6 * i + 5];
yading@11 703
yading@11 704 dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
yading@11 705 dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
yading@11 706 }
yading@11 707 }
yading@11 708
yading@11 709 static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
yading@11 710 {
yading@11 711 uint16_t *dst = (uint16_t *)_dst;
yading@11 712 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 713 int i;
yading@11 714 for (i = 0; i < width; i++) {
yading@11 715 int g = src[0][i];
yading@11 716 int b = src[1][i];
yading@11 717 int r = src[2][i];
yading@11 718
yading@11 719 dst[i] = (ry*r + gy*g + by*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
yading@11 720 }
yading@11 721 }
yading@11 722
yading@11 723 static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
yading@11 724 {
yading@11 725 uint16_t *dstU = (uint16_t *)_dstU;
yading@11 726 uint16_t *dstV = (uint16_t *)_dstV;
yading@11 727 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 728 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 729 int i;
yading@11 730 for (i = 0; i < width; i++) {
yading@11 731 int g = src[0][i];
yading@11 732 int b = src[1][i];
yading@11 733 int r = src[2][i];
yading@11 734
yading@11 735 dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
yading@11 736 dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
yading@11 737 }
yading@11 738 }
yading@11 739
yading@11 740 #define rdpx(src) \
yading@11 741 is_be ? AV_RB16(src) : AV_RL16(src)
yading@11 742 static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
yading@11 743 int width, int bpc, int is_be, int32_t *rgb2yuv)
yading@11 744 {
yading@11 745 int i;
yading@11 746 const uint16_t **src = (const uint16_t **)_src;
yading@11 747 uint16_t *dst = (uint16_t *)_dst;
yading@11 748 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
yading@11 749 for (i = 0; i < width; i++) {
yading@11 750 int g = rdpx(src[0] + i);
yading@11 751 int b = rdpx(src[1] + i);
yading@11 752 int r = rdpx(src[2] + i);
yading@11 753
yading@11 754 dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + bpc - 14));
yading@11 755 }
yading@11 756 }
yading@11 757
yading@11 758 static void planar_rgb9le_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 759 {
yading@11 760 planar_rgb16_to_y(dst, src, w, 9, 0, rgb2yuv);
yading@11 761 }
yading@11 762
yading@11 763 static void planar_rgb9be_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 764 {
yading@11 765 planar_rgb16_to_y(dst, src, w, 9, 1, rgb2yuv);
yading@11 766 }
yading@11 767
yading@11 768 static void planar_rgb10le_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 769 {
yading@11 770 planar_rgb16_to_y(dst, src, w, 10, 0, rgb2yuv);
yading@11 771 }
yading@11 772
yading@11 773 static void planar_rgb10be_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 774 {
yading@11 775 planar_rgb16_to_y(dst, src, w, 10, 1, rgb2yuv);
yading@11 776 }
yading@11 777
yading@11 778 static void planar_rgb12le_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 779 {
yading@11 780 planar_rgb16_to_y(dst, src, w, 12, 0, rgb2yuv);
yading@11 781 }
yading@11 782
yading@11 783 static void planar_rgb12be_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 784 {
yading@11 785 planar_rgb16_to_y(dst, src, w, 12, 1, rgb2yuv);
yading@11 786 }
yading@11 787
yading@11 788 static void planar_rgb14le_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 789 {
yading@11 790 planar_rgb16_to_y(dst, src, w, 14, 0, rgb2yuv);
yading@11 791 }
yading@11 792
yading@11 793 static void planar_rgb14be_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 794 {
yading@11 795 planar_rgb16_to_y(dst, src, w, 14, 1, rgb2yuv);
yading@11 796 }
yading@11 797
yading@11 798 static void planar_rgb16le_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 799 {
yading@11 800 planar_rgb16_to_y(dst, src, w, 16, 0, rgb2yuv);
yading@11 801 }
yading@11 802
yading@11 803 static void planar_rgb16be_to_y(uint8_t *dst, const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 804 {
yading@11 805 planar_rgb16_to_y(dst, src, w, 16, 1, rgb2yuv);
yading@11 806 }
yading@11 807
yading@11 808 static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
yading@11 809 const uint8_t *_src[4], int width,
yading@11 810 int bpc, int is_be, int32_t *rgb2yuv)
yading@11 811 {
yading@11 812 int i;
yading@11 813 const uint16_t **src = (const uint16_t **)_src;
yading@11 814 uint16_t *dstU = (uint16_t *)_dstU;
yading@11 815 uint16_t *dstV = (uint16_t *)_dstV;
yading@11 816 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
yading@11 817 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
yading@11 818 for (i = 0; i < width; i++) {
yading@11 819 int g = rdpx(src[0] + i);
yading@11 820 int b = rdpx(src[1] + i);
yading@11 821 int r = rdpx(src[2] + i);
yading@11 822
yading@11 823 dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + bpc - 14);
yading@11 824 dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + bpc - 14);
yading@11 825 }
yading@11 826 }
yading@11 827 #undef rdpx
yading@11 828
yading@11 829 static void planar_rgb9le_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 830 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 831 {
yading@11 832 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 0, rgb2yuv);
yading@11 833 }
yading@11 834
yading@11 835 static void planar_rgb9be_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 836 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 837 {
yading@11 838 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 1, rgb2yuv);
yading@11 839 }
yading@11 840
yading@11 841 static void planar_rgb10le_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 842 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 843 {
yading@11 844 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 0, rgb2yuv);
yading@11 845 }
yading@11 846
yading@11 847 static void planar_rgb10be_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 848 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 849 {
yading@11 850 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 1, rgb2yuv);
yading@11 851 }
yading@11 852
yading@11 853 static void planar_rgb12le_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 854 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 855 {
yading@11 856 planar_rgb16_to_uv(dstU, dstV, src, w, 12, 0, rgb2yuv);
yading@11 857 }
yading@11 858
yading@11 859 static void planar_rgb12be_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 860 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 861 {
yading@11 862 planar_rgb16_to_uv(dstU, dstV, src, w, 12, 1, rgb2yuv);
yading@11 863 }
yading@11 864
yading@11 865 static void planar_rgb14le_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 866 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 867 {
yading@11 868 planar_rgb16_to_uv(dstU, dstV, src, w, 14, 0, rgb2yuv);
yading@11 869 }
yading@11 870
yading@11 871 static void planar_rgb14be_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 872 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 873 {
yading@11 874 planar_rgb16_to_uv(dstU, dstV, src, w, 14, 1, rgb2yuv);
yading@11 875 }
yading@11 876
yading@11 877 static void planar_rgb16le_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 878 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 879 {
yading@11 880 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 0, rgb2yuv);
yading@11 881 }
yading@11 882
yading@11 883 static void planar_rgb16be_to_uv(uint8_t *dstU, uint8_t *dstV,
yading@11 884 const uint8_t *src[4], int w, int32_t *rgb2yuv)
yading@11 885 {
yading@11 886 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 1, rgb2yuv);
yading@11 887 }
yading@11 888
yading@11 889 av_cold void ff_sws_init_input_funcs(SwsContext *c)
yading@11 890 {
yading@11 891 enum AVPixelFormat srcFormat = c->srcFormat;
yading@11 892
yading@11 893 c->chrToYV12 = NULL;
yading@11 894 switch (srcFormat) {
yading@11 895 case AV_PIX_FMT_YUYV422:
yading@11 896 c->chrToYV12 = yuy2ToUV_c;
yading@11 897 break;
yading@11 898 case AV_PIX_FMT_UYVY422:
yading@11 899 c->chrToYV12 = uyvyToUV_c;
yading@11 900 break;
yading@11 901 case AV_PIX_FMT_NV12:
yading@11 902 c->chrToYV12 = nv12ToUV_c;
yading@11 903 break;
yading@11 904 case AV_PIX_FMT_NV21:
yading@11 905 c->chrToYV12 = nv21ToUV_c;
yading@11 906 break;
yading@11 907 case AV_PIX_FMT_RGB8:
yading@11 908 case AV_PIX_FMT_BGR8:
yading@11 909 case AV_PIX_FMT_PAL8:
yading@11 910 case AV_PIX_FMT_BGR4_BYTE:
yading@11 911 case AV_PIX_FMT_RGB4_BYTE:
yading@11 912 c->chrToYV12 = palToUV_c;
yading@11 913 break;
yading@11 914 case AV_PIX_FMT_GBRP9LE:
yading@11 915 c->readChrPlanar = planar_rgb9le_to_uv;
yading@11 916 break;
yading@11 917 case AV_PIX_FMT_GBRP10LE:
yading@11 918 c->readChrPlanar = planar_rgb10le_to_uv;
yading@11 919 break;
yading@11 920 case AV_PIX_FMT_GBRP12LE:
yading@11 921 c->readChrPlanar = planar_rgb12le_to_uv;
yading@11 922 break;
yading@11 923 case AV_PIX_FMT_GBRP14LE:
yading@11 924 c->readChrPlanar = planar_rgb14le_to_uv;
yading@11 925 break;
yading@11 926 case AV_PIX_FMT_GBRP16LE:
yading@11 927 c->readChrPlanar = planar_rgb16le_to_uv;
yading@11 928 break;
yading@11 929 case AV_PIX_FMT_GBRP9BE:
yading@11 930 c->readChrPlanar = planar_rgb9be_to_uv;
yading@11 931 break;
yading@11 932 case AV_PIX_FMT_GBRP10BE:
yading@11 933 c->readChrPlanar = planar_rgb10be_to_uv;
yading@11 934 break;
yading@11 935 case AV_PIX_FMT_GBRP12BE:
yading@11 936 c->readChrPlanar = planar_rgb12be_to_uv;
yading@11 937 break;
yading@11 938 case AV_PIX_FMT_GBRP14BE:
yading@11 939 c->readChrPlanar = planar_rgb14be_to_uv;
yading@11 940 break;
yading@11 941 case AV_PIX_FMT_GBRP16BE:
yading@11 942 c->readChrPlanar = planar_rgb16be_to_uv;
yading@11 943 break;
yading@11 944 case AV_PIX_FMT_GBRP:
yading@11 945 c->readChrPlanar = planar_rgb_to_uv;
yading@11 946 break;
yading@11 947 #if HAVE_BIGENDIAN
yading@11 948 case AV_PIX_FMT_YUV444P9LE:
yading@11 949 case AV_PIX_FMT_YUV422P9LE:
yading@11 950 case AV_PIX_FMT_YUV420P9LE:
yading@11 951 case AV_PIX_FMT_YUV422P10LE:
yading@11 952 case AV_PIX_FMT_YUV444P10LE:
yading@11 953 case AV_PIX_FMT_YUV420P10LE:
yading@11 954 case AV_PIX_FMT_YUV422P12LE:
yading@11 955 case AV_PIX_FMT_YUV444P12LE:
yading@11 956 case AV_PIX_FMT_YUV420P12LE:
yading@11 957 case AV_PIX_FMT_YUV422P14LE:
yading@11 958 case AV_PIX_FMT_YUV444P14LE:
yading@11 959 case AV_PIX_FMT_YUV420P14LE:
yading@11 960 case AV_PIX_FMT_YUV420P16LE:
yading@11 961 case AV_PIX_FMT_YUV422P16LE:
yading@11 962 case AV_PIX_FMT_YUV444P16LE:
yading@11 963
yading@11 964 case AV_PIX_FMT_YUVA444P9LE:
yading@11 965 case AV_PIX_FMT_YUVA422P9LE:
yading@11 966 case AV_PIX_FMT_YUVA420P9LE:
yading@11 967 case AV_PIX_FMT_YUVA444P10LE:
yading@11 968 case AV_PIX_FMT_YUVA422P10LE:
yading@11 969 case AV_PIX_FMT_YUVA420P10LE:
yading@11 970 case AV_PIX_FMT_YUVA420P16LE:
yading@11 971 case AV_PIX_FMT_YUVA422P16LE:
yading@11 972 case AV_PIX_FMT_YUVA444P16LE:
yading@11 973 c->chrToYV12 = bswap16UV_c;
yading@11 974 break;
yading@11 975 #else
yading@11 976 case AV_PIX_FMT_YUV444P9BE:
yading@11 977 case AV_PIX_FMT_YUV422P9BE:
yading@11 978 case AV_PIX_FMT_YUV420P9BE:
yading@11 979 case AV_PIX_FMT_YUV444P10BE:
yading@11 980 case AV_PIX_FMT_YUV422P10BE:
yading@11 981 case AV_PIX_FMT_YUV420P10BE:
yading@11 982 case AV_PIX_FMT_YUV444P12BE:
yading@11 983 case AV_PIX_FMT_YUV422P12BE:
yading@11 984 case AV_PIX_FMT_YUV420P12BE:
yading@11 985 case AV_PIX_FMT_YUV444P14BE:
yading@11 986 case AV_PIX_FMT_YUV422P14BE:
yading@11 987 case AV_PIX_FMT_YUV420P14BE:
yading@11 988 case AV_PIX_FMT_YUV420P16BE:
yading@11 989 case AV_PIX_FMT_YUV422P16BE:
yading@11 990 case AV_PIX_FMT_YUV444P16BE:
yading@11 991
yading@11 992 case AV_PIX_FMT_YUVA444P9BE:
yading@11 993 case AV_PIX_FMT_YUVA422P9BE:
yading@11 994 case AV_PIX_FMT_YUVA420P9BE:
yading@11 995 case AV_PIX_FMT_YUVA444P10BE:
yading@11 996 case AV_PIX_FMT_YUVA422P10BE:
yading@11 997 case AV_PIX_FMT_YUVA420P10BE:
yading@11 998 case AV_PIX_FMT_YUVA420P16BE:
yading@11 999 case AV_PIX_FMT_YUVA422P16BE:
yading@11 1000 case AV_PIX_FMT_YUVA444P16BE:
yading@11 1001 c->chrToYV12 = bswap16UV_c;
yading@11 1002 break;
yading@11 1003 #endif
yading@11 1004 }
yading@11 1005 if (c->chrSrcHSubSample) {
yading@11 1006 switch (srcFormat) {
yading@11 1007 case AV_PIX_FMT_RGBA64BE:
yading@11 1008 c->chrToYV12 = rgb64BEToUV_half_c;
yading@11 1009 break;
yading@11 1010 case AV_PIX_FMT_RGBA64LE:
yading@11 1011 c->chrToYV12 = rgb64LEToUV_half_c;
yading@11 1012 break;
yading@11 1013 case AV_PIX_FMT_RGB48BE:
yading@11 1014 c->chrToYV12 = rgb48BEToUV_half_c;
yading@11 1015 break;
yading@11 1016 case AV_PIX_FMT_RGB48LE:
yading@11 1017 c->chrToYV12 = rgb48LEToUV_half_c;
yading@11 1018 break;
yading@11 1019 case AV_PIX_FMT_BGR48BE:
yading@11 1020 c->chrToYV12 = bgr48BEToUV_half_c;
yading@11 1021 break;
yading@11 1022 case AV_PIX_FMT_BGR48LE:
yading@11 1023 c->chrToYV12 = bgr48LEToUV_half_c;
yading@11 1024 break;
yading@11 1025 case AV_PIX_FMT_RGB32:
yading@11 1026 c->chrToYV12 = bgr32ToUV_half_c;
yading@11 1027 break;
yading@11 1028 case AV_PIX_FMT_RGB32_1:
yading@11 1029 c->chrToYV12 = bgr321ToUV_half_c;
yading@11 1030 break;
yading@11 1031 case AV_PIX_FMT_BGR24:
yading@11 1032 c->chrToYV12 = bgr24ToUV_half_c;
yading@11 1033 break;
yading@11 1034 case AV_PIX_FMT_BGR565LE:
yading@11 1035 c->chrToYV12 = bgr16leToUV_half_c;
yading@11 1036 break;
yading@11 1037 case AV_PIX_FMT_BGR565BE:
yading@11 1038 c->chrToYV12 = bgr16beToUV_half_c;
yading@11 1039 break;
yading@11 1040 case AV_PIX_FMT_BGR555LE:
yading@11 1041 c->chrToYV12 = bgr15leToUV_half_c;
yading@11 1042 break;
yading@11 1043 case AV_PIX_FMT_BGR555BE:
yading@11 1044 c->chrToYV12 = bgr15beToUV_half_c;
yading@11 1045 break;
yading@11 1046 case AV_PIX_FMT_GBR24P :
yading@11 1047 c->chrToYV12 = gbr24pToUV_half_c;
yading@11 1048 break;
yading@11 1049 case AV_PIX_FMT_BGR444LE:
yading@11 1050 c->chrToYV12 = bgr12leToUV_half_c;
yading@11 1051 break;
yading@11 1052 case AV_PIX_FMT_BGR444BE:
yading@11 1053 c->chrToYV12 = bgr12beToUV_half_c;
yading@11 1054 break;
yading@11 1055 case AV_PIX_FMT_BGR32:
yading@11 1056 c->chrToYV12 = rgb32ToUV_half_c;
yading@11 1057 break;
yading@11 1058 case AV_PIX_FMT_BGR32_1:
yading@11 1059 c->chrToYV12 = rgb321ToUV_half_c;
yading@11 1060 break;
yading@11 1061 case AV_PIX_FMT_RGB24:
yading@11 1062 c->chrToYV12 = rgb24ToUV_half_c;
yading@11 1063 break;
yading@11 1064 case AV_PIX_FMT_RGB565LE:
yading@11 1065 c->chrToYV12 = rgb16leToUV_half_c;
yading@11 1066 break;
yading@11 1067 case AV_PIX_FMT_RGB565BE:
yading@11 1068 c->chrToYV12 = rgb16beToUV_half_c;
yading@11 1069 break;
yading@11 1070 case AV_PIX_FMT_RGB555LE:
yading@11 1071 c->chrToYV12 = rgb15leToUV_half_c;
yading@11 1072 break;
yading@11 1073 case AV_PIX_FMT_RGB555BE:
yading@11 1074 c->chrToYV12 = rgb15beToUV_half_c;
yading@11 1075 break;
yading@11 1076 case AV_PIX_FMT_RGB444LE:
yading@11 1077 c->chrToYV12 = rgb12leToUV_half_c;
yading@11 1078 break;
yading@11 1079 case AV_PIX_FMT_RGB444BE:
yading@11 1080 c->chrToYV12 = rgb12beToUV_half_c;
yading@11 1081 break;
yading@11 1082 }
yading@11 1083 } else {
yading@11 1084 switch (srcFormat) {
yading@11 1085 case AV_PIX_FMT_RGBA64BE:
yading@11 1086 c->chrToYV12 = rgb64BEToUV_c;
yading@11 1087 break;
yading@11 1088 case AV_PIX_FMT_RGBA64LE:
yading@11 1089 c->chrToYV12 = rgb64LEToUV_c;
yading@11 1090 break;
yading@11 1091 case AV_PIX_FMT_RGB48BE:
yading@11 1092 c->chrToYV12 = rgb48BEToUV_c;
yading@11 1093 break;
yading@11 1094 case AV_PIX_FMT_RGB48LE:
yading@11 1095 c->chrToYV12 = rgb48LEToUV_c;
yading@11 1096 break;
yading@11 1097 case AV_PIX_FMT_BGR48BE:
yading@11 1098 c->chrToYV12 = bgr48BEToUV_c;
yading@11 1099 break;
yading@11 1100 case AV_PIX_FMT_BGR48LE:
yading@11 1101 c->chrToYV12 = bgr48LEToUV_c;
yading@11 1102 break;
yading@11 1103 case AV_PIX_FMT_RGB32:
yading@11 1104 c->chrToYV12 = bgr32ToUV_c;
yading@11 1105 break;
yading@11 1106 case AV_PIX_FMT_RGB32_1:
yading@11 1107 c->chrToYV12 = bgr321ToUV_c;
yading@11 1108 break;
yading@11 1109 case AV_PIX_FMT_BGR24:
yading@11 1110 c->chrToYV12 = bgr24ToUV_c;
yading@11 1111 break;
yading@11 1112 case AV_PIX_FMT_BGR565LE:
yading@11 1113 c->chrToYV12 = bgr16leToUV_c;
yading@11 1114 break;
yading@11 1115 case AV_PIX_FMT_BGR565BE:
yading@11 1116 c->chrToYV12 = bgr16beToUV_c;
yading@11 1117 break;
yading@11 1118 case AV_PIX_FMT_BGR555LE:
yading@11 1119 c->chrToYV12 = bgr15leToUV_c;
yading@11 1120 break;
yading@11 1121 case AV_PIX_FMT_BGR555BE:
yading@11 1122 c->chrToYV12 = bgr15beToUV_c;
yading@11 1123 break;
yading@11 1124 case AV_PIX_FMT_BGR444LE:
yading@11 1125 c->chrToYV12 = bgr12leToUV_c;
yading@11 1126 break;
yading@11 1127 case AV_PIX_FMT_BGR444BE:
yading@11 1128 c->chrToYV12 = bgr12beToUV_c;
yading@11 1129 break;
yading@11 1130 case AV_PIX_FMT_BGR32:
yading@11 1131 c->chrToYV12 = rgb32ToUV_c;
yading@11 1132 break;
yading@11 1133 case AV_PIX_FMT_BGR32_1:
yading@11 1134 c->chrToYV12 = rgb321ToUV_c;
yading@11 1135 break;
yading@11 1136 case AV_PIX_FMT_RGB24:
yading@11 1137 c->chrToYV12 = rgb24ToUV_c;
yading@11 1138 break;
yading@11 1139 case AV_PIX_FMT_RGB565LE:
yading@11 1140 c->chrToYV12 = rgb16leToUV_c;
yading@11 1141 break;
yading@11 1142 case AV_PIX_FMT_RGB565BE:
yading@11 1143 c->chrToYV12 = rgb16beToUV_c;
yading@11 1144 break;
yading@11 1145 case AV_PIX_FMT_RGB555LE:
yading@11 1146 c->chrToYV12 = rgb15leToUV_c;
yading@11 1147 break;
yading@11 1148 case AV_PIX_FMT_RGB555BE:
yading@11 1149 c->chrToYV12 = rgb15beToUV_c;
yading@11 1150 break;
yading@11 1151 case AV_PIX_FMT_RGB444LE:
yading@11 1152 c->chrToYV12 = rgb12leToUV_c;
yading@11 1153 break;
yading@11 1154 case AV_PIX_FMT_RGB444BE:
yading@11 1155 c->chrToYV12 = rgb12beToUV_c;
yading@11 1156 break;
yading@11 1157 }
yading@11 1158 }
yading@11 1159
yading@11 1160 c->lumToYV12 = NULL;
yading@11 1161 c->alpToYV12 = NULL;
yading@11 1162 switch (srcFormat) {
yading@11 1163 case AV_PIX_FMT_GBRP9LE:
yading@11 1164 c->readLumPlanar = planar_rgb9le_to_y;
yading@11 1165 break;
yading@11 1166 case AV_PIX_FMT_GBRP10LE:
yading@11 1167 c->readLumPlanar = planar_rgb10le_to_y;
yading@11 1168 break;
yading@11 1169 case AV_PIX_FMT_GBRP12LE:
yading@11 1170 c->readLumPlanar = planar_rgb12le_to_y;
yading@11 1171 break;
yading@11 1172 case AV_PIX_FMT_GBRP14LE:
yading@11 1173 c->readLumPlanar = planar_rgb14le_to_y;
yading@11 1174 break;
yading@11 1175 case AV_PIX_FMT_GBRP16LE:
yading@11 1176 c->readLumPlanar = planar_rgb16le_to_y;
yading@11 1177 break;
yading@11 1178 case AV_PIX_FMT_GBRP9BE:
yading@11 1179 c->readLumPlanar = planar_rgb9be_to_y;
yading@11 1180 break;
yading@11 1181 case AV_PIX_FMT_GBRP10BE:
yading@11 1182 c->readLumPlanar = planar_rgb10be_to_y;
yading@11 1183 break;
yading@11 1184 case AV_PIX_FMT_GBRP12BE:
yading@11 1185 c->readLumPlanar = planar_rgb12be_to_y;
yading@11 1186 break;
yading@11 1187 case AV_PIX_FMT_GBRP14BE:
yading@11 1188 c->readLumPlanar = planar_rgb14be_to_y;
yading@11 1189 break;
yading@11 1190 case AV_PIX_FMT_GBRP16BE:
yading@11 1191 c->readLumPlanar = planar_rgb16be_to_y;
yading@11 1192 break;
yading@11 1193 case AV_PIX_FMT_GBRP:
yading@11 1194 c->readLumPlanar = planar_rgb_to_y;
yading@11 1195 break;
yading@11 1196 #if HAVE_BIGENDIAN
yading@11 1197 case AV_PIX_FMT_YUV444P9LE:
yading@11 1198 case AV_PIX_FMT_YUV422P9LE:
yading@11 1199 case AV_PIX_FMT_YUV420P9LE:
yading@11 1200 case AV_PIX_FMT_YUV444P10LE:
yading@11 1201 case AV_PIX_FMT_YUV422P10LE:
yading@11 1202 case AV_PIX_FMT_YUV420P10LE:
yading@11 1203 case AV_PIX_FMT_YUV444P12LE:
yading@11 1204 case AV_PIX_FMT_YUV422P12LE:
yading@11 1205 case AV_PIX_FMT_YUV420P12LE:
yading@11 1206 case AV_PIX_FMT_YUV444P14LE:
yading@11 1207 case AV_PIX_FMT_YUV422P14LE:
yading@11 1208 case AV_PIX_FMT_YUV420P14LE:
yading@11 1209 case AV_PIX_FMT_YUV420P16LE:
yading@11 1210 case AV_PIX_FMT_YUV422P16LE:
yading@11 1211 case AV_PIX_FMT_YUV444P16LE:
yading@11 1212
yading@11 1213 case AV_PIX_FMT_GRAY16LE:
yading@11 1214 c->lumToYV12 = bswap16Y_c;
yading@11 1215 break;
yading@11 1216 case AV_PIX_FMT_YUVA444P9LE:
yading@11 1217 case AV_PIX_FMT_YUVA422P9LE:
yading@11 1218 case AV_PIX_FMT_YUVA420P9LE:
yading@11 1219 case AV_PIX_FMT_YUVA444P10LE:
yading@11 1220 case AV_PIX_FMT_YUVA422P10LE:
yading@11 1221 case AV_PIX_FMT_YUVA420P10LE:
yading@11 1222 case AV_PIX_FMT_YUVA420P16LE:
yading@11 1223 case AV_PIX_FMT_YUVA422P16LE:
yading@11 1224 case AV_PIX_FMT_YUVA444P16LE:
yading@11 1225 c->lumToYV12 = bswap16Y_c;
yading@11 1226 c->alpToYV12 = bswap16Y_c;
yading@11 1227 break;
yading@11 1228 #else
yading@11 1229 case AV_PIX_FMT_YUV444P9BE:
yading@11 1230 case AV_PIX_FMT_YUV422P9BE:
yading@11 1231 case AV_PIX_FMT_YUV420P9BE:
yading@11 1232 case AV_PIX_FMT_YUV444P10BE:
yading@11 1233 case AV_PIX_FMT_YUV422P10BE:
yading@11 1234 case AV_PIX_FMT_YUV420P10BE:
yading@11 1235 case AV_PIX_FMT_YUV444P12BE:
yading@11 1236 case AV_PIX_FMT_YUV422P12BE:
yading@11 1237 case AV_PIX_FMT_YUV420P12BE:
yading@11 1238 case AV_PIX_FMT_YUV444P14BE:
yading@11 1239 case AV_PIX_FMT_YUV422P14BE:
yading@11 1240 case AV_PIX_FMT_YUV420P14BE:
yading@11 1241 case AV_PIX_FMT_YUV420P16BE:
yading@11 1242 case AV_PIX_FMT_YUV422P16BE:
yading@11 1243 case AV_PIX_FMT_YUV444P16BE:
yading@11 1244
yading@11 1245 case AV_PIX_FMT_GRAY16BE:
yading@11 1246 c->lumToYV12 = bswap16Y_c;
yading@11 1247 break;
yading@11 1248 case AV_PIX_FMT_YUVA444P9BE:
yading@11 1249 case AV_PIX_FMT_YUVA422P9BE:
yading@11 1250 case AV_PIX_FMT_YUVA420P9BE:
yading@11 1251 case AV_PIX_FMT_YUVA444P10BE:
yading@11 1252 case AV_PIX_FMT_YUVA422P10BE:
yading@11 1253 case AV_PIX_FMT_YUVA420P10BE:
yading@11 1254 case AV_PIX_FMT_YUVA420P16BE:
yading@11 1255 case AV_PIX_FMT_YUVA422P16BE:
yading@11 1256 case AV_PIX_FMT_YUVA444P16BE:
yading@11 1257 c->lumToYV12 = bswap16Y_c;
yading@11 1258 c->alpToYV12 = bswap16Y_c;
yading@11 1259 break;
yading@11 1260 #endif
yading@11 1261 case AV_PIX_FMT_YUYV422:
yading@11 1262 case AV_PIX_FMT_Y400A:
yading@11 1263 c->lumToYV12 = yuy2ToY_c;
yading@11 1264 break;
yading@11 1265 case AV_PIX_FMT_UYVY422:
yading@11 1266 c->lumToYV12 = uyvyToY_c;
yading@11 1267 break;
yading@11 1268 case AV_PIX_FMT_BGR24:
yading@11 1269 c->lumToYV12 = bgr24ToY_c;
yading@11 1270 break;
yading@11 1271 case AV_PIX_FMT_BGR565LE:
yading@11 1272 c->lumToYV12 = bgr16leToY_c;
yading@11 1273 break;
yading@11 1274 case AV_PIX_FMT_BGR565BE:
yading@11 1275 c->lumToYV12 = bgr16beToY_c;
yading@11 1276 break;
yading@11 1277 case AV_PIX_FMT_BGR555LE:
yading@11 1278 c->lumToYV12 = bgr15leToY_c;
yading@11 1279 break;
yading@11 1280 case AV_PIX_FMT_BGR555BE:
yading@11 1281 c->lumToYV12 = bgr15beToY_c;
yading@11 1282 break;
yading@11 1283 case AV_PIX_FMT_BGR444LE:
yading@11 1284 c->lumToYV12 = bgr12leToY_c;
yading@11 1285 break;
yading@11 1286 case AV_PIX_FMT_BGR444BE:
yading@11 1287 c->lumToYV12 = bgr12beToY_c;
yading@11 1288 break;
yading@11 1289 case AV_PIX_FMT_RGB24:
yading@11 1290 c->lumToYV12 = rgb24ToY_c;
yading@11 1291 break;
yading@11 1292 case AV_PIX_FMT_RGB565LE:
yading@11 1293 c->lumToYV12 = rgb16leToY_c;
yading@11 1294 break;
yading@11 1295 case AV_PIX_FMT_RGB565BE:
yading@11 1296 c->lumToYV12 = rgb16beToY_c;
yading@11 1297 break;
yading@11 1298 case AV_PIX_FMT_RGB555LE:
yading@11 1299 c->lumToYV12 = rgb15leToY_c;
yading@11 1300 break;
yading@11 1301 case AV_PIX_FMT_RGB555BE:
yading@11 1302 c->lumToYV12 = rgb15beToY_c;
yading@11 1303 break;
yading@11 1304 case AV_PIX_FMT_RGB444LE:
yading@11 1305 c->lumToYV12 = rgb12leToY_c;
yading@11 1306 break;
yading@11 1307 case AV_PIX_FMT_RGB444BE:
yading@11 1308 c->lumToYV12 = rgb12beToY_c;
yading@11 1309 break;
yading@11 1310 case AV_PIX_FMT_RGB8:
yading@11 1311 case AV_PIX_FMT_BGR8:
yading@11 1312 case AV_PIX_FMT_PAL8:
yading@11 1313 case AV_PIX_FMT_BGR4_BYTE:
yading@11 1314 case AV_PIX_FMT_RGB4_BYTE:
yading@11 1315 c->lumToYV12 = palToY_c;
yading@11 1316 break;
yading@11 1317 case AV_PIX_FMT_MONOBLACK:
yading@11 1318 c->lumToYV12 = monoblack2Y_c;
yading@11 1319 break;
yading@11 1320 case AV_PIX_FMT_MONOWHITE:
yading@11 1321 c->lumToYV12 = monowhite2Y_c;
yading@11 1322 break;
yading@11 1323 case AV_PIX_FMT_RGB32:
yading@11 1324 c->lumToYV12 = bgr32ToY_c;
yading@11 1325 break;
yading@11 1326 case AV_PIX_FMT_RGB32_1:
yading@11 1327 c->lumToYV12 = bgr321ToY_c;
yading@11 1328 break;
yading@11 1329 case AV_PIX_FMT_BGR32:
yading@11 1330 c->lumToYV12 = rgb32ToY_c;
yading@11 1331 break;
yading@11 1332 case AV_PIX_FMT_BGR32_1:
yading@11 1333 c->lumToYV12 = rgb321ToY_c;
yading@11 1334 break;
yading@11 1335 case AV_PIX_FMT_RGB48BE:
yading@11 1336 c->lumToYV12 = rgb48BEToY_c;
yading@11 1337 break;
yading@11 1338 case AV_PIX_FMT_RGB48LE:
yading@11 1339 c->lumToYV12 = rgb48LEToY_c;
yading@11 1340 break;
yading@11 1341 case AV_PIX_FMT_BGR48BE:
yading@11 1342 c->lumToYV12 = bgr48BEToY_c;
yading@11 1343 break;
yading@11 1344 case AV_PIX_FMT_BGR48LE:
yading@11 1345 c->lumToYV12 = bgr48LEToY_c;
yading@11 1346 break;
yading@11 1347 case AV_PIX_FMT_RGBA64BE:
yading@11 1348 c->lumToYV12 = rgb64BEToY_c;
yading@11 1349 break;
yading@11 1350 case AV_PIX_FMT_RGBA64LE:
yading@11 1351 c->lumToYV12 = rgb64LEToY_c;
yading@11 1352 break;
yading@11 1353 }
yading@11 1354 if (c->alpPixBuf) {
yading@11 1355 if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
yading@11 1356 if (HAVE_BIGENDIAN == !isBE(srcFormat))
yading@11 1357 c->alpToYV12 = bswap16Y_c;
yading@11 1358 }
yading@11 1359 switch (srcFormat) {
yading@11 1360 case AV_PIX_FMT_RGBA64LE:
yading@11 1361 case AV_PIX_FMT_RGBA64BE: c->alpToYV12 = rgba64ToA_c; break;
yading@11 1362 case AV_PIX_FMT_BGRA:
yading@11 1363 case AV_PIX_FMT_RGBA:
yading@11 1364 c->alpToYV12 = rgbaToA_c;
yading@11 1365 break;
yading@11 1366 case AV_PIX_FMT_ABGR:
yading@11 1367 case AV_PIX_FMT_ARGB:
yading@11 1368 c->alpToYV12 = abgrToA_c;
yading@11 1369 break;
yading@11 1370 case AV_PIX_FMT_Y400A:
yading@11 1371 c->alpToYV12 = uyvyToY_c;
yading@11 1372 break;
yading@11 1373 case AV_PIX_FMT_PAL8 :
yading@11 1374 c->alpToYV12 = palToA_c;
yading@11 1375 break;
yading@11 1376 }
yading@11 1377 }
yading@11 1378 }