diff options
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SourceBufferList.cpp')
-rw-r--r-- | Source/WebCore/Modules/mediasource/SourceBufferList.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/Source/WebCore/Modules/mediasource/SourceBufferList.cpp b/Source/WebCore/Modules/mediasource/SourceBufferList.cpp index 2dd7b81f0..005973709 100644 --- a/Source/WebCore/Modules/mediasource/SourceBufferList.cpp +++ b/Source/WebCore/Modules/mediasource/SourceBufferList.cpp @@ -34,6 +34,7 @@ #if ENABLE(MEDIA_SOURCE) #include "Event.h" +#include "EventNames.h" #include "SourceBuffer.h" namespace WebCore { @@ -49,15 +50,15 @@ SourceBufferList::~SourceBufferList() ASSERT(m_list.isEmpty()); } -void SourceBufferList::add(PassRefPtr<SourceBuffer> buffer) +void SourceBufferList::add(Ref<SourceBuffer>&& buffer) { - m_list.append(buffer); + m_list.append(WTFMove(buffer)); scheduleEvent(eventNames().addsourcebufferEvent); } -void SourceBufferList::remove(SourceBuffer* buffer) +void SourceBufferList::remove(SourceBuffer& buffer) { - size_t index = m_list.find(buffer); + size_t index = m_list.find(&buffer); if (index == notFound) return; m_list.remove(index); @@ -70,12 +71,30 @@ void SourceBufferList::clear() scheduleEvent(eventNames().removesourcebufferEvent); } +void SourceBufferList::swap(Vector<RefPtr<SourceBuffer>>& other) +{ + int changeInSize = other.size() - m_list.size(); + int addedEntries = 0; + for (auto& sourceBuffer : other) { + if (!m_list.contains(sourceBuffer)) + ++addedEntries; + } + int removedEntries = addedEntries - changeInSize; + + m_list.swap(other); + + if (addedEntries) + scheduleEvent(eventNames().addsourcebufferEvent); + if (removedEntries) + scheduleEvent(eventNames().removesourcebufferEvent); +} + void SourceBufferList::scheduleEvent(const AtomicString& eventName) { - RefPtr<Event> event = Event::create(eventName, false, false); + auto event = Event::create(eventName, false, false); event->setTarget(this); - m_asyncEventQueue.enqueueEvent(event.release()); + m_asyncEventQueue.enqueueEvent(WTFMove(event)); } |