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

Dynamic setting of QML Camera deviceId fails

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Cannot Reproduce
    • Icon: P3: Somewhat important P3: Somewhat important
    • None
    • 5.7.0
    • Multimedia
    • None
    • Windows 10 64bit 1605, MSVC2013_64, Sprout by HP

      The Camera QML documetation says:

      deviceId : string

      This property holds the unique identifier for the camera device being used.You can get all available device IDs from QtMultimedia.availableCameras. If no value is provided or if set to an empty string, the system's default camera will be used.

      However, unless the (non-default) deviceId is hardcoded (f.ex needs to be determined from QtMultimedia.availableCameras), you'll not be able to actually open the camera.

      Example:

      import QtQuick 2.7
      import QtQuick.Controls 2.0
      import QtQuick.Layouts 1.0
      import QtMultimedia 5.6

      ApplicationWindow {
      visible: true
      width: 640
      height: 480
      title: qsTr("Don't touch my camera")

      VideoOutput

      { anchors.fill: parent source: camera }

      Item {
      id: hpcam
      property bool ready: false
      property string deviceId: ""
      property var data: [[]]
      Component.onCompleted: {
      data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
      console.log(JSON.stringify(data))
      for (var ii=0; ii< data.length; ii++)

      { if (data[ii].displayName == "Forward Facing camera") deviceId = data[ii].deviceId }

      ready = true
      }
      }

      Camera

      { id: camera deviceId: hpcam.ready ? hpcam.deviceId : "" Component.onCompleted: console.log("CamStart is " + deviceId) onDeviceIdChanged: console.log("Cam changed to " + deviceId) viewfinder.resolution: "1280x720" onCameraStateChanged: console.log("CamState: " + cameraState) onDisplayNameChanged: console.log("New name: " + displayName) onError: console.log("Orror:" + errorCode + ": " + errorString) }

      }

      On my multi-cam machine, by the time the deviceId is correctly defined, the video preview has irrevocably failed and does not react to changing the deviceId. Output of the above:

      Starting C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe...
      QML debugging is enabled. Only use this in a safe environment.
      failed to find the video proc amp
      Invalid viewfinder settings
      Failed to configure preview format
      qml: CamStart is @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
      qml: [{"deviceId":"@device:pnp:\\\\?
      usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}


      global","displayName":"USB Camera-OV580","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      root#image#0001#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"Forward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      root#image#0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}


      global","displayName":"Downward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_8086&pid_0a66&mi_00#7&1446047e&0&0000#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) RGB","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_8086&pid_0a66&mi_02#7&1446047e&0&0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}


      global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) Depth","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      root#image#0002#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"Intel(R) RealSense(TM) 3D Camera Virtual Driver","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_04f2&pid_b454&mi_00#7&305232d3&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}


      global","displayName":"HP High Definition 1MP Webcam","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_03f0&pid_e807&mi_00#8&10675082&0&0000#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"HP Webcam HD 4310","position":0,"orientation":0}]
      qml: Cam changed to @device:pnp:\\?\root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}

      \global
      qml: New name: Forward Facing camera
      C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe exited with code 0

      Second attempt, by having the cam stack unloaded by default also fails:

      import QtQuick 2.7
      import QtQuick.Controls 2.0
      import QtQuick.Layouts 1.0
      import QtMultimedia 5.6

      ApplicationWindow {
      visible: true
      width: 640
      height: 480
      title: qsTr("Hello World")

      VideoOutput

      { anchors.fill: parent source: camera }

      Item {
      id: hpcam
      property bool ready: false
      property string deviceId: ""
      property var data: [[]]
      Component.onCompleted: {
      data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
      console.log(JSON.stringify(data))
      for (var ii=0; ii< data.length; ii++)

      { // console.log(JSON.stringify(cam.data[ii])) if (data[ii].displayName == "Forward Facing camera") deviceId = data[ii].deviceId }
      ready = true
      }
      }

      Camera {
      id: camera
      cameraState: Camera.UnloadedState
      deviceId: hpcam.ready ? hpcam.deviceId : ""
      Component.onCompleted: console.log("CamStart is " + deviceId)
      onDeviceIdChanged: { console.log("Cam changed to " + deviceId) cameraState = Camera.ActiveState // viewfinder.resolution = "1280x720" }
      onCameraStateChanged: console.log("CamState: " + cameraState + (cameraState == Camera.ActiveState))
      onCameraStatusChanged: console.log("CamStatUS: " + cameraStatus)
      onDisplayNameChanged: console.log("New name: " + displayName)
      onError: console.log("Orror:" + errorCode + ": " + errorString)
      }
      }

      ...with...

      Starting C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe...
      QML debugging is enabled. Only use this in a safe environment.
      qml: Cam changed to @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
      qml: CamStart is @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
      qml: [{"deviceId":"@device:pnp:\\\\?\\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"USB Camera-OV580","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Forward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\root#image#0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"Downward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_8086&pid_0a66&mi_00#7&1446047e&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) RGB","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\usb#vid_8086&pid_0a66&mi_02#7&1446047e&0&0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) Depth","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      root#image#0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Intel(R) RealSense(TM) 3D Camera Virtual Driver","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\usb#vid_04f2&pid_b454&mi_00#7&305232d3&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
      global","displayName":"HP High Definition 1MP Webcam","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
      usb#vid_03f0&pid_e807&mi_00#8&10675082&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"HP Webcam HD 4310","position":0,"orientation":0}]

      qml: Cam changed to @device:pnp:\\?\root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
      qml: CamStatUS: 2
      Failed to get the supported modes of the video control
      qml: CamStatUS: 4
      qml: CamStatUS: 6
      qml: CamStatUS: 8
      qml: CamState: 2true
      qml: New name: Forward Facing camera
      qml: CamStatUS: 7
      qml: CamStatUS: 4
      qml: CamStatUS: 3
      qml: CamStatUS: 1
      qml: CamState: 0false
      C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe exited with code 0

      Oddly enough if the alternate deviceId was hardcoded, and I just alter the state, it does open the camera correctly:

      import QtQuick 2.7
      import QtQuick.Controls 2.0
      import QtQuick.Layouts 1.0
      import QtMultimedia 5.6

      ApplicationWindow {
      visible: true
      width: 640
      height: 480
      title: qsTr("Hello World")

      VideoOutput { anchors.fill: parent source: camera }

      Item {
      id: hpcam
      property bool ready: false
      property string deviceId: ""
      property var data: [[]]
      Component.onCompleted: {
      data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
      console.log(JSON.stringify(data))
      for (var ii=0; ii< data.length; ii++) { // console.log(JSON.stringify(cam.data[ii])) if (data[ii].displayName == "Forward Facing camera") deviceId = data[ii].deviceId }

      ready = true
      }
      }

      Timer

      { interval: 3000 onTriggered: camera.cameraState = Camera.ActiveState running: true }

      Camera {
      id: camera
      cameraState: Camera.UnloadedState

      deviceId: "@device:pnp:\\\\?
      root#image#0001#

      {65e8773d-8f56-11d0-a3b9-00a0c9223196}


      global"
      Component.onCompleted: console.log("CamStart is " + deviceId)
      viewfinder.resolution: "1280x720"
      onCameraStateChanged: console.log("CamState: " + cameraState + (cameraState == Camera.ActiveState))
      onCameraStatusChanged: console.log("CamStatUS: " + cameraStatus)
      onDisplayNameChanged: console.log("New name: " + displayName)
      onError: console.log("Orror:" + errorCode + ": " + errorString)

      }
      }

      ...which leads me to believe that even if you ask the cam stack state to be unloaded by default, something is still getting (wrongly) initialized which prevents later successful changing of the deviceId.

      If the deviceId is immutable, it should be noted in the documentation, but it feels that this is a bug given it refers to QtMultimedia.availableCameras as a source of deviceIds.

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

            ylopes Yoann Lopes
            achipa Attila Csipa
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes