[MPlayer-dev-eng] [RFC][PATCH v2] Add support for 12-bit color mode. (to mplayer)

Janusz Krzysztofik jkrzyszt at tis.icnet.pl
Fri Apr 2 19:38:37 CEST 2010


Friday 19 March 2010 01:52:42 Janusz Krzysztofik wrote:
> Hi,
>
> While trying to use mplayer on my ARM OMAP1 based Amstrad Delta (E3)
> videophone, I found this software not compatible with the 12-bit LCD
> display my device is equipped with. Fbdev and fbdev2 video output drivers
> did not work at all, while others like directfb, for example, gave
> incorrect colors.
>
> In order to solve my problem, I started with extending ffmpeg libraries for
> RGB12 format handling, as I was advised when I submitted here in January my
> v1 patch that covered both mplayer and ffmpeg modifications. My patches
> against libswscale, providing RGB12 output pixel format support for both
> generic and special unscaled paths, have just been accepted. Now it's time
> to try with adding RGB12 support to the mplayer video output drivers (I was
> using these modifications while testing my swscale patches).
>
> The patch extends mplayer with RGB12 aka RGB444 pixel format handling.
> It works for me with fbdev and fbdev2, selecting required color conversion
> filters automatically. It also works with directfb when provided with "-vf
> format=bgr12" option. I wasn't able to get correct results using sdl,
> neither with qtopia (incorrect collors) nor fbcon (not working at all)
> drivers. I haven't tested the x11 output driver modifications.
>
> Created and tested against mplayer svn revision 30929.
> Tested on omapfb framebuffer device with Amstrad Delta 12-bit LCD display.
>
> Signed-off-by: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>


Hi,
Since there were no comments on this patch since I submitted 2 weeks ago, 
nor has it been acknowledged by anyone,  am I supposed to do something more 
for it to be reviewed and possibly applied?

Thanks,
Janusz


