UVC

Parse Descriptor for UVC (USB Video Class)

Installation

Add this line to your application's Gemfile:

gem 'uvc'

And then execute:

$ bundle

Or install it yourself as:

$ gem install uvc

Usage

# returns libusb Device class instance
# ref. https://rubydoc.info/gems/libusb/LIBUSB/Device
p UVC::UVCDevice.devices

# libusb Setting class instance
# ref. https://rubydoc.info/gems/libusb/LIBUSB/Setting
setting = UVC::UVCDevice.video_control_interface_settings_of(UVC::UVCDevice.devices.first).first

# Create UVCDevice instance with libusb Setting instance
uvc = UVC::UVCDevice.new(setting)

# ct is Camera Terminal
ct = uvc.camera_terminals.first
# pu is Processing Unit
pu = uvc.processing_units.first

# print all descriptors of UVC
pp uvc.descriptors

# Include module for using control constants (eg. CT_AE_MODE_CONTROL)
include UVC::Controls

# Open and claim interface for video control subclass interface.
uvc.open do
    # show some control values
    [
        CT_SCANNING_MODE_CONTROL,
        CT_AE_MODE_CONTROL,
        CT_AE_PRIORITY_CONTROL,
        CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,

        PU_BACKLIGHT_COMPENSATION_CONTROL,
        PU_BRIGHTNESS_CONTROL,
        PU_CONTRAST_CONTROL,
        PU_CONTRAST_AUTO_CONTROL,
        PU_GAIN_CONTROL,
        PU_POWER_LINE_FREQUENCY_CONTROL,
        PU_HUE_CONTROL,
        PU_HUE_AUTO_CONTROL,
        PU_SATURATION_CONTROL,
        PU_SHARPNESS_CONTROL,
        PU_GAMMA_CONTROL,
        PU_WHITE_BALANCE_TEMPERATURE_CONTROL,
        PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,
        PU_DIGITAL_MULTIPLIER_CONTROL,
        PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL,
    ].each do |control|
        target = nil
        case control.to_s
        when /^CT/
            target = ct
        when /^PU/
            target = pu
        else
            raise "unknown"
        end

        # For controls known from the specification, the values are decoded.
        cur = uvc.get_cur(control, target.bUnitID) rescue nil
        res = uvc.get_res(control, target.bUnitID) rescue nil
        max = uvc.get_max(control, target.bUnitID) rescue nil
        min = uvc.get_min(control, target.bUnitID) rescue nil
        dff = uvc.get_def(control, target.bUnitID) rescue nil
        p [control, [:min, min, :cur, cur, :max, max, :def, dff, :res, res]]
    end

    # Set some values for CT control
    p uvc.set_cur(CT_AE_MODE_CONTROL, ct.bUnitID, 1) # exposure manual
    p uvc.set_cur(CT_EXPOSURE_TIME_ABSOLUTE_CONTROL, ct.bUnitID, 600)

    # Set some values for PU control
    p uvc.set_cur(PU_BACKLIGHT_COMPENSATION_CONTROL, pu.bUnitID, 0)
    p uvc.set_cur(PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL, pu.bUnitID, false)
    p uvc.set_cur(PU_WHITE_BALANCE_TEMPERATURE_CONTROL, pu.bUnitID, 5000)
    p uvc.set_cur(PU_GAIN_CONTROL, pu.bUnitID, 80)
    p uvc.set_cur(PU_GAMMA_CONTROL, pu.bUnitID, 120)
    p uvc.set_cur(PU_POWER_LINE_FREQUENCY_CONTROL, pu.bUnitID, 0)
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/cho45/uvc.

License

The gem is available as open source under the terms of the MIT License.