Files
go2rtc/pkg/v4l2/device/formats.go

63 lines
1.1 KiB
Go

package device
const (
V4L2_PIX_FMT_YUYV = 'Y' | 'U'<<8 | 'Y'<<16 | 'V'<<24
V4L2_PIX_FMT_NV12 = 'N' | 'V'<<8 | '1'<<16 | '2'<<24
V4L2_PIX_FMT_MJPEG = 'M' | 'J'<<8 | 'P'<<16 | 'G'<<24
V4L2_PIX_FMT_H264 = 'H' | '2'<<8 | '6'<<16 | '4'<<24
V4L2_PIX_FMT_HEVC = 'H' | 'E'<<8 | 'V'<<16 | 'C'<<24
)
type Format struct {
FourCC uint32
Name string
FFmpeg string
}
var Formats = []Format{
{V4L2_PIX_FMT_YUYV, "YUV 4:2:2", "yuyv422"},
{V4L2_PIX_FMT_NV12, "Y/UV 4:2:0", "nv12"},
{V4L2_PIX_FMT_MJPEG, "Motion-JPEG", "mjpeg"},
{V4L2_PIX_FMT_H264, "H.264", "h264"},
{V4L2_PIX_FMT_HEVC, "HEVC", "hevc"},
}
func YUYVtoYUV(dst, src []byte) {
n := len(src)
i0 := 0
iy := 0
iu := n / 2
iv := n / 4 * 3
for i0 < n {
dst[iy] = src[i0]
i0++
iy++
dst[iu] = src[i0]
i0++
iu++
dst[iy] = src[i0]
i0++
iy++
dst[iv] = src[i0]
i0++
iv++
}
}
func NV12toYUV(dst, src []byte) {
n := len(src)
k := n / 6
i0 := k * 4
iu := i0
iv := i0 + k
copy(dst, src[:i0]) // copy Y
for i0 < n {
dst[iu] = src[i0]
i0++
iu++
dst[iv] = src[i0]
i0++
iv++
}
}