--- /dev/null
+/*
+ * Copyright (c) 2022 Philippe Proulx <pproulx@efficios.com>
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "common/assert.h"
+#include "cpp-common/make-unique.hpp"
+#include "tsdl/ctf-1-metadata-stream-parser.hpp"
+#include "json/ctf-2-metadata-stream-parser.hpp"
+#include "metadata-stream-parser-utils.hpp"
+
+namespace ctf {
+namespace src {
+
+MetadataStreamMajorVersion getMetadataStreamMajorVersion(const std::uint8_t * const data) noexcept
+{
+ BT_ASSERT(data);
+
+ /* CTF 2 if it starts with an RS byte, otherwise CTF 1 */
+ return (*data == 30) ? MetadataStreamMajorVersion::V2 : MetadataStreamMajorVersion::V1;
+}
+
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(const MetadataStreamMajorVersion majorVersion,
+ const ClkClsCfg& clkClsCfg, bt_self_component * const selfComp,
+ const bt2_common::LogCfg& logCfg)
+{
+ if (majorVersion == MetadataStreamMajorVersion::V1) {
+ return bt2_common::makeUnique<Ctf1MetadataStreamParser>(clkClsCfg, selfComp, logCfg);
+ } else {
+ BT_ASSERT(majorVersion == MetadataStreamMajorVersion::V2);
+ return bt2_common::makeUnique<Ctf2MetadataStreamParser>(clkClsCfg, selfComp, logCfg);
+ }
+}
+
+std::unique_ptr<MetadataStreamParser> createMetadataStreamParser(const std::uint8_t * const data,
+ const ClkClsCfg& clkClsCfg,
+ bt_self_component * const selfComp,
+ const bt2_common::LogCfg& logCfg)
+{
+ return createMetadataStreamParser(getMetadataStreamMajorVersion(data), clkClsCfg, selfComp,
+ logCfg);
+}
+
+MetadataStreamParser::ParseRet parseMetadataStream(const ClkClsCfg& clkClsCfg,
+ bt_self_component * const selfComp,
+ const uint8_t * const begin,
+ const uint8_t * const end,
+ const bt2_common::LogCfg& logCfg)
+{
+ const auto majorVersion = getMetadataStreamMajorVersion(begin);
+
+ if (majorVersion == MetadataStreamMajorVersion::V1) {
+ return Ctf1MetadataStreamParser::parse(clkClsCfg, selfComp, begin, end, logCfg);
+ } else {
+ BT_ASSERT(majorVersion == MetadataStreamMajorVersion::V2);
+ return Ctf2MetadataStreamParser::parse(clkClsCfg, selfComp, begin, end, logCfg);
+ }
+}
+
+} /* namespace src */
+} /* namespace ctf */
--- /dev/null
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright 2022 Philippe Proulx <pproulx@efficios.com>
+ */
+
+#ifndef _CTF_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP
+#define _CTF_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP
+
+#include <cstdint>
+#include <memory>
+
+#include "metadata-stream-parser.hpp"
+#include "cpp-common/log-cfg.hpp"
+#include "../clk-cls-cfg.hpp"
+
+namespace ctf {
+namespace src {
+
+enum class MetadataStreamMajorVersion
+{
+ V1 = 1,
+ V2,
+};
+
+/*
+ * Returns the major CTF version (1 or 2) of the metadata stream
+ * starting with `data`.
+ */
+MetadataStreamMajorVersion getMetadataStreamMajorVersion(const std::uint8_t *data) noexcept;
+
+/*
+ * Creates and returns a CTF metadata stream parser of which the
+ * concrete class depends on `majorVersion`.
+ *
+ * Forwards other parameters to the CTF metadata stream parser
+ * constructor.
+ */
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(MetadataStreamMajorVersion majorVersion, const ClkClsCfg& clkClsCfg,
+ bt_self_component *selfComp, const bt2_common::LogCfg& logCfg);
+
+/*
+ * Creates and returns a CTF metadata stream parser of which the
+ * concrete class depends on the first byte of `data`, the beginning of
+ * the metadata stream.
+ *
+ * Forwards other parameters to the CTF metadata stream parser
+ * constructor.
+ */
+std::unique_ptr<MetadataStreamParser> createMetadataStreamParser(const std::uint8_t *data,
+ const ClkClsCfg& clkClsCfg,
+ bt_self_component *selfComp,
+ const bt2_common::LogCfg& logCfg);
+
+/*
+ * Parses the metadata stream between `begin` and `end` using a parser
+ * of which the concrete class depends on the first byte of `begin`, the
+ * beginning of the metadata stream.
+ *
+ * Forwards other parameters to the CTF metadata stream parser
+ * constructor.
+ */
+MetadataStreamParser::ParseRet parseMetadataStream(const ClkClsCfg& clkClsCfg,
+ bt_self_component *selfComp,
+ const uint8_t *begin, const uint8_t *end,
+ const bt2_common::LogCfg& logCfg);
+
+} /* namespace src */
+} /* namespace ctf */
+
+#endif /* _CTF_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP */