MediaSourceClientGStreamerMSE.cpp [plain text]
#include "config.h"
#include "MediaSourceClientGStreamerMSE.h"
#include "AppendPipeline.h"
#include "MediaPlayerPrivateGStreamerMSE.h"
#include "WebKitMediaSourceGStreamer.h"
#if ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(MEDIA_SOURCE)
namespace WebCore {
Ref<MediaSourceClientGStreamerMSE> MediaSourceClientGStreamerMSE::create(MediaPlayerPrivateGStreamerMSE& playerPrivate)
{
ASSERT(WTF::isMainThread());
Ref<MediaSourceClientGStreamerMSE> client(adoptRef(*new MediaSourceClientGStreamerMSE(playerPrivate)));
playerPrivate.setMediaSourceClient(client.get());
return client;
}
MediaSourceClientGStreamerMSE::MediaSourceClientGStreamerMSE(MediaPlayerPrivateGStreamerMSE& playerPrivate)
: m_playerPrivate(&playerPrivate)
, m_duration(MediaTime::invalidTime())
{
ASSERT(WTF::isMainThread());
}
MediaSourceClientGStreamerMSE::~MediaSourceClientGStreamerMSE()
{
ASSERT(WTF::isMainThread());
}
MediaSourcePrivate::AddStatus MediaSourceClientGStreamerMSE::addSourceBuffer(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, const ContentType&)
{
ASSERT(WTF::isMainThread());
if (!m_playerPrivate)
return MediaSourcePrivate::AddStatus::NotSupported;
ASSERT(m_playerPrivate->m_playbackPipeline);
ASSERT(sourceBufferPrivate);
RefPtr<AppendPipeline> appendPipeline = adoptRef(new AppendPipeline(*this, *sourceBufferPrivate, *m_playerPrivate));
GST_TRACE("Adding SourceBuffer to AppendPipeline: this=%p sourceBuffer=%p appendPipeline=%p", this, sourceBufferPrivate.get(), appendPipeline.get());
m_playerPrivate->m_appendPipelinesMap.add(sourceBufferPrivate, appendPipeline);
return m_playerPrivate->m_playbackPipeline->addSourceBuffer(sourceBufferPrivate);
}
const MediaTime& MediaSourceClientGStreamerMSE::duration()
{
ASSERT(WTF::isMainThread());
return m_duration;
}
void MediaSourceClientGStreamerMSE::durationChanged(const MediaTime& duration)
{
ASSERT(WTF::isMainThread());
GST_TRACE("duration: %f", duration.toFloat());
if (!duration.isValid() || duration.isPositiveInfinite() || duration.isNegativeInfinite())
return;
m_duration = duration;
if (m_playerPrivate)
m_playerPrivate->durationChanged();
}
void MediaSourceClientGStreamerMSE::abort(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate)
{
ASSERT(WTF::isMainThread());
GST_DEBUG("aborting");
if (!m_playerPrivate)
return;
RefPtr<AppendPipeline> appendPipeline = m_playerPrivate->m_appendPipelinesMap.get(sourceBufferPrivate);
ASSERT(appendPipeline);
appendPipeline->abort();
}
void MediaSourceClientGStreamerMSE::resetParserState(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate)
{
ASSERT(WTF::isMainThread());
GST_DEBUG("resetting parser state");
if (!m_playerPrivate)
return;
RefPtr<AppendPipeline> appendPipeline = m_playerPrivate->m_appendPipelinesMap.get(sourceBufferPrivate);
ASSERT(appendPipeline);
appendPipeline->abort();
}
bool MediaSourceClientGStreamerMSE::append(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate, const unsigned char* data, unsigned length)
{
ASSERT(WTF::isMainThread());
GST_DEBUG("Appending %u bytes", length);
if (!m_playerPrivate)
return false;
RefPtr<AppendPipeline> appendPipeline = m_playerPrivate->m_appendPipelinesMap.get(sourceBufferPrivate);
ASSERT(appendPipeline);
GstBuffer* buffer = gst_buffer_new_and_alloc(length);
gst_buffer_fill(buffer, 0, data, length);
return appendPipeline->pushNewBuffer(buffer) == GST_FLOW_OK;
}
void MediaSourceClientGStreamerMSE::markEndOfStream(MediaSourcePrivate::EndOfStreamStatus status)
{
ASSERT(WTF::isMainThread());
if (!m_playerPrivate)
return;
m_playerPrivate->markEndOfStream(status);
}
void MediaSourceClientGStreamerMSE::removedFromMediaSource(RefPtr<SourceBufferPrivateGStreamer> sourceBufferPrivate)
{
ASSERT(WTF::isMainThread());
if (!m_playerPrivate)
return;
ASSERT(m_playerPrivate->m_playbackPipeline);
RefPtr<AppendPipeline> appendPipeline = m_playerPrivate->m_appendPipelinesMap.get(sourceBufferPrivate);
ASSERT(appendPipeline);
appendPipeline->clearPlayerPrivate();
m_playerPrivate->m_appendPipelinesMap.remove(sourceBufferPrivate);
m_playerPrivate->m_playbackPipeline->removeSourceBuffer(sourceBufferPrivate);
}
void MediaSourceClientGStreamerMSE::flush(AtomicString trackId)
{
ASSERT(WTF::isMainThread());
if (m_playerPrivate)
m_playerPrivate->m_playbackPipeline->flush(trackId);
}
void MediaSourceClientGStreamerMSE::enqueueSample(PassRefPtr<MediaSample> prpSample)
{
ASSERT(WTF::isMainThread());
if (m_playerPrivate)
m_playerPrivate->m_playbackPipeline->enqueueSample(prpSample);
}
GRefPtr<WebKitMediaSrc> MediaSourceClientGStreamerMSE::webKitMediaSrc()
{
ASSERT(WTF::isMainThread());
if (!m_playerPrivate)
return nullptr;
WebKitMediaSrc* source = WEBKIT_MEDIA_SRC(m_playerPrivate->m_source.get());
ASSERT(WEBKIT_IS_MEDIA_SRC(source));
return source;
}
void MediaSourceClientGStreamerMSE::clearPlayerPrivate()
{
ASSERT(WTF::isMainThread());
m_playerPrivate = nullptr;
}
}
#endif // USE(GSTREAMER)