Gstreamer- failed to enumerate video formats and Inappropriate ioctl for device Error

3.1k views Asked by At

I need to stream a video using gstreamer. After giving media-ctl commands correctly When I give this command LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so mplayer tv:// -tv driver=v4l2:device=/dev/video6 -vo png -fps 1 , it is successfully capturing frames but only problem with Gstreamer.

Gstreamer pipeline:

root@overo:~# LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so gst-launch-0.10 -v v4l2src device=/dev/video6 queue-size=8 ! video/x-raw-yuv,format=\(fourcc\)UYVY,width=720,height=480 ! ffmpegcolorspace ! tcpserversink host=192.168.1.104 port=5000
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Failed to enumerate possible video formats device '/dev/video6' can work with
Additional debug info:
/home/siguser/yocto-28-11/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/gst-plugins-good/0.10.31-r8/gst-plugins-good-0.10.31/sys/v4l2/gstv4l2object.c(1122): gst_v4l2_object_fill_format_list (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Failed to get number 0 in pixelformat enumeration for /dev/video6. (25 - Inappropriate ioctl for device)
Setting pipeline to NULL ...
Freeing pipeline ...

After changing resolution, I get same error:

root@overo:~# LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so gst-launch-0.10 v4l2src --gst-debug=0 device=/dev/video6 ! video/x-raw-yuv,width=640,height=480,framerate=\(fraction\)2/1 ! ffmpegcolorspace ! smokeenc keyframe=8 qmax=40 ! udpsink host=192.168.1.104 port=5000
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Failed to enumerate possible video formats device '/dev/video6' can work with
Additional debug info:
/home/siguser/yocto-28-11/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/gst-plugins-good/0.10.31-r8/gst-plugins-good-0.10.31/sys/v4l2/gstv4l2object.c(1122): gst_v4l2_object_fill_format_list (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Failed to get number 0 in pixelformat enumeration for /dev/video6. (25 - Inappropriate ioctl for device)
Setting pipeline to NULL ...
Freeing pipeline ...

root@overo:~# LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so v4l2-ctl -d 6 --list-formats

ioctl: VIDIOC_ENUM_FMT
Index       : 0
Type        : Video Capture
Pixel Format: 'RGB3' (emulated)
Name        : RGB3

Index       : 1
Type        : Video Capture
Pixel Format: 'BGR3' (emulated)
Name        : BGR3

Index       : 2
Type        : Video Capture
Pixel Format: 'YU12' (emulated)
Name        : YU12

Index       : 3
Type        : Video Capture
Pixel Format: 'YV12' (emulated)
Name        : YV12

I am trying to get the caspa camera working with yocto 1.4.2 (dylan) on 3.5.7 linux kernel.

3

There are 3 answers

0
Zafrullah Syed On BEST ANSWER

The problem lies in omap ispvideo driver code in 3.5.7 kernel version currently used by Gumstix. To output the video with our own codec then the driver should know what codec is used. Apply the changes to ispvideo.c located at

/home/yocto/build/work/.../drivers/media/video/omap3isp/ispvideo.c

    From 2ea2a64d737236ed84f8aa481f4331eecbe6081f Mon Sep 17 00:00:00 2001
From: 
Date: Thu, 9 Jan 2014 15:32:50 +0100
Subject: [PATCH] Adding missing ioctl's

---
 drivers/media/video/omap3isp/ispvideo.c |   48 +++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c
index b37379d..0bf5c5b 100644
--- a/drivers/media/video/omap3isp/ispvideo.c
+++ b/drivers/media/video/omap3isp/ispvideo.c
@@ -662,6 +662,39 @@ isp_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
 }

 static int
+// My patch changes
+isp_video_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc*fmtdesc)
+{
+    struct isp_video_fh *vfh = to_isp_video_fh(fh);
+    struct isp_video *video = video_drvdata(file);
+
+    if (fmtdesc->index)
+    {
+//        printk(KERN_ERR "%s: invalid index (%d)\n",__func__,fmtdesc->index);
+        return -EINVAL;
+    }
+
+    if (fmtdesc->type != video->type)
+    {
+//        printk(KERN_ERR "%s: invalid type (%d). Current type:%d\n",__func__, fmtdesc->type, video->type);
+        return -EINVAL;
+    }
+
+    // trying to produce direct output in VYVY format. Hardcoded.
+    fmtdesc->flags = 0;
+    fmtdesc->description[0] = 'U';
+    fmtdesc->description[1] = 'Y';
+    fmtdesc->description[2] = 'V';
+    fmtdesc->description[3] = 'Y';
+    fmtdesc->description[4] = '0';
+    fmtdesc->pixelformat = V4L2_PIX_FMT_UYVY;
+
+    return 0;
+}
+
+static int
+
+
 isp_video_get_format(struct file *file, void *fh, struct v4l2_format *format)
 {
    struct isp_video_fh *vfh = to_isp_video_fh(fh);
@@ -678,6 +711,7 @@ isp_video_get_format(struct file *file, void *fh, struct v4l2_format *format)
 }

 static int
+
 isp_video_set_format(struct file *file, void *fh, struct v4l2_format *format)
 {
    struct isp_video_fh *vfh = to_isp_video_fh(fh);
@@ -1189,8 +1223,21 @@ isp_video_s_input(struct file *file, void *fh, unsigned int input)
    return input == 0 ? 0 : -EINVAL;
 }

+static int
+isp_video_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl*queryctrl)
+{
+//    printk(KERN_ERR "%s: query id (%d)\n",__func__, queryctrl->id);
+//    printk(KERN_ERR "%s: query type (%d)\n",__func__, queryctrl->type);
+
+    if (queryctrl->id < V4L2_CID_BASE)
+        return -EDOM;
+
+    return -EINVAL;
+}
+
 static const struct v4l2_ioctl_ops isp_video_ioctl_ops = {
    .vidioc_querycap        = isp_video_querycap,
+        .vidioc_enum_fmt_vid_cap    = isp_video_enum_format,
    .vidioc_g_fmt_vid_cap       = isp_video_get_format,
    .vidioc_s_fmt_vid_cap       = isp_video_set_format,
    .vidioc_try_fmt_vid_cap     = isp_video_try_format,
@@ -1211,6 +1258,7 @@ static const struct v4l2_ioctl_ops isp_video_ioctl_ops = {
    .vidioc_enum_input      = isp_video_enum_input,
    .vidioc_g_input         = isp_video_g_input,
    .vidioc_s_input         = isp_video_s_input,
+   .vidioc_queryctrl        = isp_video_queryctrl,
 };

 /* -----------------------------------------------------------------------------
-- 
1.7.9.5

After that commit changes of patch. Follow this tutorial to know how to create the patch.

Yocto-Create the patch

The patch was taken from here

2
ensonic On

What if you also LD_PRELOAD the compat lib for gst?

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so gst-launch-0.10 v4l2src ...

Also consider to use gstreamer-1.0.

0
bhamadicharef On

The solution is following this patch to gstreamer and overo isp

http://gumstix.8.x6.nabble.com/Overo-COM-Caspa-Camera-for-image-processing-td4965139.html#a4965265