diff --git a/v4l2.go b/v4l2.go index e573783..cc4c6b8 100644 --- a/v4l2.go +++ b/v4l2.go @@ -25,6 +25,14 @@ type control struct { max int32 } +type capability struct { + driver string + card string + bus_info string + version uint32 + capabilities uint32 +} + const ( V4L2_CAP_VIDEO_CAPTURE uint32 = 0x00000001 V4L2_CAP_STREAMING uint32 = 0x04000000 @@ -205,18 +213,31 @@ type v4l2_control struct { func checkCapabilities(fd uintptr) (supportsVideoCapture bool, supportsVideoStreaming bool, err error) { - caps := &v4l2_capability{} + caps, err := getCapabilities(fd) + + supportsVideoCapture = (caps.capabilities & V4L2_CAP_VIDEO_CAPTURE) != 0 + supportsVideoStreaming = (caps.capabilities & V4L2_CAP_STREAMING) != 0 + + return +} - err = ioctl.Ioctl(fd, VIDIOC_QUERYCAP, uintptr(unsafe.Pointer(caps))) +func getCapabilities(fd uintptr) (caps *capability, err error) { + v4lcaps := &v4l2_capability{} + err = ioctl.Ioctl(fd, VIDIOC_QUERYCAP, uintptr(unsafe.Pointer(v4lcaps))) if err != nil { return } - supportsVideoCapture = (caps.capabilities & V4L2_CAP_VIDEO_CAPTURE) != 0 - supportsVideoStreaming = (caps.capabilities & V4L2_CAP_STREAMING) != 0 - return + caps = &capability{ + driver: CToGoString(v4lcaps.driver[:]), + card: CToGoString(v4lcaps.card[:]), + bus_info: CToGoString(v4lcaps.bus_info[:]), + version: v4lcaps.version, + capabilities: v4lcaps.capabilities, + } + return } func getPixelFormat(fd uintptr, index uint32) (code uint32, description string, err error) { diff --git a/webcam.go b/webcam.go index 19d3559..5c4ea07 100644 --- a/webcam.go +++ b/webcam.go @@ -26,6 +26,16 @@ type Control struct { Max int32 } +// Capability is go representation of v4l2_capability struct. +// See more: https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/vidioc-querycap.html#c.v4l2_capability +type Capability struct { + Driver string + Card string + BusInfo string + Version uint32 + Capabilities uint32 +} + // Open a webcam with a given path // Checks if device is a v4l2 device and if it is // capable to stream video @@ -58,6 +68,23 @@ func Open(path string) (*Webcam, error) { return w, nil } +// GetCapabilities reads device capabilities with VIDIOC_QUERYCAP. +// See more: https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/vidioc-querycap.html#ioctl-vidioc-querycap +func (w *Webcam) GetCapabilities() (*Capability, error) { + caps, err := getCapabilities(w.fd) + if err != nil { + return nil, err + } + + return &Capability{ + Driver: caps.driver, + Card: caps.card, + BusInfo: caps.bus_info, + Version: caps.version, + Capabilities: caps.capabilities, + }, nil +} + // Returns image formats supported by the device alongside with // their text description // Not that this function is somewhat experimental. Frames are not ordered in