Vivid test device: adding YU12

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi folks, I've been trying to add a triplanar format to those that vivid
can generate, and didn't quite manage :(

So, I tried adding code for it like in the patch (with some dprintk() as
well) to clarify what I wanted to do. Module is insmod'ed like "insmod
vivid.ko n_devs=1 node_types=0x1 multiplanar=2 vivid_debug=1"

With the patch, vivid:
- seems to enumerate the new triplanar format all right
- vid_s_fmt_vid_cap() works as intended too, apparently
- when arriving to vid_cap_queue_setup(), the size of the different
sub-arrays does not look quite ok.
- Generated video is, visually, all green.

I added as well a capture output dmesgs. Not much of interest here, the
first few lines configure the queue -- with my few added dprintk it can be
seen that the queue sizes are seemingly incorrect.

If and when this part is up and running, I wanted to use Vivid to test
dma-buf based capture.

Big thanks!
Jan 28 18:05:23  kernel: [  884.446334] vivid-000: @vivid_s_fmt_vid_cap
Jan 28 18:05:23  kernel: [  884.446350] vivid-000: vid_cap_queue_setup, fourcc=0x32315559, planes=3
Jan 28 18:05:23  kernel: [  884.446351] vivid-000: vid_cap_queue_setup, 0 bpl=640, 2bytesize=2
Jan 28 18:05:23  kernel: [  884.446352] vivid-000: vid_cap_queue_setup, 1 bpl=640, 2bytesize=1
Jan 28 18:05:23  kernel: [  884.446353] vivid-000: vid_cap_queue_setup, 2 bpl=640, 2bytesize=1
Jan 28 18:05:23  kernel: [  884.446354] vivid-000: vid_cap_queue_setup, count=2, sizes=230400, 230400, 230400
Jan 28 18:05:23  kernel: [  884.447130] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:23  kernel: [  884.447401] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:23  kernel: [  884.447405] vivid-000: vid_cap_buf_queue
Jan 28 18:05:23  kernel: [  884.447406] vivid-000: vid_cap_buf_queue
Jan 28 18:05:23  kernel: [  884.447407] vivid-000: vid_cap_start_streaming
Jan 28 18:05:23  kernel: [  884.447408] vivid-000: vivid_start_generating_vid_cap
Jan 28 18:05:23  kernel: [  884.447442] vivid-000: returning from vivid_start_generating_vid_cap
Jan 28 18:05:23  kernel: [  884.447443] vivid-000: Video Capture Thread Start
Jan 28 18:05:23  kernel: [  884.447444] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.447448] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:23  kernel: [  884.447450] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:23  kernel: [  884.447987] vivid-000: filled buffer 0
Jan 28 18:05:23  kernel: [  884.478491] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.478494] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:23  kernel: [  884.478496] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:23  kernel: [  884.478945] vivid-000: filled buffer 1
Jan 28 18:05:23  kernel: [  884.479243] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:23  kernel: [  884.479246] vivid-000: vid_cap_buf_queue
Jan 28 18:05:23  kernel: [  884.514523] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.514526] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:23  kernel: [  884.514527] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:23  kernel: [  884.514723] vivid-000: filled buffer 0
Jan 28 18:05:23  kernel: [  884.546620] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.578592] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.614667] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.646706] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.678709] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.714780] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.715555] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:23  kernel: [  884.715557] vivid-000: vid_cap_buf_queue
Jan 28 18:05:23  kernel: [  884.746817] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.746845] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:23  kernel: [  884.746846] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:23  kernel: [  884.747119] vivid-000: filled buffer 1
Jan 28 18:05:23  kernel: [  884.778812] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.814849] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.846895] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.878922] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.914996] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.947015] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.947899] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:23  kernel: [  884.947901] vivid-000: vid_cap_buf_queue
Jan 28 18:05:23  kernel: [  884.979071] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  884.979089] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:23  kernel: [  884.979090] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:23  kernel: [  884.979436] vivid-000: filled buffer 0
Jan 28 18:05:23  kernel: [  885.015092] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  885.047140] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  885.079136] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  885.115176] vivid-000: Video Capture Thread Tick
Jan 28 18:05:23  kernel: [  885.147235] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.179275] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.180183] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  885.180185] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  885.215290] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.215293] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:24  kernel: [  885.215295] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:24  kernel: [  885.215603] vivid-000: filled buffer 1
Jan 28 18:05:24  kernel: [  885.247319] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.279353] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.315427] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.347465] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.379524] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.415550] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.416342] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  885.416345] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  885.447609] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.447612] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:24  kernel: [  885.447614] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:24  kernel: [  885.447887] vivid-000: filled buffer 0
Jan 28 18:05:24  kernel: [  885.479599] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.515640] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.547641] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.579707] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.615761] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.647814] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.648717] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  885.648720] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  885.679806] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.679809] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:24  kernel: [  885.679811] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:24  kernel: [  885.680159] vivid-000: filled buffer 1
Jan 28 18:05:24  kernel: [  885.715878] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.747901] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.779951] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.816001] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.848012] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.880059] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.880897] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  885.880899] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  885.916090] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.916107] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:24  kernel: [  885.916109] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:24  kernel: [  885.916513] vivid-000: filled buffer 0
Jan 28 18:05:24  kernel: [  885.948082] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  885.980152] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.016203] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.048236] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.080253] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.116308] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.117211] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  886.117213] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  886.148356] vivid-000: Video Capture Thread Tick
Jan 28 18:05:24  kernel: [  886.148360] vivid-000: loop_vid_copy: 640x360@0x0 loop_vid_out: 640x360@0x0 loop_vid_cap: 640x360@0x0
Jan 28 18:05:24  kernel: [  886.148361] vivid-000: loop_fb_copy: 0x0@0x0 loop_vid_overlay: 0x0@0x0 loop_vid_overlay_cap: 0x0@0x0
Jan 28 18:05:24  kernel: [  886.148771] vivid-000: filled buffer 1
Jan 28 18:05:24  kernel: [  886.148976] vivid-000: vid_cap_buf_prepare
Jan 28 18:05:24  kernel: [  886.148978] vivid-000: vid_cap_buf_queue
Jan 28 18:05:24  kernel: [  886.148993] vivid-000: vid_cap_stop_streaming
Jan 28 18:05:24  kernel: [  886.148994] vivid-000: vivid_stop_generating_vid_cap
Jan 28 18:05:24  kernel: [  886.148998] vivid-000: Video Capture Thread End
diff --git a/drivers/media/platform/vivid/vivid-core.h b/drivers/media/platform/vivid/vivid-core.h
index 4b497df..debc66f 100644
--- a/drivers/media/platform/vivid/vivid-core.h
+++ b/drivers/media/platform/vivid/vivid-core.h
@@ -84,7 +84,7 @@ struct vivid_fmt {
 	bool	can_do_overlay;
 	u32	alpha_mask;
 	u8	planes;
-	u32	data_offset[2];
+	u32	data_offset[TPG_MAX_PLANES];
 };
 
 extern struct vivid_fmt vivid_formats[];
