Add support mips arch for v4l2 source

This commit is contained in:
Alex X
2025-01-09 00:20:48 +03:00
parent 59161c663b
commit 7e0a163f12
11 changed files with 725 additions and 286 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
//go:build !(linux && (386 || arm || amd64 || arm64))
//go:build !linux
package v4l2
-2
View File
@@ -1,5 +1,3 @@
//go:build linux && (386 || arm || amd64 || arm64)
package v4l2
import (
+19
View File
@@ -0,0 +1,19 @@
Build on Ubuntu
```bash
sudo apt install gcc-x86-64-linux-gnu
sudo apt install gcc-i686-linux-gnu
sudo apt install gcc-aarch64-linux-gnu binutils
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install gcc-mipsel-linux-gnu
x86_64-linux-gnu-gcc -w -static arch.c -o arch_x86_64
i686-linux-gnu-gcc -w -static arch.c -o arch_i686
aarch64-linux-gnu-gcc -w -static arch.c -o arch_aarch64
arm-linux-gnueabihf-gcc -w -static arch.c -o arch_armhf
mipsel-linux-gnu-gcc -static arch.c -o arch_mipsel
```
## Useful links
- https://github.com/torvalds/linux/blob/master/include/uapi/linux/videodev2.h
+163
View File
@@ -0,0 +1,163 @@
#include <stdio.h>
#include <stddef.h>
#include <linux/videodev2.h>
#define printconst1(con) printf("\t%s = 0x%08lx\n", #con, con)
#define printconst2(con) printf("\t%s = %d\n", #con, con)
#define printstruct(str) printf("type %s struct { // size %lu\n", #str, sizeof(struct str))
#define printmember(str, mem, typ) printf("\t%s %s // offset %lu, size %lu\n", #mem == "type" ? "typ" : #mem, typ, offsetof(struct str, mem), sizeof((struct str){0}.mem))
#define printunimem(str, uni, mem, typ) printf("\t%s %s // offset %lu, size %lu\n", #mem, typ, offsetof(struct str, uni.mem), sizeof((struct str){0}.uni.mem))
#define printalign1(str, mem2, mem1, siz1) printf("\t_ [%lu]byte // align\n", offsetof(struct str, mem2) - offsetof(struct str, mem1) - siz1)
#define printfiller(str, mem1, siz1) printf("\t_ [%lu]byte // filler\n", sizeof(struct str) - offsetof(struct str, mem1) - siz1)
int main() {
printf("const (\n");
printconst1(VIDIOC_QUERYCAP);
printconst1(VIDIOC_ENUM_FMT);
printconst1(VIDIOC_G_FMT);
printconst1(VIDIOC_S_FMT);
printconst1(VIDIOC_REQBUFS);
printconst1(VIDIOC_QUERYBUF);
printf("\n");
printconst1(VIDIOC_QBUF);
printconst1(VIDIOC_DQBUF);
printconst1(VIDIOC_STREAMON);
printconst1(VIDIOC_STREAMOFF);
printconst1(VIDIOC_G_PARM);
printconst1(VIDIOC_S_PARM);
printf("\n");
printconst1(VIDIOC_ENUM_FRAMESIZES);
printconst1(VIDIOC_ENUM_FRAMEINTERVALS);
printf(")\n\n");
printf("const (\n");
printconst2(V4L2_BUF_TYPE_VIDEO_CAPTURE);
printconst2(V4L2_COLORSPACE_DEFAULT);
printconst2(V4L2_FIELD_NONE);
printconst2(V4L2_FRMIVAL_TYPE_DISCRETE);
printconst2(V4L2_FRMSIZE_TYPE_DISCRETE);
printconst2(V4L2_MEMORY_MMAP);
printf(")\n\n");
printstruct(v4l2_capability);
printmember(v4l2_capability, driver, "[16]byte");
printmember(v4l2_capability, card, "[32]byte");
printmember(v4l2_capability, bus_info, "[32]byte");
printmember(v4l2_capability, version, "uint32");
printmember(v4l2_capability, capabilities, "uint32");
printmember(v4l2_capability, device_caps, "uint32");
printmember(v4l2_capability, reserved, "[3]uint32");
printf("}\n\n");
printstruct(v4l2_format);
printmember(v4l2_format, type, "uint32");
printalign1(v4l2_format, fmt, type, 4);
printunimem(v4l2_format, fmt, pix, "v4l2_pix_format");
printfiller(v4l2_format, fmt, sizeof(struct v4l2_pix_format));
printf("}\n\n");
printstruct(v4l2_pix_format);
printmember(v4l2_pix_format, width, "uint32");
printmember(v4l2_pix_format, height, "uint32");
printmember(v4l2_pix_format, pixelformat, "uint32");
printmember(v4l2_pix_format, field, "uint32");
printmember(v4l2_pix_format, bytesperline, "uint32");
printmember(v4l2_pix_format, sizeimage, "uint32");
printmember(v4l2_pix_format, colorspace, "uint32");
printmember(v4l2_pix_format, priv, "uint32");
printmember(v4l2_pix_format, flags, "uint32");
printmember(v4l2_pix_format, ycbcr_enc, "uint32");
printmember(v4l2_pix_format, quantization, "uint32");
printmember(v4l2_pix_format, xfer_func, "uint32");
printf("}\n\n");
printstruct(v4l2_streamparm);
printmember(v4l2_streamparm, type, "uint32");
printunimem(v4l2_streamparm, parm, capture, "v4l2_captureparm");
printfiller(v4l2_streamparm, parm, sizeof(struct v4l2_captureparm));
printf("}\n\n");
printstruct(v4l2_captureparm);
printmember(v4l2_captureparm, capability, "uint32");
printmember(v4l2_captureparm, capturemode, "uint32");
printmember(v4l2_captureparm, timeperframe, "v4l2_fract");
printmember(v4l2_captureparm, extendedmode, "uint32");
printmember(v4l2_captureparm, readbuffers, "uint32");
printmember(v4l2_captureparm, reserved, "[4]uint32");
printf("}\n\n");
printstruct(v4l2_fract);
printmember(v4l2_fract, numerator, "uint32");
printmember(v4l2_fract, denominator, "uint32");
printf("}\n\n");
printstruct(v4l2_requestbuffers);
printmember(v4l2_requestbuffers, count, "uint32");
printmember(v4l2_requestbuffers, type, "uint32");
printmember(v4l2_requestbuffers, memory, "uint32");
printmember(v4l2_requestbuffers, capabilities, "uint32");
printmember(v4l2_requestbuffers, flags, "uint8");
printmember(v4l2_requestbuffers, reserved, "[3]uint8");
printf("}\n\n");
printstruct(v4l2_buffer);
printmember(v4l2_buffer, index, "uint32");
printmember(v4l2_buffer, type, "uint32");
printmember(v4l2_buffer, bytesused, "uint32");
printmember(v4l2_buffer, flags, "uint32");
printmember(v4l2_buffer, field, "uint32");
printalign1(v4l2_buffer, timecode, field, 4);
printmember(v4l2_buffer, timecode, "v4l2_timecode");
printmember(v4l2_buffer, sequence, "uint32");
printmember(v4l2_buffer, memory, "uint32");
printunimem(v4l2_buffer, m, offset, "uint32");
printalign1(v4l2_buffer, length, m, 4);
printmember(v4l2_buffer, length, "uint32");
printfiller(v4l2_buffer, length, 4);
printf("}\n\n");
printstruct(v4l2_timecode);
printmember(v4l2_timecode, type, "uint32");
printmember(v4l2_timecode, flags, "uint32");
printmember(v4l2_timecode, frames, "uint8");
printmember(v4l2_timecode, seconds, "uint8");
printmember(v4l2_timecode, minutes, "uint8");
printmember(v4l2_timecode, hours, "uint8");
printmember(v4l2_timecode, userbits, "[4]uint8");
printf("}\n\n");
printstruct(v4l2_fmtdesc);
printmember(v4l2_fmtdesc, index, "uint32");
printmember(v4l2_fmtdesc, type, "uint32");
printmember(v4l2_fmtdesc, flags, "uint32");
printmember(v4l2_fmtdesc, description, "[32]byte");
printmember(v4l2_fmtdesc, pixelformat, "uint32");
printmember(v4l2_fmtdesc, mbus_code, "uint32");
printmember(v4l2_fmtdesc, reserved, "[3]uint32");
printf("}\n\n");
printstruct(v4l2_frmsizeenum);
printmember(v4l2_frmsizeenum, index, "uint32");
printmember(v4l2_frmsizeenum, pixel_format, "uint32");
printmember(v4l2_frmsizeenum, type, "uint32");
printmember(v4l2_frmsizeenum, discrete, "v4l2_frmsize_discrete");
printfiller(v4l2_frmsizeenum, discrete, sizeof(struct v4l2_frmsize_discrete));
printf("}\n\n");
printstruct(v4l2_frmsize_discrete);
printmember(v4l2_frmsize_discrete, width, "uint32");
printmember(v4l2_frmsize_discrete, height, "uint32");
printf("}\n\n");
printstruct(v4l2_frmivalenum);
printmember(v4l2_frmivalenum, index, "uint32");
printmember(v4l2_frmivalenum, pixel_format, "uint32");
printmember(v4l2_frmivalenum, width, "uint32");
printmember(v4l2_frmivalenum, height, "uint32");
printmember(v4l2_frmivalenum, type, "uint32");
printmember(v4l2_frmivalenum, discrete, "v4l2_fract");
printfiller(v4l2_frmivalenum, discrete, sizeof(struct v4l2_fract));
printf("}\n\n");
return 0;
}
+1 -1
View File
@@ -121,7 +121,7 @@ func (d *Device) ListFrameRates(pixFmt, width, height uint32) ([]uint32, error)
func (d *Device) SetFormat(width, height, pixFmt uint32) error {
f := v4l2_format{
typ: V4L2_BUF_TYPE_VIDEO_CAPTURE,
fmt: v4l2_pix_format{
pix: v4l2_pix_format{
width: width,
height: height,
pixelformat: pixFmt,
+149
View File
@@ -0,0 +1,149 @@
package device
const (
VIDIOC_QUERYCAP = 0x80685600
VIDIOC_ENUM_FMT = 0xc0405602
VIDIOC_G_FMT = 0xc0cc5604
VIDIOC_S_FMT = 0xc0cc5605
VIDIOC_REQBUFS = 0xc0145608
VIDIOC_QUERYBUF = 0xc0445609
VIDIOC_QBUF = 0xc044560f
VIDIOC_DQBUF = 0xc0445611
VIDIOC_STREAMON = 0x40045612
VIDIOC_STREAMOFF = 0x40045613
VIDIOC_G_PARM = 0xc0cc5615
VIDIOC_S_PARM = 0xc0cc5616
VIDIOC_ENUM_FRAMESIZES = 0xc02c564a
VIDIOC_ENUM_FRAMEINTERVALS = 0xc034564b
)
const (
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1
V4L2_COLORSPACE_DEFAULT = 0
V4L2_FIELD_NONE = 1
V4L2_FRMIVAL_TYPE_DISCRETE = 1
V4L2_FRMSIZE_TYPE_DISCRETE = 1
V4L2_MEMORY_MMAP = 1
)
type v4l2_capability struct { // size 104
driver [16]byte // offset 0, size 16
card [32]byte // offset 16, size 32
bus_info [32]byte // offset 48, size 32
version uint32 // offset 80, size 4
capabilities uint32 // offset 84, size 4
device_caps uint32 // offset 88, size 4
reserved [3]uint32 // offset 92, size 12
}
type v4l2_format struct { // size 204
typ uint32 // offset 0, size 4
_ [0]byte // align
pix v4l2_pix_format // offset 4, size 48
_ [152]byte // filler
}
type v4l2_pix_format struct { // size 48
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
pixelformat uint32 // offset 8, size 4
field uint32 // offset 12, size 4
bytesperline uint32 // offset 16, size 4
sizeimage uint32 // offset 20, size 4
colorspace uint32 // offset 24, size 4
priv uint32 // offset 28, size 4
flags uint32 // offset 32, size 4
ycbcr_enc uint32 // offset 36, size 4
quantization uint32 // offset 40, size 4
xfer_func uint32 // offset 44, size 4
}
type v4l2_streamparm struct { // size 204
typ uint32 // offset 0, size 4
capture v4l2_captureparm // offset 4, size 40
_ [160]byte // filler
}
type v4l2_captureparm struct { // size 40
capability uint32 // offset 0, size 4
capturemode uint32 // offset 4, size 4
timeperframe v4l2_fract // offset 8, size 8
extendedmode uint32 // offset 16, size 4
readbuffers uint32 // offset 20, size 4
reserved [4]uint32 // offset 24, size 16
}
type v4l2_fract struct { // size 8
numerator uint32 // offset 0, size 4
denominator uint32 // offset 4, size 4
}
type v4l2_requestbuffers struct { // size 20
count uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
memory uint32 // offset 8, size 4
capabilities uint32 // offset 12, size 4
flags uint8 // offset 16, size 1
reserved [3]uint8 // offset 17, size 3
}
type v4l2_buffer struct { // size 68
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
bytesused uint32 // offset 8, size 4
flags uint32 // offset 12, size 4
field uint32 // offset 16, size 4
_ [8]byte // align
timecode v4l2_timecode // offset 28, size 16
sequence uint32 // offset 44, size 4
memory uint32 // offset 48, size 4
offset uint32 // offset 52, size 4
_ [0]byte // align
length uint32 // offset 56, size 4
_ [8]byte // filler
}
type v4l2_timecode struct { // size 16
typ uint32 // offset 0, size 4
flags uint32 // offset 4, size 4
frames uint8 // offset 8, size 1
seconds uint8 // offset 9, size 1
minutes uint8 // offset 10, size 1
hours uint8 // offset 11, size 1
userbits [4]uint8 // offset 12, size 4
}
type v4l2_fmtdesc struct { // size 64
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
flags uint32 // offset 8, size 4
description [32]byte // offset 12, size 32
pixelformat uint32 // offset 44, size 4
mbus_code uint32 // offset 48, size 4
reserved [3]uint32 // offset 52, size 12
}
type v4l2_frmsizeenum struct { // size 44
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
typ uint32 // offset 8, size 4
discrete v4l2_frmsize_discrete // offset 12, size 8
_ [24]byte // filler
}
type v4l2_frmsize_discrete struct { // size 8
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
}
type v4l2_frmivalenum struct { // size 52
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
width uint32 // offset 8, size 4
height uint32 // offset 12, size 4
typ uint32 // offset 16, size 4
discrete v4l2_fract // offset 20, size 8
_ [24]byte // filler
}
+149
View File
@@ -0,0 +1,149 @@
package device
const (
VIDIOC_QUERYCAP = 0x80685600
VIDIOC_ENUM_FMT = 0xc0405602
VIDIOC_G_FMT = 0xc0cc5604
VIDIOC_S_FMT = 0xc0cc5605
VIDIOC_REQBUFS = 0xc0145608
VIDIOC_QUERYBUF = 0xc0505609
VIDIOC_QBUF = 0xc050560f
VIDIOC_DQBUF = 0xc0505611
VIDIOC_STREAMON = 0x40045612
VIDIOC_STREAMOFF = 0x40045613
VIDIOC_G_PARM = 0xc0cc5615
VIDIOC_S_PARM = 0xc0cc5616
VIDIOC_ENUM_FRAMESIZES = 0xc02c564a
VIDIOC_ENUM_FRAMEINTERVALS = 0xc034564b
)
const (
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1
V4L2_COLORSPACE_DEFAULT = 0
V4L2_FIELD_NONE = 1
V4L2_FRMIVAL_TYPE_DISCRETE = 1
V4L2_FRMSIZE_TYPE_DISCRETE = 1
V4L2_MEMORY_MMAP = 1
)
type v4l2_capability struct { // size 104
driver [16]byte // offset 0, size 16
card [32]byte // offset 16, size 32
bus_info [32]byte // offset 48, size 32
version uint32 // offset 80, size 4
capabilities uint32 // offset 84, size 4
device_caps uint32 // offset 88, size 4
reserved [3]uint32 // offset 92, size 12
}
type v4l2_format struct { // size 204
typ uint32 // offset 0, size 4
_ [0]byte // align
pix v4l2_pix_format // offset 4, size 48
_ [152]byte // filler
}
type v4l2_pix_format struct { // size 48
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
pixelformat uint32 // offset 8, size 4
field uint32 // offset 12, size 4
bytesperline uint32 // offset 16, size 4
sizeimage uint32 // offset 20, size 4
colorspace uint32 // offset 24, size 4
priv uint32 // offset 28, size 4
flags uint32 // offset 32, size 4
ycbcr_enc uint32 // offset 36, size 4
quantization uint32 // offset 40, size 4
xfer_func uint32 // offset 44, size 4
}
type v4l2_streamparm struct { // size 204
typ uint32 // offset 0, size 4
capture v4l2_captureparm // offset 4, size 40
_ [160]byte // filler
}
type v4l2_captureparm struct { // size 40
capability uint32 // offset 0, size 4
capturemode uint32 // offset 4, size 4
timeperframe v4l2_fract // offset 8, size 8
extendedmode uint32 // offset 16, size 4
readbuffers uint32 // offset 20, size 4
reserved [4]uint32 // offset 24, size 16
}
type v4l2_fract struct { // size 8
numerator uint32 // offset 0, size 4
denominator uint32 // offset 4, size 4
}
type v4l2_requestbuffers struct { // size 20
count uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
memory uint32 // offset 8, size 4
capabilities uint32 // offset 12, size 4
flags uint8 // offset 16, size 1
reserved [3]uint8 // offset 17, size 3
}
type v4l2_buffer struct { // size 80
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
bytesused uint32 // offset 8, size 4
flags uint32 // offset 12, size 4
field uint32 // offset 16, size 4
_ [20]byte // align
timecode v4l2_timecode // offset 40, size 16
sequence uint32 // offset 56, size 4
memory uint32 // offset 60, size 4
offset uint32 // offset 64, size 4
_ [0]byte // align
length uint32 // offset 68, size 4
_ [8]byte // filler
}
type v4l2_timecode struct { // size 16
typ uint32 // offset 0, size 4
flags uint32 // offset 4, size 4
frames uint8 // offset 8, size 1
seconds uint8 // offset 9, size 1
minutes uint8 // offset 10, size 1
hours uint8 // offset 11, size 1
userbits [4]uint8 // offset 12, size 4
}
type v4l2_fmtdesc struct { // size 64
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
flags uint32 // offset 8, size 4
description [32]byte // offset 12, size 32
pixelformat uint32 // offset 44, size 4
mbus_code uint32 // offset 48, size 4
reserved [3]uint32 // offset 52, size 12
}
type v4l2_frmsizeenum struct { // size 44
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
typ uint32 // offset 8, size 4
discrete v4l2_frmsize_discrete // offset 12, size 8
_ [24]byte // filler
}
type v4l2_frmsize_discrete struct { // size 8
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
}
type v4l2_frmivalenum struct { // size 52
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
width uint32 // offset 8, size 4
height uint32 // offset 12, size 4
typ uint32 // offset 16, size 4
discrete v4l2_fract // offset 20, size 8
_ [24]byte // filler
}
+149
View File
@@ -0,0 +1,149 @@
package device
const (
VIDIOC_QUERYCAP = 0x40685600
VIDIOC_ENUM_FMT = 0xc0405602
VIDIOC_G_FMT = 0xc0cc5604
VIDIOC_S_FMT = 0xc0cc5605
VIDIOC_REQBUFS = 0xc0145608
VIDIOC_QUERYBUF = 0xc0505609
VIDIOC_QBUF = 0xc050560f
VIDIOC_DQBUF = 0xc0505611
VIDIOC_STREAMON = 0x80045612
VIDIOC_STREAMOFF = 0x80045613
VIDIOC_G_PARM = 0xc0cc5615
VIDIOC_S_PARM = 0xc0cc5616
VIDIOC_ENUM_FRAMESIZES = 0xc02c564a
VIDIOC_ENUM_FRAMEINTERVALS = 0xc034564b
)
const (
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1
V4L2_COLORSPACE_DEFAULT = 0
V4L2_FIELD_NONE = 1
V4L2_FRMIVAL_TYPE_DISCRETE = 1
V4L2_FRMSIZE_TYPE_DISCRETE = 1
V4L2_MEMORY_MMAP = 1
)
type v4l2_capability struct { // size 104
driver [16]byte // offset 0, size 16
card [32]byte // offset 16, size 32
bus_info [32]byte // offset 48, size 32
version uint32 // offset 80, size 4
capabilities uint32 // offset 84, size 4
device_caps uint32 // offset 88, size 4
reserved [3]uint32 // offset 92, size 12
}
type v4l2_format struct { // size 204
typ uint32 // offset 0, size 4
_ [0]byte // align
pix v4l2_pix_format // offset 4, size 48
_ [152]byte // filler
}
type v4l2_pix_format struct { // size 48
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
pixelformat uint32 // offset 8, size 4
field uint32 // offset 12, size 4
bytesperline uint32 // offset 16, size 4
sizeimage uint32 // offset 20, size 4
colorspace uint32 // offset 24, size 4
priv uint32 // offset 28, size 4
flags uint32 // offset 32, size 4
ycbcr_enc uint32 // offset 36, size 4
quantization uint32 // offset 40, size 4
xfer_func uint32 // offset 44, size 4
}
type v4l2_streamparm struct { // size 204
typ uint32 // offset 0, size 4
capture v4l2_captureparm // offset 4, size 40
_ [160]byte // filler
}
type v4l2_captureparm struct { // size 40
capability uint32 // offset 0, size 4
capturemode uint32 // offset 4, size 4
timeperframe v4l2_fract // offset 8, size 8
extendedmode uint32 // offset 16, size 4
readbuffers uint32 // offset 20, size 4
reserved [4]uint32 // offset 24, size 16
}
type v4l2_fract struct { // size 8
numerator uint32 // offset 0, size 4
denominator uint32 // offset 4, size 4
}
type v4l2_requestbuffers struct { // size 20
count uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
memory uint32 // offset 8, size 4
capabilities uint32 // offset 12, size 4
flags uint8 // offset 16, size 1
reserved [3]uint8 // offset 17, size 3
}
type v4l2_buffer struct { // size 80
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
bytesused uint32 // offset 8, size 4
flags uint32 // offset 12, size 4
field uint32 // offset 16, size 4
_ [20]byte // align
timecode v4l2_timecode // offset 40, size 16
sequence uint32 // offset 56, size 4
memory uint32 // offset 60, size 4
offset uint32 // offset 64, size 4
_ [0]byte // align
length uint32 // offset 68, size 4
_ [8]byte // filler
}
type v4l2_timecode struct { // size 16
typ uint32 // offset 0, size 4
flags uint32 // offset 4, size 4
frames uint8 // offset 8, size 1
seconds uint8 // offset 9, size 1
minutes uint8 // offset 10, size 1
hours uint8 // offset 11, size 1
userbits [4]uint8 // offset 12, size 4
}
type v4l2_fmtdesc struct { // size 64
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
flags uint32 // offset 8, size 4
description [32]byte // offset 12, size 32
pixelformat uint32 // offset 44, size 4
mbus_code uint32 // offset 48, size 4
reserved [3]uint32 // offset 52, size 12
}
type v4l2_frmsizeenum struct { // size 44
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
typ uint32 // offset 8, size 4
discrete v4l2_frmsize_discrete // offset 12, size 8
_ [24]byte // filler
}
type v4l2_frmsize_discrete struct { // size 8
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
}
type v4l2_frmivalenum struct { // size 52
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
width uint32 // offset 8, size 4
height uint32 // offset 12, size 4
typ uint32 // offset 16, size 4
discrete v4l2_fract // offset 20, size 8
_ [24]byte // filler
}
-34
View File
@@ -1,34 +0,0 @@
package device
import (
"runtime"
"testing"
"unsafe"
"github.com/stretchr/testify/require"
)
func TestSize(t *testing.T) {
switch runtime.GOARCH {
case "amd64", "arm64":
require.Equal(t, 104, int(unsafe.Sizeof(v4l2_capability{})))
require.Equal(t, 208, int(unsafe.Sizeof(v4l2_format{})))
require.Equal(t, 204, int(unsafe.Sizeof(v4l2_streamparm{})))
require.Equal(t, 20, int(unsafe.Sizeof(v4l2_requestbuffers{})))
require.Equal(t, 88, int(unsafe.Sizeof(v4l2_buffer{})))
require.Equal(t, 16, int(unsafe.Sizeof(v4l2_timecode{})))
require.Equal(t, 64, int(unsafe.Sizeof(v4l2_fmtdesc{})))
require.Equal(t, 44, int(unsafe.Sizeof(v4l2_frmsizeenum{})))
require.Equal(t, 52, int(unsafe.Sizeof(v4l2_frmivalenum{})))
case "386", "arm":
require.Equal(t, 104, int(unsafe.Sizeof(v4l2_capability{})))
require.Equal(t, 204, int(unsafe.Sizeof(v4l2_format{})))
require.Equal(t, 204, int(unsafe.Sizeof(v4l2_streamparm{})))
require.Equal(t, 20, int(unsafe.Sizeof(v4l2_requestbuffers{})))
require.Equal(t, 68, int(unsafe.Sizeof(v4l2_buffer{})))
require.Equal(t, 16, int(unsafe.Sizeof(v4l2_timecode{})))
require.Equal(t, 64, int(unsafe.Sizeof(v4l2_fmtdesc{})))
require.Equal(t, 44, int(unsafe.Sizeof(v4l2_frmsizeenum{})))
require.Equal(t, 52, int(unsafe.Sizeof(v4l2_frmivalenum{})))
}
}
-152
View File
@@ -1,152 +0,0 @@
//go:build 386 || arm
package device
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/videodev2.h
const (
VIDIOC_QUERYCAP = 0x80685600
VIDIOC_ENUM_FMT = 0xc0405602
VIDIOC_G_FMT = 0xc0cc5604
VIDIOC_S_FMT = 0xc0cc5605
VIDIOC_REQBUFS = 0xc0145608
VIDIOC_QUERYBUF = 0xc0445609
VIDIOC_QBUF = 0xc044560f
VIDIOC_DQBUF = 0xc0445611
VIDIOC_STREAMON = 0x40045612
VIDIOC_STREAMOFF = 0x40045613
VIDIOC_G_PARM = 0xc0cc5615
VIDIOC_S_PARM = 0xc0cc5616
VIDIOC_ENUM_FRAMESIZES = 0xc02c564a
VIDIOC_ENUM_FRAMEINTERVALS = 0xc034564b
)
const (
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1
V4L2_COLORSPACE_DEFAULT = 0
V4L2_FIELD_NONE = 1
V4L2_FRMIVAL_TYPE_DISCRETE = 1
V4L2_FRMSIZE_TYPE_DISCRETE = 1
V4L2_MEMORY_MMAP = 1
)
type v4l2_capability struct {
driver [16]byte
card [32]byte
bus_info [32]byte
version uint32
capabilities uint32
device_caps uint32
reserved [3]uint32
}
type v4l2_format struct {
typ uint32
fmt v4l2_pix_format
}
type v4l2_pix_format struct {
width uint32 // 0
height uint32 // 4
pixelformat uint32 // 8
field uint32 // 12
bytesperline uint32 // 16
sizeimage uint32 // 20
colorspace uint32 // 24
priv uint32 // 28
flags uint32 // 32
ycbcr_enc uint32 // 36
quantization uint32 // 40
xfer_func uint32 // 44
_ [152]byte // 48
}
type v4l2_streamparm struct {
typ uint32
capture v4l2_captureparm
}
type v4l2_captureparm struct {
capability uint32 // 0
capturemode uint32 // 4
timeperframe v4l2_fract // 8
extendedmode uint32 // 16
readbuffers uint32 // 20
_ [176]byte // 24
}
type v4l2_fract struct {
numerator uint32
denominator uint32
}
type v4l2_requestbuffers struct {
count uint32
typ uint32
memory uint32
capabilities uint32
flags uint8
reserved [3]uint8
}
type v4l2_buffer struct {
index uint32 // 0
typ uint32 // 4
bytesused uint32 // 8
flags uint32 // 12
field uint32 // 16
_ [8]byte // 20
timecode v4l2_timecode // 28
sequence uint32 // 44
memory uint32 // 48
offset uint32 // 52
length uint32 // 56
_ [8]byte // 60
}
type v4l2_timecode struct {
typ uint32
flags uint32
frames uint8
seconds uint8
minutes uint8
hours uint8
userbits [4]uint8
}
type v4l2_fmtdesc struct {
index uint32
typ uint32
flags uint32
description [32]byte
pixelformat uint32
mbus_code uint32
reserved [3]uint32
}
type v4l2_frmsizeenum struct {
index uint32 // 0
pixel_format uint32 // 4
typ uint32 // 8
discrete v4l2_frmsize_discrete // 12
_ [24]byte
}
type v4l2_frmsize_discrete struct {
width uint32
height uint32
}
type v4l2_frmivalenum struct {
index uint32
pixel_format uint32
width uint32
height uint32
typ uint32
discrete v4l2_fract
_ [24]byte
}
+94 -96
View File
@@ -2,8 +2,6 @@
package device
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/videodev2.h
const (
VIDIOC_QUERYCAP = 0x80685600
VIDIOC_ENUM_FMT = 0xc0405602
@@ -32,122 +30,122 @@ const (
V4L2_MEMORY_MMAP = 1
)
type v4l2_capability struct {
driver [16]byte
card [32]byte
bus_info [32]byte
version uint32
capabilities uint32
device_caps uint32
reserved [3]uint32
type v4l2_capability struct { // size 104
driver [16]byte // offset 0, size 16
card [32]byte // offset 16, size 32
bus_info [32]byte // offset 48, size 32
version uint32 // offset 80, size 4
capabilities uint32 // offset 84, size 4
device_caps uint32 // offset 88, size 4
reserved [3]uint32 // offset 92, size 12
}
type v4l2_format struct {
typ uint64
fmt v4l2_pix_format
type v4l2_format struct { // size 208
typ uint32 // offset 0, size 4
_ [4]byte // align
pix v4l2_pix_format // offset 8, size 48
_ [152]byte // filler
}
type v4l2_pix_format struct {
width uint32 // 0
height uint32 // 4
pixelformat uint32 // 8
field uint32 // 12
bytesperline uint32 // 16
sizeimage uint32 // 20
colorspace uint32 // 24
priv uint32 // 28
flags uint32 // 32
ycbcr_enc uint32 // 36
quantization uint32 // 40
xfer_func uint32 // 44
_ [152]byte // 48
type v4l2_pix_format struct { // size 48
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
pixelformat uint32 // offset 8, size 4
field uint32 // offset 12, size 4
bytesperline uint32 // offset 16, size 4
sizeimage uint32 // offset 20, size 4
colorspace uint32 // offset 24, size 4
priv uint32 // offset 28, size 4
flags uint32 // offset 32, size 4
ycbcr_enc uint32 // offset 36, size 4
quantization uint32 // offset 40, size 4
xfer_func uint32 // offset 44, size 4
}
type v4l2_streamparm struct {
typ uint32
capture v4l2_captureparm
type v4l2_streamparm struct { // size 204
typ uint32 // offset 0, size 4
capture v4l2_captureparm // offset 4, size 40
_ [160]byte // filler
}
type v4l2_captureparm struct {
capability uint32 // 0
capturemode uint32 // 4
timeperframe v4l2_fract // 8
extendedmode uint32 // 16
readbuffers uint32 // 20
_ [176]byte // 24
type v4l2_captureparm struct { // size 40
capability uint32 // offset 0, size 4
capturemode uint32 // offset 4, size 4
timeperframe v4l2_fract // offset 8, size 8
extendedmode uint32 // offset 16, size 4
readbuffers uint32 // offset 20, size 4
reserved [4]uint32 // offset 24, size 16
}
type v4l2_fract struct {
numerator uint32
denominator uint32
type v4l2_fract struct { // size 8
numerator uint32 // offset 0, size 4
denominator uint32 // offset 4, size 4
}
type v4l2_requestbuffers struct {
count uint32
typ uint32
memory uint32
capabilities uint32
flags uint8
reserved [3]uint8
type v4l2_requestbuffers struct { // size 20
count uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
memory uint32 // offset 8, size 4
capabilities uint32 // offset 12, size 4
flags uint8 // offset 16, size 1
reserved [3]uint8 // offset 17, size 3
}
type v4l2_buffer struct {
index uint32 // 0
typ uint32 // 4
bytesused uint32 // 8
flags uint32 // 12
field uint32 // 16
_ [20]byte // 20
timecode v4l2_timecode // 40
sequence uint32 // 56
memory uint32 // 60
offset uint32 // 64
_ [4]byte // 68
length uint32 // 72
_ [12]byte // 76
type v4l2_buffer struct { // size 88
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
bytesused uint32 // offset 8, size 4
flags uint32 // offset 12, size 4
field uint32 // offset 16, size 4
_ [20]byte // align
timecode v4l2_timecode // offset 40, size 16
sequence uint32 // offset 56, size 4
memory uint32 // offset 60, size 4
offset uint32 // offset 64, size 4
_ [4]byte // align
length uint32 // offset 72, size 4
_ [12]byte // filler
}
type v4l2_timecode struct {
typ uint32
flags uint32
frames uint8
seconds uint8
minutes uint8
hours uint8
userbits [4]uint8
type v4l2_timecode struct { // size 16
typ uint32 // offset 0, size 4
flags uint32 // offset 4, size 4
frames uint8 // offset 8, size 1
seconds uint8 // offset 9, size 1
minutes uint8 // offset 10, size 1
hours uint8 // offset 11, size 1
userbits [4]uint8 // offset 12, size 4
}
type v4l2_fmtdesc struct {
index uint32
typ uint32
flags uint32
description [32]byte
pixelformat uint32
mbus_code uint32
reserved [3]uint32
type v4l2_fmtdesc struct { // size 64
index uint32 // offset 0, size 4
typ uint32 // offset 4, size 4
flags uint32 // offset 8, size 4
description [32]byte // offset 12, size 32
pixelformat uint32 // offset 44, size 4
mbus_code uint32 // offset 48, size 4
reserved [3]uint32 // offset 52, size 12
}
type v4l2_frmsizeenum struct {
index uint32 // 0
pixel_format uint32 // 4
typ uint32 // 8
discrete v4l2_frmsize_discrete // 12
_ [24]byte
type v4l2_frmsizeenum struct { // size 44
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
typ uint32 // offset 8, size 4
discrete v4l2_frmsize_discrete // offset 12, size 8
_ [24]byte // filler
}
type v4l2_frmsize_discrete struct {
width uint32
height uint32
type v4l2_frmsize_discrete struct { // size 8
width uint32 // offset 0, size 4
height uint32 // offset 4, size 4
}
type v4l2_frmivalenum struct {
index uint32
pixel_format uint32
width uint32
height uint32
typ uint32
discrete v4l2_fract
_ [24]byte
type v4l2_frmivalenum struct { // size 52
index uint32 // offset 0, size 4
pixel_format uint32 // offset 4, size 4
width uint32 // offset 8, size 4
height uint32 // offset 12, size 4
typ uint32 // offset 16, size 4
discrete v4l2_fract // offset 20, size 8
_ [24]byte // filler
}