2009-02-08 03:27:30 +00:00
|
|
|
/*
|
|
|
|
* generic alpha renderers for all YUV modes and RGB depths
|
|
|
|
* These are "reference implementations", should be optimized later (MMX, etc).
|
|
|
|
* templating code by Michael Niedermayer (michaelni@gmx.at)
|
|
|
|
*
|
|
|
|
* This file is part of MPlayer.
|
|
|
|
*
|
|
|
|
* MPlayer is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* MPlayer is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
2001-04-10 02:29:38 +00:00
|
|
|
|
2001-06-02 16:02:38 +00:00
|
|
|
#include "config.h"
|
2001-04-24 20:03:13 +00:00
|
|
|
#include "osd.h"
|
2002-05-02 10:49:55 +00:00
|
|
|
#include "mp_msg.h"
|
2001-11-11 22:14:13 +00:00
|
|
|
#include <inttypes.h>
|
2012-07-31 21:37:56 +00:00
|
|
|
#include <sys/types.h>
|
2004-10-28 01:15:53 +00:00
|
|
|
#include "cpudetect.h"
|
2001-11-11 22:14:13 +00:00
|
|
|
|
2009-01-16 09:21:21 +00:00
|
|
|
#if ARCH_X86
|
2008-01-30 18:52:59 +00:00
|
|
|
static const uint64_t bFF __attribute__((aligned(8))) = 0xFFFFFFFFFFFFFFFFULL;
|
2001-11-26 21:12:15 +00:00
|
|
|
static const unsigned long long mask24lh __attribute__((aligned(8))) = 0xFFFF000000000000ULL;
|
|
|
|
static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FFFFFFFFFFFFULL;
|
2001-11-11 22:14:13 +00:00
|
|
|
#endif
|
2001-04-24 20:03:13 +00:00
|
|
|
|
2012-07-29 15:31:38 +00:00
|
|
|
//Note: we have C, X86-nommx, MMX, MMX2
|
2001-11-26 21:12:15 +00:00
|
|
|
//Plain C versions
|
2001-11-27 01:54:13 +00:00
|
|
|
#define COMPILE_C
|
|
|
|
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ARCH_X86
|
2001-11-27 01:54:13 +00:00
|
|
|
|
|
|
|
#define COMPILE_MMX
|
|
|
|
#define COMPILE_MMX2
|
2009-03-15 10:01:02 +00:00
|
|
|
|
|
|
|
#endif /* ARCH_X86 */
|
2001-11-27 01:54:13 +00:00
|
|
|
|
|
|
|
#undef HAVE_MMX
|
|
|
|
#undef HAVE_MMX2
|
2009-01-16 09:21:21 +00:00
|
|
|
#define HAVE_MMX 0
|
|
|
|
#define HAVE_MMX2 0
|
2004-10-21 11:55:20 +00:00
|
|
|
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ! ARCH_X86
|
2001-11-27 01:54:13 +00:00
|
|
|
|
|
|
|
#ifdef COMPILE_C
|
2001-11-26 21:12:15 +00:00
|
|
|
#undef HAVE_MMX
|
|
|
|
#undef HAVE_MMX2
|
2009-01-16 09:21:21 +00:00
|
|
|
#define HAVE_MMX 0
|
|
|
|
#define HAVE_MMX2 0
|
2001-11-26 21:12:15 +00:00
|
|
|
#define RENAME(a) a ## _C
|
|
|
|
#include "osd_template.c"
|
2001-11-27 01:54:13 +00:00
|
|
|
#endif
|
2001-11-26 21:12:15 +00:00
|
|
|
|
2004-10-21 11:55:20 +00:00
|
|
|
#else
|
2001-11-26 21:12:15 +00:00
|
|
|
|
|
|
|
//X86 noMMX versions
|
2001-11-27 01:54:13 +00:00
|
|
|
#ifdef COMPILE_C
|
2001-11-26 21:12:15 +00:00
|
|
|
#undef RENAME
|
|
|
|
#undef HAVE_MMX
|
|
|
|
#undef HAVE_MMX2
|
2009-01-16 09:21:21 +00:00
|
|
|
#define HAVE_MMX 0
|
|
|
|
#define HAVE_MMX2 0
|
2001-11-26 21:12:15 +00:00
|
|
|
#define RENAME(a) a ## _X86
|
|
|
|
#include "osd_template.c"
|
2001-11-27 01:54:13 +00:00
|
|
|
#endif
|
2001-11-26 21:12:15 +00:00
|
|
|
|
|
|
|
//MMX versions
|
2001-11-27 01:54:13 +00:00
|
|
|
#ifdef COMPILE_MMX
|
2001-11-26 21:12:15 +00:00
|
|
|
#undef RENAME
|
2009-01-16 09:21:21 +00:00
|
|
|
#undef HAVE_MMX
|
2001-11-26 21:12:15 +00:00
|
|
|
#undef HAVE_MMX2
|
2009-01-16 09:21:21 +00:00
|
|
|
#define HAVE_MMX 1
|
|
|
|
#define HAVE_MMX2 0
|
2001-11-26 21:12:15 +00:00
|
|
|
#define RENAME(a) a ## _MMX
|
|
|
|
#include "osd_template.c"
|
2001-11-27 01:54:13 +00:00
|
|
|
#endif
|
2001-11-26 21:12:15 +00:00
|
|
|
|
|
|
|
//MMX2 versions
|
2001-11-27 01:54:13 +00:00
|
|
|
#ifdef COMPILE_MMX2
|
2001-11-26 21:12:15 +00:00
|
|
|
#undef RENAME
|
2009-01-16 09:21:21 +00:00
|
|
|
#undef HAVE_MMX
|
|
|
|
#undef HAVE_MMX2
|
|
|
|
#define HAVE_MMX 1
|
|
|
|
#define HAVE_MMX2 1
|
2001-11-26 21:12:15 +00:00
|
|
|
#define RENAME(a) a ## _MMX2
|
|
|
|
#include "osd_template.c"
|
2001-11-27 01:54:13 +00:00
|
|
|
#endif
|
2001-11-26 21:12:15 +00:00
|
|
|
|
2009-03-15 10:01:02 +00:00
|
|
|
#endif /* ARCH_X86 */
|
2001-11-26 21:12:15 +00:00
|
|
|
|
2001-04-10 02:29:38 +00:00
|
|
|
void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ARCH_X86
|
2004-05-31 15:13:35 +00:00
|
|
|
// ordered by speed / fastest first
|
2001-11-26 21:12:15 +00:00
|
|
|
if(gCpuCaps.hasMMX2)
|
|
|
|
vo_draw_alpha_yv12_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else if(gCpuCaps.hasMMX)
|
|
|
|
vo_draw_alpha_yv12_MMX(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else
|
|
|
|
vo_draw_alpha_yv12_X86(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-06-02 16:02:38 +00:00
|
|
|
#else
|
2001-11-26 21:12:15 +00:00
|
|
|
vo_draw_alpha_yv12_C(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-11-11 22:14:13 +00:00
|
|
|
#endif
|
2001-04-10 02:29:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ARCH_X86
|
2004-05-31 15:13:35 +00:00
|
|
|
// ordered by speed / fastest first
|
2001-11-26 21:12:15 +00:00
|
|
|
if(gCpuCaps.hasMMX2)
|
|
|
|
vo_draw_alpha_yuy2_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else if(gCpuCaps.hasMMX)
|
|
|
|
vo_draw_alpha_yuy2_MMX(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else
|
|
|
|
vo_draw_alpha_yuy2_X86(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-11-11 22:14:13 +00:00
|
|
|
#else
|
2001-11-26 21:12:15 +00:00
|
|
|
vo_draw_alpha_yuy2_C(w, h, src, srca, srcstride, dstbase, dststride);
|
2004-05-31 15:13:35 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2001-04-10 02:29:38 +00:00
|
|
|
void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ARCH_X86
|
2004-05-31 15:13:35 +00:00
|
|
|
// ordered by speed / fastest first
|
2001-11-26 21:12:15 +00:00
|
|
|
if(gCpuCaps.hasMMX2)
|
|
|
|
vo_draw_alpha_rgb24_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else if(gCpuCaps.hasMMX)
|
|
|
|
vo_draw_alpha_rgb24_MMX(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else
|
|
|
|
vo_draw_alpha_rgb24_X86(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-06-02 16:02:38 +00:00
|
|
|
#else
|
2001-11-26 21:12:15 +00:00
|
|
|
vo_draw_alpha_rgb24_C(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-11-11 16:09:19 +00:00
|
|
|
#endif
|
2001-04-10 02:29:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
2009-03-15 10:01:02 +00:00
|
|
|
#if ARCH_X86
|
2004-05-31 15:13:35 +00:00
|
|
|
// ordered by speed / fastest first
|
2001-11-26 21:12:15 +00:00
|
|
|
if(gCpuCaps.hasMMX2)
|
|
|
|
vo_draw_alpha_rgb32_MMX2(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else if(gCpuCaps.hasMMX)
|
|
|
|
vo_draw_alpha_rgb32_MMX(w, h, src, srca, srcstride, dstbase, dststride);
|
|
|
|
else
|
|
|
|
vo_draw_alpha_rgb32_X86(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-06-02 16:02:38 +00:00
|
|
|
#else
|
2001-11-26 21:12:15 +00:00
|
|
|
vo_draw_alpha_rgb32_C(w, h, src, srca, srcstride, dstbase, dststride);
|
2001-06-02 16:02:38 +00:00
|
|
|
#endif
|
2001-04-10 02:29:38 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 10:18:25 +00:00
|
|
|
void vo_draw_alpha_rgb12(int w, int h, unsigned char* src, unsigned char *srca,
|
|
|
|
int srcstride, unsigned char* dstbase, int dststride) {
|
|
|
|
int y;
|
|
|
|
for (y = 0; y < h; y++) {
|
|
|
|
register unsigned short *dst = (unsigned short*) dstbase;
|
|
|
|
register int x;
|
|
|
|
for (x = 0; x < w; x++) {
|
|
|
|
if(srca[x]){
|
|
|
|
unsigned char r = dst[x] & 0x0F;
|
|
|
|
unsigned char g = (dst[x] >> 4) & 0x0F;
|
|
|
|
unsigned char b = (dst[x] >> 8) & 0x0F;
|
|
|
|
r = (((r*srca[x]) >> 4) + src[x]) >> 4;
|
|
|
|
g = (((g*srca[x]) >> 4) + src[x]) >> 4;
|
|
|
|
b = (((b*srca[x]) >> 4) + src[x]) >> 4;
|
|
|
|
dst[x] = (b << 8) | (g << 4) | r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
src += srcstride;
|
|
|
|
srca += srcstride;
|
|
|
|
dstbase += dststride;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2001-04-10 02:29:38 +00:00
|
|
|
void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
|
|
|
int y;
|
|
|
|
for(y=0;y<h;y++){
|
|
|
|
register unsigned short *dst = (unsigned short*) dstbase;
|
|
|
|
register int x;
|
|
|
|
for(x=0;x<w;x++){
|
|
|
|
if(srca[x]){
|
|
|
|
unsigned char r=dst[x]&0x1F;
|
|
|
|
unsigned char g=(dst[x]>>5)&0x1F;
|
|
|
|
unsigned char b=(dst[x]>>10)&0x1F;
|
|
|
|
r=(((r*srca[x])>>5)+src[x])>>3;
|
|
|
|
g=(((g*srca[x])>>5)+src[x])>>3;
|
|
|
|
b=(((b*srca[x])>>5)+src[x])>>3;
|
|
|
|
dst[x]=(b<<10)|(g<<5)|r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
src+=srcstride;
|
|
|
|
srca+=srcstride;
|
|
|
|
dstbase+=dststride;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){
|
|
|
|
int y;
|
|
|
|
for(y=0;y<h;y++){
|
|
|
|
register unsigned short *dst = (unsigned short*) dstbase;
|
|
|
|
register int x;
|
|
|
|
for(x=0;x<w;x++){
|
|
|
|
if(srca[x]){
|
|
|
|
unsigned char r=dst[x]&0x1F;
|
|
|
|
unsigned char g=(dst[x]>>5)&0x3F;
|
|
|
|
unsigned char b=(dst[x]>>11)&0x1F;
|
|
|
|
r=(((r*srca[x])>>5)+src[x])>>3;
|
|
|
|
g=(((g*srca[x])>>6)+src[x])>>2;
|
|
|
|
b=(((b*srca[x])>>5)+src[x])>>3;
|
|
|
|
dst[x]=(b<<11)|(g<<5)|r;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
src+=srcstride;
|
|
|
|
srca+=srcstride;
|
|
|
|
dstbase+=dststride;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|