Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f793b9b0 authored by Jia Jin's avatar Jia Jin
Browse files

msm: v4l2loopback: to create V4L2 loopback devices

This module allows to create "virtual video devices".
Normal (v4l2) applications will read these devices as
if they were ordinary video devices.

Git-commit: 541e3bc7aaf46dc9a21f92c7f527397fce03dfd8
Git-repo: https://github.com/umlaeute/v4l2loopback.git


Revision: v0.12.1
Change-Id: I0ac87a58ad3b113ff5e2d6bd5e7c32ff71e1493c
Signed-off-by: default avatarJia Jin <jinjia@codeaurora.org>
parent 2b35f93b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ endif

obj-$(CONFIG_VIDEO_DEV) += v4l2-core/
obj-$(CONFIG_DVB_CORE)  += dvb-core/
obj-$(CONFIG_VIDEO_DEV) += v4l2loopback-master/

# There are both core and drivers at RC subtree - merge before drivers
obj-y += rc/
+7 −0
Original line number Diff line number Diff line
@@ -111,3 +111,10 @@ config VIDEOBUF2_DMA_SG
config VIDEOBUF2_DVB
	tristate
	select VIDEOBUF2_CORE

config V4L2_LOOPBACK
	tristate "v4l2loopback driver"
	---help---
	Enable v4l2loopback support, it allows to create
	"virtual video devices". Normal (v4l2) applications will
	read these devices as if they were ordinary video devices.
+5 −0
Original line number Diff line number Diff line
#
## Makefile for the V4L2 loopback
#

obj-$(CONFIG_V4L2_LOOPBACK) +=  v4l2loopback.o
+2569 −0

File added.

Preview size limit exceeded, changes collapsed.

+423 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 */

