[{"id":3868,"web_url":"https://patchwork.libcamera.org/comment/3868/","msgid":"<20200229140625.GO18738@pendragon.ideasonboard.com>","date":"2020-02-29T14:06:25","subject":"Re: [libcamera-devel] [PATCH v2 14/27] gst: utils: Add\n\tStreamConfiguration helpers","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Nicolas,\n\nThank you for the patch.\n\nOn Thu, Feb 27, 2020 at 03:03:54PM -0500, Nicolas Dufresne wrote:\n> This add helpers to deal with the conversion from StreamConfiguration\n\ns/add/adds/\n\n> to caps and vis-versa. This is needed to implement caps negotiation.\n\ns/vis/vice/\n\n> \n> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 64 ++++++++++++++++++++++++++++\n>  src/gstreamer/gstlibcamera-utils.h   |  3 ++\n>  2 files changed, 67 insertions(+)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index dc129c3..231f3c5 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -40,6 +40,18 @@ drm_to_gst_format(guint drm_fourcc)\n>  \treturn GST_VIDEO_FORMAT_UNKNOWN;\n>  }\n>  \n> +static inline guint\n\nShouldn't we let the compiler decide whether to inline the function ?\n\n> +gst_format_to_drm(GstVideoFormat gst_format)\n> +{\n> +\tif (gst_format == GST_VIDEO_FORMAT_ENCODED)\n> +\t\treturn DRM_FORMAT_INVALID;\n> +\n> +\tfor (const auto &item : format_map)\n\tfor (const auto &item : format_map) {\n> +\t\tif (item.gst_format == gst_format)\n> +\t\t\treturn item.drm_fourcc;\n\t}\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\treturn DRM_FORMAT_INVALID;\n> +}\n> +\n>  static GstStructure *\n>  bare_structure_from_fourcc(guint fourcc)\n>  {\n> @@ -96,3 +108,55 @@ gst_libcamera_stream_formats_to_caps(const StreamFormats &formats)\n>  \n>  \treturn caps;\n>  }\n> +\n> +GstCaps *\n> +gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg)\n> +{\n> +\tGstCaps *caps = gst_caps_new_empty();\n> +\tGstStructure *s = bare_structure_from_fourcc(stream_cfg.pixelFormat);\n> +\n> +\tgst_structure_set(s,\n> +\t\t\t  \"width\", G_TYPE_INT, stream_cfg.size.width,\n> +\t\t\t  \"height\", G_TYPE_INT, stream_cfg.size.height,\n> +\t\t\t  nullptr);\n> +\tgst_caps_append_structure(caps, s);\n> +\n> +\treturn caps;\n> +}\n> +\n> +void\n> +gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n> +\t\t\t\t\t GstCaps *caps)\n> +{\n> +\tGstVideoFormat gst_format = drm_to_gst_format(stream_cfg.pixelFormat);\n> +\n> +\t/* First fixate the caps using default configuration value */\n> +\tg_assert(gst_caps_is_writable(caps));\n> +\tcaps = gst_caps_truncate(caps);\n> +\tGstStructure *s = gst_caps_get_structure(caps, 0);\n> +\n> +\tgst_structure_fixate_field_nearest_int(s, \"width\", stream_cfg.size.width);\n> +\tgst_structure_fixate_field_nearest_int(s, \"height\", stream_cfg.size.height);\n> +\n> +\tif (gst_structure_has_name(s, \"video/x-raw\")) {\n> +\t\tconst gchar *format = gst_video_format_to_string(gst_format);\n> +\t\tgst_structure_fixate_field_string(s, \"format\", format);\n> +\t}\n> +\n> +\t/* Then configure the stream with the result. */\n> +\tif (gst_structure_has_name(s, \"video/x-raw\")) {\n> +\t\tconst gchar *format = gst_structure_get_string(s, \"format\");\n> +\t\tgst_format = gst_video_format_from_string(format);\n> +\t\tstream_cfg.pixelFormat = gst_format_to_drm(gst_format);\n> +\t} else if (gst_structure_has_name(s, \"image/jpeg\")) {\n> +\t\tstream_cfg.pixelFormat = DRM_FORMAT_MJPEG;\n> +\t} else {\n> +\t\tg_critical(\"Unsupported media type: %s\", gst_structure_get_name(s));\n> +\t}\n> +\n> +\tgint width, height;\n> +\tgst_structure_get_int(s, \"width\", &width);\n> +\tgst_structure_get_int(s, \"height\", &height);\n> +\tstream_cfg.size.width = width;\n> +\tstream_cfg.size.height = height;\n> +}\n> diff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\n> index 737ca63..51898a0 100644\n> --- a/src/gstreamer/gstlibcamera-utils.h\n> +++ b/src/gstreamer/gstlibcamera-utils.h\n> @@ -14,6 +14,9 @@\n>  #include <libcamera/stream.h>\n>  \n>  GstCaps *gst_libcamera_stream_formats_to_caps(const libcamera::StreamFormats &formats);\n> +GstCaps *gst_libcamera_stream_configuration_to_caps(const libcamera::StreamConfiguration &stream_cfg);\n> +void gst_libcamera_configure_stream_from_caps(libcamera::StreamConfiguration &stream_cfg,\n> +\t\t\t\t\t      GstCaps *caps);\n>  \n>  /**\n>   * \\class GLibLocker","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3C62562689\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 29 Feb 2020 15:06:49 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AE9AB2AF;\n\tSat, 29 Feb 2020 15:06:48 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1582985208;\n\tbh=1iwNEr00lTZJTt601S/2WJbAdoTCs+lkN1i+RQMIxyM=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=tEzZJ/o8XZKjSLW079Rfd3lAn8ro1C/RBWTzVA5wEH4pCG/iUAvFcoXT43s7QfT8i\n\tx5cFZ1cvfmL4vzuoHVPBNbIYQwOFEAzmumZodCPrMTIuNRssACqNtU5scYlYhmSGM7\n\tuCe9POY9PA/Cvh3r8su7SecffYLR7BuUlGZaip3E=","Date":"Sat, 29 Feb 2020 16:06:25 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200229140625.GO18738@pendragon.ideasonboard.com>","References":"<20200227200407.490616-1-nicolas.dufresne@collabora.com>\n\t<20200227200407.490616-15-nicolas.dufresne@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200227200407.490616-15-nicolas.dufresne@collabora.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 14/27] gst: utils: Add\n\tStreamConfiguration helpers","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sat, 29 Feb 2020 14:06:49 -0000"}}]