MediaSourcePrivateGStreamer.cpp [plain text]
#include "config.h"
#include "MediaSourcePrivateGStreamer.h"
#if ENABLE(MEDIA_SOURCE) && USE(GSTREAMER)
#include "ContentType.h"
#include "Logging.h"
#include "MediaPlayerPrivateGStreamer.h"
#include "MediaPlayerPrivateGStreamerMSE.h"
#include "NotImplemented.h"
#include "PlaybackPipeline.h"
#include "SourceBufferPrivateGStreamer.h"
#include "TimeRanges.h"
#include "WebKitMediaSourceGStreamer.h"
#include <wtf/RefPtr.h>
#include <wtf/glib/GRefPtr.h>
namespace WebCore {
void MediaSourcePrivateGStreamer::open(MediaSourcePrivateClient& mediaSource, MediaPlayerPrivateGStreamerMSE& playerPrivate)
{
mediaSource.setPrivateAndOpen(adoptRef(*new MediaSourcePrivateGStreamer(mediaSource, playerPrivate)));
}
MediaSourcePrivateGStreamer::MediaSourcePrivateGStreamer(MediaSourcePrivateClient& mediaSource, MediaPlayerPrivateGStreamerMSE& playerPrivate)
: MediaSourcePrivate()
, m_mediaSource(mediaSource)
, m_playerPrivate(playerPrivate)
#if !RELEASE_LOG_DISABLED
, m_logger(m_playerPrivate.mediaPlayerLogger())
, m_logIdentifier(m_playerPrivate.mediaPlayerLogIdentifier())
#endif
{
}
MediaSourcePrivateGStreamer::~MediaSourcePrivateGStreamer()
{
ALWAYS_LOG(LOGIDENTIFIER);
for (auto& sourceBufferPrivate : m_sourceBuffers)
sourceBufferPrivate->clearMediaSource();
}
MediaSourcePrivateGStreamer::AddStatus MediaSourcePrivateGStreamer::addSourceBuffer(const ContentType& contentType, bool, RefPtr<SourceBufferPrivate>& sourceBufferPrivate)
{
DEBUG_LOG(LOGIDENTIFIER, contentType);
sourceBufferPrivate = SourceBufferPrivateGStreamer::create(this, contentType, m_playerPrivate);
RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivateGStreamer = static_cast<SourceBufferPrivateGStreamer*>(sourceBufferPrivate.get());
m_sourceBuffers.add(sourceBufferPrivateGStreamer);
return m_playerPrivate.playbackPipeline()->addSourceBuffer(sourceBufferPrivateGStreamer);
}
void MediaSourcePrivateGStreamer::removeSourceBuffer(SourceBufferPrivate* sourceBufferPrivate)
{
RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivateGStreamer = static_cast<SourceBufferPrivateGStreamer*>(sourceBufferPrivate);
ASSERT(m_sourceBuffers.contains(sourceBufferPrivateGStreamer));
sourceBufferPrivateGStreamer->clearMediaSource();
m_sourceBuffers.remove(sourceBufferPrivateGStreamer);
m_activeSourceBuffers.remove(sourceBufferPrivateGStreamer.get());
}
void MediaSourcePrivateGStreamer::durationChanged(const MediaTime&)
{
ASSERT(isMainThread());
MediaTime duration = m_mediaSource->duration();
GST_TRACE("duration: %f", duration.toFloat());
if (!duration.isValid() || duration.isPositiveInfinite() || duration.isNegativeInfinite())
return;
m_playerPrivate.durationChanged();
}
void MediaSourcePrivateGStreamer::markEndOfStream(EndOfStreamStatus status)
{
ASSERT(isMainThread());
m_playerPrivate.markEndOfStream(status);
m_isEnded = true;
}
void MediaSourcePrivateGStreamer::unmarkEndOfStream()
{
notImplemented();
m_isEnded = false;
}
MediaPlayer::ReadyState MediaSourcePrivateGStreamer::readyState() const
{
return m_playerPrivate.readyState();
}
void MediaSourcePrivateGStreamer::setReadyState(MediaPlayer::ReadyState state)
{
m_playerPrivate.setReadyState(state);
}
void MediaSourcePrivateGStreamer::waitForSeekCompleted()
{
m_playerPrivate.waitForSeekCompleted();
}
void MediaSourcePrivateGStreamer::seekCompleted()
{
m_playerPrivate.seekCompleted();
}
MediaTime MediaSourcePrivateGStreamer::duration() const
{
return m_mediaSource->duration();
}
MediaTime MediaSourcePrivateGStreamer::currentMediaTime() const
{
return m_playerPrivate.currentMediaTime();
}
void MediaSourcePrivateGStreamer::sourceBufferPrivateDidChangeActiveState(SourceBufferPrivateGStreamer* sourceBufferPrivate, bool isActive)
{
if (!isActive)
m_activeSourceBuffers.remove(sourceBufferPrivate);
else if (!m_activeSourceBuffers.contains(sourceBufferPrivate))
m_activeSourceBuffers.add(sourceBufferPrivate);
}
std::unique_ptr<PlatformTimeRanges> MediaSourcePrivateGStreamer::buffered()
{
return m_mediaSource->buffered();
}
#if !RELEASE_LOG_DISABLED
WTFLogChannel& MediaSourcePrivateGStreamer::logChannel() const
{
return LogMediaSource;
}
#endif
}
#endif