-
Bug
-
Resolution: Unresolved
-
P2: Important
-
None
-
6.8.4
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