summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/mediasource/SourceBufferList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SourceBufferList.cpp')
-rw-r--r--Source/WebCore/Modules/mediasource/SourceBufferList.cpp31
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));
}