Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions v4l2.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
27 changes: 27 additions & 0 deletions webcam.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down