From 6494d7b056ccf941c77bf0191a48a54630832d16 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Fri, 13 Mar 2020 16:51:27 -0400 Subject: [PATCH] v4l2format: Convert between V4L2 and GST video format This will be needed in the output format negotiation. --- sys/v4l2codecs/gstv4l2format.c | 40 ++++++++++++++++++++++++++++++++++ sys/v4l2codecs/gstv4l2format.h | 6 +++++ 2 files changed, 46 insertions(+) diff --git a/sys/v4l2codecs/gstv4l2format.c b/sys/v4l2codecs/gstv4l2format.c index 39b5e2be4a..f07ac65ade 100644 --- a/sys/v4l2codecs/gstv4l2format.c +++ b/sys/v4l2codecs/gstv4l2format.c @@ -52,6 +52,22 @@ lookup_v4l2_fmt (guint v4l2_pix_fmt) return ret; } +static struct FormatEntry * +lookup_gst_fmt (GstVideoFormat gst_fmt) +{ + gint i; + struct FormatEntry *ret = NULL; + + for (i = 0; format_map[i].v4l2_pix_fmt; i++) { + if (format_map[i].gst_fmt == gst_fmt) { + ret = format_map + i; + break; + } + } + + return ret; +} + static gint extrapolate_stride (const GstVideoFormatInfo * finfo, gint plane, gint stride) { @@ -113,3 +129,27 @@ gst_v4l2_format_to_video_info (struct v4l2_format * fmt, return TRUE; } + +gboolean +gst_v4l2_format_to_video_format (guint32 pix_fmt, GstVideoFormat * out_format) +{ + struct FormatEntry *entry = lookup_v4l2_fmt (pix_fmt); + + if (!entry) + return FALSE; + + *out_format = entry->gst_fmt; + return TRUE; +} + +gboolean +gst_v4l2_format_from_video_format (GstVideoFormat format, guint32 * out_pix_fmt) +{ + struct FormatEntry *entry = lookup_gst_fmt (format); + + if (!entry) + return FALSE; + + *out_pix_fmt = entry->v4l2_pix_fmt; + return TRUE; +} diff --git a/sys/v4l2codecs/gstv4l2format.h b/sys/v4l2codecs/gstv4l2format.h index d76bd51fdd..bcb0918605 100644 --- a/sys/v4l2codecs/gstv4l2format.h +++ b/sys/v4l2codecs/gstv4l2format.h @@ -27,4 +27,10 @@ gboolean gst_v4l2_format_to_video_info (struct v4l2_format * fmt, GstVideoInfo * out_info); +gboolean gst_v4l2_format_to_video_format (guint32 pix_fmt, + GstVideoFormat * out_format); + +gboolean gst_v4l2_format_from_video_format (GstVideoFormat format, + guint32 * out_pix_fmt); + #endif /* __GST_V4L2_FORMAT_H__ */