diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-09-29 16:16:15 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-11-09 10:04:06 +0000 |
commit | a95a7417ad456115a1ef2da4bb8320531c0821f1 (patch) | |
tree | edcd59279e486d2fd4a8f88a7ed025bcf925c6e6 /chromium/media/formats/hls/playlist.cc | |
parent | 33fc33aa94d4add0878ec30dc818e34e1dd3cc2a (diff) | |
download | qtwebengine-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.cc | 83 |
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 |