From 0eba7be2abc28ced7b66f591c27ebcd80d686262 Mon Sep 17 00:00:00 2001 From: liujie129 Date: Wed, 23 Aug 2023 23:22:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B6=85=E5=A4=A7=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=91=8A=E8=AD=A6m3u8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liujie129 --- .../plugins/source/http_source/hls/m3u8.cpp | 114 +++++++++++------- .../plugins/source/http_source/hls/m3u8.h | 12 ++ 2 files changed, 80 insertions(+), 46 deletions(-) diff --git a/engine/plugin/plugins/source/http_source/hls/m3u8.cpp b/engine/plugin/plugins/source/http_source/hls/m3u8.cpp index 7a129caf..eaaabf0e 100644 --- a/engine/plugin/plugins/source/http_source/hls/m3u8.cpp +++ b/engine/plugin/plugins/source/http_source/hls/m3u8.cpp @@ -49,6 +49,7 @@ M3U8Fragment::M3U8Fragment(std::string uri, std::string title, double duration, M3U8::M3U8(std::string uri, std::string name) : uri_(std::move(uri)), name_(std::move(name)) { + InitTagUpdatersMap(); } bool M3U8::Update(std::string& playList) @@ -74,56 +75,77 @@ bool M3U8::Update(std::string& playList) return true; } +void M3U8::InitTagUpdatersMap() +{ + tagUpdatersMap_[HlsTag::EXTXPLAYLISTTYPE] = [this] (std::shared_ptr& tag, M3U8Info& info) { + bLive_ = !info.bVod && (std::static_pointer_cast(tag)->GetValue().QuotedString() != "VOD"); + }; + + tagUpdatersMap_[HlsTag::EXTXTARGETDURATION] = [this] (std::shared_ptr& tag, M3U8Info& info) { + std::ignore = info; + targetDuration_ = std::static_pointer_cast(tag)->GetValue().FloatingPoint(); + }; + + tagUpdatersMap_[HlsTag::EXTXMEDIASEQUENCE] = [this] (std::shared_ptr& tag, M3U8Info& info) { + std::ignore = info; + sequence_ = std::static_pointer_cast(tag)->GetValue().Decimal(); + }; + + tagUpdatersMap_[HlsTag::EXTXDISCONTINUITYSEQUENCE] = [this] (std::shared_ptr& tag, M3U8Info& info) { + discontSequence_ = std::static_pointer_cast(tag)->GetValue().Decimal(); + info.discontinuity = true; + }; + + tagUpdatersMap_[HlsTag::EXTINF] = [this](std::shared_ptr &tag, M3U8Info &info) { + GetExtInf(tag, info.duration, info.title); + }; + + tagUpdatersMap_[HlsTag::URI] = [this](std::shared_ptr &tag, M3U8Info &info) { + info.uri = UriJoin(uri_, std::static_pointer_cast(tag)->GetValue().QuotedString()); + }; + + tagUpdatersMap_[HlsTag::EXTXBYTERANGE] = [](std::shared_ptr &tag, M3U8Info &info) { + std::ignore = tag; + std::ignore = info; + MEDIA_LOG_I("need to parse EXTXBYTERANGE"); + }; + + tagUpdatersMap_[HlsTag::EXTXDISCONTINUITY] = [this](std::shared_ptr &tag, M3U8Info &info) { + std::ignore = tag; + discontSequence_++; + info.discontinuity = true; + }; + + tagUpdatersMap_[HlsTag::EXTXKEY] = [](std::shared_ptr &tag, M3U8Info &info) { + std::ignore = tag; + std::ignore = info; + MEDIA_LOG_I("need to parse EXTXKEY"); + }; + + tagUpdatersMap_[HlsTag::EXTXMAP] = [](std::shared_ptr &tag, M3U8Info &info) { + std::ignore = tag; + std::ignore = info; + MEDIA_LOG_I("need to parse EXTXMAP"); + }; +} + void M3U8::UpdateFromTags(std::list>& tags) { - std::string uri; - std::string title; - double duration = 0; - bool discontinuity = false; - auto bVod = !tags.empty() && tags.back()->GetType() == HlsTag::EXTXENDLIST; - bLive_ = !bVod; + M3U8Info info; + info.bVod = !tags.empty() && tags.back()->GetType() == HlsTag::EXTXENDLIST; + bLive_ = !info.bVod; for (auto& tag : tags) { - switch (tag->GetType()) { - case HlsTag::EXTXPLAYLISTTYPE: - bLive_ = !bVod && (std::static_pointer_cast(tag)->GetValue().QuotedString() != "VOD"); - break; - case HlsTag::EXTXTARGETDURATION: - targetDuration_ = std::static_pointer_cast(tag)->GetValue().FloatingPoint(); - break; - case HlsTag::EXTXMEDIASEQUENCE: - sequence_ = std::static_pointer_cast(tag)->GetValue().Decimal(); - break; - case HlsTag::EXTXDISCONTINUITYSEQUENCE: { - discontSequence_ = std::static_pointer_cast(tag)->GetValue().Decimal(); - discontinuity = true; - break; - } - case HlsTag::EXTINF: - GetExtInf(tag, duration, title); - break; - case HlsTag::URI: - uri = UriJoin(uri_, std::static_pointer_cast(tag)->GetValue().QuotedString()); - break; - case HlsTag::EXTXBYTERANGE: - MEDIA_LOG_I("need to parse EXTXBYTERANGE"); - break; - case HlsTag::EXTXDISCONTINUITY: { - discontSequence_++; - discontinuity = true; - break; - } - case HlsTag::EXTXKEY: - MEDIA_LOG_I("need to parse EXTXKEY"); - break; - case HlsTag::EXTXMAP: - MEDIA_LOG_I("need to parse EXTXMAP"); - break; - default: - break; + HlsTag hlsTag = tag->GetType(); + auto iter = tagUpdatersMap_.find(hlsTag); + if (iter != tagUpdatersMap_.end()) { + auto updater = iter->second; + updater(tag, info); } - if (!uri.empty()) { - files_.emplace_back(std::make_shared(uri, title, duration, sequence_++, discontinuity)); - uri = "", title = "", duration = 0, discontinuity = false; + + if (!info.uri.empty()) { + files_.emplace_back(std::make_shared(info.uri, info.title, info.duration, sequence_++, + info.discontinuity)); + info.uri = "", info.title = "", info.duration = 0, info.discontinuity = false; } } } diff --git a/engine/plugin/plugins/source/http_source/hls/m3u8.h b/engine/plugin/plugins/source/http_source/hls/m3u8.h index db6ebfa0..aefdbdb4 100644 --- a/engine/plugin/plugins/source/http_source/hls/m3u8.h +++ b/engine/plugin/plugins/source/http_source/hls/m3u8.h @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "hls_tags.h" namespace OHOS { @@ -53,8 +55,17 @@ struct M3U8Fragment { int size_ {0}; }; +struct M3U8Info { + std::string uri; + std::string title; + double duration = 0; + bool discontinuity = false; + bool bVod; +}; + struct M3U8 { M3U8(std::string uri, std::string name); + void InitTagUpdatersMap(); bool Update(std::string& playList); void UpdateFromTags(std::list>& tags); void GetExtInf(const std::shared_ptr& tag, double& duration, std::string& title) const; @@ -63,6 +74,7 @@ struct M3U8 { std::string uri_; std::string name_; + std::unordered_map&, M3U8Info&)>> tagUpdatersMap_; double targetDuration_ {0.0}; bool bLive_ {}; -- Gitee