[vlc-devel] [PATCH] v4l2: split declarations

Rémi Denis-Courmont remi at remlab.net
Fri Dec 23 20:47:51 CET 2011


   Hello,

I don't see the point in factoring demux-specific mmap stuff. It can't work. And 
it will make my work on zero-copy V4L2 input needlessly more complicated. It's 
already bad enough with the V4L2 access that nobody seems to use.

On Friday 23 December 2011, Francois Cartegnie wrote:
> ---
>  modules/access/Modules.am         |    3 +
>  modules/access/v4l2/access.c      |    1 +
>  modules/access/v4l2/controls.c    |    1 +
>  modules/access/v4l2/demux.c       |    1 +
>  modules/access/v4l2/v4l2.h        |   24 +-----
>  modules/access/v4l2/v4l2_common.c |  162
> +++++++++++++++++++++++++++++++++++++ modules/access/v4l2/v4l2_common.h | 
>  31 +++++++
>  modules/access/v4l2/v4l2_input.h  |   46 +++++++++++
>  modules/access/v4l2/video.c       |  162
> ++++++------------------------------- 9 files changed, 272 insertions(+),
> 159 deletions(-)
>  create mode 100644 modules/access/v4l2/v4l2_common.c
>  create mode 100644 modules/access/v4l2/v4l2_common.h
>  create mode 100644 modules/access/v4l2/v4l2_input.h
> 
> diff --git a/modules/access/Modules.am b/modules/access/Modules.am
> index bbf0c5e..9e86086 100644
> --- a/modules/access/Modules.am
> +++ b/modules/access/Modules.am
> @@ -161,6 +161,9 @@ libv4l2_plugin_la_SOURCES = \
>  	v4l2/video.c \
>  	v4l2/demux.c \
>  	v4l2/access.c \
> +	v4l2/v4l2_common.c \
> +	v4l2/v4l2_common.h \
> +	v4l2/v4l2_input.h \
>  	v4l2/controls.c \
>  	v4l2/v4l2.h
>  libv4l2_plugin_la_CFLAGS = $(AM_CFLAGS) $(LIBV4L2_CFLAGS)
> diff --git a/modules/access/v4l2/access.c b/modules/access/v4l2/access.c
> index 38348d2..df88c22 100644
> --- a/modules/access/v4l2/access.c
> +++ b/modules/access/v4l2/access.c
> @@ -28,6 +28,7 @@
>  #endif
> 
>  #include "v4l2.h"
> +#include "v4l2_input.h"
>  #include <vlc_access.h>
> 
>  #include <errno.h>
> diff --git a/modules/access/v4l2/controls.c
> b/modules/access/v4l2/controls.c index 2bfbabb..f4309a1 100644
> --- a/modules/access/v4l2/controls.c
> +++ b/modules/access/v4l2/controls.c
> @@ -28,6 +28,7 @@
>  #endif
> 
>  #include "v4l2.h"
> +#include "v4l2_input.h"
>  #include <ctype.h>
>  #include <assert.h>
>  #include <sys/ioctl.h>
> diff --git a/modules/access/v4l2/demux.c b/modules/access/v4l2/demux.c
> index bdbeb95..74c4076 100644
> --- a/modules/access/v4l2/demux.c
> +++ b/modules/access/v4l2/demux.c
> @@ -28,6 +28,7 @@
>  #endif
> 
>  #include "v4l2.h"
> +#include "v4l2_input.h"
>  #include <vlc_demux.h>
>  #include <errno.h>
>  #include <sys/ioctl.h>
> diff --git a/modules/access/v4l2/v4l2.h b/modules/access/v4l2/v4l2.h
> index 8b227d1..91207e6 100644
> --- a/modules/access/v4l2/v4l2.h
> +++ b/modules/access/v4l2/v4l2.h
> @@ -69,8 +69,6 @@
>  #   define v4l2_munmap munmap
>  #endif
> 
> -#define CFG_PREFIX "v4l2-"
> -
>  /* TODO: remove this, use callbacks */
>  typedef enum {
>      IO_METHOD_READ=1,
> @@ -92,7 +90,7 @@ struct demux_sys_t
>      unsigned int i_nbuffers;
>  #define blocksize i_nbuffers /* HACK HACK */
> 
> -    int i_fourcc;
> +    vlc_fourcc_t i_fourcc;
>      uint32_t i_block_flags;
> 
>      es_out_id_t *p_es;
> @@ -109,23 +107,3 @@ struct buffer_t
>      void *  start;
>      size_t  length;
>  };
> -
> -/* video.c */
> -void ParseMRL(vlc_object_t *, const char *);
> -int OpenVideo(vlc_object_t *, demux_sys_t *, bool);
> -block_t* GrabVideo(vlc_object_t *, demux_sys_t *);
> -
> -/* demux.c */
> -int DemuxOpen(vlc_object_t *);
> -void DemuxClose(vlc_object_t *);
> -float GetAbsoluteMaxFrameRate(vlc_object_t *, int fd, uint32_t fmt);
> -void GetMaxDimensions(vlc_object_t *, int fd, uint32_t fmt, float fps_min,
> -                      uint32_t *pwidth, uint32_t *pheight);
> -
> -/* access.c */
> -int AccessOpen(vlc_object_t *);
> -void AccessClose(vlc_object_t *);
> -
> -/* controls.c */
> -vlc_v4l2_ctrl_t *ControlsInit(vlc_object_t *, int fd);
> -void ControlsDeinit(vlc_object_t *, vlc_v4l2_ctrl_t *);
> diff --git a/modules/access/v4l2/v4l2_common.c
> b/modules/access/v4l2/v4l2_common.c new file mode 100644
> index 0000000..8ece257
> --- /dev/null
> +++ b/modules/access/v4l2/v4l2_common.c
> @@ -0,0 +1,162 @@
> +/*************************************************************************
> **** + * v4l2_common.c : Video4Linux2 input module for vlc
> +
> **************************************************************************
> *** + * Copyright (C) 2002-2011 the VideoLAN team
> + *
> + * This program 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.
> + *
> + * This program 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 this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
> 02110-1301, USA. +
> **************************************************************************
> ***/ +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include "v4l2_common.h"
> +#include "v4l2.h"
> +
> +#include <vlc_fourcc.h>
> +
> +#include <sys/ioctl.h>
> +#include <sys/mman.h>
> +
> +static const struct
> +{
> +    unsigned int i_v4l2;
> +    vlc_fourcc_t i_fourcc;
> +    int i_rmask;
> +    int i_gmask;
> +    int i_bmask;
> +} v4l2chroma_to_fourcc[] =
> +{
> +    /* Raw data types */
> +    { V4L2_PIX_FMT_GREY,    VLC_CODEC_GREY, 0, 0, 0 },
> +    { V4L2_PIX_FMT_HI240,   VLC_FOURCC('I','2','4','0'), 0, 0, 0 },
> +    { V4L2_PIX_FMT_RGB555,  VLC_CODEC_RGB15, 0x001f,0x03e0,0x7c00 },
> +    { V4L2_PIX_FMT_RGB565,  VLC_CODEC_RGB16, 0x001f,0x07e0,0xf800 },
> +    /* Won't work since we don't know how to handle such gmask values
> +     * correctly
> +    { V4L2_PIX_FMT_RGB555X, VLC_CODEC_RGB15, 0x007c,0xe003,0x1f00 },
> +    { V4L2_PIX_FMT_RGB565X, VLC_CODEC_RGB16, 0x00f8,0xe007,0x1f00 },
> +    */
> +    { V4L2_PIX_FMT_BGR24,   VLC_CODEC_RGB24, 0xff0000,0xff00,0xff },
> +    { V4L2_PIX_FMT_RGB24,   VLC_CODEC_RGB24, 0xff,0xff00,0xff0000 },
> +    { V4L2_PIX_FMT_BGR32,   VLC_CODEC_RGB32, 0xff0000,0xff00,0xff },
> +    { V4L2_PIX_FMT_RGB32,   VLC_CODEC_RGB32, 0xff,0xff00,0xff0000 },
> +    { V4L2_PIX_FMT_YUYV,    VLC_CODEC_YUYV, 0, 0, 0 },
> +    { V4L2_PIX_FMT_UYVY,    VLC_CODEC_UYVY, 0, 0, 0 },
> +    { V4L2_PIX_FMT_Y41P,    VLC_FOURCC('I','4','1','N'), 0, 0, 0 },
> +    { V4L2_PIX_FMT_YUV422P, VLC_CODEC_I422, 0, 0, 0 },
> +    { V4L2_PIX_FMT_YVU420,  VLC_CODEC_YV12, 0, 0, 0 },
> +    { V4L2_PIX_FMT_YUV411P, VLC_CODEC_I411, 0, 0, 0 },
> +    { V4L2_PIX_FMT_YUV410,  VLC_CODEC_I410, 0, 0, 0 },
> +
> +    /* Raw data types, not in V4L2 spec but still in videodev2.h and
> supported +     * by VLC */
> +    { V4L2_PIX_FMT_YUV420,  VLC_CODEC_I420, 0, 0, 0 },
> +    /* FIXME { V4L2_PIX_FMT_RGB444,  VLC_CODEC_RGB32 }, */
> +
> +    /* Compressed data types */
> +    { V4L2_PIX_FMT_MJPEG,   VLC_CODEC_MJPG, 0, 0, 0 },
> +    { V4L2_PIX_FMT_JPEG,    VLC_CODEC_JPEG, 0, 0, 0 },
> +#if 0
> +    { V4L2_PIX_FMT_DV,      VLC_FOURCC('?','?','?','?') },
> +    { V4L2_PIX_FMT_MPEG,    VLC_FOURCC('?','?','?','?') },
> +#endif
> +    { 0, 0, 0, 0, 0 }
> +};
> +
> +bool get_v4l2pixelformat_by_fourcc( unsigned int *found, vlc_fourcc_t
> i_requested_fourcc ) +{
> +    for( int i = 0; v4l2chroma_to_fourcc[i].i_v4l2 != 0; i++ )
> +    {
> +        if( v4l2chroma_to_fourcc[i].i_fourcc == i_requested_fourcc )
> +        {
> +            *found = v4l2chroma_to_fourcc[i].i_v4l2;
> +            return true;
> +        }
> +    }
> +    return false;
> +}
> +
> +bool get_fourcc_by_v4l2pixelformat( vlc_fourcc_t *i_fourcc, int *i_rmask,
> int *i_gmask, int *i_bmask, unsigned int pixelformat ) +{
> +    for( int i = 0; v4l2chroma_to_fourcc[i].i_fourcc != 0; i++ )
> +    {
> +        if( v4l2chroma_to_fourcc[i].i_v4l2 == pixelformat )
> +        {
> +            *i_fourcc = v4l2chroma_to_fourcc[i].i_fourcc;
> +            *i_rmask = v4l2chroma_to_fourcc[i].i_rmask;
> +            *i_gmask = v4l2chroma_to_fourcc[i].i_gmask;
> +            *i_bmask = v4l2chroma_to_fourcc[i].i_bmask;
> +            return true;
> +        }
> +    }
> +    return false;
> +}
> +/*************************************************************************
> **** + * Helper function to initalise video IO using the mmap method
> +
> **************************************************************************
> ***/ +int InitMmap( vlc_object_t *p_demux, demux_sys_t *p_sys, int i_fd )
> +{
> +    struct v4l2_requestbuffers req;
> +
> +    memset( &req, 0, sizeof(req) );
> +    req.count = 4;
> +    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
> +    req.memory = V4L2_MEMORY_MMAP;
> +
> +    if( v4l2_ioctl( i_fd, VIDIOC_REQBUFS, &req ) < 0 )
> +    {
> +        msg_Err( p_demux, "device does not support mmap I/O" );
> +        return -1;
> +    }
> +
> +    if( req.count < 2 )
> +    {
> +        msg_Err( p_demux, "insufficient buffers" );
> +        return -1;
> +    }
> +
> +    p_sys->p_buffers = calloc( req.count, sizeof( *p_sys->p_buffers ) );
> +    if( unlikely(!p_sys->p_buffers) )
> +        return -1;
> +
> +    for( p_sys->i_nbuffers = 0; p_sys->i_nbuffers < req.count;
> ++p_sys->i_nbuffers ) +    {
> +        struct v4l2_buffer buf;
> +
> +        memset( &buf, 0, sizeof(buf) );
> +        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
> +        buf.memory = V4L2_MEMORY_MMAP;
> +        buf.index = p_sys->i_nbuffers;
> +
> +        if( v4l2_ioctl( i_fd, VIDIOC_QUERYBUF, &buf ) < 0 )
> +        {
> +            msg_Err( p_demux, "VIDIOC_QUERYBUF: %m" );
> +            return -1;
> +        }
> +
> +        p_sys->p_buffers[p_sys->i_nbuffers].length = buf.length;
> +        p_sys->p_buffers[p_sys->i_nbuffers].start =
> +            v4l2_mmap( NULL, buf.length, PROT_READ | PROT_WRITE,
> MAP_SHARED, i_fd, buf.m.offset ); +
> +        if( p_sys->p_buffers[p_sys->i_nbuffers].start == MAP_FAILED )
> +        {
> +            msg_Err( p_demux, "mmap failed: %m" );
> +            return -1;
> +        }
> +    }
> +
> +    return 0;
> +}
> diff --git a/modules/access/v4l2/v4l2_common.h
> b/modules/access/v4l2/v4l2_common.h new file mode 100644
> index 0000000..c56b7b3
> --- /dev/null
> +++ b/modules/access/v4l2/v4l2_common.h
> @@ -0,0 +1,31 @@
> +/*************************************************************************
> **** + * v4l2_common.h : Video4Linux2 input module for vlc
> +
> **************************************************************************
> *** + * Copyright (C) 2002-2011 the VideoLAN team
> + *
> + * This program 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.
> + *
> + * This program 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 this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
> 02110-1301, USA. +
> **************************************************************************
> ***/ +#ifndef V4L2_COMMON_H
> +#define V4L2_COMMON_H
> +
> +#include <vlc_common.h>
> +
> +int InitMmap( vlc_object_t *p_demux, demux_sys_t *p_sys, int i_fd );
> +
> +bool get_fourcc_by_v4l2pixelformat( vlc_fourcc_t *i_fourcc, int *i_rmask,
> int *i_gmask, int *i_bmask, unsigned int pixelformat ); +bool
> get_v4l2pixelformat_by_fourcc( unsigned int *found, vlc_fourcc_t
> i_requested_fourcc ); +
> +
> +#endif // V4L2_COMMON_H
> diff --git a/modules/access/v4l2/v4l2_input.h
> b/modules/access/v4l2/v4l2_input.h new file mode 100644
> index 0000000..ffb102a
> --- /dev/null
> +++ b/modules/access/v4l2/v4l2_input.h
> @@ -0,0 +1,46 @@
> +/*************************************************************************
> **** + * v4l2_input.h : Video4Linux2 input module for vlc
> +
> **************************************************************************
> *** + * Copyright (C) 2002-2011 the VideoLAN team
> + *
> + * This program 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.
> + *
> + * This program 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 this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
> 02110-1301, USA. +
> **************************************************************************
> ***/ +
> +#ifndef V4L2_INPUT_H
> +#define V4L2_INPUT_H
> +
> +#define CFG_PREFIX "v4l2-"
> +
> +/* video.c */
> +void ParseMRL(vlc_object_t *, const char *);
> +int OpenVideo(vlc_object_t *, demux_sys_t *, bool);
> +block_t* GrabVideo(vlc_object_t *, demux_sys_t *);
> +
> +/* demux.c */
> +int DemuxOpen(vlc_object_t *);
> +void DemuxClose(vlc_object_t *);
> +float GetAbsoluteMaxFrameRate(vlc_object_t *, int fd, uint32_t fmt);
> +void GetMaxDimensions(vlc_object_t *, int fd, uint32_t fmt, float fps_min,
> +                      uint32_t *pwidth, uint32_t *pheight);
> +
> +/* access.c */
> +int AccessOpen(vlc_object_t *);
> +void AccessClose(vlc_object_t *);
> +
> +/* controls.c */
> +vlc_v4l2_ctrl_t *ControlsInit(vlc_object_t *, int fd);
> +void ControlsDeinit(vlc_object_t *, vlc_v4l2_ctrl_t *);
> +
> +#endif // V4L2_INPUT_H
> diff --git a/modules/access/v4l2/video.c b/modules/access/v4l2/video.c
> index 951213d..5c33934 100644
> --- a/modules/access/v4l2/video.c
> +++ b/modules/access/v4l2/video.c
> @@ -38,6 +38,8 @@
>  #endif
> 
>  #include "v4l2.h"
> +#include "v4l2_input.h"
> +#include "v4l2_common.h"
>  #include <vlc_plugin.h>
>  #include <vlc_fs.h>
>  #include <vlc_demux.h>
> @@ -460,52 +462,6 @@ vlc_module_end ()
> 
>  static block_t* ProcessVideoFrame( vlc_object_t *p_demux, uint8_t
> *p_frame, size_t );
> 
> -static const struct
> -{
> -    unsigned int i_v4l2;
> -    vlc_fourcc_t i_fourcc;
> -    int i_rmask;
> -    int i_gmask;
> -    int i_bmask;
> -} v4l2chroma_to_fourcc[] =
> -{
> -    /* Raw data types */
> -    { V4L2_PIX_FMT_GREY,    VLC_CODEC_GREY, 0, 0, 0 },
> -    { V4L2_PIX_FMT_HI240,   VLC_FOURCC('I','2','4','0'), 0, 0, 0 },
> -    { V4L2_PIX_FMT_RGB555,  VLC_CODEC_RGB15, 0x001f,0x03e0,0x7c00 },
> -    { V4L2_PIX_FMT_RGB565,  VLC_CODEC_RGB16, 0x001f,0x07e0,0xf800 },
> -    /* Won't work since we don't know how to handle such gmask values
> -     * correctly
> -    { V4L2_PIX_FMT_RGB555X, VLC_CODEC_RGB15, 0x007c,0xe003,0x1f00 },
> -    { V4L2_PIX_FMT_RGB565X, VLC_CODEC_RGB16, 0x00f8,0xe007,0x1f00 },
> -    */
> -    { V4L2_PIX_FMT_BGR24,   VLC_CODEC_RGB24, 0xff0000,0xff00,0xff },
> -    { V4L2_PIX_FMT_RGB24,   VLC_CODEC_RGB24, 0xff,0xff00,0xff0000 },
> -    { V4L2_PIX_FMT_BGR32,   VLC_CODEC_RGB32, 0xff0000,0xff00,0xff },
> -    { V4L2_PIX_FMT_RGB32,   VLC_CODEC_RGB32, 0xff,0xff00,0xff0000 },
> -    { V4L2_PIX_FMT_YUYV,    VLC_CODEC_YUYV, 0, 0, 0 },
> -    { V4L2_PIX_FMT_UYVY,    VLC_CODEC_UYVY, 0, 0, 0 },
> -    { V4L2_PIX_FMT_Y41P,    VLC_FOURCC('I','4','1','N'), 0, 0, 0 },
> -    { V4L2_PIX_FMT_YUV422P, VLC_CODEC_I422, 0, 0, 0 },
> -    { V4L2_PIX_FMT_YVU420,  VLC_CODEC_YV12, 0, 0, 0 },
> -    { V4L2_PIX_FMT_YUV411P, VLC_CODEC_I411, 0, 0, 0 },
> -    { V4L2_PIX_FMT_YUV410,  VLC_CODEC_I410, 0, 0, 0 },
> -
> -    /* Raw data types, not in V4L2 spec but still in videodev2.h and
> supported -     * by VLC */
> -    { V4L2_PIX_FMT_YUV420,  VLC_CODEC_I420, 0, 0, 0 },
> -    /* FIXME { V4L2_PIX_FMT_RGB444,  VLC_CODEC_RGB32 }, */
> -
> -    /* Compressed data types */
> -    { V4L2_PIX_FMT_MJPEG,   VLC_CODEC_MJPG, 0, 0, 0 },
> -    { V4L2_PIX_FMT_JPEG,    VLC_CODEC_JPEG, 0, 0, 0 },
> -#if 0
> -    { V4L2_PIX_FMT_DV,      VLC_FOURCC('?','?','?','?') },
> -    { V4L2_PIX_FMT_MPEG,    VLC_FOURCC('?','?','?','?') },
> -#endif
> -    { 0, 0, 0, 0, 0 }
> -};
> -
>  /**
>   * List of V4L2 chromas were confident enough to use as fallbacks if the
>   * user hasn't provided a --v4l2-chroma value.
> @@ -673,63 +629,6 @@ static block_t* ProcessVideoFrame( vlc_object_t
> *p_demux, uint8_t *p_frame, size }
> 
>  /*************************************************************************
> **** - * Helper function to initalise video IO using the mmap method
> -
> **************************************************************************
> ***/ -static int InitMmap( vlc_object_t *p_demux, demux_sys_t *p_sys, int
> i_fd ) -{
> -    struct v4l2_requestbuffers req;
> -
> -    memset( &req, 0, sizeof(req) );
> -    req.count = 4;
> -    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
> -    req.memory = V4L2_MEMORY_MMAP;
> -
> -    if( v4l2_ioctl( i_fd, VIDIOC_REQBUFS, &req ) < 0 )
> -    {
> -        msg_Err( p_demux, "device does not support mmap I/O" );
> -        return -1;
> -    }
> -
> -    if( req.count < 2 )
> -    {
> -        msg_Err( p_demux, "insufficient buffers" );
> -        return -1;
> -    }
> -
> -    p_sys->p_buffers = calloc( req.count, sizeof( *p_sys->p_buffers ) );
> -    if( unlikely(!p_sys->p_buffers) )
> -        return -1;
> -
> -    for( p_sys->i_nbuffers = 0; p_sys->i_nbuffers < req.count;
> ++p_sys->i_nbuffers ) -    {
> -        struct v4l2_buffer buf;
> -
> -        memset( &buf, 0, sizeof(buf) );
> -        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
> -        buf.memory = V4L2_MEMORY_MMAP;
> -        buf.index = p_sys->i_nbuffers;
> -
> -        if( v4l2_ioctl( i_fd, VIDIOC_QUERYBUF, &buf ) < 0 )
> -        {
> -            msg_Err( p_demux, "VIDIOC_QUERYBUF: %m" );
> -            return -1;
> -        }
> -
> -        p_sys->p_buffers[p_sys->i_nbuffers].length = buf.length;
> -        p_sys->p_buffers[p_sys->i_nbuffers].start =
> -            v4l2_mmap( NULL, buf.length, PROT_READ | PROT_WRITE,
> MAP_SHARED, i_fd, buf.m.offset ); -
> -        if( p_sys->p_buffers[p_sys->i_nbuffers].start == MAP_FAILED )
> -        {
> -            msg_Err( p_demux, "mmap failed: %m" );
> -            return -1;
> -        }
> -    }
> -
> -    return 0;
> -}
> -
> -/*************************************************************************
> **** * Helper function to initalise video IO using the userbuf method
> **************************************************************************
> ***/ static int InitUserP( vlc_object_t *p_demux, demux_sys_t *p_sys, int
> i_fd, unsigned int i_buffer_size ) @@ -1071,21 +970,17 @@ static int
> InitVideo( vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys,
> vlc_fourcc_to_char( codecs[i].pixelformat, fourcc_v4l2 );
> 
>              bool b_codec_supported = false;
> -            for( unsigned j = 0; v4l2chroma_to_fourcc[j].i_v4l2 != 0; j++
> ) -            {
> -                if( v4l2chroma_to_fourcc[j].i_v4l2 ==
> codecs[i].pixelformat ) -                {
> -                    char fourcc[5];
> -                    memset( fourcc, 0, sizeof( fourcc ) );
> -                    vlc_fourcc_to_char( v4l2chroma_to_fourcc[j].i_fourcc,
> -                                        fourcc );
> -                    msg_Dbg( p_obj, "device supports chroma %4.4s [%s,
> %s]", -                             fourcc, codecs[i].description,
> fourcc_v4l2 ); -                    b_codec_supported = true;
> -                }
> -            }
> -            if( !b_codec_supported )
> +            vlc_fourcc_t i_fourcc;
> +            int i_rmask, i_gmask, i_bmask;
> +            b_codec_supported = get_fourcc_by_v4l2pixelformat( &i_fourcc,
> &i_rmask, &i_gmask, &i_bmask, codecs[i].pixelformat ); +            if(
> b_codec_supported )
>              {
> +                char fourcc[5];
> +                memset( fourcc, 0, sizeof( fourcc ) );
> +                vlc_fourcc_to_char( i_fourcc, fourcc );
> +                msg_Dbg( p_obj, "device supports chroma %4.4s [%s, %s]",
> +                         fourcc, codecs[i].description, fourcc_v4l2 );
> +            } else {
>                  msg_Dbg( p_obj, "device codec %4.4s (%s) not supported",
>                           fourcc_v4l2, codecs[i].description );
>              }
> @@ -1167,14 +1062,8 @@ static int InitVideo( vlc_object_t *p_obj, int i_fd,
> demux_sys_t *p_sys, const vlc_fourcc_t i_requested_fourcc =
>                  vlc_fourcc_GetCodecFromString( VIDEO_ES, reqchroma );
> 
> -            for( int i = 0; v4l2chroma_to_fourcc[i].i_v4l2 != 0; i++ )
> -            {
> -                if( v4l2chroma_to_fourcc[i].i_fourcc == i_requested_fourcc
> ) -                {
> -                    fmt.fmt.pix.pixelformat =
> v4l2chroma_to_fourcc[i].i_v4l2; -                    break;
> -                }
> -            }
> +            get_v4l2pixelformat_by_fourcc( &fmt.fmt.pix.pixelformat,
> i_requested_fourcc ); +
>              /* Try and set user chroma */
>              bool b_error = !IsPixelFormatSupported( codecs, ncodec,
>                                                     
> fmt.fmt.pix.pixelformat ); @@ -1309,18 +1198,19 @@ static int InitVideo(
> vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys, }
> 
>      /* Look up final fourcc */
> -    p_sys->i_fourcc = 0;
> -    for( int i = 0; v4l2chroma_to_fourcc[i].i_fourcc != 0; i++ )
> +    int i_rmask, i_gmask, i_bmask;
> +    if ( get_fourcc_by_v4l2pixelformat( &p_sys->i_fourcc,
> +                                        &i_rmask,
> +                                        &i_gmask,
> +                                        &i_bmask,
> +                                        fmt.fmt.pix.pixelformat ) )
>      {
> -        if( v4l2chroma_to_fourcc[i].i_v4l2 == fmt.fmt.pix.pixelformat )
> -        {
> -            p_sys->i_fourcc = v4l2chroma_to_fourcc[i].i_fourcc;
> -            es_format_Init( &es_fmt, VIDEO_ES, p_sys->i_fourcc );
> -            es_fmt.video.i_rmask = v4l2chroma_to_fourcc[i].i_rmask;
> -            es_fmt.video.i_gmask = v4l2chroma_to_fourcc[i].i_gmask;
> -            es_fmt.video.i_bmask = v4l2chroma_to_fourcc[i].i_bmask;
> -            break;
> -        }
> +        es_format_Init( &es_fmt, VIDEO_ES, p_sys->i_fourcc );
> +        es_fmt.video.i_rmask = i_rmask;
> +        es_fmt.video.i_gmask = i_gmask;
> +        es_fmt.video.i_bmask = i_bmask;
> +    } else {
> +        p_sys->i_fourcc = 0;
>      }
> 
>      /* Buggy driver paranoia */
-- 
Rémi Denis-Courmont
http://www.remlab.info



More information about the vlc-devel mailing list