1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package usbcapture
- import (
- "fmt"
- "os"
- )
- // NewInstance creates a new video capture instance
- func NewInstance(config *Config) (*Instance, error) {
- if config == nil {
- return nil, fmt.Errorf("config cannot be nil")
- }
- //Check if the video device exists
- if _, err := os.Stat(config.VideoDeviceName); os.IsNotExist(err) {
- return nil, fmt.Errorf("video device %s does not exist", config.VideoDeviceName)
- } else if err != nil {
- return nil, fmt.Errorf("failed to check video device: %w", err)
- }
- //Check if the device file actualy points to a video device
- isValidDevice, err := checkVideoCaptureDevice(config.VideoDeviceName)
- if err != nil {
- return nil, fmt.Errorf("failed to check video device: %w", err)
- }
- if !isValidDevice {
- return nil, fmt.Errorf("device %s is not a video capture device", config.VideoDeviceName)
- }
- //Get the supported resolutions of the video device
- formatInfo, err := GetV4L2FormatInfo(config.VideoDeviceName)
- if err != nil {
- return nil, fmt.Errorf("failed to get video device format info: %w", err)
- }
- if len(formatInfo) == 0 {
- return nil, fmt.Errorf("no supported formats found for device %s", config.VideoDeviceName)
- }
- return &Instance{
- Config: config,
- Capturing: false,
- SupportedResolutions: formatInfo,
- // Videos
- camera: nil,
- pixfmt: 0,
- width: 0,
- height: 0,
- streamInfo: "",
- //Audio
- audiostopchan: make(chan bool, 1),
- // Access control
- videoTakeoverChan: make(chan bool, 1),
- accessCount: 0,
- }, nil
- }
- // GetStreamInfo returns the stream information string
- func (i *Instance) GetStreamInfo() string {
- return i.streamInfo
- }
- // IsCapturing checks if the camera is currently capturing video
- func (i *Instance) IsCapturing() bool {
- return i.Capturing
- }
- // IsAudioStreaming checks if the audio is currently being captured
- func (i *Instance) IsAudioStreaming() bool {
- return i.isAudioStreaming
- }
- // Close closes the camera device and releases resources
- func (i *Instance) Close() error {
- if i.camera != nil {
- i.StopCapture()
- }
- return nil
- }
|