/* here come the packed formats */
{
	.name = "32 bpp RGB, le",
	.fourcc = V4L2_PIX_FMT_BGR32,
	.depth = 32,
	.flags = 0,
},
{
	.name = "32 bpp RGB, be",
	.fourcc = V4L2_PIX_FMT_RGB32,
	.depth = 32,
	.flags = 0,
},
{
	.name = "24 bpp RGB, le",
	.fourcc = V4L2_PIX_FMT_BGR24,
	.depth = 24,
	.flags = 0,
},
{
	.name = "24 bpp RGB, be",
	.fourcc = V4L2_PIX_FMT_RGB24,
	.depth = 24,
	.flags = 0,
},
#ifdef V4L2_PIX_FMT_RGB332
{
	.name = "8 bpp RGB-3-3-2",
	.fourcc = V4L2_PIX_FMT_RGB332,
	.depth = 8,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB332 */
#ifdef V4L2_PIX_FMT_RGB444
{
	.name = "16 bpp RGB (xxxxrrrr ggggbbbb)",
	.fourcc = V4L2_PIX_FMT_RGB444,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB444 */
#ifdef V4L2_PIX_FMT_RGB555
{
	.name = "16 bpp RGB-5-5-5",
	.fourcc = V4L2_PIX_FMT_RGB555,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB555 */
#ifdef V4L2_PIX_FMT_RGB565
{
	.name = "16 bpp  RGB-5-6-5",
	.fourcc = V4L2_PIX_FMT_RGB565,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB565 */
#ifdef V4L2_PIX_FMT_RGB555X
{
	.name = "16 bpp RGB-5-5-5 BE",
	.fourcc = V4L2_PIX_FMT_RGB555X,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB555X */
#ifdef V4L2_PIX_FMT_RGB565X
{
	.name = "16 bpp RGB-5-6-5 BE",
	.fourcc = V4L2_PIX_FMT_RGB565X,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_RGB565X */
#ifdef V4L2_PIX_FMT_BGR666
{
	.name = "18 bpp BGR-6-6-6",
	.fourcc = V4L2_PIX_FMT_BGR666,
	.depth = 18,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_BGR666 */
{
	.name = "4:2:2, packed, YUYV",
	.fourcc = V4L2_PIX_FMT_YUYV,
	.depth = 16,
	.flags = 0,
},
{
	.name = "4:2:2, packed, UYVY",
	.fourcc = V4L2_PIX_FMT_UYVY,
	.depth = 16,
	.flags = 0,
},
#ifdef V4L2_PIX_FMT_YVYU
{
	.name = "4:2:2, packed YVYU",
	.fourcc = V4L2_PIX_FMT_YVYU,
	.depth = 16,
	.flags = 0,
},
#endif
#ifdef V4L2_PIX_FMT_VYUY
{
	.name = "4:2:2, packed VYUY",
	.fourcc = V4L2_PIX_FMT_VYUY,
	.depth = 16,
	.flags = 0,
},
#endif
{
	.name = "4:2:2, packed YYUV",
	.fourcc = V4L2_PIX_FMT_YYUV,
	.depth = 16,
	.flags = 0,
},
{
	.name = "YUV-8-8-8-8",
	.fourcc = V4L2_PIX_FMT_YUV32,
	.depth = 32,
	.flags = 0,
},
{
	.name = "8 bpp, Greyscale",
	.fourcc = V4L2_PIX_FMT_GREY,
	.depth = 8,
	.flags = 0,
},
#ifdef V4L2_PIX_FMT_Y4
{
	.name = "4 bpp Greyscale",
	.fourcc = V4L2_PIX_FMT_Y4,
	.depth = 4,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_Y4 */
#ifdef V4L2_PIX_FMT_Y6
{
	.name = "6 bpp Greyscale",
	.fourcc = V4L2_PIX_FMT_Y6,
	.depth = 6,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_Y6 */
#ifdef V4L2_PIX_FMT_Y10
{
	.name = "10 bpp Greyscale",
	.fourcc = V4L2_PIX_FMT_Y10,
	.depth = 10,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_Y10 */
#ifdef V4L2_PIX_FMT_Y12
{
	.name = "12 bpp Greyscale",
	.fourcc = V4L2_PIX_FMT_Y12,
	.depth = 12,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_Y12 */
{
	.name = "16 bpp, Greyscale",
	.fourcc = V4L2_PIX_FMT_Y16,
	.depth = 16,
	.flags = 0,
},
#ifdef V4L2_PIX_FMT_YUV444
{
	.name = "16 bpp xxxxyyyy uuuuvvvv",
	.fourcc = V4L2_PIX_FMT_YUV444,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_YUV444 */
#ifdef V4L2_PIX_FMT_YUV555
{
	.name = "16 bpp YUV-5-5-5",
	.fourcc = V4L2_PIX_FMT_YUV555,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_YUV555 */
#ifdef V4L2_PIX_FMT_YUV565
{
	.name = "16 bpp YUV-5-6-5",
	.fourcc = V4L2_PIX_FMT_YUV565,
	.depth = 16,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_YUV565 */

	/* bayer formats */
#ifdef V4L2_PIX_FMT_SRGGB8
{
	.name = "Bayer RGGB 8bit",
	.fourcc = V4L2_PIX_FMT_SRGGB8,
	.depth = 8,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_SRGGB8 */
#ifdef V4L2_PIX_FMT_SGRBG8
{
	.name = "Bayer GRBG 8bit",
	.fourcc = V4L2_PIX_FMT_SGRBG8,
	.depth = 8,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_SGRBG8 */
#ifdef V4L2_PIX_FMT_SGBRG8
{
	.name = "Bayer GBRG 8bit",
	.fourcc = V4L2_PIX_FMT_SGBRG8,
	.depth = 8,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_SGBRG8 */
#ifdef V4L2_PIX_FMT_SBGGR8
{
	.name = "Bayer BA81 8bit",
	.fourcc = V4L2_PIX_FMT_SBGGR8,
	.depth = 8,
	.flags = 0,
},
#endif /* V4L2_PIX_FMT_SBGGR8 */



	/* here come the planar formats */
{
	.name = "4:1:0, planar, Y-Cr-Cb",
	.fourcc = V4L2_PIX_FMT_YVU410,
	.depth = 9,
	.flags = FORMAT_FLAGS_PLANAR,
},
{
	.name = "4:2:0, planar, Y-Cr-Cb",
	.fourcc = V4L2_PIX_FMT_YVU420,
	.depth = 12,
	.flags = FORMAT_FLAGS_PLANAR,
},
{
	.name = "4:1:0, planar, Y-Cb-Cr",
	.fourcc = V4L2_PIX_FMT_YUV410,
	.depth = 9,
	.flags = FORMAT_FLAGS_PLANAR,
},
{
	.name = "4:2:0, planar, Y-Cb-Cr",
	.fourcc = V4L2_PIX_FMT_YUV420,
	.depth = 12,
	.flags = FORMAT_FLAGS_PLANAR,
},
#ifdef V4L2_PIX_FMT_YUV422P
{
	.name = "16 bpp YVU422 planar",
	.fourcc = V4L2_PIX_FMT_YUV422P,
	.depth = 16,
	.flags = FORMAT_FLAGS_PLANAR,
},
#endif /* V4L2_PIX_FMT_YUV422P */
#ifdef V4L2_PIX_FMT_YUV411P
{
	.name = "16 bpp YVU411 planar",
	.fourcc = V4L2_PIX_FMT_YUV411P,
	.depth = 16,
	.flags = FORMAT_FLAGS_PLANAR,
},
#endif /* V4L2_PIX_FMT_YUV411P */
#ifdef V4L2_PIX_FMT_Y41P
{
	.name = "12 bpp YUV 4:1:1",
	.fourcc = V4L2_PIX_FMT_Y41P,
	.depth = 12,
	.flags = FORMAT_FLAGS_PLANAR,
},
#endif /* V4L2_PIX_FMT_Y41P */
#ifdef V4L2_PIX_FMT_NV12
{
	.name = "12 bpp Y/CbCr 4:2:0 ",
	.fourcc = V4L2_PIX_FMT_NV12,
	.depth = 12,
	.flags = FORMAT_FLAGS_PLANAR,
},
#endif /* V4L2_PIX_FMT_NV12 */

	/* here come the compressed formats */

#ifdef V4L2_PIX_FMT_MJPEG
{
	.name = "Motion-JPEG",
	.fourcc = V4L2_PIX_FMT_MJPEG,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_MJPEG */
#ifdef V4L2_PIX_FMT_JPEG
{
	.name = "JFIF JPEG",
	.fourcc = V4L2_PIX_FMT_JPEG,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_JPEG */
#ifdef V4L2_PIX_FMT_DV
{
	.name = "DV1394",
	.fourcc = V4L2_PIX_FMT_DV,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_DV */
#ifdef V4L2_PIX_FMT_MPEG
{
	.name = "MPEG-1/2/4 Multiplexed",
	.fourcc = V4L2_PIX_FMT_MPEG,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_MPEG */
#ifdef V4L2_PIX_FMT_H264
{
	.name = "H264 with start codes",
	.fourcc = V4L2_PIX_FMT_H264,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_H264 */
#ifdef V4L2_PIX_FMT_H264_NO_SC
{
	.name = "H264 without start codes",
	.fourcc = V4L2_PIX_FMT_H264_NO_SC,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_H264_NO_SC */
#ifdef V4L2_PIX_FMT_H264_MVC
{
	.name = "H264 MVC",
	.fourcc = V4L2_PIX_FMT_H264_MVC,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_H264_MVC */
#ifdef V4L2_PIX_FMT_H263
{
	.name = "H263",
	.fourcc = V4L2_PIX_FMT_H263,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_H263 */
#ifdef V4L2_PIX_FMT_MPEG1
{
	.name = "MPEG-1 ES",
	.fourcc = V4L2_PIX_FMT_MPEG1,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_MPEG1 */
#ifdef V4L2_PIX_FMT_MPEG2
{
	.name = "MPEG-2 ES",
	.fourcc = V4L2_PIX_FMT_MPEG2,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_MPEG2 */
#ifdef V4L2_PIX_FMT_MPEG4
{
	.name = "MPEG-4 part 2 ES",
	.fourcc = V4L2_PIX_FMT_MPEG4,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_MPEG4 */
#ifdef V4L2_PIX_FMT_XVID
{
	.name = "Xvid",
	.fourcc = V4L2_PIX_FMT_XVID,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_XVID */
#ifdef V4L2_PIX_FMT_VC1_ANNEX_G
{
	.name = "SMPTE 421M Annex G compliant stream",
	.fourcc = V4L2_PIX_FMT_VC1_ANNEX_G,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_VC1_ANNEX_G */
#ifdef V4L2_PIX_FMT_VC1_ANNEX_L
{
	.name = "SMPTE 421M Annex L compliant stream",
	.fourcc = V4L2_PIX_FMT_VC1_ANNEX_L,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_VC1_ANNEX_L */
#ifdef V4L2_PIX_FMT_VP8
{
	.name = "VP8",
	.fourcc = V4L2_PIX_FMT_VP8,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
#endif /* V4L2_PIX_FMT_VP8 */
{
	.name = "VP9",
	.fourcc = V4L2_PIX_FMT_VP9,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},
{
	.name = "HEVC",
	.fourcc = V4L2_PIX_FMT_HEVC,
	.depth = 32,
	.flags = FORMAT_FLAGS_COMPRESSED,
},