I have a DM3730 with a parallel mt9p031 sensor attached.  I am trying
to troubleshoot some issues with streaming video with G-streamer, but
I I think the issue is in how the ISP driver reports the video info.

I have the pipeline to grab from the resizer:

media-ctl -v -V '"mt9p031 1-0048":0 [SGRBG8 1280x720
(664,541)/1280x720], "OMAP3 ISP CCDC":2 [SGRBG8 1280x720], "OMAP3 ISP
preview":1 [UYVY 1280x720], "OMAP3 ISP resizer":1 [UYVY 480x272]'

This make /dev/video6 the output of the resizer and shows the format
and resolution of the output of the resizer as:

     Setting up format UYVY8_1X16 480x272 on pad OMAP3 ISP resizer/1
     Format set: UYVY8_1X16 480x272

I used 480x272 because it's the resolution of my LCD, and I was hoping
the resizer would be able to scale this so the ARM would not need to
do the work, and it appears to not have any issues with this
resolution.

However, if I query the video format, I don't get UYVY:

# v4l2-ctl  -d6 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'RGB3' (RGB3, emulated)
        [1]: 'BGR3' (BGR3, emulated)
        [2]: 'YU12' (YU12, emulated)
        [3]: 'YV12' (YV12, emulated)

This becomes an issue when I attempt to stream video from my camera to
anything, include fake sink:

gst-launch-1.0 -v v4l2src device=/dev/video6 ! fakesink
Tried to capture in RGB3, but device returned format UYVY

So for some reason, when queried, it reports different values than
UYVY, but when attempting to set the video capture to the listed
formats, it returns an error.

gst-launch-1.0 -v v4l2src device=/dev/video6 ! video/x-raw,
format=UYVY ! fakesink

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Internal data stream error.
Additional debug info:
gstbasesrc.c(3055): gst_base_src_loop ():
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason not-negotiated (-4)

This leads me to believe that v4l2 is trying to set the format to
something it does not think it is able to negotiate, and it's being
rejected.

I can even explicitly set the output video format to UYVY with:

v4l2-ctl -d /dev/video6
--set-fmt-video=width=480,height=272,pixelformat=UYVY --verbose

VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Capture:
        Width/Height      : 480/272
        Pixel Format      : 'UYVY'
        Field             : None
        Bytes per Line    : 960
        Size Image        : 261120
        Colorspace        : JPEG
        Transfer Function : Default (maps to sRGB)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Full Range)
        Flags             :
#

This shows me the UYVY format, but upon a follow-up query, it does not
appear to retain the pixel format of UYVY.

v4l2-ctl -d /dev/video6 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'RGB3' (RGB3, emulated)
        [1]: 'BGR3' (BGR3, emulated)
        [2]: 'YU12' (YU12, emulated)
        [3]: 'YV12' (YV12, emulated)
#

If I use ffmpeg to stream video, I the video codec there recognizes it
as uyvy and I can convert it to RGB to display on my LCD, but it has
limited framerate, and it seems to me like this should be do-able in
G-Streamer with v4l2src.

# ffmpeg -an -re -i /dev/video6 -f v4l2 -vcodec rawvideo -pix_fmt bgra
-f fbdev /dev/fb0

Input #0, video4linux2,v4l2, from '/dev/video6':
  Duration: N/A, start: 908.826490, bitrate: N/A
    Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422,
480x272, 17.42 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
Press [q] to stop, [?] for help
Output #0, fbdev, to '/dev/fb0':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: rawvideo (BGRA / 0x41524742), bgra, 480x272,
q=2-31, 72765 kb/s, 17.42 fps, 17.42 tbn, 17.42 tbc
    Metadata:
      encoder         : Lavc57.107.100 rawvideo


This shows me the information is available in some ways from v4l2, but
I wonder if there is a missing IOCTL for VIDIOC_ENUM_FMT for the isp
driver somewhere.  Shouldn't VIDIOC_ENUM_FMT  return UYVY?

I noticed vpbe_display.c has a function that appears to correspond to
this.  There is a patch at [1] for an older kernel.  Is this something
worth pursuing?

[1] - 
https://stackoverflow.com/questions/20693155/gstreamer-failed-to-enumerate-video-formats-and-inappropriate-ioctl-for-device

adam

Reply via email to