Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-141572

QtMultimedia frequently fails to detect camera devices

XMLWordPrintable

    • Linux/Yocto

      We're facing an issue after upgrading to Qt6 where QtMultimedia frequently fails to detect camera devices. 
      We have a device based on an NVidia Jetson TX2 with two MIPI-CSI cameras. 
      Our OS is a custom Yocto/kirkstone with Qt 6.8.4 and meta-tegra 32.7.6. We're using the GStreamer backend for QtMultimedia. *
      On /dev/video0 there's an OV5640 5MP camera with UYVY 422 pixel format and 2592x1944 resolution. 
      This is used in a QML element as a camera device in a CaptureSession.

      • On /dev/video1 there's an FPGA connected via a Toshiba TC358748 parallel-to-MIPI converter with AR24 pixel format and 64x9600 resolution. 
        This is used as a data acquisition system via a GStreamer appsink. 
        It works without issues, even when the other camera isn't detected.

      It looks like the device can sometimes get into an error-state where QMediaDevices::videoInputs() returns empty and the camera doesn't start on application startup. 
      When it does work correctly QMediaDevices::videoInputs() contains just a single entry (the camera on /dev/video0), and the camera starts without problems. 

      However, in the error-state the video device drivers are loaded correctly, /dev/video0 and /dev/video1 exist, and starting a camera stream via gst-launch works. 
      This issue also occurs using the declarative-camera demo app.
      This is logging in the error-state from the declarative-camera demo-app with QT_LOGGING_RULES=.multimedia.=true

      Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8.
      Qt depends on a UTF-8 locale, but has failed to switch to one.
      If this causes problems, reconfigure your locale. See the locale(1) manual
      for more information.
      qt.multimedia.plugin: Available backends QList("gstreamer")
      qt.multimedia.plugin: Loading media backend "gstreamer"
      qt.multimedia.gstreamer: Using gstreamer version:  GStreamer 1.20.7
      qt.multimedia.imageCapture: cameraActiveChanged false false
      qt.multimedia.imageCapture: cameraActiveChanged false false
       
      (declarative-camera:25514): GLib-GObject-WARNING **: 14:15:33.242: g_object_set_is_valid_property: object class 'GstAutoAudioSink' has no property named 'async'
      qt.multimedia.gstvideosink: instantiating conversion element: 
      qt.multimedia.gstvideosink: instantiating conversion element: Gstnvvconv
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.videooutput: sinkChanged "videoSinkBin"
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.videooutput: sinkChanged "videoSinkBin"
      qml: State: Other
      qrc:/CameraListPopup.qml:13:5: Unable to assign [undefined] to QCameraDevice
      qrc:/CameraListPopup.qml:13:5: Unable to assign [undefined] to QCameraDevice
      0:00:00.210276896 25514       0xa88ca0 WARN                glwindow gstglwindow.c:340:gst_gl_window_new: Could not create window. user specified (null), creating dummy window
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      0:00:00.228190208 25514       0xa88ca0 WARN                glwindow gstglwindow.c:340:gst_gl_window_new: Could not create window. user specified (null), creating dummy window
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS

      This is logging in the OK-state from the declarative-camera demo-app with QT_LOGGING_RULES=.multimedia.=true

      14:20:08: Starting /usr/local/examples/multimedia/declarative-camera/declarative-camera on fluke-559046400325061260.local...
      Detected locale "C" with character encoding "ANSI_X3.4-1968", which is not UTF-8.
      Qt depends on a UTF-8 locale, but has failed to switch to one.
      If this causes problems, reconfigure your locale. See the locale(1) manual
      for more information.
      qt.multimedia.plugin: Available backends QList("gstreamer")
      qt.multimedia.plugin: Loading media backend "gstreamer"
      qt.multimedia.gstreamer: Using gstreamer version:  GStreamer 1.20.7
      qt.multimedia.imageCapture: cameraActiveChanged false false
      QGstElement::getPipeline failed for element: videoConvert {name: videoConvert, parent: camerabin, qos: 1, dither: (not implemented: GstVideoDitherMethod), dither-quantization: 1, chroma-resampler: (not implemented: GstVideoResamplerMethod), alpha-mode: (not implemented: GstVideoAlphaMode), alpha-value: 1, chroma-mode: (not implemented: GstVideoChromaMode), matrix-mode: (not implemented: GstVideoMatrixMode), gamma-mode: (not implemented: GstVideoGammaMode), primaries-mode: (not implemented: GstVideoPrimariesMode), n-threads: 1}
      qt.multimedia.imageCapture: cameraActiveChanged false false(declarative-camera:1070): GLib-GObject-WARNING **: 14:22:38.248: g_object_set_is_valid_property: object class 'GstAutoAudioSink' has no property named 'async'
      qt.multimedia.gstvideosink: instantiating conversion element: 
      qt.multimedia.gstvideosink: instantiating conversion element: Gstnvvconv
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.videooutput: sinkChanged "videoSinkBin"
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.videooutput: sinkChanged "videoSinkBin"
      qml: State: Other
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->READY SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: READY->PAUSED SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: PAUSED->PLAYING SUCCESS
      qt.multimedia.imageCapture: cameraActiveChanged false true
      qt.multimedia.imageCapture: isReady true
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::gstEvent: stream-start
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::gstEvent: caps
      qt.multimedia.gstvideorenderer: set_caps: video/x-raw, width=(int)2592, height=(int)1944, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1, interlace-mode=(string)progressive, format=(string)UYVY
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::start video/x-raw, width=(int)2592, height=(int)1944, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1, interlace-mode=(string)progressive, format=(string)UYVY
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::proposeAllocation
      0:00:00.320144256  1070       0x8121e0 WARN          v4l2bufferpool gstv4l2bufferpool.c:855:gst_v4l2_buffer_pool_start:<camerasrc:pool0:src> Uncertain or not enough buffers, enabling copy threshold
      0:00:00.338153760  1070   0x7f80004070 WARN                glwindow gstglwindow.c:340:gst_gl_window_new: Could not create window. user specified (null), creating dummy window
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->NULL SUCCESS
      0:00:00.356903008  1070   0x7f80004070 WARN                glwindow gstglwindow.c:340:gst_gl_window_new: Could not create window. user specified (null), creating dummy window
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::unlock
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: PLAYING->PAUSED SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::unlock
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: PAUSED->READY SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::stop
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: READY->NULL SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: NULL->READY SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: READY->PAUSED SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::change_state: PAUSED->PLAYING SUCCESS
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::gstEvent: stream-start
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::gstEvent: caps
      qt.multimedia.gstvideorenderer: set_caps: video/x-raw, width=(int)2592, height=(int)1944, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1, interlace-mode=(string)progressive, format=(string)UYVY
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::start video/x-raw, width=(int)2592, height=(int)1944, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)15/1, interlace-mode=(string)progressive, format=(string)UYVY
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::gstEvent: segment
      0:00:00.999066624  1070       0x8121e0 WARN                 v4l2src gstv4l2src.c:564:gst_v4l2src_query_preferred_size:<camerasrc> warning: Signal lost
      0:00:00.999100768  1070       0x8121e0 WARN                 v4l2src gstv4l2src.c:564:gst_v4l2src_query_preferred_size:<camerasrc> warning: No input source was detected - video frames invalid
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.video: updatePaintNode: Video node created. Handle type: NoHandle
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::proposeAllocation
      0:00:01.043061312  1070       0x8121e0 WARN                 v4l2src gstv4l2src.c:1152:gst_v4l2src_create:<camerasrc> lost frames detected: count = 2 - ts: 0:00:00.806966560
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      !!!!!!!!!!! videoDevices.size() 1
      ID:  "0"
      Description:  "vi-output, 150c0000.nvcsi--1"
      Is default:  No
      Format_UYVY QSize(2592, 1944)
      Format_UYVY QSize(2592, 1944)
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render
      qt.multimedia.gstvideorenderer:     sending video frame
      qt.multimedia.gstvideorenderer: QGstVideoRenderer::render

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

            qtmultimediateam Qt Multimedia Team
            vslotman Vincent Slotman
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:

                There are no open Gerrit changes