mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
spa: libcamera: source: simplify color space conversion
Instead of using an out parameter, just return the `spa_video_colorimetry`
object; and do the libcamera -> spa conversion in a single place, where
the data is actually added to the pod.
(cherry picked from commit 938195b19f)
This commit is contained in:
parent
e770ed42c3
commit
db23d9fa04
1 changed files with 22 additions and 20 deletions
|
|
@ -443,60 +443,64 @@ int score_size(const Size &a, const Size &b)
|
||||||
return x * x + y * y;
|
return x * x + y * y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
[[nodiscard]]
|
||||||
parse_colorimetry(const ColorSpace& colorspace,
|
spa_video_colorimetry
|
||||||
struct spa_video_colorimetry *colorimetry)
|
color_space_to_colorimetry(const libcamera::ColorSpace& colorspace)
|
||||||
{
|
{
|
||||||
|
spa_video_colorimetry res = {};
|
||||||
|
|
||||||
switch (colorspace.range) {
|
switch (colorspace.range) {
|
||||||
case ColorSpace::Range::Full:
|
case ColorSpace::Range::Full:
|
||||||
colorimetry->range = SPA_VIDEO_COLOR_RANGE_0_255;
|
res.range = SPA_VIDEO_COLOR_RANGE_0_255;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::Range::Limited:
|
case ColorSpace::Range::Limited:
|
||||||
colorimetry->range = SPA_VIDEO_COLOR_RANGE_16_235;
|
res.range = SPA_VIDEO_COLOR_RANGE_16_235;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (colorspace.ycbcrEncoding) {
|
switch (colorspace.ycbcrEncoding) {
|
||||||
case ColorSpace::YcbcrEncoding::None:
|
case ColorSpace::YcbcrEncoding::None:
|
||||||
colorimetry->matrix = SPA_VIDEO_COLOR_MATRIX_RGB;
|
res.matrix = SPA_VIDEO_COLOR_MATRIX_RGB;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::YcbcrEncoding::Rec601:
|
case ColorSpace::YcbcrEncoding::Rec601:
|
||||||
colorimetry->matrix = SPA_VIDEO_COLOR_MATRIX_BT601;
|
res.matrix = SPA_VIDEO_COLOR_MATRIX_BT601;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::YcbcrEncoding::Rec709:
|
case ColorSpace::YcbcrEncoding::Rec709:
|
||||||
colorimetry->matrix = SPA_VIDEO_COLOR_MATRIX_BT709;
|
res.matrix = SPA_VIDEO_COLOR_MATRIX_BT709;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::YcbcrEncoding::Rec2020:
|
case ColorSpace::YcbcrEncoding::Rec2020:
|
||||||
colorimetry->matrix = SPA_VIDEO_COLOR_MATRIX_BT2020;
|
res.matrix = SPA_VIDEO_COLOR_MATRIX_BT2020;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (colorspace.transferFunction) {
|
switch (colorspace.transferFunction) {
|
||||||
case ColorSpace::TransferFunction::Linear:
|
case ColorSpace::TransferFunction::Linear:
|
||||||
colorimetry->transfer = SPA_VIDEO_TRANSFER_UNKNOWN;
|
res.transfer = SPA_VIDEO_TRANSFER_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::TransferFunction::Srgb:
|
case ColorSpace::TransferFunction::Srgb:
|
||||||
colorimetry->transfer = SPA_VIDEO_TRANSFER_SRGB;
|
res.transfer = SPA_VIDEO_TRANSFER_SRGB;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::TransferFunction::Rec709:
|
case ColorSpace::TransferFunction::Rec709:
|
||||||
colorimetry->transfer = SPA_VIDEO_TRANSFER_BT709;
|
res.transfer = SPA_VIDEO_TRANSFER_BT709;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (colorspace.primaries) {
|
switch (colorspace.primaries) {
|
||||||
case ColorSpace::Primaries::Raw:
|
case ColorSpace::Primaries::Raw:
|
||||||
colorimetry->primaries = SPA_VIDEO_COLOR_PRIMARIES_UNKNOWN;
|
res.primaries = SPA_VIDEO_COLOR_PRIMARIES_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::Primaries::Smpte170m:
|
case ColorSpace::Primaries::Smpte170m:
|
||||||
colorimetry->primaries = SPA_VIDEO_COLOR_PRIMARIES_SMPTE170M;
|
res.primaries = SPA_VIDEO_COLOR_PRIMARIES_SMPTE170M;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::Primaries::Rec709:
|
case ColorSpace::Primaries::Rec709:
|
||||||
colorimetry->primaries = SPA_VIDEO_COLOR_PRIMARIES_BT709;
|
res.primaries = SPA_VIDEO_COLOR_PRIMARIES_BT709;
|
||||||
break;
|
break;
|
||||||
case ColorSpace::Primaries::Rec2020:
|
case ColorSpace::Primaries::Rec2020:
|
||||||
colorimetry->primaries = SPA_VIDEO_COLOR_PRIMARIES_BT2020;
|
res.primaries = SPA_VIDEO_COLOR_PRIMARIES_BT2020;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -507,7 +511,6 @@ spa_libcamera_enum_format(struct impl *impl, struct port *port, int seq,
|
||||||
struct spa_pod_builder b = { 0 };
|
struct spa_pod_builder b = { 0 };
|
||||||
struct spa_pod_frame f[2];
|
struct spa_pod_frame f[2];
|
||||||
struct spa_result_node_params result;
|
struct spa_result_node_params result;
|
||||||
struct spa_video_colorimetry colorimetry = {};
|
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
|
|
||||||
spa_libcamera_get_config(impl);
|
spa_libcamera_get_config(impl);
|
||||||
|
|
@ -516,9 +519,6 @@ spa_libcamera_enum_format(struct impl *impl, struct port *port, int seq,
|
||||||
const StreamFormats &formats = streamConfig.formats();
|
const StreamFormats &formats = streamConfig.formats();
|
||||||
const auto &pixel_formats = formats.pixelformats();
|
const auto &pixel_formats = formats.pixelformats();
|
||||||
|
|
||||||
if (streamConfig.colorSpace)
|
|
||||||
parse_colorimetry(*streamConfig.colorSpace, &colorimetry);
|
|
||||||
|
|
||||||
result.id = SPA_PARAM_EnumFormat;
|
result.id = SPA_PARAM_EnumFormat;
|
||||||
result.next = start;
|
result.next = start;
|
||||||
|
|
||||||
|
|
@ -616,6 +616,8 @@ next_fmt:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (streamConfig.colorSpace) {
|
if (streamConfig.colorSpace) {
|
||||||
|
auto colorimetry = color_space_to_colorimetry(*streamConfig.colorSpace);
|
||||||
|
|
||||||
spa_pod_builder_add(&b,
|
spa_pod_builder_add(&b,
|
||||||
SPA_FORMAT_VIDEO_colorRange,
|
SPA_FORMAT_VIDEO_colorRange,
|
||||||
SPA_POD_Id(colorimetry.range),
|
SPA_POD_Id(colorimetry.range),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue