Skip to content

Camera crashes as I try to add new face for bio recognition #14066

Description

@mimmomarozzi-create

SUMMARY | 问题概要

On this Deepin system, face enrollment always fails with device is claimed inside the authentication
framework. The root cause is a D-Bus interface incompatibility between deepin-authenticate
(2.0.33, commercial repo) and deepin-face (2.0.16, main repo): the framework expects the new
UOS driver interface (Claim(bool) method, Claimed property, StartEnroll(uuid, faceName),
GetShareMemInfo, ...), while the open-source driver exposes the old interface (Claim property,
EnrollStart(chara, charaType, actionId), anonymous file descriptor). As shipped in the official
repositories, the two components are not compatible with each other.

SOFTWARE/OS VERSIONS | 软件/系统版本信息

| Field | Value |
|---|---|
| OS | Deepin 25 (VERSION_CODENAME=crimson) |
| Kernel | 6.18.48-amd64-desktop-rolling |
| Architecture | amd64 |
| `deepin-authenticate` | 1:2.0.33 (repo `crimson/commercial`) |
| `deepin-face` | 2.0.16 (repo `crimson/main`) |
| Camera | Generic FULL HD 1080P Webcam (USB, ID 2ef4:4255), uvcvideo |
| Runtime | containerized environment (read-only root, persistent home) |

PRE-REQUIREMENT | 预置条件

No response

STEPS TO REPRODUCE | 复现步骤

  1. Open Settings → Biometrics → Face → Add face.
  2. The webcam LED turns on and immediately turns off; no preview image is shown.
  3. Enrollment fails; the framework returns:
    Error org.deepin.dde.DBus.Error.Unnamed: device is claimed
  4. org.deepin.dde.Authenticate1.Face.ServiceList stays empty (the driver is never registered).

OBSERVED RESULT | 观察到的结果

4.1 The camera works

  • lsusb: 2ef4:4255 Generic FULL HD 1080P Webcam
  • /sys/class/video4linux/video0 present, uvcvideo driver loaded.
  • Real capture with ffmpeg (YUYV422 and MJPEG, 640x480 → 1920x1080): OK (valid JPEG files).

4.2 The deepin-face driver works when called directly

  • EnrollStart as root returns a file descriptor (unix socket): success.
  • Claim correctly goes from false to true and back to false after EnrollStop.

4.3 The framework does not register the driver

  • Face.ServiceList = "" (empty), FrameworkState = 1 (unavailable).
  • CharaManger.DriverInfo = [{"DriverName":"org.deepin.dde.Face1","CharaType":4}]
    (the driver is known but not registered).

4.4 Live D-Bus capture during Face.StartEnroll

error ...: "'face' not exist"
error ...: "Property org.deepin.dde.Face1.Claimed was not found in object /org/deepin/dde/Face1"
error ...: "device is claimed"

After a local binary patch of the driver (Claim→Claimed) the sequence proceeds up to the missing method:

method call sender=:1.480 -> destination=org.deepin.dde.Face1 path=/org/deepin/dde/Face1
           interface=org.deepin.dde.Face1; member=Claim
error "No such method 'Claim' in interface 'org.deepin.dde.Face1' (signature 'b')"

4.5 Driver log (/var/log/deepin-face.log)

QDBusConnection: couldn't handle call to Claim, no slot matched
Could not find slot DbusFaceService::Claim

EXPECTED RESULT | 期望的结果

No response

ADDITIONAL INFORMATION | 额外补充

The framework uses Deepin's go-dbus-factory. The expected driver interface is defined in
go-dbus-factory/system/org.deepin.dde.authenticate1.face/Face.xml
(https://github.com/linuxdeepin/go-dbus-factory/blob/master/system/org.deepin.dde.authenticate1.face/Face.xml):

<interface name="org.deepin.dde.Authenticate1.Face.Device">
    <method name="Claim"><arg name="claimed" type="b" direction="in"/></method>
    <method name="StartEnroll"><arg name="uuid" type="s"/><arg name="faceName" type="s"/></method>
    <method name="StopEnroll"/>
    <method name="GetShareMemInfo">...sockPath, key, size...</method>
    <method name="SetDefaultDevice"/><method name="ListFaces"/><method name="RenameFace"/>...
    <property name="Claimed" type="b" access="read"/>
    <property name="SupportedDevices"/><property name="Capability"/><property name="Status"/>...
</interface>

The actual interface of the installed driver (deepin-face 2.0.16, source:
https://github.com/linuxdeepin/deepin-face/blob/master/dbusfaceservice.h):

Q_PROPERTY(bool Claim READ getClaim)
Q_PROPERTY(QStringList List READ getList)
Q_PROPERTY(qint32 CharaType READ getCharaType)
Q_SLOTS: EnrollStart(chara, charaType, actionId), EnrollStop, VerifyStart, VerifyStop, Delete
Member expected by framework Driver 2.0.16 Result
Method Claim(bool) absent (only Claim property) ❌ registration fails
Property Claimed absent (Claim instead) ❌ (added via local patch)
StartEnroll(uuid, faceName) EnrollStart(chara, charaType, actionId) ❌ different signature
GetShareMemInfo() → sockPath/key/size absent (returns anonymous fd) ❌ different frame protocol
SetDefaultDevice/ListFaces/RenameFace/... absent ❌

The commercial UOS driver (never present in the main repo) implements the new interface;
the open-source deepin-face does not. The official Deepin 25 repositories ship a commercial
framework together with an incompatible open-source driver.

6. Secondary issue (preview)

The camera preview (Qt Multimedia, FFmpeg backend) produces no frames inside the container:
QImage::scaled: Image is a null image in the driver log, LED on/off, while the ffmpeg CLI
captures normally. To be investigated separately (possibly selection of the metadata node
/dev/video1 or format negotiation).

7. Reproduction

  1. dbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.deepin.dde.Authenticate1.Face.StartEnroll string:Domenico string:org.deepin.dde.Face1 string:test
    → Error org.deepin.dde.DBus.Error.Unnamed: device is claimed
  2. dbus-send --system --print-reply --dest=org.deepin.dde.Authenticate1 /org/deepin/dde/Authenticate1/Face org.freedesktop.DBus.Properties.Get string:org.deepin.dde.Authenticate1.Face string:ServiceList
    → empty.

8. Proposed fixes (for Deepin)

  1. Ship a face driver in the official repos that is compatible with the commercial framework
    (new interface: Claim/Claimed/StartEnroll/GetShareMemInfo), or
  2. Downgrade deepin-authenticate to a version compatible with deepin-face 2.0.16, or
  3. Document the incompatibility and prevent the cross-installation of these packages.

9. Workarounds applied locally (diagnostic only)

  • Binary patch of the driver: property Claim → Claimed (first step of the expected contract).
  • Restart=on-failure on the deepin-face service (avoids crash at boot).
  • DefaultService=org.deepin.dde.Face1 persisted.
    None of these unblocks enrollment because the missing members cannot be added to a compiled binary.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions