v4l2

package module
v0.0.0-...-aab462b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 22, 2022 License: MIT Imports: 7 Imported by: 0

README

go-v4l2

A pure Go implementation of Video4Linux2 stream capture with a simple channel based interface:

  • No C code. No separate cross-compiler required.
  • Zero copy. Memory-mapped double-buffer scheme makes kernel memory reference available via Go channel.

Quickstart

See examples/record.go for a more detailed example.

device, err := v4l2.Open("/dev/video0")

device.SetPixelFormat(1280, 720, v4l2.V4L2_PIX_FMT_H264)

device.SetBitrate(1000000)

device.Start()

for {
	select {
	case sample := <-device.C:
		// Each read is a H.264 NAL unit
		fmt.Printf("Read %d byte sample\n", len(sample.Data))
		sample.Release()
	}
}

Build example:

GOARCH=arm GOOS=linux go build examples/record.go

Documentation

Index

Constants

View Source
const (
	V4L2_BUF_TYPE_VIDEO_CAPTURE = 1

	V4L2_FIELD_ANY  = 0
	V4L2_FIELD_NONE = 1

	V4L2_PIX_FMT_JPEG = 'J' | 'P'<<8 | 'E'<<16 | 'G'<<24
	V4L2_PIX_FMT_H264 = 'H' | '2'<<8 | '6'<<16 | '4'<<24

	V4L2_MEMORY_MMAP = 1

	VIDIOC_DQBUF       = 0xc0445611
	VIDIOC_QBUF        = 0xc044560f
	VIDIOC_QUERYBUF    = 0xc0445609
	VIDIOC_QUERYCAP    = 0x80685600
	VIDIOC_REQBUFS     = 0xc0145608
	VIDIOC_G_EXT_CTRLS = 0xc0185647
	VIDIOC_S_EXT_CTRLS = 0xc0185648
	VIDIOC_S_FMT       = 0xc0cc5605
	VIDIOC_STREAMON    = 0x40045612
	VIDIOC_STREAMOFF   = 0x40045613
	VIDIOC_S_CTRL      = 0xc008561c
)
View Source
const (
	// Control classes
	V4L2_CTRL_CLASS_USER = 0x00980000
	V4L2_CTRL_CLASS_MPEG = 0x00990000

	// User-class control IDs
	V4L2_CID_BASE               = V4L2_CTRL_CLASS_USER | 0x900
	V4L2_CID_USER_BASE          = V4L2_CID_BASE
	V4L2_CID_USER_CLASS         = V4L2_CTRL_CLASS_USER | 1
	V4L2_CID_BRIGHTNESS         = V4L2_CID_BASE + 0
	V4L2_CID_CONTRAST           = V4L2_CID_BASE + 1
	V4L2_CID_SATURATION         = V4L2_CID_BASE + 2
	V4L2_CID_HUE                = V4L2_CID_BASE + 3
	V4L2_CID_AUTO_WHITE_BALANCE = V4L2_CID_BASE + 12
	V4L2_CID_DO_WHITE_BALANCE   = V4L2_CID_BASE + 13
	V4L2_CID_RED_BALANCE        = V4L2_CID_BASE + 14
	V4L2_CID_BLUE_BALANCE       = V4L2_CID_BASE + 15
	V4L2_CID_GAMMA              = V4L2_CID_BASE + 16
	V4L2_CID_EXPOSURE           = V4L2_CID_BASE + 17
	V4L2_CID_AUTOGAIN           = V4L2_CID_BASE + 18
	V4L2_CID_GAIN               = V4L2_CID_BASE + 19
	V4L2_CID_HFLIP              = V4L2_CID_BASE + 20
	V4L2_CID_VFLIP              = V4L2_CID_BASE + 21

	// MPEG-class control IDs
	V4L2_CID_MPEG_BASE                    = V4L2_CTRL_CLASS_MPEG | 0x900
	V4L2_CID_MPEG_CLASS                   = V4L2_CTRL_CLASS_MPEG | 1
	V4L2_CID_MPEG_VIDEO_B_FRAMES          = V4L2_CID_MPEG_BASE + 202
	V4L2_CID_MPEG_VIDEO_GOP_SIZE          = V4L2_CID_MPEG_BASE + 203
	V4L2_CID_MPEG_VIDEO_BITRATE           = V4L2_CID_MPEG_BASE + 207
	V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER = V4L2_CID_MPEG_BASE + 226
	V4L2_CID_MPEG_VIDEO_H264_I_PERIOD     = V4L2_CID_MPEG_BASE + 358
	V4L2_CID_MPEG_VIDEO_H264_LEVEL        = V4L2_CID_MPEG_BASE + 359
	V4L2_CID_MPEG_VIDEO_H264_PROFILE      = V4L2_CID_MPEG_BASE + 363

	// H.264 Levels
	V4L2_MPEG_VIDEO_H264_LEVEL_1_0 = 0
	V4L2_MPEG_VIDEO_H264_LEVEL_1B  = 1
	V4L2_MPEG_VIDEO_H264_LEVEL_1_1 = 2
	V4L2_MPEG_VIDEO_H264_LEVEL_1_2 = 3
	V4L2_MPEG_VIDEO_H264_LEVEL_1_3 = 4
	V4L2_MPEG_VIDEO_H264_LEVEL_2_0 = 5
	V4L2_MPEG_VIDEO_H264_LEVEL_2_1 = 6
	V4L2_MPEG_VIDEO_H264_LEVEL_2_2 = 7
	V4L2_MPEG_VIDEO_H264_LEVEL_3_0 = 8
	V4L2_MPEG_VIDEO_H264_LEVEL_3_1 = 9
	V4L2_MPEG_VIDEO_H264_LEVEL_3_2 = 10
	V4L2_MPEG_VIDEO_H264_LEVEL_4_0 = 11
	V4L2_MPEG_VIDEO_H264_LEVEL_4_1 = 12
	V4L2_MPEG_VIDEO_H264_LEVEL_4_2 = 13
	V4L2_MPEG_VIDEO_H264_LEVEL_5_0 = 14
	V4L2_MPEG_VIDEO_H264_LEVEL_5_1 = 15

	// H.264 Profiles
	V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE             = 0
	V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE = 1
	V4L2_MPEG_VIDEO_H264_PROFILE_MAIN                 = 2
	V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED             = 3
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH                 = 4
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10              = 5
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422             = 6
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE  = 7
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA        = 8
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA       = 9
	V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA       = 10
	V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA      = 11
	V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE    = 12
	V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH        = 13
	V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA  = 14
)

Controls (from linux/v4l2-controls.h)

Variables

This section is empty.

Functions

This section is empty.

Types

type Buffer

type Buffer struct {
	Data []byte
	// contains filtered or unexported fields
}

func (*Buffer) Release

func (b *Buffer) Release() error

Release buffer so that it may be re-enqueued into the device

type Device

type Device struct {
	C chan Buffer
	// contains filtered or unexported fields
}

func Open

func Open(path string) (*Device, error)

Open device

func OpenN

func OpenN(path string, numBuffers int) (*Device, error)

func (*Device) Close

func (dev *Device) Close() error

Close device

func (*Device) SetBitrate

func (dev *Device) SetBitrate(bitrate int32) error

SetBitrate configures the target bitrate of encoder

func (*Device) SetPixelFormat

func (dev *Device) SetPixelFormat(width, height, format int) error

SetPixelFormat configures frame geometry and pixel format. The pixel format may be a compressor supported by the device, such as MJPEG or H.264.

func (*Device) SetRepeatSequenceHeader

func (dev *Device) SetRepeatSequenceHeader(on bool) error

SetRepeatSequenceHeader configures the device to output sequence parameter sets (SPS) and picture parameter sets (PPS) before each group-of-pictures (GoP). This is H.264 specific and not supported by all devices.

func (*Device) Start

func (dev *Device) Start() error

Start video capture

func (*Device) Stop

func (dev *Device) Stop() error

Stop video capture

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL