wrong colors with Xv extension and image format id: 0x59565955 (UYVY) from an rgb mapping

Amos Tibaldi amos.tibaldi at gmail.com
Wed Jan 21 23:55:17 PST 2009


The driver is ati radeon 8.12, the kernel object loaded is fglrx.ko

2009/1/22 Corbin Simpson <mostawesomedude at gmail.com>

> Amos Tibaldi wrote:
> > Hello,
> >   I am trying to use the Xv extension in order to display images on
> windows.
> > I have obtained the image formats with
> >  xvc.fo = XvListImageFormats( xvc.display, xvc.port, (int *)&formats );
> > and I have chosen the format
> >       id: 0x59565955 (UYVY)
> >         guid: 55595659-0000-0010-8000-00aa00389b71
> >         bits per pixel: 16
> >         number of planes: 1
> >         type: YUV (packed)
> >
> > I'd like to convert from RGB to UYVY and I have found that for the struct
> >
> > typedef struct {
> >   int id;                      /* Unique descriptor for the format */
> >   int type;                    /* XvRGB, XvYUV */
> >   int byte_order;              /* LSBFirst, MSBFirst */
> >   char guid[16];               /* Globally Unique IDentifier */
> >   int bits_per_pixel;
> >   int format;                  /* XvPacked, XvPlanar */
> >   int num_planes;
> >
> >   /* for RGB formats only */
> >   int depth;
> >   unsigned int red_mask;
> >   unsigned int green_mask;
> >   unsigned int blue_mask;
> >
> >   /* for YUV formats only */
> >   unsigned int y_sample_bits;
> >   unsigned int u_sample_bits;
> >   unsigned int v_sample_bits;
> >   unsigned int horz_y_period;
> >   unsigned int horz_u_period;
> >   unsigned int horz_v_period;
> >   unsigned int vert_y_period;
> >   unsigned int vert_u_period;
> >   unsigned int vert_v_period;
> >   char component_order[32];    /* eg. UYVY */
> >   int scanline_order;          /* XvTopToBottom, XvBottomToTop */
> > } XvImageFormatValues;
> >
> > that image format has: ysb 8; usb 8; vsb 8; hyp 1; hup 2; hvp 2; vyp 1;
> vup
> > 1; vvp 1; 'UYVY'slo: 0
> >
> > So I'm trying to convert the bytes from rgb with:
> >
> >
> > void RGBToUYVY(unsigned short int r,
> >                unsigned short int g,
> >                unsigned short int b,
> >                unsigned short int * u,
> >                unsigned short int * y,
> >                unsigned short int * v)
> > {
> >     //cout << "r=" << r << " g=" << g << " b=" << b;
> >     r &= 0x00FF; g &= 0x00FF; b &= 0x00FF;
> >    *y = (unsigned short
> > int)(0.299f*(float)r+0.587f*(float)g+0.114f*(float)b);
> >     *u = (unsigned short
> > int)(-0.147f*(float)r-0.289f*(float)g+0.436f*(float)b);
> >     *v = (unsigned short
> > int)(0.615f*(float)r-0.515f*(float)g-0.100f*(float)b);
> >     *y &= 0x00FF;
> >     *u &= 0x00FF;
> >     *v &= 0x00FF;
> >     //cout << " y=" << *y << " u=" << *u << " v=" << *v <<endl;
> > }
> >
> > and to display the image with
> > void XVWindow::Redraw()
> > {
> >     unsigned short int u, y, v;
> >     RGBToUYVY(255,255,0,&u,&y,&v);
> >     unsigned short int thecolor =  u << 12 | y << 8 | v << 4 | y;
> >
> >       for ( int y=0; y<ImageHeight; y++ )
> >     for ( int x=0; x<ImageWidth; x++ )
> >       ((unsigned short int *)BGimage->data)[ y * ImageWidth + x ] =
> > thecolor;
> >
> >     counter++;
> >             XvPutImage( xvc.display, xvc.port, window, gc,
> >                     BGimage, 0, 0, ImageWidth, ImageHeight,
> >                        0, 0, WindowWidth, WindowHeight );
> > }
> >
> > but the colors are always different. I have tried to use the blue, the
> red
> > and the green to see if I could obtain them separately but the mapping
> was
> > always wrong and different colours were showing on the window with
> respect
> > to those that I'd like to use in RGB.
> >
> > What can I do? Is my RGB to UYVY correct? Why do I obtain on the screen
> > different colours. There are some kind of manual on how to map colors
> with
> > XV images?
>
> Which driver, exactly? Most drivers provide RGB Xv formats, and those
> that don't probably could be hacked to add it.
>
> ~ C.
>



-- 
Amos Tibaldi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg/attachments/20090122/4c693c9a/attachment.html>


More information about the xorg mailing list