> ---
> diff -upr trunk.orig/fmt-conversion.c trunk/fmt-conversion.c
> --- trunk.orig/fmt-conversion.c	2010-02-26 02:41:08.000000000 +0100
> +++ trunk/fmt-conversion.c	2010-03-19 01:01:29.000000000 +0100
> @@ -32,6 +32,8 @@ static const struct {
>      {IMGFMT_BGR16LE, PIX_FMT_RGB565LE},
>      {IMGFMT_BGR15BE, PIX_FMT_RGB555BE},
>      {IMGFMT_BGR15LE, PIX_FMT_RGB555LE},
> +    {IMGFMT_BGR12BE, PIX_FMT_RGB444BE},
> +    {IMGFMT_BGR12LE, PIX_FMT_RGB444LE},
>      {IMGFMT_BGR8,  PIX_FMT_RGB8},
>      {IMGFMT_BGR4,  PIX_FMT_RGB4},
>      {IMGFMT_BGR1,  PIX_FMT_MONOBLACK},
> @@ -47,6 +49,8 @@ static const struct {
>      {IMGFMT_RGB16LE, PIX_FMT_BGR565LE},
>      {IMGFMT_RGB15BE, PIX_FMT_BGR555BE},
>      {IMGFMT_RGB15LE, PIX_FMT_BGR555LE},
> +    {IMGFMT_RGB12BE, PIX_FMT_BGR444BE},
> +    {IMGFMT_RGB12LE, PIX_FMT_BGR444LE},
>      {IMGFMT_RGB8,  PIX_FMT_BGR8},
>      {IMGFMT_RGB4,  PIX_FMT_BGR4},
>      {IMGFMT_BGR8,  PIX_FMT_PAL8},
> diff -upr trunk.orig/libmenu/menu.c trunk/libmenu/menu.c
> --- trunk.orig/libmenu/menu.c	2010-02-26 02:40:48.000000000 +0100
> +++ trunk/libmenu/menu.c	2010-03-19 01:01:29.000000000 +0100
> @@ -376,6 +376,9 @@ typedef void (*draw_alpha_f)(int w,int h
>
>  inline static draw_alpha_f get_draw_alpha(uint32_t fmt) {
>    switch(fmt) {
> +  case IMGFMT_BGR12:
> +  case IMGFMT_RGB12:
> +    return vo_draw_alpha_rgb12;
>    case IMGFMT_BGR15:
>    case IMGFMT_RGB15:
>      return vo_draw_alpha_rgb15;
> diff -upr trunk.orig/libmpcodecs/img_format.c
> trunk/libmpcodecs/img_format.c ---
> trunk.orig/libmpcodecs/img_format.c	2010-02-26 02:39:48.000000000 +0100 +++
> trunk/libmpcodecs/img_format.c	2010-03-19 01:01:29.000000000 +0100 @@ -29,6
> +29,7 @@ const char *vo_format_name(int format)
>  	case IMGFMT_RGB4: return "RGB 4-bit";
>  	case IMGFMT_RG4B: return "RGB 4-bit per byte";
>  	case IMGFMT_RGB8: return "RGB 8-bit";
> +	case IMGFMT_RGB12: return "RGB 12-bit";
>  	case IMGFMT_RGB15: return "RGB 15-bit";
>  	case IMGFMT_RGB16: return "RGB 16-bit";
>  	case IMGFMT_RGB24: return "RGB 24-bit";
> @@ -39,6 +40,7 @@ const char *vo_format_name(int format)
>  	case IMGFMT_BGR4: return "BGR 4-bit";
>  	case IMGFMT_BG4B: return "BGR 4-bit per byte";
>  	case IMGFMT_BGR8: return "BGR 8-bit";
> +	case IMGFMT_BGR12: return "BGR 12-bit";
>  	case IMGFMT_BGR15: return "BGR 15-bit";
>  	case IMGFMT_BGR16: return "BGR 16-bit";
>  	case IMGFMT_BGR24: return "BGR 24-bit";
> diff -upr trunk.orig/libmpcodecs/img_format.h
> trunk/libmpcodecs/img_format.h ---
> trunk.orig/libmpcodecs/img_format.h	2010-02-26 02:39:48.000000000 +0100 +++
> trunk/libmpcodecs/img_format.h	2010-03-19 01:01:29.000000000 +0100 @@ -29,6
> +29,7 @@
>  #define IMGFMT_RGB4  (IMGFMT_RGB|4)
>  #define IMGFMT_RGB4_CHAR  (IMGFMT_RGB|4|128) // RGB4 with 1 pixel per byte
>  #define IMGFMT_RGB8  (IMGFMT_RGB|8)
> +#define IMGFMT_RGB12 (IMGFMT_RGB|12)
>  #define IMGFMT_RGB15 (IMGFMT_RGB|15)
>  #define IMGFMT_RGB16 (IMGFMT_RGB|16)
>  #define IMGFMT_RGB24 (IMGFMT_RGB|24)
> @@ -42,6 +43,7 @@
>  #define IMGFMT_BGR4 (IMGFMT_BGR|4)
>  #define IMGFMT_BGR4_CHAR (IMGFMT_BGR|4|128) // BGR4 with 1 pixel per byte
>  #define IMGFMT_BGR8 (IMGFMT_BGR|8)
> +#define IMGFMT_BGR12 (IMGFMT_BGR|12)
>  #define IMGFMT_BGR15 (IMGFMT_BGR|15)
>  #define IMGFMT_BGR16 (IMGFMT_BGR|16)
>  #define IMGFMT_BGR24 (IMGFMT_BGR|24)
> @@ -53,10 +55,14 @@
>  #define IMGFMT_ARGB IMGFMT_BGR32
>  #define IMGFMT_RGBA (IMGFMT_BGR32|64)
>  #define IMGFMT_RGB48NE IMGFMT_RGB48BE
> +#define IMGFMT_RGB12BE IMGFMT_RGB12
> +#define IMGFMT_RGB12LE (IMGFMT_RGB12|64)
>  #define IMGFMT_RGB15BE IMGFMT_RGB15
>  #define IMGFMT_RGB15LE (IMGFMT_RGB15|64)
>  #define IMGFMT_RGB16BE IMGFMT_RGB16
>  #define IMGFMT_RGB16LE (IMGFMT_RGB16|64)
> +#define IMGFMT_BGR12BE IMGFMT_BGR12
> +#define IMGFMT_BGR12LE (IMGFMT_BGR12|64)
>  #define IMGFMT_BGR15BE IMGFMT_BGR15
>  #define IMGFMT_BGR15LE (IMGFMT_BGR15|64)
>  #define IMGFMT_BGR16BE IMGFMT_BGR16
> @@ -67,10 +73,14 @@
>  #define IMGFMT_ARGB (IMGFMT_RGB32|64)
>  #define IMGFMT_RGBA IMGFMT_RGB32
>  #define IMGFMT_RGB48NE IMGFMT_RGB48LE
> +#define IMGFMT_RGB12BE (IMGFMT_RGB12|64)
> +#define IMGFMT_RGB12LE IMGFMT_RGB12
>  #define IMGFMT_RGB15BE (IMGFMT_RGB15|64)
>  #define IMGFMT_RGB15LE IMGFMT_RGB15
>  #define IMGFMT_RGB16BE (IMGFMT_RGB16|64)
>  #define IMGFMT_RGB16LE IMGFMT_RGB16
> +#define IMGFMT_BGR12BE (IMGFMT_BGR12|64)
> +#define IMGFMT_BGR12LE IMGFMT_BGR12
>  #define IMGFMT_BGR15BE (IMGFMT_BGR15|64)
>  #define IMGFMT_BGR15LE IMGFMT_BGR15
>  #define IMGFMT_BGR16BE (IMGFMT_BGR16|64)
> diff -upr trunk.orig/libmpcodecs/vf_1bpp.c trunk/libmpcodecs/vf_1bpp.c
> --- trunk.orig/libmpcodecs/vf_1bpp.c	2010-02-26 02:39:43.000000000 +0100
> +++ trunk/libmpcodecs/vf_1bpp.c	2010-03-19 01:01:29.000000000 +0100
> @@ -45,6 +45,8 @@ static const unsigned int bgr_list[]={
>      IMGFMT_444P,
>
>      IMGFMT_YUY2,
> +    IMGFMT_BGR12,
> +    IMGFMT_RGB12,
>      IMGFMT_BGR15,
>      IMGFMT_RGB15,
>      IMGFMT_BGR16,
> @@ -150,6 +152,10 @@ static int put_image(struct vf_instance
>      case IMGFMT_YUY2:
>  	convert(mpi,dmpi,0x8000,0x80ff,2);
>  	break;
> +    case IMGFMT_BGR12:
> +    case IMGFMT_RGB12:
> +	convert(mpi,dmpi,0,0x0fff,2);
> +	break;
>      case IMGFMT_BGR15:
>      case IMGFMT_RGB15:
>  	convert(mpi,dmpi,0,0x7fff,2);
> diff -upr trunk.orig/libmpcodecs/vf_expand.c trunk/libmpcodecs/vf_expand.c
> --- trunk.orig/libmpcodecs/vf_expand.c	2010-02-26 02:39:46.000000000 +0100
> +++ trunk/libmpcodecs/vf_expand.c	2010-03-19 01:01:29.000000000 +0100
> @@ -146,6 +146,10 @@ static void draw_func(int x0,int y0, int
>  			vf->dmpi->stride[0]*y0+
>  			(vf->dmpi->bpp>>3)*x0;
>      switch(vf->dmpi->imgfmt){
> +    case IMGFMT_BGR12:
> +    case IMGFMT_RGB12:
> +	vo_draw_alpha_rgb12(w,h,src,srca,stride,dst,vf->dmpi->stride[0]);
> +	break;
>      case IMGFMT_BGR15:
>      case IMGFMT_RGB15:
>  	vo_draw_alpha_rgb15(w,h,src,srca,stride,dst,vf->dmpi->stride[0]);
> diff -upr trunk.orig/libmpcodecs/vf_rgbtest.c
> trunk/libmpcodecs/vf_rgbtest.c ---
> trunk.orig/libmpcodecs/vf_rgbtest.c	2010-02-26 02:39:50.000000000 +0100 +++
> trunk/libmpcodecs/vf_rgbtest.c	2010-03-19 01:01:29.000000000 +0100 @@
> -37,11 +37,13 @@ struct vf_priv_s {
>
>  static unsigned int getfmt(unsigned int outfmt){
>      switch(outfmt){
> +    case IMGFMT_RGB12:
>      case IMGFMT_RGB15:
>      case IMGFMT_RGB16:
>      case IMGFMT_RGB24:
>      case IMGFMT_RGBA:
>      case IMGFMT_ARGB:
> +    case IMGFMT_BGR12:
>      case IMGFMT_BGR15:
>      case IMGFMT_BGR16:
>      case IMGFMT_BGR24:
> @@ -54,6 +56,10 @@ static unsigned int getfmt(unsigned int
>
>  static void put_pixel(uint8_t *buf, int x, int y, int stride, int r, int
> g, int b, int fmt){ switch(fmt){
> +    case IMGFMT_BGR12: ((uint16_t*)(buf + y*stride))[x]= ((r>>4)<< 8) |
> ((g>>4)<<4) | (b>>4); +    break;
> +    case IMGFMT_RGB12: ((uint16_t*)(buf + y*stride))[x]= ((b>>4)<< 8) |
> ((g>>4)<<4) | (r>>4); +    break;
>      case IMGFMT_BGR15: ((uint16_t*)(buf + y*stride))[x]= ((r>>3)<<10) |
> ((g>>3)<<5) | (b>>3); break;
>      case IMGFMT_RGB15: ((uint16_t*)(buf + y*stride))[x]= ((b>>3)<<10) |
> ((g>>3)<<5) | (r>>3); diff -upr trunk.orig/libmpcodecs/vf_scale.c
> trunk/libmpcodecs/vf_scale.c ---
> trunk.orig/libmpcodecs/vf_scale.c	2010-02-26 02:39:49.000000000 +0100 +++
> trunk/libmpcodecs/vf_scale.c	2010-03-19 01:01:29.000000000 +0100 @@ -96,6
> +96,8 @@ static const unsigned int outfmt_list[]=
>      IMGFMT_RGB16,
>      IMGFMT_BGR15,
>      IMGFMT_RGB15,
> +    IMGFMT_BGR12,
> +    IMGFMT_RGB12,
>      IMGFMT_Y800,
>      IMGFMT_Y8,
>      IMGFMT_BGR8,
> diff -upr trunk.orig/libmpcodecs/vf_screenshot.c
> trunk/libmpcodecs/vf_screenshot.c ---
> trunk.orig/libmpcodecs/vf_screenshot.c	2010-02-26 02:39:43.000000000 +0100
> +++ trunk/libmpcodecs/vf_screenshot.c	2010-03-19 01:01:29.000000000 +0100
> @@ -258,6 +258,7 @@ static int query_format(struct vf_instan
>      case IMGFMT_BGR24:
>      case IMGFMT_BGR16:
>      case IMGFMT_BGR15:
> +    case IMGFMT_BGR12:
>      case IMGFMT_RGB32:
>      case IMGFMT_RGB24:
>      case IMGFMT_Y800:
> diff -upr trunk.orig/libmpcodecs/vf_tile.c trunk/libmpcodecs/vf_tile.c
> --- trunk.orig/libmpcodecs/vf_tile.c	2010-02-26 02:39:46.000000000 +0100
> +++ trunk/libmpcodecs/vf_tile.c	2010-03-19 01:01:29.000000000 +0100
> @@ -202,12 +202,14 @@ static void uninit(struct vf_instance *v
>  static int query_format(struct vf_instance *vf, unsigned int fmt)
>  {
>  	switch (fmt) {
> -        /* rgb 15 -> 32 bit */
> +        /* rgb 12 -> 32 bit */
> +        case IMGFMT_RGB12:
>          case IMGFMT_RGB15:
>  	case IMGFMT_RGB16:
>  	case IMGFMT_RGB24:
>          case IMGFMT_RGB32:
> -        /* bgr 15 -> 32 bit */
> +        /* bgr 12 -> 32 bit */
> +	case IMGFMT_BGR12:
>  	case IMGFMT_BGR15:
>  	case IMGFMT_BGR16:
>  	case IMGFMT_BGR24:
> diff -upr trunk.orig/libvo/osd.c trunk/libvo/osd.c
> --- trunk.orig/libvo/osd.c	2010-02-26 02:40:23.000000000 +0100
> +++ trunk/libvo/osd.c	2010-03-19 01:01:29.000000000 +0100
> @@ -329,6 +329,38 @@ 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<h;y++){
> diff -upr trunk.orig/libvo/osd.h trunk/libvo/osd.h
> --- trunk.orig/libvo/osd.h	2010-02-26 02:40:23.000000000 +0100
> +++ trunk/libvo/osd.h	2010-03-19 01:01:29.000000000 +0100
> @@ -29,6 +29,7 @@ void vo_draw_alpha_yuy2(int w,  int h, u
>  void vo_draw_alpha_uyvy(int w,  int h, unsigned char* src, unsigned char
> *srca, int srcstride, unsigned char* dstbase, int dststride); void
> vo_draw_alpha_rgb24(int w, int h, unsigned char* src, unsigned char *srca,
> int srcstride, unsigned char* dstbase, int dststride); void
> vo_draw_alpha_rgb32(int w, int h, unsigned char* src, unsigned char *srca,
> int srcstride, unsigned char* dstbase, int dststride); +void
> vo_draw_alpha_rgb12(int w, int h, unsigned char* src, unsigned char *srca,
> int srcstride, unsigned char* dstbase, int dststride); void
> vo_draw_alpha_rgb15(int w, int h, unsigned char* src, unsigned char *srca,
> int srcstride, unsigned char* dstbase, int dststride); void
> vo_draw_alpha_rgb16(int w, int h, unsigned char* src, unsigned char *srca,
> int srcstride, unsigned char* dstbase, int dststride);
>
> diff -upr trunk.orig/libvo/vo_directfb2.c trunk/libvo/vo_directfb2.c
> --- trunk.orig/libvo/vo_directfb2.c	2010-02-26 02:40:25.000000000 +0100
> +++ trunk/libvo/vo_directfb2.c	2010-03-19 01:01:29.000000000 +0100
> @@ -324,9 +324,13 @@ static DFBSurfacePixelFormat convformat(
>  #if DIRECTFBVERSION > 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;
> @@ -547,6 +551,8 @@ static int config(uint32_t s_width, uint
>      		    case IMGFMT_BGR16:
>              	    case IMGFMT_RGB15:
>  	    	    case IMGFMT_BGR15:
> +            	    case IMGFMT_RGB12:
> +	    	    case IMGFMT_BGR12:
>  					params.bpp=16;
>  					break;
>  		    default:		params.bpp=0;
> @@ -671,8 +677,10 @@ static int config(uint32_t s_width, uint
>  	            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;
>  		}
> @@ -684,8 +692,10 @@ static int config(uint32_t s_width, uint
>  	            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"); @@ -1493,6 +1503,13 @@ static void draw_alpha(int x0, int
> y0, i
>  #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 -upr trunk.orig/libvo/vo_fbdev.c trunk/libvo/vo_fbdev.c
> --- trunk.orig/libvo/vo_fbdev.c	2010-03-18 21:43:44.000000000 +0100
> +++ trunk/libvo/vo_fbdev.c	2010-03-19 01:01:29.000000000 +0100
> @@ -521,6 +521,13 @@ static void set_bpp(struct fb_var_screen
>          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,7 @@ 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 +857,9 @@ static int config(uint32_t width, uint32
>      case 15:
>          draw_alpha_p = vo_draw_alpha_rgb15;
>          break;
> +    case 12:
> +        draw_alpha_p = vo_draw_alpha_rgb12;
> +        break;
>      default:
>          return 1;
>      }
> diff -upr trunk.orig/libvo/vo_fbdev2.c trunk/libvo/vo_fbdev2.c
> --- trunk.orig/libvo/vo_fbdev2.c	2010-03-05 16:07:05.000000000 +0100
> +++ trunk/libvo/vo_fbdev2.c	2010-03-19 01:01:29.000000000 +0100
> @@ -77,6 +77,13 @@ static void set_bpp(struct fb_var_screen
>  			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
>  		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;
>  	}
>
> diff -upr trunk.orig/libvo/vo_sdl.c trunk/libvo/vo_sdl.c
> --- trunk.orig/libvo/vo_sdl.c	2010-02-26 02:40:23.000000000 +0100
> +++ trunk/libvo/vo_sdl.c	2010-03-19 01:01:29.000000000 +0100
> @@ -299,6 +299,10 @@ static void draw_alpha(int x0,int y0, in
>          if(priv->dblit) {
>              x0 *= priv->surface->format->BytesPerPixel;
>  		switch(priv->format) {
> +		case IMGFMT_RGB12:
> +		case IMGFMT_BGR12:
> +    			vo_draw_alpha_rgb12(w,h,src,srca,stride,((uint8_t *)
> priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch);
> +		break;
>  		case IMGFMT_RGB15:
>  		case IMGFMT_BGR15:
>      			vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *)
> priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); @@
> -320,6 +324,10 @@ static void draw_alpha(int x0,int y0, in
>  		else {
>              x0 *= priv->rgbsurface->format->BytesPerPixel;
>  		switch(priv->format) {
> +		case IMGFMT_RGB12:
> +		case IMGFMT_BGR12:
> +    			vo_draw_alpha_rgb12(w,h,src,srca,stride,((uint8_t *)
> priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->p
>itch); +		break;
>  		case IMGFMT_RGB15:
>  		case IMGFMT_BGR15:
>      			vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *)
> priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->p
>itch); @@ -741,12 +749,14 @@ config(uint32_t width, uint32_t height,
>  		case IMGFMT_YVYU:
>              priv->mode = YUV;
>              break;
> +		case IMGFMT_BGR12:
>  		case IMGFMT_BGR15:
>  		case IMGFMT_BGR16:
>  		case IMGFMT_BGR24:
>  		case IMGFMT_BGR32:
>  			priv->mode = BGR;
>  			break;
> +        case IMGFMT_RGB12:
>          case IMGFMT_RGB15:
>          case IMGFMT_RGB16:
>          case IMGFMT_RGB24:
> @@ -909,7 +919,14 @@ static int setup_surfaces(void)
>  		// 24 bit: r:ff0000 g:ff00 b:ff
>  		// 16 bit: r:1111100000000000b g:0000011111100000b b:0000000000011111b
>  		// 15 bit: r:111110000000000b g:000001111100000b b:000000000011111b
> +		// 12 bit: r:111100000000b g:000011110000b b:000000001111b
>  		// FIXME: colorkey detect based on bpp, FIXME static bpp value, FIXME
> alpha value correct? +	    case IMGFMT_RGB12:
> +            priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY,
> surfwidth, surfheight, 12, 0x000F, 0x00F0, 0x0F00, 0); +	    break;
> +	    case IMGFMT_BGR12:
> +            priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY,
> surfwidth, surfheight, 12, 0x0F00, 0x00F0, 0x000F, 0); +	    break;
>  	    case IMGFMT_RGB15:
>              priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY,
> surfwidth, surfheight, 15, 31, 992, 31744, 0); break;
> @@ -1002,6 +1019,8 @@ static int draw_frame(uint8_t *src[])
>  	    SDL_OVR_UNLOCK
>              break;
>
> +	case IMGFMT_RGB12:
> +	case IMGFMT_BGR12:
>  	case IMGFMT_RGB15:
>  	case IMGFMT_BGR15:
>  	case IMGFMT_RGB16:
> @@ -1334,6 +1353,8 @@ static void erase_rectangle(int x, int y
>                  break;
>          }
>
> +        case IMGFMT_RGB12:
> +        case IMGFMT_BGR12:
>          case IMGFMT_RGB15:
>          case IMGFMT_BGR15:
>          case IMGFMT_RGB16:
> @@ -1436,6 +1457,8 @@ static void flip_page (void)
>  	struct sdl_priv_s *priv = &sdl_priv;
>
>  	switch(priv->format) {
> +	    case IMGFMT_RGB12:
> +	    case IMGFMT_BGR12:
>  	    case IMGFMT_RGB15:
>  	    case IMGFMT_BGR15:
>  	    case IMGFMT_RGB16:
> @@ -1490,6 +1513,8 @@ query_format(uint32_t format)
>      case IMGFMT_YVYU:
>          return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD
> | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN;
> +    case IMGFMT_RGB12:
> +    case IMGFMT_BGR12:
>      case IMGFMT_RGB15:
>      case IMGFMT_BGR15:
>      case IMGFMT_RGB16:
> diff -upr trunk.orig/libvo/vo_x11.c trunk/libvo/vo_x11.c
> --- trunk.orig/libvo/vo_x11.c	2010-02-26 02:40:25.000000000 +0100
> +++ trunk/libvo/vo_x11.c	2010-03-19 01:01:29.000000000 +0100
> @@ -146,6 +146,14 @@ static void draw_alpha_15(int x0, int y0
>                          2 * image_width);
>  }
>
> +static void draw_alpha_12(int x0, int y0, int w, int h, unsigned char
> *src, +                          unsigned char *srca, int stride)
> +{
> +    vo_draw_alpha_rgb12(w, h, src, srca, stride,
> +                        ImageData + 2 * (y0 * image_width + x0),
> +                        2 * image_width);
> +}
> +
>  static void draw_alpha_null(int x0, int y0, int w, int h,
>                              unsigned char *src, unsigned char *srca,
>                              int stride)
> @@ -285,6 +293,8 @@ const struct fmt2Xfmtentry_s {
>    {IMGFMT_RGB8,  BO_NONNATIVE, 0x00000007, 0x00000038, 0x000000C0},
>    {IMGFMT_BGR8,  BO_NATIVE,    0x000000E0, 0x0000001C, 0x00000003},
>    {IMGFMT_BGR8,  BO_NONNATIVE, 0x000000E0, 0x0000001C, 0x00000003},
> +  {IMGFMT_RGB12, BO_NATIVE,    0x0000000F, 0x000000F0, 0x00000F00},
> +  {IMGFMT_BGR12, BO_NATIVE,    0x00000F00, 0x000000F0, 0x0000000F},
>    {IMGFMT_RGB15, BO_NATIVE,    0x0000001F, 0x000003E0, 0x00007C00},
>    {IMGFMT_BGR15, BO_NATIVE,    0x00007C00, 0x000003E0, 0x0000001F},
>    {IMGFMT_RGB16, BO_NATIVE,    0x0000001F, 0x000007E0, 0x0000F800},
> @@ -620,6 +630,7 @@ static int query_format(uint32_t format)
>      switch (format)
>      {
>  //   case IMGFMT_BGR8:
> +//   case IMGFMT_BGR12:
>  //   case IMGFMT_BGR15:
>  //   case IMGFMT_BGR16:
>  //   case IMGFMT_BGR24:
> diff -upr trunk.orig/m_option.c trunk/m_option.c
> --- trunk.orig/m_option.c	2010-03-05 16:07:13.000000000 +0100
> +++ trunk/m_option.c	2010-03-19 01:01:29.000000000 +0100
> @@ -1080,6 +1080,7 @@ static struct {
>    {"bgr32", IMGFMT_BGR32},
>    {"bgr16", IMGFMT_BGR16},
>    {"bgr15", IMGFMT_BGR15},
> +  {"bgr12", IMGFMT_BGR12},
>    {"bgr8", IMGFMT_BGR8},
>    {"bgr4", IMGFMT_BGR4},
>    {"bg4b", IMGFMT_BG4B},
> @@ -1091,6 +1092,7 @@ static struct {
>    {"rgb32", IMGFMT_RGB32},
>    {"rgb16", IMGFMT_RGB16},
>    {"rgb15", IMGFMT_RGB15},
> +  {"rgb12", IMGFMT_RGB12},
>    {"rgb8", IMGFMT_RGB8},
>    {"rgb4", IMGFMT_RGB4},
>    {"rg4b", IMGFMT_RG4B},





More information about the MPlayer-dev-eng mailing list