annotate ffmpeg/libswscale/x86/yuv2rgb.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 * software YUV to RGB converter
yading@11 3 *
yading@11 4 * Copyright (C) 2009 Konstantin Shishkov
yading@11 5 *
yading@11 6 * MMX/MMXEXT template stuff (needed for fast movntq support),
yading@11 7 * 1,4,8bpp support and context / deglobalize stuff
yading@11 8 * by Michael Niedermayer (michaelni@gmx.at)
yading@11 9 *
yading@11 10 * This file is part of FFmpeg.
yading@11 11 *
yading@11 12 * FFmpeg is free software; you can redistribute it and/or
yading@11 13 * modify it under the terms of the GNU Lesser General Public
yading@11 14 * License as published by the Free Software Foundation; either
yading@11 15 * version 2.1 of the License, or (at your option) any later version.
yading@11 16 *
yading@11 17 * FFmpeg is distributed in the hope that it will be useful,
yading@11 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 20 * Lesser General Public License for more details.
yading@11 21 *
yading@11 22 * You should have received a copy of the GNU Lesser General Public
yading@11 23 * License along with FFmpeg; if not, write to the Free Software
yading@11 24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 25 */
yading@11 26
yading@11 27 #include <stdio.h>
yading@11 28 #include <stdlib.h>
yading@11 29 #include <inttypes.h>
yading@11 30 #include <assert.h>
yading@11 31
yading@11 32 #include "config.h"
yading@11 33 #include "libswscale/rgb2rgb.h"
yading@11 34 #include "libswscale/swscale.h"
yading@11 35 #include "libswscale/swscale_internal.h"
yading@11 36 #include "libavutil/attributes.h"
yading@11 37 #include "libavutil/x86/asm.h"
yading@11 38 #include "libavutil/cpu.h"
yading@11 39
yading@11 40 #if HAVE_INLINE_ASM
yading@11 41
yading@11 42 #define DITHER1XBPP // only for MMX
yading@11 43
yading@11 44 /* hope these constant values are cache line aligned */
yading@11 45 DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL;
yading@11 46 DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL;
yading@11 47 DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL;
yading@11 48 DECLARE_ASM_CONST(8, uint64_t, pb_e0) = 0xe0e0e0e0e0e0e0e0ULL;
yading@11 49 DECLARE_ASM_CONST(8, uint64_t, pb_03) = 0x0303030303030303ULL;
yading@11 50 DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL;
yading@11 51
yading@11 52 //MMX versions
yading@11 53 #if HAVE_MMX_INLINE
yading@11 54 #undef RENAME
yading@11 55 #undef COMPILE_TEMPLATE_MMXEXT
yading@11 56 #define COMPILE_TEMPLATE_MMXEXT 0
yading@11 57 #define RENAME(a) a ## _MMX
yading@11 58 #include "yuv2rgb_template.c"
yading@11 59 #endif /* HAVE_MMX_INLINE */
yading@11 60
yading@11 61 // MMXEXT versions
yading@11 62 #if HAVE_MMXEXT_INLINE
yading@11 63 #undef RENAME
yading@11 64 #undef COMPILE_TEMPLATE_MMXEXT
yading@11 65 #define COMPILE_TEMPLATE_MMXEXT 1
yading@11 66 #define RENAME(a) a ## _MMXEXT
yading@11 67 #include "yuv2rgb_template.c"
yading@11 68 #endif /* HAVE_MMXEXT_INLINE */
yading@11 69
yading@11 70 #endif /* HAVE_INLINE_ASM */
yading@11 71
yading@11 72 av_cold SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c)
yading@11 73 {
yading@11 74 #if HAVE_INLINE_ASM
yading@11 75 int cpu_flags = av_get_cpu_flags();
yading@11 76
yading@11 77 #if HAVE_MMXEXT_INLINE
yading@11 78 if (cpu_flags & AV_CPU_FLAG_MMXEXT) {
yading@11 79 switch (c->dstFormat) {
yading@11 80 case AV_PIX_FMT_RGB24:
yading@11 81 return yuv420_rgb24_MMXEXT;
yading@11 82 case AV_PIX_FMT_BGR24:
yading@11 83 return yuv420_bgr24_MMXEXT;
yading@11 84 }
yading@11 85 }
yading@11 86 #endif
yading@11 87
yading@11 88 if (cpu_flags & AV_CPU_FLAG_MMX) {
yading@11 89 switch (c->dstFormat) {
yading@11 90 case AV_PIX_FMT_RGB32:
yading@11 91 if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
yading@11 92 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
yading@11 93 return yuva420_rgb32_MMX;
yading@11 94 #endif
yading@11 95 break;
yading@11 96 } else return yuv420_rgb32_MMX;
yading@11 97 case AV_PIX_FMT_BGR32:
yading@11 98 if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
yading@11 99 #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
yading@11 100 return yuva420_bgr32_MMX;
yading@11 101 #endif
yading@11 102 break;
yading@11 103 } else return yuv420_bgr32_MMX;
yading@11 104 case AV_PIX_FMT_RGB24: return yuv420_rgb24_MMX;
yading@11 105 case AV_PIX_FMT_BGR24: return yuv420_bgr24_MMX;
yading@11 106 case AV_PIX_FMT_RGB565: return yuv420_rgb16_MMX;
yading@11 107 case AV_PIX_FMT_RGB555: return yuv420_rgb15_MMX;
yading@11 108 }
yading@11 109 }
yading@11 110 #endif /* HAVE_INLINE_ASM */
yading@11 111
yading@11 112 return NULL;
yading@11 113 }