Skip to content

Commit

Permalink
When finding cameras on linux systems, look at camera ID before path …
Browse files Browse the repository at this point in the history
…or video* (pion#476)
  • Loading branch information
martha-johnston authored Mar 7, 2023
1 parent 62009a8 commit 55881dd
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
1 change: 1 addition & 0 deletions pkg/driver/camera/camera_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ func init() {
// Initialize finds and registers camera devices. This is part of an experimental API.
func Initialize() {
discovered := make(map[string]struct{})
discover(discovered, "/dev/v4l/by-id/*")
discover(discovered, "/dev/v4l/by-path/*")
discover(discovered, "/dev/video*")
}
Expand Down
62 changes: 62 additions & 0 deletions pkg/driver/camera/camera_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,68 @@ func TestDiscover(t *testing.T) {
drvs[0].Info().Label,
drvs[1].Info().Label,
}

// Returned drivers are unordered. Sort to get static result.
sort.Sort(sort.StringSlice(labels))

expected := longName + LabelSeparator + shortName
if label := labels[0]; label != expected {
t.Errorf("Expected label: %s, got: %s", expected, label)
}

expectedNoLink := shortName2 + LabelSeparator + shortName2
if label := labels[1]; label != expectedNoLink {
t.Errorf("Expected label: %s, got: %s", expectedNoLink, label)
}
}

func TestDiscoverByID(t *testing.T) {
const (
shortName = "id-unittest-video0"
shortName2 = "id-unittest-video1"
longName = "id-unittest-long-device-name:0:1:2:3"
)

dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)

byIdDir := filepath.Join(dir, "v4l", "by-id")
if err := os.MkdirAll(byIdDir, 0755); err != nil {
t.Fatal(err)
}
if err := ioutil.WriteFile(filepath.Join(dir, shortName), []byte{}, 0644); err != nil {
t.Fatal(err)
}
if err := ioutil.WriteFile(filepath.Join(dir, shortName2), []byte{}, 0644); err != nil {
t.Fatal(err)
}
if err := os.Symlink(
filepath.Join(dir, shortName),
filepath.Join(byIdDir, longName),
); err != nil {
t.Fatal(err)
}

discovered := make(map[string]struct{})
discover(discovered, filepath.Join(byIdDir, "*"))
discover(discovered, filepath.Join(dir, "id-unittest-video*"))

drvs := driver.GetManager().Query(func(d driver.Driver) bool {
// Ignore real cameras.
return d.Info().DeviceType == driver.Camera && strings.Contains(d.Info().Label, "id-unittest")
})
if len(drvs) != 2 {
t.Fatalf("Expected 2 driver, got %d drivers", len(drvs))
}

labels := []string{
drvs[0].Info().Label,
drvs[1].Info().Label,
}

// Returned drivers are unordered. Sort to get static result.
sort.Sort(sort.StringSlice(labels))

Expand Down

0 comments on commit 55881dd

Please sign in to comment.