vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Jan 20 19:23:00 2021 +0100| [79ca05e2e228fa7c62a101bedcf3292284713740] | committer: Francois Cartegnie
demux: adaptive: change tracker Events > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=79ca05e2e228fa7c62a101bedcf3292284713740 --- modules/demux/adaptive/SegmentTracker.cpp | 85 +++++++++------ modules/demux/adaptive/SegmentTracker.hpp | 119 +++++++++++++-------- modules/demux/adaptive/Streams.cpp | 38 ++++--- modules/demux/adaptive/Streams.hpp | 2 +- .../demux/adaptive/logic/AbstractAdaptationLogic.h | 2 +- .../adaptive/logic/NearOptimalAdaptationLogic.cpp | 36 ++++--- .../adaptive/logic/NearOptimalAdaptationLogic.hpp | 2 +- .../adaptive/logic/PredictiveAdaptationLogic.cpp | 44 ++++---- .../adaptive/logic/PredictiveAdaptationLogic.hpp | 2 +- .../adaptive/logic/RateBasedAdaptationLogic.cpp | 14 +-- .../adaptive/logic/RateBasedAdaptationLogic.h | 2 +- 11 files changed, 210 insertions(+), 136 deletions(-) diff --git a/modules/demux/adaptive/SegmentTracker.cpp b/modules/demux/adaptive/SegmentTracker.cpp index 0cc7035175..7368be83ed 100644 --- a/modules/demux/adaptive/SegmentTracker.cpp +++ b/modules/demux/adaptive/SegmentTracker.cpp @@ -38,46 +38,63 @@ using namespace adaptive; using namespace adaptive::logic; using namespace adaptive::playlist; -SegmentTrackerEvent::SegmentTrackerEvent(SegmentChunk *s) +TrackerEvent::TrackerEvent(Type t) { - type = Type::Discontinuity; - u.discontinuity.sc = s; + type = t; } -SegmentTrackerEvent::SegmentTrackerEvent(BaseRepresentation *prev, BaseRepresentation *next) +TrackerEvent::~TrackerEvent() { - type = Type::RepresentationSwitch; - u.switching.prev = prev; - u.switching.next = next; + +} + +TrackerEvent::Type TrackerEvent::getType() const +{ + return type; +} + +DiscontinuityEvent::DiscontinuityEvent() + : TrackerEvent(Type::Discontinuity) +{ + +} + +RepresentationSwitchEvent::RepresentationSwitchEvent(BaseRepresentation *prev, + BaseRepresentation *next) + : TrackerEvent(Type::RepresentationSwitch) +{ + this->prev = prev; + this->next = next; } -SegmentTrackerEvent::SegmentTrackerEvent(const StreamFormat *fmt) +FormatChangedEvent::FormatChangedEvent(const StreamFormat *f) + : TrackerEvent(Type::FormatChange) { - type = Type::FormatChange; - u.format.f = fmt; + this->format = f; } -SegmentTrackerEvent::SegmentTrackerEvent(const ID &id, bool enabled) +SegmentChangedEvent::SegmentChangedEvent(const ID &id, vlc_tick_t duration) + : TrackerEvent(Type::SegmentChange) { - type = Type::BufferingStateUpdate; - u.buffering.enabled = enabled; - u.buffering.id = &id; + this->id = &id; + this->duration = duration; } -SegmentTrackerEvent::SegmentTrackerEvent(const ID &id, vlc_tick_t min, vlc_tick_t current, vlc_tick_t target) +BufferingStateUpdatedEvent::BufferingStateUpdatedEvent(const ID &id, bool enabled) + : TrackerEvent(Type::BufferingStateUpdate) { - type = Type::BufferingLevelChange; - u.buffering_level.minimum = min; - u.buffering_level.current = current; - u.buffering_level.target = target; - u.buffering.id = &id; + this->id = &id; + this->enabled = enabled; } -SegmentTrackerEvent::SegmentTrackerEvent(const ID &id, vlc_tick_t duration) +BufferingLevelChangedEvent::BufferingLevelChangedEvent(const ID &id, vlc_tick_t minimum, + vlc_tick_t current, vlc_tick_t target) + : TrackerEvent(Type::BufferingLevelChange) { - type = Type::SegmentChange; - u.segment.duration = duration; - u.segment.id = &id; + this->id = &id; + this->minimum = minimum; + this->current = current; + this->target = target; } SegmentTracker::SegmentTracker(SharedResources *res, @@ -198,7 +215,7 @@ const Role & SegmentTracker::getStreamRole() const void SegmentTracker::reset() { - notify(SegmentTrackerEvent(current.rep, nullptr)); + notify(RepresentationSwitchEvent(current.rep, nullptr)); current = Position(); next = Position(); initializing = true; @@ -257,7 +274,7 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed, if(b_switched) { - notify(SegmentTrackerEvent(current.rep, next.rep)); + notify(RepresentationSwitchEvent(current.rep, next.rep)); initializing = true; assert(!next.index_sent); assert(!next.init_sent); @@ -276,7 +293,7 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed, else { format = current.rep->getStreamFormat(); - notify(SegmentTrackerEvent(&format)); /* Notify new demux format */ + notify(FormatChangedEvent(&format)); /* Notify new demux format */ return nullptr; /* Force current demux to end */ } } @@ -284,7 +301,7 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed, { /* Handle the corner case when only the demuxer can know the format and * demuxer starts after the format change (Probe != buffering) */ - notify(SegmentTrackerEvent(&format)); /* Notify new demux format */ + notify(FormatChangedEvent(&format)); /* Notify new demux format */ return nullptr; /* Force current demux to end */ } @@ -334,7 +351,7 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed, if(chunk) { const Timescale timescale = next.rep->inheritTimescale(); - notify(SegmentTrackerEvent(next.rep->getAdaptationSet()->getID(), + notify(SegmentChangedEvent(next.rep->getAdaptationSet()->getID(), timescale.ToTime(segment->duration.Get()))); } @@ -342,13 +359,13 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed, if(chunk && format != chunk->getStreamFormat()) { format = chunk->getStreamFormat(); - notify(SegmentTrackerEvent(&format)); + notify(FormatChangedEvent(&format)); } /* Handle both implicit and explicit discontinuities */ if( (b_gap && next.number) || (chunk && chunk->discontinuity) ) { - notify(SegmentTrackerEvent(chunk)); + notify(DiscontinuityEvent()); } if(chunk) @@ -465,12 +482,12 @@ vlc_tick_t SegmentTracker::getMinAheadTime() const void SegmentTracker::notifyBufferingState(bool enabled) const { - notify(SegmentTrackerEvent(adaptationSet->getID(), enabled)); + notify(BufferingStateUpdatedEvent(adaptationSet->getID(), enabled)); } void SegmentTracker::notifyBufferingLevel(vlc_tick_t min, vlc_tick_t current, vlc_tick_t target) const { - notify(SegmentTrackerEvent(adaptationSet->getID(), min, current, target)); + notify(BufferingLevelChangedEvent(adaptationSet->getID(), min, current, target)); } void SegmentTracker::registerListener(SegmentTrackerListenerInterface *listener) @@ -494,7 +511,7 @@ void SegmentTracker::updateSelected() } } -void SegmentTracker::notify(const SegmentTrackerEvent &event) const +void SegmentTracker::notify(const TrackerEvent &event) const { std::list<SegmentTrackerListenerInterface *>::const_iterator it; for(it=listeners.begin();it != listeners.end(); ++it) diff --git a/modules/demux/adaptive/SegmentTracker.hpp b/modules/demux/adaptive/SegmentTracker.hpp index cd303ec072..e3711b9bea 100644 --- a/modules/demux/adaptive/SegmentTracker.hpp +++ b/modules/demux/adaptive/SegmentTracker.hpp @@ -53,15 +53,9 @@ namespace adaptive using namespace logic; using namespace http; - class SegmentTrackerEvent + class TrackerEvent { public: - SegmentTrackerEvent(SegmentChunk *); - SegmentTrackerEvent(BaseRepresentation *, BaseRepresentation *); - SegmentTrackerEvent(const StreamFormat *); - SegmentTrackerEvent(const ID &, bool); - SegmentTrackerEvent(const ID &, vlc_tick_t, vlc_tick_t, vlc_tick_t); - SegmentTrackerEvent(const ID &, vlc_tick_t); enum class Type { Discontinuity, @@ -70,46 +64,85 @@ namespace adaptive SegmentChange, BufferingStateUpdate, BufferingLevelChange, - } type; - union - { - struct - { - SegmentChunk *sc; - } discontinuity; - struct - { - BaseRepresentation *prev; - BaseRepresentation *next; - } switching; - struct - { - const StreamFormat *f; - } format; - struct - { - const ID *id; - bool enabled; - } buffering; - struct - { - const ID *id; - vlc_tick_t minimum; - vlc_tick_t current; - vlc_tick_t target; - } buffering_level; - struct - { - const ID *id; - vlc_tick_t duration; - } segment; - } u; + }; + TrackerEvent() = delete; + virtual ~TrackerEvent() = 0; + Type getType() const; + + protected: + TrackerEvent(Type t); + + private: + Type type; + }; + + class DiscontinuityEvent : public TrackerEvent + { + public: + DiscontinuityEvent(); + virtual ~DiscontinuityEvent() = default; + }; + + class RepresentationSwitchEvent : public TrackerEvent + { + public: + RepresentationSwitchEvent() = delete; + RepresentationSwitchEvent(BaseRepresentation *, BaseRepresentation *); + virtual ~RepresentationSwitchEvent() = default; + + BaseRepresentation *prev; + BaseRepresentation *next; + }; + + class FormatChangedEvent : public TrackerEvent + { + public: + FormatChangedEvent() = delete; + FormatChangedEvent(const StreamFormat *); + virtual ~FormatChangedEvent() = default; + + const StreamFormat *format; + }; + + class SegmentChangedEvent : public TrackerEvent + { + public: + SegmentChangedEvent() = delete; + SegmentChangedEvent(const ID &, vlc_tick_t); + virtual ~SegmentChangedEvent() = default; + + const ID *id; + vlc_tick_t duration; + }; + + class BufferingStateUpdatedEvent : public TrackerEvent + { + public: + BufferingStateUpdatedEvent() = delete; + BufferingStateUpdatedEvent(const ID &, bool); + virtual ~BufferingStateUpdatedEvent() = default; + + const ID *id; + bool enabled; + }; + + class BufferingLevelChangedEvent : public TrackerEvent + { + public: + BufferingLevelChangedEvent() = delete; + BufferingLevelChangedEvent(const ID &, vlc_tick_t, vlc_tick_t, vlc_tick_t); + virtual ~BufferingLevelChangedEvent() = default; + + const ID *id; + vlc_tick_t minimum; + vlc_tick_t current; + vlc_tick_t target; }; class SegmentTrackerListenerInterface { public: - virtual void trackerEvent(const SegmentTrackerEvent &) = 0; + virtual void trackerEvent(const TrackerEvent &) = 0; virtual ~SegmentTrackerListenerInterface() = default; }; @@ -158,7 +191,7 @@ namespace adaptive private: void setAdaptationLogic(AbstractAdaptationLogic *); - void notify(const SegmentTrackerEvent &) const; + void notify(const TrackerEvent &) const; bool first; bool initializing; Position current; diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index b8434e8603..04cfc39f87 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -639,45 +639,53 @@ AbstractDemuxer *AbstractStream::newDemux(vlc_object_t *p_obj, const StreamForma return ret; } -void AbstractStream::trackerEvent(const SegmentTrackerEvent &event) +void AbstractStream::trackerEvent(const TrackerEvent &ev) { - switch(event.type) + switch(ev.getType()) { - case SegmentTrackerEvent::Type::Discontinuity: + case TrackerEvent::Type::Discontinuity: discontinuity = true; break; - case SegmentTrackerEvent::Type::FormatChange: + case TrackerEvent::Type::FormatChange: + { + const FormatChangedEvent &event = + static_cast<const FormatChangedEvent &>(ev); /* Check if our current demux is still valid */ - if(*event.u.format.f != format || format == StreamFormat(StreamFormat::UNKNOWN)) + if(*event.format != format || format == StreamFormat(StreamFormat::UNKNOWN)) { /* Format has changed between segments, we need to drain and change demux */ msg_Info(p_realdemux, "Changing stream format %s -> %s", - format.str().c_str(), event.u.format.f->str().c_str()); - format = *event.u.format.f; + format.str().c_str(), event.format->str().c_str()); + format = *event.format; /* This is an implict discontinuity */ discontinuity = true; } + } break; - case SegmentTrackerEvent::Type::RepresentationSwitch: + case TrackerEvent::Type::RepresentationSwitch: + { + const RepresentationSwitchEvent &event = + static_cast<const RepresentationSwitchEvent &>(ev); if(demuxer && !inrestart) { if(!demuxer->bitstreamSwitchCompatible() || - (event.u.switching.next && - !event.u.switching.next->getAdaptationSet()->isBitSwitchable())) + (event.next && + !event.next->getAdaptationSet()->isBitSwitchable())) needrestart = true; } AdvDebug(msg_Dbg(p_realdemux, "Stream %s switching %s %s to %s %s", description.c_str(), - event.u.switching.prev ? event.u.switching.prev->getID().str().c_str() : "", - event.u.switching.prev ? event.u.switching.prev->getStreamFormat().str().c_str() : "", - event.u.switching.next ? event.u.switching.next->getID().str().c_str() : "", - event.u.switching.next ? event.u.switching.next->getStreamFormat().str().c_str() : "")); + event.prev ? event.prev->getID().str().c_str() : "", + event.prev ? event.prev->getStreamFormat().str().c_str() : "", + event.next ? event.next->getID().str().c_str() : "", + event.next ? event.next->getStreamFormat().str().c_str() : "")); + } break; - case SegmentTrackerEvent::Type::SegmentChange: + case TrackerEvent::Type::SegmentChange: if(demuxer && demuxer->needsRestartOnEachSegment() && !inrestart) { needrestart = true; diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index b255642bb7..54ea4e5b72 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -98,7 +98,7 @@ namespace adaptive /**/ virtual void fillExtraFMTInfo( es_format_t * ) const override; - virtual void trackerEvent(const SegmentTrackerEvent &) override; + virtual void trackerEvent(const TrackerEvent &) override; protected: bool seekAble() const; diff --git a/modules/demux/adaptive/logic/AbstractAdaptationLogic.h b/modules/demux/adaptive/logic/AbstractAdaptationLogic.h index 7542114ce9..33becd4aca 100644 --- a/modules/demux/adaptive/logic/AbstractAdaptationLogic.h +++ b/modules/demux/adaptive/logic/AbstractAdaptationLogic.h @@ -49,7 +49,7 @@ namespace adaptive virtual BaseRepresentation* getNextRepresentation(BaseAdaptationSet *, BaseRepresentation *) = 0; virtual void updateDownloadRate (const ID &, size_t, vlc_tick_t); - virtual void trackerEvent (const SegmentTrackerEvent &) {} + virtual void trackerEvent (const TrackerEvent &) override {} void setMaxDeviceResolution (int, int); enum class LogicType diff --git a/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.cpp b/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.cpp index b171bfbe1f..d5e42b2d48 100644 --- a/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.cpp +++ b/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.cpp @@ -194,27 +194,31 @@ void NearOptimalAdaptationLogic::updateDownloadRate(const ID &id, size_t dlsize, vlc_mutex_unlock(&lock); } -void NearOptimalAdaptationLogic::trackerEvent(const SegmentTrackerEvent &event) +void NearOptimalAdaptationLogic::trackerEvent(const TrackerEvent &ev) { - switch(event.type) + switch(ev.getType()) { - case SegmentTrackerEvent::Type::RepresentationSwitch: + case TrackerEvent::Type::RepresentationSwitch: { + const RepresentationSwitchEvent &event = + static_cast<const RepresentationSwitchEvent &>(ev); vlc_mutex_lock(&lock); - if(event.u.switching.prev) - usedBps -= event.u.switching.prev->getBandwidth(); - if(event.u.switching.next) - usedBps += event.u.switching.next->getBandwidth(); + if(event.prev) + usedBps -= event.prev->getBandwidth(); + if(event.next) + usedBps += event.next->getBandwidth(); BwDebug(msg_Info(p_obj, "New total bandwidth usage %zu kBps", (usedBps / 8000))); vlc_mutex_unlock(&lock); } break; - case SegmentTrackerEvent::Type::BufferingStateUpdate: + case TrackerEvent::Type::BufferingStateUpdate: { - const ID &id = *event.u.buffering.id; + const BufferingStateUpdatedEvent &event = + static_cast<const BufferingStateUpdatedEvent &>(ev); + const ID &id = *event.id; vlc_mutex_lock(&lock); - if(event.u.buffering.enabled) + if(event.enabled) { if(streams.find(id) == streams.end()) { @@ -230,17 +234,19 @@ void NearOptimalAdaptationLogic::trackerEvent(const SegmentTrackerEvent &event) } vlc_mutex_unlock(&lock); BwDebug(msg_Info(p_obj, "Stream %s is now known %sactive", id.str().c_str(), - (event.u.buffering.enabled) ? "" : "in")); + (event.enabled) ? "" : "in")); } break; - case SegmentTrackerEvent::Type::BufferingLevelChange: + case TrackerEvent::Type::BufferingLevelChange: { - const ID &id = *event.u.buffering.id; + const BufferingLevelChangedEvent &event = + static_cast<const BufferingLevelChangedEvent &>(ev); + const ID &id = *event.id; vlc_mutex_lock(&lock); NearOptimalContext &ctx = streams[id]; - ctx.buffering_level = event.u.buffering_level.current; - ctx.buffering_target = event.u.buffering_level.target; + ctx.buffering_level = event.current; + ctx.buffering_target = event.target; vlc_mutex_unlock(&lock); } break; diff --git a/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.hpp b/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.hpp index 022b42badf..ee2cd9815f 100644 --- a/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.hpp +++ b/modules/demux/adaptive/logic/NearOptimalAdaptationLogic.hpp @@ -53,7 +53,7 @@ namespace adaptive virtual BaseRepresentation* getNextRepresentation(BaseAdaptationSet *, BaseRepresentation *) override; virtual void updateDownloadRate (const ID &, size_t, vlc_tick_t) override; - virtual void trackerEvent (const SegmentTrackerEvent &) override; + virtual void trackerEvent (const TrackerEvent &) override; private: BaseRepresentation * getNextQualityIndex( BaseAdaptationSet *, RepresentationSelector &, diff --git a/modules/demux/adaptive/logic/PredictiveAdaptationLogic.cpp b/modules/demux/adaptive/logic/PredictiveAdaptationLogic.cpp index 2e05cfb2d1..24221c62e5 100644 --- a/modules/demux/adaptive/logic/PredictiveAdaptationLogic.cpp +++ b/modules/demux/adaptive/logic/PredictiveAdaptationLogic.cpp @@ -175,28 +175,32 @@ unsigned PredictiveAdaptationLogic::getAvailableBw(unsigned i_bw, const BaseRepr return i_remain > i_bw ? i_remain : i_bw; } -void PredictiveAdaptationLogic::trackerEvent(const SegmentTrackerEvent &event) +void PredictiveAdaptationLogic::trackerEvent(const TrackerEvent &ev) { - switch(event.type) + switch(ev.getType()) { - case SegmentTrackerEvent::Type::RepresentationSwitch: + case TrackerEvent::Type::RepresentationSwitch: { + const RepresentationSwitchEvent &event = + static_cast<const RepresentationSwitchEvent &>(ev); vlc_mutex_lock(&lock); - if(event.u.switching.prev) - usedBps -= event.u.switching.prev->getBandwidth(); - if(event.u.switching.next) - usedBps += event.u.switching.next->getBandwidth(); + if(event.prev) + usedBps -= event.prev->getBandwidth(); + if(event.next) + usedBps += event.next->getBandwidth(); BwDebug(msg_Info(p_obj, "New total bandwidth usage %zu KiB/s", (usedBps / 8000))); vlc_mutex_unlock(&lock); } break; - case SegmentTrackerEvent::Type::BufferingStateUpdate: + case TrackerEvent::Type::BufferingStateUpdate: { - const ID &id = *event.u.buffering.id; + const BufferingStateUpdatedEvent &event = + static_cast<const BufferingStateUpdatedEvent &>(ev); + const ID &id = *event.id; vlc_mutex_lock(&lock); - if(event.u.buffering.enabled) + if(event.enabled) { if(streams.find(id) == streams.end()) { @@ -212,27 +216,31 @@ void PredictiveAdaptationLogic::trackerEvent(const SegmentTrackerEvent &event) } vlc_mutex_unlock(&lock); BwDebug(msg_Info(p_obj, "Stream %s is now known %sactive", id.str().c_str(), - (event.u.buffering.enabled) ? "" : "in")); + (event.enabled) ? "" : "in")); } break; - case SegmentTrackerEvent::Type::BufferingLevelChange: + case TrackerEvent::Type::BufferingLevelChange: { - const ID &id = *event.u.buffering.id; + const BufferingLevelChangedEvent &event = + static_cast<const BufferingLevelChangedEvent &>(ev); + const ID &id = *event.id; vlc_mutex_lock(&lock); PredictiveStats &stats = streams[id]; - stats.buffering_level = event.u.buffering_level.current; - stats.buffering_target = event.u.buffering_level.target; + stats.buffering_level = event.current; + stats.buffering_target = event.target; vlc_mutex_unlock(&lock); } break; - case SegmentTrackerEvent::Type::SegmentChange: + case TrackerEvent::Type::SegmentChange: { - const ID &id = *event.u.segment.id; + const SegmentChangedEvent &event = + static_cast<const SegmentChangedEvent &>(ev); + const ID &id = *event.id; vlc_mutex_lock(&lock); PredictiveStats &stats = streams[id]; - stats.last_duration = event.u.segment.duration; + stats.last_duration = event.duration; vlc_mutex_unlock(&lock); } break; diff --git a/modules/demux/adaptive/logic/PredictiveAdaptationLogic.hpp b/modules/demux/adaptive/logic/PredictiveAdaptationLogic.hpp index c69e47fa16..cf60162889 100644 --- a/modules/demux/adaptive/logic/PredictiveAdaptationLogic.hpp +++ b/modules/demux/adaptive/logic/PredictiveAdaptationLogic.hpp @@ -54,7 +54,7 @@ namespace adaptive virtual BaseRepresentation* getNextRepresentation(BaseAdaptationSet *, BaseRepresentation *) override; virtual void updateDownloadRate (const ID &, size_t, vlc_tick_t) override; - virtual void trackerEvent (const SegmentTrackerEvent &) override; + virtual void trackerEvent (const TrackerEvent &) override; private: unsigned getAvailableBw(unsigned, const BaseRepresentation *) const; diff --git a/modules/demux/adaptive/logic/RateBasedAdaptationLogic.cpp b/modules/demux/adaptive/logic/RateBasedAdaptationLogic.cpp index caf9c55a17..f657bdf8a7 100644 --- a/modules/demux/adaptive/logic/RateBasedAdaptationLogic.cpp +++ b/modules/demux/adaptive/logic/RateBasedAdaptationLogic.cpp @@ -105,15 +105,17 @@ void RateBasedAdaptationLogic::updateDownloadRate(const ID &, size_t size, vlc_t vlc_mutex_unlock(&lock); } -void RateBasedAdaptationLogic::trackerEvent(const SegmentTrackerEvent &event) +void RateBasedAdaptationLogic::trackerEvent(const TrackerEvent &ev) { - if(event.type == SegmentTrackerEvent::Type::RepresentationSwitch) + if(ev.getType() == TrackerEvent::Type::RepresentationSwitch) { + const RepresentationSwitchEvent &event = + static_cast<const RepresentationSwitchEvent &>(ev); vlc_mutex_lock(&lock); - if(event.u.switching.prev) - usedBps -= event.u.switching.prev->getBandwidth(); - if(event.u.switching.next) - usedBps += event.u.switching.next->getBandwidth(); + if(event.prev) + usedBps -= event.prev->getBandwidth(); + if(event.next) + usedBps += event.next->getBandwidth(); BwDebug(msg_Info(p_obj, "New bandwidth usage %zu KiB/s %u%%", (usedBps / 8000), (bpsAvg) ? (unsigned)(usedBps * 100.0 / bpsAvg) : 0 )); diff --git a/modules/demux/adaptive/logic/RateBasedAdaptationLogic.h b/modules/demux/adaptive/logic/RateBasedAdaptationLogic.h index 33b9a2b680..9b94996e54 100644 --- a/modules/demux/adaptive/logic/RateBasedAdaptationLogic.h +++ b/modules/demux/adaptive/logic/RateBasedAdaptationLogic.h @@ -42,7 +42,7 @@ namespace adaptive BaseRepresentation *getNextRepresentation(BaseAdaptationSet *, BaseRepresentation *) override; virtual void updateDownloadRate(const ID &, size_t, vlc_tick_t) override; - virtual void trackerEvent(const SegmentTrackerEvent &) override; + virtual void trackerEvent(const TrackerEvent &) override; private: size_t bpsAvg; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