diff --git a/drivers/media/platform/vivid/vivid-tpg.c b/drivers/media/platform/vivid/vivid-tpg.c
index fc9c653..596828e 100644
--- a/drivers/media/platform/vivid/vivid-tpg.c
+++ b/drivers/media/platform/vivid/vivid-tpg.c
@@ -185,6 +185,10 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
 	case V4L2_PIX_FMT_ABGR32:
 		tpg->is_yuv = false;
 		break;
+	case V4L2_PIX_FMT_YUV420:
+		tpg->planes = 3;
+		tpg->is_yuv = true;
+		break;
 	case V4L2_PIX_FMT_NV16M:
 	case V4L2_PIX_FMT_NV61M:
 		tpg->planes = 2;
@@ -229,6 +233,11 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
 		tpg->twopixelsize[0] = 2;
 		tpg->twopixelsize[1] = 2;
 		break;
+	case V4L2_PIX_FMT_YUV420:
+		tpg->twopixelsize[0] = 2;
+		tpg->twopixelsize[1] = 1;
+		tpg->twopixelsize[2] = 1;
+		break;
 	}
 	return true;
 }
@@ -671,6 +680,11 @@ static void gen_twopix(struct tpg_data *tpg,
 		buf[0][offset] = r_y;
 		buf[1][offset] = odd ? g_u : b_v;
 		break;
+	case V4L2_PIX_FMT_YUV420:
+		buf[0][offset] = r_y;
+		buf[1][offset / 2] = g_u;
+		buf[2][offset / 2] = b_v;
+		break;
 
 	case V4L2_PIX_FMT_YUYV:
 		buf[0][offset] = r_y;
diff --git a/drivers/media/platform/vivid/vivid-tpg.h b/drivers/media/platform/vivid/vivid-tpg.h
index bd8b1c7..9014324 100644
--- a/drivers/media/platform/vivid/vivid-tpg.h
+++ b/drivers/media/platform/vivid/vivid-tpg.h
@@ -87,7 +87,7 @@ enum tpg_move_mode {
 
 extern const char * const tpg_aspect_strings[];
 
-#define TPG_MAX_PLANES 2
+#define TPG_MAX_PLANES 3
 #define TPG_MAX_PAT_LINES 8
 
 struct tpg_data {
diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c
index 867a29a..3c2f584 100644
--- a/drivers/media/platform/vivid/vivid-vid-cap.c
+++ b/drivers/media/platform/vivid/vivid-vid-cap.c
@@ -98,6 +98,13 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f
 	unsigned h = dev->fmt_cap_rect.height;
 	unsigned p;
 
+  dprintk(dev, 1, "%s, fourcc=0x%x, planes=%u\n", __func__, dev->tpg.fourcc,
+  	planes);
+  //for (p = 0; p < planes; p++) {
+		//dprintk(dev, 1, "%s, %u bpl=%u, 2bytesize=%u\n", __func__,
+		//	  p, tpg_g_bytesperline(&dev->tpg, p), tpg_g_twopixelsize(&dev->tpg, p));
+  //}
+
 	if (dev->field_cap == V4L2_FIELD_ALTERNATE) {
 		/*
 		 * You cannot use read() with FIELD_ALTERNATE since the field
@@ -149,12 +156,20 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f
 
 	*nplanes = planes;
 
+  for (p = 0; p < planes; p++) {
+		dprintk(dev, 1, "%s, %u bpl=%u, 2bytesize=%u\n", __func__,
+			  p, tpg_g_bytesperline(&dev->tpg, p), tpg_g_twopixelsize(&dev->tpg, p));
+
+  }
 	/*
 	 * videobuf2-vmalloc allocator is context-less so no need to set
 	 * alloc_ctxs array.
 	 */
 
-	if (planes == 2)
+	if (planes == 3)
+		dprintk(dev, 1, "%s, count=%d, sizes=%u, %u, %u\n", __func__,
+			*nbuffers, sizes[0], sizes[1], sizes[2]);
+	else if (planes == 2)
 		dprintk(dev, 1, "%s, count=%d, sizes=%u, %u\n", __func__,
 			*nbuffers, sizes[0], sizes[1]);
 	else
@@ -519,6 +534,8 @@ int vivid_g_fmt_vid_cap(struct file *file, void *priv,
 	struct v4l2_pix_format_mplane *mp = &f->fmt.pix_mp;
 	unsigned p;
 
+    dprintk(dev, 1, "%s, planes=%u\n", __func__, dev->fmt_cap->planes);
+
 	mp->width        = dev->fmt_cap_rect.width;
 	mp->height       = dev->fmt_cap_rect.height;
 	mp->field        = dev->field_cap;
@@ -629,6 +646,8 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv,
 	unsigned factor = 1;
 	unsigned i;
 
+	dprintk(dev, 1, "@%s\n", __func__);
+
 	if (ret < 0)
 		return ret;
 
@@ -645,6 +664,10 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv,
 	dev->fmt_cap = vivid_get_format(dev, mp->pixelformat);
 	if (V4L2_FIELD_HAS_T_OR_B(mp->field))
 		factor = 2;
+    if (V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
+    	tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);
+        dev->tpg.planes = mp->num_planes;
+    }
 
 	/* Note: the webcam input doesn't support scaling, cropping or composing */
 
@@ -732,6 +755,8 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv,
 	tpg_s_bytesperline(&dev->tpg, 0, mp->plane_fmt[0].bytesperline);
 	if (tpg_g_planes(&dev->tpg) > 1)
 		tpg_s_bytesperline(&dev->tpg, 1, mp->plane_fmt[1].bytesperline);
+	if (tpg_g_planes(&dev->tpg) > 2)
+		tpg_s_bytesperline(&dev->tpg, 2, mp->plane_fmt[2].bytesperline);
 	dev->field_cap = mp->field;
 	tpg_s_field(&dev->tpg, dev->field_cap);
 	tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap);
diff --git a/drivers/media/platform/vivid/vivid-vid-common.c b/drivers/media/platform/vivid/vivid-vid-common.c
index 6bef1e6..6281e13 100644
--- a/drivers/media/platform/vivid/vivid-vid-common.c
+++ b/drivers/media/platform/vivid/vivid-vid-common.c
@@ -181,10 +181,18 @@ struct vivid_fmt vivid_formats[] = {
 		.planes   = 2,
 		.data_offset = { 0, PLANE0_DATA_OFFSET },
 	},
+	{
+		.name     = "4:2:0, planar, YUV",
+		.fourcc   = V4L2_PIX_FMT_YUV420,
+		.depth    = 8,
+		.is_yuv   = true,
+		.planes   = 3,
+		.data_offset = { 0, 0, 0},
+	},
 };
 
-/* There are 2 multiplanar formats in the list */
-#define VIVID_MPLANAR_FORMATS 2
+/* There are 3 multiplanar formats in the list */
+#define VIVID_MPLANAR_FORMATS 3
 
 const struct vivid_fmt *vivid_get_format(struct vivid_dev *dev, u32 pixelformat)
 {

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux