From 02641f54eee3ef4117489ba96cc16dce2c20d8c1 Mon Sep 17 00:00:00 2001 From: cehoyos Date: Thu, 6 May 2010 10:18:25 +0000 Subject: Add support for 12-bit color mode on framebuffer devices. Patch Janusz Krzysztofik, jkrzyszt A tis icnet pl git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31139 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/osd.c | 33 +++++++++++++++++++++++++++++++++ libvo/osd.h | 2 ++ libvo/vo_directfb2.c | 19 +++++++++++++++++++ libvo/vo_fbdev.c | 13 ++++++++++++- libvo/vo_fbdev2.c | 8 ++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) (limited to 'libvo') diff --git a/libvo/osd.c b/libvo/osd.c index a3664dadb3..54854c785f 100644 --- a/libvo/osd.c +++ b/libvo/osd.c @@ -329,6 +329,39 @@ void vo_draw_alpha_init(void){ } } +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]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x] = fast_osd_12bpp_table[src[x]]; +#else + register unsigned int a = src[x] >> 4; + dst[x] = (a << 8) | (a << 4) | a; +#endif +#else + 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; +#endif + } + } + src += srcstride; + srca += srcstride; + dstbase += dststride; + } + return; +} + 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 DFB_VERSION(0,9,15) case IMGFMT_RGB15: return DSPF_ARGB1555; break; case IMGFMT_BGR15: return DSPF_ARGB1555; break; + case IMGFMT_RGB12: return DSPF_ARGB4444; break; + case IMGFMT_BGR12: return DSPF_ARGB4444; break; #else case IMGFMT_RGB15: return DSPF_RGB15; break; case IMGFMT_BGR15: return DSPF_RGB15; break; + case IMGFMT_RGB12: return DSPF_RGB12; break; + case IMGFMT_BGR12: return DSPF_RGB12; break; #endif case IMGFMT_YUY2: return DSPF_YUY2; break; case IMGFMT_UYVY: return DSPF_UYVY; break; @@ -541,6 +545,8 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case IMGFMT_BGR16: case IMGFMT_RGB15: case IMGFMT_BGR15: + case IMGFMT_RGB12: + case IMGFMT_BGR12: params.bpp=16; break; default: params.bpp=0; @@ -665,8 +671,10 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case DSPF_RGB16: bpp=16;break; #if DIRECTFBVERSION > DFB_VERSION(0,9,15) case DSPF_ARGB1555: bpp=15;break; + case DSPF_ARGB4444: bpp=12; break; #else case DSPF_RGB15: bpp=15;break; + case DSPF_RGB12: bpp=12; break; #endif case DSPF_RGB332 : bpp=8;break; } @@ -678,8 +686,10 @@ static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, case DSPF_RGB16: #if DIRECTFBVERSION > DFB_VERSION(0,9,15) case DSPF_ARGB1555: + case DSPF_ARGB4444: #else case DSPF_RGB15: + case DSPF_RGB12: #endif case DSPF_RGB332: mp_msg(MSGT_VO, MSGL_V,"DirectFB: Trying to recover via videomode change (VM).\n"); @@ -1487,6 +1497,15 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, #endif vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch); break; +#if DIRECTFBVERSION > DFB_VERSION(0,9,15) + case DSPF_ARGB4444: +#else + case DSPF_RGB12: +#endif + vo_draw_alpha_rgb12(w, h, src, srca, stride, + ((uint8_t *) dst) + pitch * y0 + 2 * x0, + pitch); + break; case DSPF_YUY2: vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0,pitch); diff --git a/libvo/vo_fbdev.c b/libvo/vo_fbdev.c index c1d2051725..cfa7f522bc 100644 --- a/libvo/vo_fbdev.c +++ b/libvo/vo_fbdev.c @@ -521,6 +521,13 @@ static void set_bpp(struct fb_var_screeninfo *p, int bpp) p->green.offset = 5; p->blue.length = 5; break; + case 12: + p->red.offset = 8; + p->green.length = 4; + p->red.length = 4; + p->green.offset = 4; + p->blue.length = 4; + break; } } @@ -700,7 +707,8 @@ static int fb_preinit(int reset) } if (vo_dbpp) { - if (vo_dbpp != 15 && vo_dbpp != 16 && vo_dbpp != 24 && vo_dbpp != 32) { + if (vo_dbpp != 12 && vo_dbpp != 15 && vo_dbpp != 16 + && vo_dbpp != 24 && vo_dbpp != 32) { mp_msg(MSGT_VO, MSGL_ERR, "can't switch to %d bpp\n", vo_dbpp); goto err_out; } @@ -850,6 +858,9 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; + case 12: + draw_alpha_p = vo_draw_alpha_rgb12; + break; default: return 1; } diff --git a/libvo/vo_fbdev2.c b/libvo/vo_fbdev2.c index 0e8f3743cd..9c32736a35 100644 --- a/libvo/vo_fbdev2.c +++ b/libvo/vo_fbdev2.c @@ -77,6 +77,13 @@ static void set_bpp(struct fb_var_screeninfo *p, int bpp) p->green.offset = 5; p->blue.length = 5; break; + case 12: + p->red.offset = 8; + p->green.length = 4; + p->red.length = 4; + p->green.offset = 4; + p->blue.length = 4; + break; } } @@ -247,6 +254,7 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, case 24: draw_alpha_p = vo_draw_alpha_rgb24; break; case 16: draw_alpha_p = vo_draw_alpha_rgb16; break; case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; + case 12: draw_alpha_p = vo_draw_alpha_rgb12; break; default: return 1; } -- cgit v1.2.3