[vlc-devel] [PATCH 1/2] split some v4l2 declarations
Francois Cartegnie
fcvlcdev at free.fr
Sat Jan 14 02:45:54 CET 2012
---
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 | 110 +++++++++++++++++++++++++++++++++++++
modules/access/v4l2/v4l2_common.h | 40 +++++++++++++
modules/access/v4l2/v4l2_input.h | 46 +++++++++++++++
modules/access/v4l2/video.c | 106 +++++++++--------------------------
9 files changed, 230 insertions(+), 102 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..68d7ea6
--- /dev/null
+++ b/modules/access/v4l2/v4l2_common.c
@@ -0,0 +1,110 @@
+/*****************************************************************************
+ * v4l2_common.c : V4L2 shared data & functions 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;
+}
+
diff --git a/modules/access/v4l2/v4l2_common.h b/modules/access/v4l2/v4l2_common.h
new file mode 100644
index 0000000..870c818
--- /dev/null
+++ b/modules/access/v4l2/v4l2_common.h
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * v4l2_common.h : V4L2 shared data & functions 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>
+
+/**
+ * Matchs a V4L2 fourcc with VLC's one.
+ * @return true if successfully matched.
+ **/
+bool get_fourcc_by_v4l2pixelformat( vlc_fourcc_t *i_fourcc,
+ int *i_rmask, int *i_gmask, int *i_bmask,
+ unsigned int pixelformat );
+
+/**
+ * Matchs a VLC fourcc with V4L2's one.
+ * @return true if successfully matched.
+ **/
+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..9cfdd22
--- /dev/null
+++ b/modules/access/v4l2/v4l2_input.h
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * v4l2_input.h : Video4Linux2 input/access/demux modules 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 587c259..07c2369 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.
@@ -1071,21 +1027,18 @@ 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 +1120,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 +1256,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 */
--
1.7.6
More information about the vlc-devel
mailing list