summaryrefslogtreecommitdiff
path: root/chromium/media/formats/hls/playlist.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-09-29 16:16:15 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-11-09 10:04:06 +0000
commita95a7417ad456115a1ef2da4bb8320531c0821f1 (patch)
treeedcd59279e486d2fd4a8f88a7ed025bcf925c6e6 /chromium/media/formats/hls/playlist.cc
parent33fc33aa94d4add0878ec30dc818e34e1dd3cc2a (diff)
downloadqtwebengine-chromium-a95a7417ad456115a1ef2da4bb8320531c0821f1.tar.gz
BASELINE: Update Chromium to 106.0.5249.126
Change-Id: Ib0bb21c437a7d1686e21c33f2d329f2ac425b7ab Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/438936 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/media/formats/hls/playlist.cc')
-rw-r--r--chromium/media/formats/hls/playlist.cc83
1 files changed, 83 insertions, 0 deletions
diff --git a/chromium/media/formats/hls/playlist.cc b/chromium/media/formats/hls/playlist.cc
index 1aa8664d3ac..eb652e6b835 100644
--- a/chromium/media/formats/hls/playlist.cc
+++ b/chromium/media/formats/hls/playlist.cc
@@ -4,6 +4,9 @@
#include "media/formats/hls/playlist.h"
+#include "media/formats/hls/items.h"
+#include "media/formats/hls/playlist_common.h"
+#include "media/formats/hls/tags.h"
#include "media/formats/hls/types.h"
#include "url/gurl.h"
@@ -20,4 +23,84 @@ Playlist::Playlist(Playlist&&) = default;
Playlist& Playlist::operator=(Playlist&&) = default;
Playlist::~Playlist() = default;
+// static
+ParseStatus::Or<Playlist::Identification> Playlist::IdentifyPlaylist(
+ base::StringPiece source) {
+ absl::optional<Kind> playlist_kind;
+ absl::optional<XVersionTag> version_tag;
+
+ // Iterate through playlist lines until we can identify the version and the
+ // playlist kind.
+ SourceLineIterator iter(source);
+ while (!playlist_kind.has_value() || !version_tag.has_value()) {
+ auto item_result = GetNextLineItem(&iter);
+ if (item_result.has_error()) {
+ auto error = std::move(item_result).error();
+
+ // Only tolerated error is EOF
+ if (error.code() == ParseStatusCode::kReachedEOF) {
+ break;
+ }
+
+ return error;
+ }
+
+ auto item = std::move(item_result).value();
+ if (auto* tag = absl::get_if<TagItem>(&item)) {
+ // We can't make any assumptions on unknown tags
+ if (!tag->GetName().has_value()) {
+ continue;
+ }
+ const auto tag_name = tag->GetName().value();
+
+ // If this is a version tag, try parsing it to determine the version
+ if (tag_name == ToTagName(CommonTagName::kXVersion)) {
+ auto error = ParseUniqueTag(*tag, version_tag);
+ if (error.has_value()) {
+ return std::move(error).value();
+ }
+
+ // Ensure that the version is supported by this implementation
+ if (version_tag->version < Playlist::kMinSupportedVersion ||
+ version_tag->version > Playlist::kMaxSupportedVersion) {
+ return ParseStatusCode::kPlaylistHasUnsupportedVersion;
+ }
+
+ continue;
+ }
+
+ // Otherwise use the tag's kind to identify playlist kind without
+ // attempting to parse it.
+ switch (GetTagKind(tag_name)) {
+ case TagKind::kCommonTag:
+ break;
+ case TagKind::kMultivariantPlaylistTag:
+ if (playlist_kind == Kind::kMediaPlaylist) {
+ return ParseStatusCode::kMediaPlaylistHasMultivariantPlaylistTag;
+ }
+ playlist_kind = Kind::kMultivariantPlaylist;
+ break;
+ case TagKind::kMediaPlaylistTag:
+ if (playlist_kind == Kind::kMultivariantPlaylist) {
+ return ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag;
+ }
+ playlist_kind = Kind::kMediaPlaylist;
+ break;
+ }
+ }
+ }
+
+ return Identification{
+ // If the playlist did not contain a version tag, version is implicitly
+ // `kDefaultVersion`.
+ .version = version_tag ? version_tag->version : kDefaultVersion,
+
+ // Media playlists must contain the EXT-X-TARGETDURATION tag, so if we
+ // never encountered a media playlist tag it must be an (empty)
+ // multivariant playlist.
+ .kind =
+ playlist_kind ? playlist_kind.value() : Kind::kMultivariantPlaylist,
+ };
+}
+
} // namespace media::hls