|
@@ -46,30 +46,130 @@ var PixelFormats = map[FourCCEncoding]string{
|
|
PixelFmtMPEG4: "MPEG-4 Part 2 ES",
|
|
PixelFmtMPEG4: "MPEG-4 Part 2 ES",
|
|
}
|
|
}
|
|
|
|
|
|
-// YcbcrEncoding (v4l2_ycbcr_encoding)
|
|
|
|
|
|
+// IsPixYUVEncoded returns true if the pixel format is a chrome+luminance YUV format
|
|
|
|
+func IsPixYUVEncoded(pixFmt FourCCEncoding) bool {
|
|
|
|
+ switch pixFmt {
|
|
|
|
+ case
|
|
|
|
+ PixelFmtYUYV,
|
|
|
|
+ PixelFmtYYUV,
|
|
|
|
+ PixelFmtYVYU,
|
|
|
|
+ PixelFmtUYVY,
|
|
|
|
+ PixelFmtVYUY:
|
|
|
|
+ return true
|
|
|
|
+ default:
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// ColorspaceType
|
|
|
|
+// See https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L195
|
|
|
|
+type ColorspaceType = uint32
|
|
|
|
+
|
|
|
|
+const (
|
|
|
|
+ ColorspaceTypeDefault ColorspaceType = iota //V4L2_COLORSPACE_DEFAULT
|
|
|
|
+ ColorspaceSMPTE170M //V4L2_COLORSPACE_SMPTE170M
|
|
|
|
+ ColorspaceSMPTE240M // V4L2_COLORSPACE_SMPTE240M
|
|
|
|
+ ColorspaceREC709 // V4L2_COLORSPACE_REC709
|
|
|
|
+ ColorspaceBT878 // V4L2_COLORSPACE_BT878 (absolete)
|
|
|
|
+ Colorspace470SystemM // V4L2_COLORSPACE_470_SYSTEM_M (absolete)
|
|
|
|
+ Colorspace470SystemBG // V4L2_COLORSPACE_470_SYSTEM_BG
|
|
|
|
+ ColorspaceJPEG // V4L2_COLORSPACE_JPEG
|
|
|
|
+ ColorspaceSRGB // V4L2_COLORSPACE_SRGB
|
|
|
|
+ ColorspaceOPRGB // V4L2_COLORSPACE_OPRGB
|
|
|
|
+ ColorspaceBT2020 // V4L2_COLORSPACE_BT2020
|
|
|
|
+ ColorspaceRaw // V4L2_COLORSPACE_RAW
|
|
|
|
+ ColorspaceDCIP3 // V4L2_COLORSPACE_DCI_P3
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// Colorspaces is a map of colorspace to its respective description
|
|
|
|
+var Colorspaces = map[ColorspaceType]string{
|
|
|
|
+ ColorspaceTypeDefault: "Default",
|
|
|
|
+ ColorspaceREC709: "Rec. 709",
|
|
|
|
+ Colorspace470SystemBG: "470 System BG",
|
|
|
|
+ ColorspaceJPEG: "JPEG",
|
|
|
|
+ ColorspaceSRGB: "sRGB",
|
|
|
|
+ ColorspaceOPRGB: "opRGB",
|
|
|
|
+ ColorspaceBT2020: "BT.2020",
|
|
|
|
+ ColorspaceRaw: "Raw",
|
|
|
|
+ ColorspaceDCIP3: "DCI-P3",
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// YCbCrEncodingType (v4l2_ycbcr_encoding)
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_ycbcr_encoding
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_ycbcr_encoding
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L300
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L300
|
|
-type YcbcrEncoding = uint32
|
|
|
|
|
|
+type YCbCrEncodingType = uint32
|
|
|
|
+
|
|
|
|
+const (
|
|
|
|
+ YCbCrEncodingDefault YCbCrEncodingType = iota // V4L2_YCBCR_ENC_DEFAULT
|
|
|
|
+ YCbCrEncoding601 // V4L2_YCBCR_ENC_601
|
|
|
|
+ YCbCrEncoding709 // V4L2_YCBCR_ENC_709
|
|
|
|
+ YCbCrEncodingXV601 // V4L2_YCBCR_ENC_XV601
|
|
|
|
+ YCbCrEncodingXV709 // V4L2_YCBCR_ENC_XV709
|
|
|
|
+ _ // V4L2_YCBCR_ENC_SYCC (absolete)
|
|
|
|
+ YCbCrEncodingBT2020 // V4L2_YCBCR_ENC_BT2020
|
|
|
|
+ YCbCrEncodingBT2020ConstLum // V4L2_YCBCR_ENC_BT2020_CONST_LUM
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+var YCbCrEncodings = map[YCbCrEncodingType]string{
|
|
|
|
+ YCbCrEncodingDefault: "Default",
|
|
|
|
+ YCbCrEncoding601: "ITU-R 601",
|
|
|
|
+ YCbCrEncoding709: "Rec. 709",
|
|
|
|
+ YCbCrEncodingXV601: "xvYCC 601",
|
|
|
|
+ YCbCrEncodingXV709: "xvYCC 709",
|
|
|
|
+ YCbCrEncodingBT2020: "BT.2020",
|
|
|
|
+ YCbCrEncodingBT2020ConstLum: "BT.2020 constant luminance",
|
|
|
|
+ HSVEncoding180: "HSV 0-179",
|
|
|
|
+ HSVEncoding256: "HSV 0-255",
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// ColorspaceToYCbCrEnc is used to get the YCbCrEncoding when only a default YCbCr and the colorspace is known
|
|
|
|
+func ColorspaceToYCbCrEnc(cs ColorspaceType) YCbCrEncodingType {
|
|
|
|
+ switch cs {
|
|
|
|
+ case ColorspaceREC709, ColorspaceDCIP3:
|
|
|
|
+ return YCbCrEncoding709
|
|
|
|
+ case ColorspaceBT2020:
|
|
|
|
+ return YCbCrEncodingBT2020
|
|
|
|
+ default:
|
|
|
|
+ return YCbCrEncoding601
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// HSVEncodingType (v4l2_hsv_encoding)
|
|
|
|
+// See https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L352
|
|
|
|
+type HSVEncodingType = YCbCrEncodingType
|
|
|
|
|
|
const (
|
|
const (
|
|
- YcbcrEncDefault YcbcrEncoding = iota // V4L2_YCBCR_ENC_DEFAULT
|
|
|
|
- YcbcrEnc601 // V4L2_YCBCR_ENC_601
|
|
|
|
- YcbcrEnc709 // V4L2_YCBCR_ENC_709
|
|
|
|
- YcbcrEncXV601 // V4L2_YCBCR_ENC_XV601
|
|
|
|
- YcbcrEncXV709 // V4L2_YCBCR_ENC_XV709
|
|
|
|
|
|
+ HSVEncoding180 = HSVEncodingType(128) // V4L2_HSV_ENC_180
|
|
|
|
+ HSVEncoding256 = HSVEncodingType(129) // V4L2_HSV_ENC_256
|
|
)
|
|
)
|
|
|
|
|
|
-// Quantization (v4l2_quantization)
|
|
|
|
|
|
+// QuantizationType (v4l2_quantization)
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_quantization#c.V4L.v4l2_quantization
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_quantization#c.V4L.v4l2_quantization
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L372
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L372
|
|
-type Quantization = uint32
|
|
|
|
|
|
+type QuantizationType = uint32
|
|
|
|
|
|
const (
|
|
const (
|
|
- QuantizationDefault Quantization = iota // V4L2_QUANTIZATION_DEFAULT
|
|
|
|
- QuantizationFullRange // V4L2_QUANTIZATION_FULL_RANGE
|
|
|
|
- QuantizationLimRange // V4L2_QUANTIZATION_LIM_RANGE
|
|
|
|
|
|
+ QuantizationDefault QuantizationType = iota // V4L2_QUANTIZATION_DEFAULT
|
|
|
|
+ QuantizationFullRange // V4L2_QUANTIZATION_FULL_RANGE
|
|
|
|
+ QuantizationLimitedRange // V4L2_QUANTIZATION_LIM_RANGE
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+var Quantizations = map[QuantizationType]string{
|
|
|
|
+ QuantizationDefault: "Default",
|
|
|
|
+ QuantizationFullRange: "Full range",
|
|
|
|
+ QuantizationLimitedRange: "Limited range",
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func ColorspaceToQuantization(cs ColorspaceType) QuantizationType {
|
|
|
|
+ // TODO any RGB/HSV pixel formats should also return full-range
|
|
|
|
+ switch cs {
|
|
|
|
+ case ColorspaceOPRGB, ColorspaceSRGB, ColorspaceJPEG:
|
|
|
|
+ return QuantizationFullRange
|
|
|
|
+ default:
|
|
|
|
+ return QuantizationLimitedRange
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
// XferFunctionType (v4l2_xfer_func)
|
|
// XferFunctionType (v4l2_xfer_func)
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_xfer_func#c.V4L.v4l2_xfer_func
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-defs.html?highlight=v4l2_xfer_func#c.V4L.v4l2_xfer_func
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L259
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L259
|
|
@@ -97,6 +197,26 @@ var XferFunctions = map[XferFunctionType]string{
|
|
XferFuncSMPTE2084: "SMPTE 2084",
|
|
XferFuncSMPTE2084: "SMPTE 2084",
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ColorspaceToXferFunc used to get true XferFunc when only colorspace and default XferFuc are known.
|
|
|
|
+func ColorspaceToXferFunc(cs ColorspaceType) XferFunctionType {
|
|
|
|
+ switch cs {
|
|
|
|
+ case ColorspaceOPRGB:
|
|
|
|
+ return XferFuncOpRGB
|
|
|
|
+ case ColorspaceSMPTE240M:
|
|
|
|
+ return XferFuncSMPTE240M
|
|
|
|
+ case ColorspaceDCIP3:
|
|
|
|
+ return XferFuncDCIP3
|
|
|
|
+ case ColorspaceRaw:
|
|
|
|
+ return XferFuncNone
|
|
|
|
+ case ColorspaceSRGB:
|
|
|
|
+ return XferFuncSRGB
|
|
|
|
+ case ColorspaceJPEG:
|
|
|
|
+ return XferFuncSRGB
|
|
|
|
+ default:
|
|
|
|
+ return XferFunc709
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
// FieldType (v4l2_field)
|
|
// FieldType (v4l2_field)
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/field-order.html?highlight=v4l2_field#c.v4l2_field
|
|
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/field-order.html?highlight=v4l2_field#c.v4l2_field
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L88
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L88
|
|
@@ -129,39 +249,6 @@ var Fields = map[FieldType]string{
|
|
FieldInterlacedBottomTop: "interlaced bottom-top",
|
|
FieldInterlacedBottomTop: "interlaced bottom-top",
|
|
}
|
|
}
|
|
|
|
|
|
-// ColorspaceType
|
|
|
|
-// See https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L195
|
|
|
|
-type ColorspaceType = uint32
|
|
|
|
-
|
|
|
|
-const (
|
|
|
|
- ColorspaceTypeDefault ColorspaceType = iota //V4L2_COLORSPACE_DEFAULT
|
|
|
|
- ColorspaceSMPTE170M //V4L2_COLORSPACE_SMPTE170M
|
|
|
|
- ColorspaceSMPTE240M // V4L2_COLORSPACE_SMPTE240M
|
|
|
|
- ColorspaceREC709 // V4L2_COLORSPACE_REC709
|
|
|
|
- ColorspaceBT878 // V4L2_COLORSPACE_BT878 (absolete)
|
|
|
|
- Colorspace470SystemM // V4L2_COLORSPACE_470_SYSTEM_M (absolete)
|
|
|
|
- Colorspace470SystemBG // V4L2_COLORSPACE_470_SYSTEM_BG
|
|
|
|
- ColorspaceJPEG // V4L2_COLORSPACE_JPEG
|
|
|
|
- ColorspaceSRGB // V4L2_COLORSPACE_SRGB
|
|
|
|
- ColorspaceOPRGB // V4L2_COLORSPACE_OPRGB
|
|
|
|
- ColorspaceBT2020 // V4L2_COLORSPACE_BT2020
|
|
|
|
- ColorspaceRaw // V4L2_COLORSPACE_RAW
|
|
|
|
- ColorspaceDCIP3 // V4L2_COLORSPACE_DCI_P3
|
|
|
|
-)
|
|
|
|
-
|
|
|
|
-// Colorspaces is a map of colorspace to its respective description
|
|
|
|
-var Colorspaces = map[ColorspaceType]string{
|
|
|
|
- ColorspaceTypeDefault: "Default",
|
|
|
|
- ColorspaceREC709: "Rec. 709",
|
|
|
|
- Colorspace470SystemBG: "470 System BG",
|
|
|
|
- ColorspaceJPEG: "JPEG",
|
|
|
|
- ColorspaceSRGB: "sRGB",
|
|
|
|
- ColorspaceOPRGB: "opRGB",
|
|
|
|
- ColorspaceBT2020: "BT.2020",
|
|
|
|
- ColorspaceRaw: "Raw",
|
|
|
|
- ColorspaceDCIP3: "DCI-P3",
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// PixFormat (v4l2_pix_format)
|
|
// PixFormat (v4l2_pix_format)
|
|
// https://www.kernel.org/doc/html/v4.9/media/uapi/v4l/pixfmt-002.html?highlight=v4l2_pix_format
|
|
// https://www.kernel.org/doc/html/v4.9/media/uapi/v4l/pixfmt-002.html?highlight=v4l2_pix_format
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L496
|
|
// https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/videodev2.h#L496
|
|
@@ -175,8 +262,8 @@ type PixFormat struct {
|
|
Colorspace ColorspaceType
|
|
Colorspace ColorspaceType
|
|
Priv uint32
|
|
Priv uint32
|
|
Flags uint32
|
|
Flags uint32
|
|
- YcbcrEnc YcbcrEncoding
|
|
|
|
- Quantization Quantization
|
|
|
|
|
|
+ YcbcrEnc YCbCrEncodingType
|
|
|
|
+ Quantization QuantizationType
|
|
XferFunc XferFunctionType
|
|
XferFunc XferFunctionType
|
|
}
|
|
}
|
|
|
|
|