Gstreamer-无法枚举视频格式和不适当的ioctl设备错误

时间:2013-12-19 22:43:54

标签: linux gstreamer ioctl v4l2 gumstix

我需要使用gstreamer传输视频。正确提供media-ctl命令后当我发出此命令LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so mplayer tv:// -tv driver=v4l2:device=/dev/video6 -vo png -fps 1时,它成功捕获帧,但只有Gstreamer有问题。

Gstreamer管道:

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 ...

更改分辨率后,我得到同样的错误:

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

我正在尝试让caspa相机在3.5.7 linux内核上使用yocto 1.4.2(dylan)。

3 个答案:

答案 0 :(得分:0)

如果你也为gst创建了comp_ lib,那该怎么办?

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

还要考虑使用gstreamer-1.0。

答案 1 :(得分:0)

答案 2 :(得分:0)

问题在于Gumstix目前使用的3.5.7内核版本中的omap ispvideo驱动程序代码。要使用我们自己的编解码器输出视频,驱动程序应该知道使用了哪种编解码器。将更改应用于位于

的ispvideo.c
/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

之后提交补丁更改。请按照本教程了解如何创建补丁。

Yocto-Create the patch

该补丁取自here