From a00c1bc63e7b637a52bebe2f9580ce59847595bd Mon Sep 17 00:00:00 2001 From: randhid Date: Thu, 16 Jan 2025 10:27:47 -0500 Subject: [PATCH] remove webcam logic --- components/camera/videosource/webcam.go | 85 ------------------- .../camera/videosource/webcam_e2e_test.go | 41 --------- components/camera/videosource/webcam_test.go | 47 ---------- 3 files changed, 173 deletions(-) diff --git a/components/camera/videosource/webcam.go b/components/camera/videosource/webcam.go index 18cbc61e2b2..c1b59f6adaa 100644 --- a/components/camera/videosource/webcam.go +++ b/components/camera/videosource/webcam.go @@ -8,7 +8,6 @@ import ( "fmt" "image" "path/filepath" - "strings" "sync" "time" @@ -20,7 +19,6 @@ import ( "github.com/pion/mediadevices/pkg/prop" "github.com/pkg/errors" "go.uber.org/multierr" - pb "go.viam.com/api/component/camera/v1" goutils "go.viam.com/utils" "go.viam.com/rdk/components/camera" @@ -39,101 +37,18 @@ var intrinsics []byte var data map[string]transform.PinholeCameraIntrinsics -// getVideoDrivers is a helper callback passed to the registered Discover func to get all video drivers. -func getVideoDrivers() []driver.Driver { - return driver.GetManager().Query(driver.FilterVideoRecorder()) -} - func init() { resource.RegisterComponent( camera.API, ModelWebcam, resource.Registration[camera.Camera, *WebcamConfig]{ Constructor: NewWebcam, - Discover: func(ctx context.Context, logger logging.Logger, extra map[string]interface{}) (interface{}, error) { - return Discover(ctx, getVideoDrivers, logger) - }, }) if err := json.Unmarshal(intrinsics, &data); err != nil { logging.Global().Errorw("cannot parse intrinsics json", "error", err) } } -// getProperties is a helper func for webcam discovery that returns the Media properties of a specific driver. -// It is NOT related to the GetProperties camera proto API. -func getProperties(d driver.Driver) (_ []prop.Media, err error) { - // Need to open driver to get properties - if d.Status() == driver.StateClosed { - errOpen := d.Open() - if errOpen != nil { - return nil, errOpen - } - defer func() { - if errClose := d.Close(); errClose != nil { - err = errClose - } - }() - } - return d.Properties(), err -} - -// Discover webcam attributes. -func Discover(ctx context.Context, getDrivers func() []driver.Driver, logger logging.Logger) (*pb.Webcams, error) { - mediadevicescamera.Initialize() - var webcams []*pb.Webcam - drivers := getDrivers() - for _, d := range drivers { - driverInfo := d.Info() - - props, err := getProperties(d) - if len(props) == 0 { - logger.CDebugw(ctx, "no properties detected for driver, skipping discovery...", "driver", driverInfo.Label) - continue - } else if err != nil { - logger.CDebugw(ctx, "cannot access driver properties, skipping discovery...", "driver", driverInfo.Label, "error", err) - continue - } - - if d.Status() == driver.StateRunning { - logger.CDebugw(ctx, "driver is in use, skipping discovery...", "driver", driverInfo.Label) - continue - } - - labelParts := strings.Split(driverInfo.Label, mediadevicescamera.LabelSeparator) - label := labelParts[0] - - name, id := func() (string, string) { - nameParts := strings.Split(driverInfo.Name, mediadevicescamera.LabelSeparator) - if len(nameParts) > 1 { - return nameParts[0], nameParts[1] - } - // fallback to the label if the name does not have an any additional parts to use. - return nameParts[0], label - }() - - wc := &pb.Webcam{ - Name: name, - Id: id, - Label: label, - Status: string(d.Status()), - Properties: make([]*pb.Property, 0, len(d.Properties())), - } - - for _, prop := range props { - pbProp := &pb.Property{ - WidthPx: int32(prop.Video.Width), - HeightPx: int32(prop.Video.Height), - FrameRate: prop.Video.FrameRate, - FrameFormat: string(prop.Video.FrameFormat), - } - wc.Properties = append(wc.Properties, pbProp) - } - webcams = append(webcams, wc) - } - - return &pb.Webcams{Webcams: webcams}, nil -} - // WebcamConfig is the native config attribute struct for webcams. type WebcamConfig struct { CameraParameters *transform.PinholeCameraIntrinsics `json:"intrinsic_parameters,omitempty"` diff --git a/components/camera/videosource/webcam_e2e_test.go b/components/camera/videosource/webcam_e2e_test.go index 7e5537a1c11..dd373edcded 100644 --- a/components/camera/videosource/webcam_e2e_test.go +++ b/components/camera/videosource/webcam_e2e_test.go @@ -27,47 +27,6 @@ func findWebcam(t *testing.T, webcams []*pb.Webcam, name string) *pb.Webcam { return nil } -func TestWebcamDiscovery(t *testing.T) { - logger := logging.NewTestLogger(t) - - reg, ok := resource.LookupRegistration(camera.API, videosource.ModelWebcam) - test.That(t, ok, test.ShouldBeTrue) - - ctx := context.Background() - discoveries, err := reg.Discover(ctx, logger) - test.That(t, err, test.ShouldBeNil) - - webcams, ok := discoveries.(*pb.Webcams) - test.That(t, ok, test.ShouldBeTrue) - webcamsLen := len(webcams.Webcams) - - // Video capture and overlay minor numbers range == [0, 63] - // Start from the end of the range to avoid conflicts with other devices - // Source: https://www.kernel.org/doc/html/v4.9/media/uapi/v4l/diff-v4l.html - config, err := vcamera.Builder(logger). - NewCamera(62, "Lo Res Webcam", vcamera.Resolution{Width: 640, Height: 480}). - NewCamera(63, "Hi Res Webcam", vcamera.Resolution{Width: 1280, Height: 720}). - Stream() - - test.That(t, err, test.ShouldBeNil) - defer config.Shutdown() - - discoveries, err = reg.Discover(ctx, logger) - test.That(t, err, test.ShouldBeNil) - - webcams, ok = discoveries.(*pb.Webcams) - test.That(t, ok, test.ShouldBeTrue) - test.That(t, len(webcams.Webcams), test.ShouldEqual, webcamsLen+2) - - webcam := findWebcam(t, webcams.Webcams, "Hi Res Webcam") - test.That(t, webcam.Properties[0].WidthPx, test.ShouldEqual, 1280) - test.That(t, webcam.Properties[0].HeightPx, test.ShouldEqual, 720) - - webcam = findWebcam(t, webcams.Webcams, "Lo Res Webcam") - test.That(t, webcam.Properties[0].WidthPx, test.ShouldEqual, 640) - test.That(t, webcam.Properties[0].HeightPx, test.ShouldEqual, 480) -} - func newWebcamConfig(name, path string) resource.Config { conf := resource.NewEmptyConfig( resource.NewName(camera.API, name), diff --git a/components/camera/videosource/webcam_test.go b/components/camera/videosource/webcam_test.go index e72a28f0625..db782c0475c 100644 --- a/components/camera/videosource/webcam_test.go +++ b/components/camera/videosource/webcam_test.go @@ -1,60 +1,13 @@ package videosource_test import ( - "context" "testing" - "github.com/pion/mediadevices/pkg/driver" - "github.com/pion/mediadevices/pkg/prop" "go.viam.com/test" "go.viam.com/rdk/components/camera/videosource" - "go.viam.com/rdk/logging" ) -// fakeDriver is a driver has a label and media properties. -type fakeDriver struct { - label string - props []prop.Media -} - -func (d *fakeDriver) Open() error { return nil } -func (d *fakeDriver) Properties() []prop.Media { return d.props } -func (d *fakeDriver) ID() string { return d.label } -func (d *fakeDriver) Info() driver.Info { return driver.Info{Label: d.label} } -func (d *fakeDriver) Status() driver.State { return "some state" } -func (d *fakeDriver) Close() error { return nil } - -func newFakeDriver(label string, props []prop.Media) driver.Driver { - return &fakeDriver{label: label, props: props} -} - -func testGetDrivers() []driver.Driver { - props := prop.Media{ - Video: prop.Video{Width: 320, Height: 240, FrameFormat: "some format", FrameRate: 30.0}, - } - withProps := newFakeDriver("some label", []prop.Media{props}) - withoutProps := newFakeDriver("another label", []prop.Media{}) - return []driver.Driver{withProps, withoutProps} -} - -func TestDiscoveryWebcam(t *testing.T) { - logger := logging.NewTestLogger(t) - resp, err := videosource.Discover(context.Background(), testGetDrivers, logger) - - test.That(t, err, test.ShouldBeNil) - test.That(t, resp.Webcams, test.ShouldHaveLength, 1) - test.That(t, resp.Webcams[0].Label, test.ShouldResemble, "some label") - test.That(t, resp.Webcams[0].Status, test.ShouldResemble, "some state") - - respProps := resp.Webcams[0].Properties - test.That(t, respProps, test.ShouldHaveLength, 1) - test.That(t, respProps[0].WidthPx, test.ShouldResemble, int32(320)) - test.That(t, respProps[0].HeightPx, test.ShouldResemble, int32(240)) - test.That(t, respProps[0].FrameFormat, test.ShouldResemble, "some format") - test.That(t, respProps[0].FrameRate, test.ShouldResemble, float32(30)) -} - func TestWebcamValidation(t *testing.T) { webCfg := &videosource.WebcamConfig{ Width: 1280,