Skip to content

Commit 7e0a163

Browse files
committed
Add support mips arch for v4l2 source
1 parent 59161c6 commit 7e0a163

11 files changed

Lines changed: 725 additions & 286 deletions

File tree

internal/v4l2/v4l2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build !(linux && (386 || arm || amd64 || arm64))
1+
//go:build !linux
22

33
package v4l2
44

internal/v4l2/v4l2_linux.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
//go:build linux && (386 || arm || amd64 || arm64)
2-
31
package v4l2
42

53
import (

pkg/v4l2/device/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Build on Ubuntu
2+
3+
```bash
4+
sudo apt install gcc-x86-64-linux-gnu
5+
sudo apt install gcc-i686-linux-gnu
6+
sudo apt install gcc-aarch64-linux-gnu binutils
7+
sudo apt install gcc-arm-linux-gnueabihf
8+
sudo apt install gcc-mipsel-linux-gnu
9+
10+
x86_64-linux-gnu-gcc -w -static arch.c -o arch_x86_64
11+
i686-linux-gnu-gcc -w -static arch.c -o arch_i686
12+
aarch64-linux-gnu-gcc -w -static arch.c -o arch_aarch64
13+
arm-linux-gnueabihf-gcc -w -static arch.c -o arch_armhf
14+
mipsel-linux-gnu-gcc -static arch.c -o arch_mipsel
15+
```
16+
17+
## Useful links
18+
19+
- https://github.com/torvalds/linux/blob/master/include/uapi/linux/videodev2.h

pkg/v4l2/device/arch.c

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
#include <stdio.h>
2+
#include <stddef.h>
3+
#include <linux/videodev2.h>
4+
5+
#define printconst1(con) printf("\t%s = 0x%08lx\n", #con, con)
6+
#define printconst2(con) printf("\t%s = %d\n", #con, con)
7+
#define printstruct(str) printf("type %s struct { // size %lu\n", #str, sizeof(struct str))
8+
#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))
9+
#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))
10+
#define printalign1(str, mem2, mem1, siz1) printf("\t_ [%lu]byte // align\n", offsetof(struct str, mem2) - offsetof(struct str, mem1) - siz1)
11+
#define printfiller(str, mem1, siz1) printf("\t_ [%lu]byte // filler\n", sizeof(struct str) - offsetof(struct str, mem1) - siz1)
12+
13+
int main() {
14+
printf("const (\n");
15+
printconst1(VIDIOC_QUERYCAP);
16+
printconst1(VIDIOC_ENUM_FMT);
17+
printconst1(VIDIOC_G_FMT);
18+
printconst1(VIDIOC_S_FMT);
19+
printconst1(VIDIOC_REQBUFS);
20+
printconst1(VIDIOC_QUERYBUF);
21+
printf("\n");
22+
printconst1(VIDIOC_QBUF);
23+
printconst1(VIDIOC_DQBUF);
24+
printconst1(VIDIOC_STREAMON);
25+
printconst1(VIDIOC_STREAMOFF);
26+
printconst1(VIDIOC_G_PARM);
27+
printconst1(VIDIOC_S_PARM);
28+
printf("\n");
29+
printconst1(VIDIOC_ENUM_FRAMESIZES);
30+
printconst1(VIDIOC_ENUM_FRAMEINTERVALS);
31+
printf(")\n\n");
32+
33+
printf("const (\n");
34+
printconst2(V4L2_BUF_TYPE_VIDEO_CAPTURE);
35+
printconst2(V4L2_COLORSPACE_DEFAULT);
36+
printconst2(V4L2_FIELD_NONE);
37+
printconst2(V4L2_FRMIVAL_TYPE_DISCRETE);
38+
printconst2(V4L2_FRMSIZE_TYPE_DISCRETE);
39+
printconst2(V4L2_MEMORY_MMAP);
40+
printf(")\n\n");
41+
42+
printstruct(v4l2_capability);
43+
printmember(v4l2_capability, driver, "[16]byte");
44+
printmember(v4l2_capability, card, "[32]byte");
45+
printmember(v4l2_capability, bus_info, "[32]byte");
46+
printmember(v4l2_capability, version, "uint32");
47+
printmember(v4l2_capability, capabilities, "uint32");
48+
printmember(v4l2_capability, device_caps, "uint32");
49+
printmember(v4l2_capability, reserved, "[3]uint32");
50+
printf("}\n\n");
51+
52+
printstruct(v4l2_format);
53+
printmember(v4l2_format, type, "uint32");
54+
printalign1(v4l2_format, fmt, type, 4);
55+
printunimem(v4l2_format, fmt, pix, "v4l2_pix_format");
56+
printfiller(v4l2_format, fmt, sizeof(struct v4l2_pix_format));
57+
printf("}\n\n");
58+
59+
printstruct(v4l2_pix_format);
60+
printmember(v4l2_pix_format, width, "uint32");
61+
printmember(v4l2_pix_format, height, "uint32");
62+
printmember(v4l2_pix_format, pixelformat, "uint32");
63+
printmember(v4l2_pix_format, field, "uint32");
64+
printmember(v4l2_pix_format, bytesperline, "uint32");
65+
printmember(v4l2_pix_format, sizeimage, "uint32");
66+
printmember(v4l2_pix_format, colorspace, "uint32");
67+
printmember(v4l2_pix_format, priv, "uint32");
68+
printmember(v4l2_pix_format, flags, "uint32");
69+
printmember(v4l2_pix_format, ycbcr_enc, "uint32");
70+
printmember(v4l2_pix_format, quantization, "uint32");
71+
printmember(v4l2_pix_format, xfer_func, "uint32");
72+
printf("}\n\n");
73+
74+
printstruct(v4l2_streamparm);
75+
printmember(v4l2_streamparm, type, "uint32");
76+
printunimem(v4l2_streamparm, parm, capture, "v4l2_captureparm");
77+
printfiller(v4l2_streamparm, parm, sizeof(struct v4l2_captureparm));
78+
printf("}\n\n");
79+
80+
printstruct(v4l2_captureparm);
81+
printmember(v4l2_captureparm, capability, "uint32");
82+
printmember(v4l2_captureparm, capturemode, "uint32");
83+
printmember(v4l2_captureparm, timeperframe, "v4l2_fract");
84+
printmember(v4l2_captureparm, extendedmode, "uint32");
85+
printmember(v4l2_captureparm, readbuffers, "uint32");
86+
printmember(v4l2_captureparm, reserved, "[4]uint32");
87+
printf("}\n\n");
88+
89+
printstruct(v4l2_fract);
90+
printmember(v4l2_fract, numerator, "uint32");
91+
printmember(v4l2_fract, denominator, "uint32");
92+
printf("}\n\n");
93+
94+
printstruct(v4l2_requestbuffers);
95+
printmember(v4l2_requestbuffers, count, "uint32");
96+
printmember(v4l2_requestbuffers, type, "uint32");
97+
printmember(v4l2_requestbuffers, memory, "uint32");
98+
printmember(v4l2_requestbuffers, capabilities, "uint32");
99+
printmember(v4l2_requestbuffers, flags, "uint8");
100+
printmember(v4l2_requestbuffers, reserved, "[3]uint8");
101+
printf("}\n\n");
102+
103+
printstruct(v4l2_buffer);
104+
printmember(v4l2_buffer, index, "uint32");
105+
printmember(v4l2_buffer, type, "uint32");
106+
printmember(v4l2_buffer, bytesused, "uint32");
107+
printmember(v4l2_buffer, flags, "uint32");
108+
printmember(v4l2_buffer, field, "uint32");
109+
printalign1(v4l2_buffer, timecode, field, 4);
110+
printmember(v4l2_buffer, timecode, "v4l2_timecode");
111+
printmember(v4l2_buffer, sequence, "uint32");
112+
printmember(v4l2_buffer, memory, "uint32");
113+
printunimem(v4l2_buffer, m, offset, "uint32");
114+
printalign1(v4l2_buffer, length, m, 4);
115+
printmember(v4l2_buffer, length, "uint32");
116+
printfiller(v4l2_buffer, length, 4);
117+
printf("}\n\n");
118+
119+
printstruct(v4l2_timecode);
120+
printmember(v4l2_timecode, type, "uint32");
121+
printmember(v4l2_timecode, flags, "uint32");
122+
printmember(v4l2_timecode, frames, "uint8");
123+
printmember(v4l2_timecode, seconds, "uint8");
124+
printmember(v4l2_timecode, minutes, "uint8");
125+
printmember(v4l2_timecode, hours, "uint8");
126+
printmember(v4l2_timecode, userbits, "[4]uint8");
127+
printf("}\n\n");
128+
129+
printstruct(v4l2_fmtdesc);
130+
printmember(v4l2_fmtdesc, index, "uint32");
131+
printmember(v4l2_fmtdesc, type, "uint32");
132+
printmember(v4l2_fmtdesc, flags, "uint32");
133+
printmember(v4l2_fmtdesc, description, "[32]byte");
134+
printmember(v4l2_fmtdesc, pixelformat, "uint32");
135+
printmember(v4l2_fmtdesc, mbus_code, "uint32");
136+
printmember(v4l2_fmtdesc, reserved, "[3]uint32");
137+
printf("}\n\n");
138+
139+
printstruct(v4l2_frmsizeenum);
140+
printmember(v4l2_frmsizeenum, index, "uint32");
141+
printmember(v4l2_frmsizeenum, pixel_format, "uint32");
142+
printmember(v4l2_frmsizeenum, type, "uint32");
143+
printmember(v4l2_frmsizeenum, discrete, "v4l2_frmsize_discrete");
144+
printfiller(v4l2_frmsizeenum, discrete, sizeof(struct v4l2_frmsize_discrete));
145+
printf("}\n\n");
146+
147+
printstruct(v4l2_frmsize_discrete);
148+
printmember(v4l2_frmsize_discrete, width, "uint32");
149+
printmember(v4l2_frmsize_discrete, height, "uint32");
150+
printf("}\n\n");
151+
152+
printstruct(v4l2_frmivalenum);
153+
printmember(v4l2_frmivalenum, index, "uint32");
154+
printmember(v4l2_frmivalenum, pixel_format, "uint32");
155+
printmember(v4l2_frmivalenum, width, "uint32");
156+
printmember(v4l2_frmivalenum, height, "uint32");
157+
printmember(v4l2_frmivalenum, type, "uint32");
158+
printmember(v4l2_frmivalenum, discrete, "v4l2_fract");
159+
printfiller(v4l2_frmivalenum, discrete, sizeof(struct v4l2_fract));
160+
printf("}\n\n");
161+
162+
return 0;
163+
}

pkg/v4l2/device/device.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (d *Device) ListFrameRates(pixFmt, width, height uint32) ([]uint32, error)
121121
func (d *Device) SetFormat(width, height, pixFmt uint32) error {
122122
f := v4l2_format{
123123
typ: V4L2_BUF_TYPE_VIDEO_CAPTURE,
124-
fmt: v4l2_pix_format{
124+
pix: v4l2_pix_format{
125125
width: width,
126126
height: height,
127127
pixelformat: pixFmt,

pkg/v4l2/device/videodev2_386.go

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package device
2+
3+
const (
4+
VIDIOC_QUERYCAP = 0x80685600
5+
VIDIOC_ENUM_FMT = 0xc0405602
6+
VIDIOC_G_FMT = 0xc0cc5604
7+
VIDIOC_S_FMT = 0xc0cc5605
8+
VIDIOC_REQBUFS = 0xc0145608
9+
VIDIOC_QUERYBUF = 0xc0445609
10+
11+
VIDIOC_QBUF = 0xc044560f
12+
VIDIOC_DQBUF = 0xc0445611
13+
VIDIOC_STREAMON = 0x40045612
14+
VIDIOC_STREAMOFF = 0x40045613
15+
VIDIOC_G_PARM = 0xc0cc5615
16+
VIDIOC_S_PARM = 0xc0cc5616
17+
18+
VIDIOC_ENUM_FRAMESIZES = 0xc02c564a
19+
VIDIOC_ENUM_FRAMEINTERVALS = 0xc034564b
20+
)
21+
22+
const (
23+
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1
24+
V4L2_COLORSPACE_DEFAULT = 0
25+
V4L2_FIELD_NONE = 1
26+
V4L2_FRMIVAL_TYPE_DISCRETE = 1
27+
V4L2_FRMSIZE_TYPE_DISCRETE = 1
28+
V4L2_MEMORY_MMAP = 1
29+
)
30+
31+
type v4l2_capability struct { // size 104
32+
driver [16]byte // offset 0, size 16
33+
card [32]byte // offset 16, size 32
34+
bus_info [32]byte // offset 48, size 32
35+
version uint32 // offset 80, size 4
36+
capabilities uint32 // offset 84, size 4
37+
device_caps uint32 // offset 88, size 4
38+
reserved [3]uint32 // offset 92, size 12
39+
}
40+
41+
type v4l2_format struct { // size 204
42+
typ uint32 // offset 0, size 4
43+
_ [0]byte // align
44+
pix v4l2_pix_format // offset 4, size 48
45+
_ [152]byte // filler
46+
}
47+
48+
type v4l2_pix_format struct { // size 48
49+
width uint32 // offset 0, size 4
50+
height uint32 // offset 4, size 4
51+
pixelformat uint32 // offset 8, size 4
52+
field uint32 // offset 12, size 4
53+
bytesperline uint32 // offset 16, size 4
54+
sizeimage uint32 // offset 20, size 4
55+
colorspace uint32 // offset 24, size 4
56+
priv uint32 // offset 28, size 4
57+
flags uint32 // offset 32, size 4
58+
ycbcr_enc uint32 // offset 36, size 4
59+
quantization uint32 // offset 40, size 4
60+
xfer_func uint32 // offset 44, size 4
61+
}
62+
63+
type v4l2_streamparm struct { // size 204
64+
typ uint32 // offset 0, size 4
65+
capture v4l2_captureparm // offset 4, size 40
66+
_ [160]byte // filler
67+
}
68+
69+
type v4l2_captureparm struct { // size 40
70+
capability uint32 // offset 0, size 4
71+
capturemode uint32 // offset 4, size 4
72+
timeperframe v4l2_fract // offset 8, size 8
73+
extendedmode uint32 // offset 16, size 4
74+
readbuffers uint32 // offset 20, size 4
75+
reserved [4]uint32 // offset 24, size 16
76+
}
77+
78+
type v4l2_fract struct { // size 8
79+
numerator uint32 // offset 0, size 4
80+
denominator uint32 // offset 4, size 4
81+
}
82+
83+
type v4l2_requestbuffers struct { // size 20
84+
count uint32 // offset 0, size 4
85+
typ uint32 // offset 4, size 4
86+
memory uint32 // offset 8, size 4
87+
capabilities uint32 // offset 12, size 4
88+
flags uint8 // offset 16, size 1
89+
reserved [3]uint8 // offset 17, size 3
90+
}
91+
92+
type v4l2_buffer struct { // size 68
93+
index uint32 // offset 0, size 4
94+
typ uint32 // offset 4, size 4
95+
bytesused uint32 // offset 8, size 4
96+
flags uint32 // offset 12, size 4
97+
field uint32 // offset 16, size 4
98+
_ [8]byte // align
99+
timecode v4l2_timecode // offset 28, size 16
100+
sequence uint32 // offset 44, size 4
101+
memory uint32 // offset 48, size 4
102+
offset uint32 // offset 52, size 4
103+
_ [0]byte // align
104+
length uint32 // offset 56, size 4
105+
_ [8]byte // filler
106+
}
107+
108+
type v4l2_timecode struct { // size 16
109+
typ uint32 // offset 0, size 4
110+
flags uint32 // offset 4, size 4
111+
frames uint8 // offset 8, size 1
112+
seconds uint8 // offset 9, size 1
113+
minutes uint8 // offset 10, size 1
114+
hours uint8 // offset 11, size 1
115+
userbits [4]uint8 // offset 12, size 4
116+
}
117+
118+
type v4l2_fmtdesc struct { // size 64
119+
index uint32 // offset 0, size 4
120+
typ uint32 // offset 4, size 4
121+
flags uint32 // offset 8, size 4
122+
description [32]byte // offset 12, size 32
123+
pixelformat uint32 // offset 44, size 4
124+
mbus_code uint32 // offset 48, size 4
125+
reserved [3]uint32 // offset 52, size 12
126+
}
127+
128+
type v4l2_frmsizeenum struct { // size 44
129+
index uint32 // offset 0, size 4
130+
pixel_format uint32 // offset 4, size 4
131+
typ uint32 // offset 8, size 4
132+
discrete v4l2_frmsize_discrete // offset 12, size 8
133+
_ [24]byte // filler
134+
}
135+
136+
type v4l2_frmsize_discrete struct { // size 8
137+
width uint32 // offset 0, size 4
138+
height uint32 // offset 4, size 4
139+
}
140+
141+
type v4l2_frmivalenum struct { // size 52
142+
index uint32 // offset 0, size 4
143+
pixel_format uint32 // offset 4, size 4
144+
width uint32 // offset 8, size 4
145+
height uint32 // offset 12, size 4
146+
typ uint32 // offset 16, size 4
147+
discrete v4l2_fract // offset 20, size 8
148+
_ [24]byte // filler
149+
}

0 commit comments

Comments
 (0)