Changeset aa98c569277c489e7796e857e56f4fad15b0d00c

Show
Ignore:
Timestamp:
13/09/08 23:47:15 (3 months ago)
Author:
Antoine Cellerier <dionoea@videolan.org>
git-committer:
Antoine Cellerier <dionoea@videolan.org> 1221342435 +0200
git-parent:

[f93b233d65ebe77ab284d978253e68baf0e02550]

git-author:
Antoine Cellerier <dionoea@videolan.org> 1221341962 +0200
Message:

Fixed the RGB masks in v4l2.

Thanks a lot to plc5_250 on IRC for testing.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/access/v4l2/v4l2.c

    r2809298 raa98c56  
    440440    unsigned int i_v4l2; 
    441441    int i_fourcc; 
     442    int i_rmask; 
     443    int i_gmask; 
     444    int i_bmask; 
    442445} v4l2chroma_to_fourcc[] = 
    443446{ 
    444447    /* Raw data types */ 
    445     { V4L2_PIX_FMT_GREY,    VLC_FOURCC('G','R','E','Y') }, 
    446     { V4L2_PIX_FMT_HI240,   VLC_FOURCC('I','2','4','0') }, 
    447     { V4L2_PIX_FMT_RGB565,  VLC_FOURCC('R','V','1','6') }, 
    448     { V4L2_PIX_FMT_RGB555,  VLC_FOURCC('R','V','1','5') }, 
    449     { V4L2_PIX_FMT_BGR24,   VLC_FOURCC('R','V','2','4') }, 
    450     { V4L2_PIX_FMT_BGR32,   VLC_FOURCC('R','V','3','2') }, 
    451     { V4L2_PIX_FMT_YUYV,    VLC_FOURCC('Y','U','Y','2') }, 
    452     { V4L2_PIX_FMT_YUYV,    VLC_FOURCC('Y','U','Y','V') }, 
    453     { V4L2_PIX_FMT_UYVY,    VLC_FOURCC('U','Y','V','Y') }, 
    454     { V4L2_PIX_FMT_Y41P,    VLC_FOURCC('I','4','1','N') }, 
    455     { V4L2_PIX_FMT_YUV422P, VLC_FOURCC('I','4','2','2') }, 
    456     { V4L2_PIX_FMT_YVU420,  VLC_FOURCC('Y','V','1','2') }, 
    457     { V4L2_PIX_FMT_YUV411P, VLC_FOURCC('I','4','1','1') }, 
    458     { V4L2_PIX_FMT_YUV410,  VLC_FOURCC('I','4','1','0') }, 
     448    { V4L2_PIX_FMT_GREY,    VLC_FOURCC('G','R','E','Y'), 0, 0, 0 }, 
     449    { V4L2_PIX_FMT_HI240,   VLC_FOURCC('I','2','4','0'), 0, 0, 0 }, 
     450    { V4L2_PIX_FMT_RGB555,  VLC_FOURCC('R','V','1','5'), 0x001f,0x03e0,0x7c00 }, 
     451    { V4L2_PIX_FMT_RGB565,  VLC_FOURCC('R','V','1','6'), 0x001f,0x07e0,0xf800 }, 
     452    /* Won't work since we don't know how to handle such gmask values 
     453     * correctly 
     454    { V4L2_PIX_FMT_RGB555X, VLC_FOURCC('R','V','1','5'), 0x007c,0xe003,0x1f00 }, 
     455    { V4L2_PIX_FMT_RGB565X, VLC_FOURCC('R','V','1','6'), 0x00f8,0xe007,0x1f00 }, 
     456    */ 
     457    { V4L2_PIX_FMT_BGR24,   VLC_FOURCC('R','V','2','4'), 0xff0000,0xff00,0xff }, 
     458    { V4L2_PIX_FMT_RGB24,   VLC_FOURCC('R','V','2','4'), 0xff,0xff00,0xff0000 }, 
     459    { V4L2_PIX_FMT_BGR32,   VLC_FOURCC('R','V','3','2'), 0xff0000,0xff00,0xff }, 
     460    { V4L2_PIX_FMT_RGB32,   VLC_FOURCC('R','V','3','2'), 0xff,0xff00,0xff0000 }, 
     461    { V4L2_PIX_FMT_YUYV,    VLC_FOURCC('Y','U','Y','2'), 0, 0, 0 }, 
     462    { V4L2_PIX_FMT_YUYV,    VLC_FOURCC('Y','U','Y','V'), 0, 0, 0 }, 
     463    { V4L2_PIX_FMT_UYVY,    VLC_FOURCC('U','Y','V','Y'), 0, 0, 0 }, 
     464    { V4L2_PIX_FMT_Y41P,    VLC_FOURCC('I','4','1','N'), 0, 0, 0 }, 
     465    { V4L2_PIX_FMT_YUV422P, VLC_FOURCC('I','4','2','2'), 0, 0, 0 }, 
     466    { V4L2_PIX_FMT_YVU420,  VLC_FOURCC('Y','V','1','2'), 0, 0, 0 }, 
     467    { V4L2_PIX_FMT_YUV411P, VLC_FOURCC('I','4','1','1'), 0, 0, 0 }, 
     468    { V4L2_PIX_FMT_YUV410,  VLC_FOURCC('I','4','1','0'), 0, 0, 0 }, 
    459469 
    460470    /* Raw data types, not in V4L2 spec but still in videodev2.h and supported 
    461471     * by VLC */ 
    462     { V4L2_PIX_FMT_YUV420,  VLC_FOURCC('I','4','2','0') }, 
     472    { V4L2_PIX_FMT_YUV420,  VLC_FOURCC('I','4','2','0'), 0, 0, 0 }, 
    463473    /* FIXME { V4L2_PIX_FMT_RGB444,  VLC_FOURCC('R','V','3','2') }, */ 
    464474 
    465475    /* Compressed data types */ 
    466     { V4L2_PIX_FMT_MJPEG,   VLC_FOURCC('M','J','P','G') }, 
     476    { V4L2_PIX_FMT_MJPEG,   VLC_FOURCC('M','J','P','G'), 0, 0, 0 }, 
    467477#if 0 
    468478    { V4L2_PIX_FMT_JPEG,    VLC_FOURCC('J','P','E','G') }, 
     
    470480    { V4L2_PIX_FMT_MPEG,    VLC_FOURCC('?','?','?','?') }, 
    471481#endif 
    472     { 0, 0
     482    { 0, 0, 0, 0, 0
    473483}; 
    474484 
     
    476486 * List of V4L2 chromas were confident enough to use as fallbacks if the 
    477487 * user hasn't provided a --v4l2-chroma value. 
     488 * 
     489 * Try YUV chromas first, then RGB little endian and MJPEG as last resort. 
    478490 */ 
    479491static const __u32 p_chroma_fallbacks[] = 
    480492{ V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_YVU420, V4L2_PIX_FMT_YUV422P, 
    481   V4L2_PIX_FMT_YUYV, V4L2_PIX_FMT_UYVY, V4L2_PIX_FMT_MJPEG }; 
     493  V4L2_PIX_FMT_YUYV, V4L2_PIX_FMT_UYVY, V4L2_PIX_FMT_BGR24, 
     494  V4L2_PIX_FTM_BGR32, V4L2_PIX_FMT_MJPEG }; 
    482495 
    483496static const struct 
     
    18171830    enum v4l2_buf_type buf_type; 
    18181831    char *psz_device = p_sys->psz_vdev; 
     1832    es_format_t es_fmt; 
    18191833 
    18201834    if( ( i_fd = open( psz_device, O_RDWR ) ) < 0 ) 
     
    20552069        { 
    20562070            p_sys->i_fourcc = v4l2chroma_to_fourcc[i].i_fourcc; 
     2071            es_format_Init( &es_fmt, VIDEO_ES, p_sys->i_fourcc ); 
     2072            es_fmt.video.i_rmask = v4l2chroma_to_fourcc[i].i_rmask; 
     2073            es_fmt.video.i_gmask = v4l2chroma_to_fourcc[i].i_gmask; 
     2074            es_fmt.video.i_bmask = v4l2chroma_to_fourcc[i].i_bmask; 
    20572075            break; 
    20582076        } 
     
    21322150 
    21332151    /* Add */ 
    2134     es_format_t es_fmt; 
    2135     es_format_Init( &es_fmt, VIDEO_ES, p_sys->i_fourcc ); 
    21362152    es_fmt.video.i_width  = p_sys->i_width; 
    21372153    es_fmt.video.i_height = p_sys->i_height; 
    21382154    es_fmt.video.i_aspect = 4 * VOUT_ASPECT_FACTOR / 3; 
    2139  
    2140     /* Setup rgb mask for RGB formats */ 
    2141     if( p_sys->i_fourcc == VLC_FOURCC( 'R','V','2','4' ) ) 
    2142     { 
    2143         /* This is in BGR format */ 
    2144         es_fmt.video.i_bmask = 0x00ff0000; 
    2145         es_fmt.video.i_gmask = 0x0000ff00; 
    2146         es_fmt.video.i_rmask = 0x000000ff; 
    2147     } 
    21482155 
    21492156    msg_Dbg( p_demux, "added new video es %4.4s %dx%d",