MockMediaSourcePrivate.cpp [plain text]
#include "config.h"
#include "MockMediaSourcePrivate.h"
#if ENABLE(MEDIA_SOURCE)
#include "ContentType.h"
#include "ExceptionCodePlaceholder.h"
#include "MediaSourcePrivateClient.h"
#include "MockMediaPlayerMediaSource.h"
#include "MockSourceBufferPrivate.h"
namespace WebCore {
RefPtr<MockMediaSourcePrivate> MockMediaSourcePrivate::create(MockMediaPlayerMediaSource* parent, MediaSourcePrivateClient* client)
{
RefPtr<MockMediaSourcePrivate> mediaSourcePrivate = adoptRef(new MockMediaSourcePrivate(parent, client));
client->setPrivateAndOpen(*mediaSourcePrivate);
return mediaSourcePrivate;
}
MockMediaSourcePrivate::MockMediaSourcePrivate(MockMediaPlayerMediaSource* parent, MediaSourcePrivateClient* client)
: m_player(parent)
, m_client(client)
, m_isEnded(false)
, m_totalVideoFrames(0)
, m_droppedVideoFrames(0)
, m_corruptedVideoFrames(0)
{
}
MockMediaSourcePrivate::~MockMediaSourcePrivate()
{
for (auto it = m_sourceBuffers.begin(), end = m_sourceBuffers.end(); it != end; ++it)
(*it)->clearMediaSource();
}
MediaSourcePrivate::AddStatus MockMediaSourcePrivate::addSourceBuffer(const ContentType& contentType, RefPtr<SourceBufferPrivate>& outPrivate)
{
MediaEngineSupportParameters parameters;
parameters.isMediaSource = true;
parameters.type = contentType.type();
parameters.codecs = contentType.parameter(ASCIILiteral("codecs"));
if (MockMediaPlayerMediaSource::supportsType(parameters) == MediaPlayer::IsNotSupported)
return NotSupported;
m_sourceBuffers.append(MockSourceBufferPrivate::create(this));
outPrivate = m_sourceBuffers.last();
return Ok;
}
void MockMediaSourcePrivate::removeSourceBuffer(SourceBufferPrivate* buffer)
{
ASSERT(m_sourceBuffers.contains(buffer));
size_t pos = m_activeSourceBuffers.find(buffer);
if (pos != notFound)
m_activeSourceBuffers.remove(pos);
pos = m_sourceBuffers.find(buffer);
m_sourceBuffers.remove(pos);
}
MediaTime MockMediaSourcePrivate::duration()
{
return m_client->duration();
}
std::unique_ptr<PlatformTimeRanges> MockMediaSourcePrivate::buffered()
{
return m_client->buffered();
}
void MockMediaSourcePrivate::durationChanged()
{
m_player->updateDuration(duration());
}
void MockMediaSourcePrivate::markEndOfStream(EndOfStreamStatus status)
{
if (status == EosNoError)
m_player->setNetworkState(MediaPlayer::Loaded);
m_isEnded = true;
}
void MockMediaSourcePrivate::unmarkEndOfStream()
{
m_isEnded = false;
}
MediaPlayer::ReadyState MockMediaSourcePrivate::readyState() const
{
return m_player->readyState();
}
void MockMediaSourcePrivate::setReadyState(MediaPlayer::ReadyState readyState)
{
m_player->setReadyState(readyState);
}
void MockMediaSourcePrivate::waitForSeekCompleted()
{
m_player->waitForSeekCompleted();
}
void MockMediaSourcePrivate::seekCompleted()
{
m_player->seekCompleted();
}
void MockMediaSourcePrivate::sourceBufferPrivateDidChangeActiveState(MockSourceBufferPrivate* buffer, bool active)
{
if (active && !m_activeSourceBuffers.contains(buffer))
m_activeSourceBuffers.append(buffer);
if (!active) {
size_t position = m_activeSourceBuffers.find(buffer);
if (position != notFound)
m_activeSourceBuffers.remove(position);
}
}
static bool MockSourceBufferPrivateHasAudio(PassRefPtr<MockSourceBufferPrivate> prpSourceBuffer)
{
return prpSourceBuffer->hasAudio();
}
bool MockMediaSourcePrivate::hasAudio() const
{
return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), MockSourceBufferPrivateHasAudio);
}
static bool MockSourceBufferPrivateHasVideo(PassRefPtr<MockSourceBufferPrivate> prpSourceBuffer)
{
return prpSourceBuffer->hasVideo();
}
bool MockMediaSourcePrivate::hasVideo() const
{
return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), MockSourceBufferPrivateHasVideo);
}
void MockMediaSourcePrivate::seekToTime(const MediaTime& time)
{
for (auto it = m_activeSourceBuffers.begin(), end = m_activeSourceBuffers.end(); it != end; ++it)
(*it)->seekToTime(time);
}
MediaTime MockMediaSourcePrivate::seekToTime(const MediaTime& targetTime, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold)
{
MediaTime seekTime = targetTime;
for (auto it = m_activeSourceBuffers.begin(), end = m_activeSourceBuffers.end(); it != end; ++it) {
MediaTime sourceSeekTime = (*it)->fastSeekTimeForMediaTime(targetTime, negativeThreshold, positiveThreshold);
if (abs(targetTime - sourceSeekTime) > abs(targetTime - seekTime))
seekTime = sourceSeekTime;
}
for (auto it = m_activeSourceBuffers.begin(), end = m_activeSourceBuffers.end(); it != end; ++it)
(*it)->seekToTime(seekTime);
return seekTime;
}
};
#endif