MediaPlayerPrivateGStreamer.h [plain text]
#ifndef MediaPlayerPrivateGStreamer_h
#define MediaPlayerPrivateGStreamer_h
#if ENABLE(VIDEO) && USE(GSTREAMER)
#include "GRefPtrGStreamer.h"
#include "MediaPlayerPrivateGStreamerBase.h"
#include "Timer.h"
#include <glib.h>
#include <gst/gst.h>
#include <gst/pbutils/install-plugins.h>
#include <wtf/Forward.h>
#include <wtf/glib/GThreadSafeMainLoopSource.h>
#if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
#include <wtf/text/AtomicStringHash.h>
#endif
#if ENABLE(MEDIA_SOURCE)
#include "MediaSourceGStreamer.h"
#endif
typedef struct _GstBuffer GstBuffer;
typedef struct _GstMessage GstMessage;
typedef struct _GstElement GstElement;
typedef struct _GstMpegtsSection GstMpegtsSection;
namespace WebCore {
#if ENABLE(WEB_AUDIO)
class AudioSourceProvider;
class AudioSourceProviderGStreamer;
#endif
class AudioTrackPrivateGStreamer;
class InbandMetadataTextTrackPrivateGStreamer;
class InbandTextTrackPrivateGStreamer;
class VideoTrackPrivateGStreamer;
class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
public:
explicit MediaPlayerPrivateGStreamer(MediaPlayer*);
~MediaPlayerPrivateGStreamer();
static void registerMediaEngine(MediaEngineRegistrar);
gboolean handleMessage(GstMessage*);
void handlePluginInstallerResult(GstInstallPluginsReturn);
bool hasVideo() const override { return m_hasVideo; }
bool hasAudio() const override { return m_hasAudio; }
void load(const String &url) override;
#if ENABLE(MEDIA_SOURCE)
void load(const String& url, MediaSourcePrivateClient*) override;
#endif
#if ENABLE(MEDIA_STREAM)
void load(MediaStreamPrivate*) override;
#endif
void commitLoad();
void cancelLoad() override;
void prepareToPlay() override;
void play() override;
void pause() override;
bool paused() const override;
bool seeking() const override;
float duration() const override;
float currentTime() const override;
void seek(float) override;
void setRate(float) override;
double rate() const override;
void setPreservesPitch(bool) override;
void setPreload(MediaPlayer::Preload) override;
void fillTimerFired();
std::unique_ptr<PlatformTimeRanges> buffered() const override;
float maxTimeSeekable() const override;
bool didLoadingProgress() const override;
unsigned long long totalBytes() const override;
float maxTimeLoaded() const override;
void loadStateChanged();
void timeChanged();
void didEnd();
void durationChanged();
void loadingFailed(MediaPlayer::NetworkState);
void videoChanged();
void videoCapsChanged();
void audioChanged();
void notifyPlayerOfVideo();
void notifyPlayerOfVideoCaps();
void notifyPlayerOfAudio();
#if ENABLE(VIDEO_TRACK)
void textChanged();
void notifyPlayerOfText();
void newTextSample();
void notifyPlayerOfNewTextSample();
#endif
void sourceChanged();
GstElement* audioSink() const override;
void setAudioStreamProperties(GObject*);
void simulateAudioInterruption() override;
bool changePipelineState(GstState);
#if ENABLE(WEB_AUDIO)
AudioSourceProvider* audioSourceProvider() override { return reinterpret_cast<AudioSourceProvider*>(m_audioSourceProvider.get()); }
#endif
private:
static void getSupportedTypes(HashSet<String>&);
static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
static bool isAvailable();
GstElement* createAudioSink() override;
float playbackPosition() const;
void cacheDuration();
void updateStates();
void asyncStateChangeDone();
void createGSTPlayBin();
bool loadNextLocation();
void mediaLocationChanged(GstMessage*);
void setDownloadBuffering();
void processBufferingStats(GstMessage*);
#if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
void processMpegTsSection(GstMpegtsSection*);
#endif
#if ENABLE(VIDEO_TRACK)
void processTableOfContents(GstMessage*);
void processTableOfContentsEntry(GstTocEntry*, GstTocEntry* parent);
#endif
bool doSeek(gint64 position, float rate, GstSeekFlags seekType);
void updatePlaybackRate();
String engineDescription() const override { return "GStreamer"; }
bool isLiveStream() const override { return m_isStreaming; }
bool didPassCORSAccessCheck() const override;
bool canSaveMediaData() const override;
#if ENABLE(MEDIA_SOURCE)
unsigned long totalVideoFrames() override { return 0; }
unsigned long droppedVideoFrames() override { return 0; }
unsigned long corruptedVideoFrames() override { return 0; }
MediaTime totalFrameDelay() override { return MediaTime::zeroTime(); }
#endif
private:
GRefPtr<GstElement> m_source;
#if ENABLE(VIDEO_TRACK)
GRefPtr<GstElement> m_textAppSink;
GRefPtr<GstPad> m_textAppSinkPad;
#endif
float m_seekTime;
bool m_changingRate;
float m_endTime;
bool m_isEndReached;
mutable bool m_isStreaming;
GstStructure* m_mediaLocations;
int m_mediaLocationCurrentIndex;
bool m_resetPipeline;
bool m_paused;
bool m_playbackRatePause;
bool m_seeking;
bool m_seekIsPending;
float m_timeOfOverlappingSeek;
bool m_canFallBackToLastFinishedSeekPosition;
bool m_buffering;
float m_playbackRate;
float m_lastPlaybackRate;
bool m_errorOccured;
mutable gfloat m_mediaDuration;
bool m_downloadFinished;
Timer m_fillTimer;
float m_maxTimeLoaded;
int m_bufferingPercentage;
MediaPlayer::Preload m_preload;
bool m_delayingLoad;
bool m_mediaDurationKnown;
mutable float m_maxTimeLoadedAtLastDidLoadingProgress;
bool m_volumeAndMuteInitialized;
bool m_hasVideo;
bool m_hasAudio;
GThreadSafeMainLoopSource m_audioTimerHandler;
GThreadSafeMainLoopSource m_textTimerHandler;
GThreadSafeMainLoopSource m_videoTimerHandler;
GThreadSafeMainLoopSource m_videoCapsTimerHandler;
GThreadSafeMainLoopSource m_readyTimerHandler;
mutable unsigned long long m_totalBytes;
URL m_url;
bool m_preservesPitch;
#if ENABLE(WEB_AUDIO)
std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
#endif
GstState m_requestedState;
GRefPtr<GstElement> m_autoAudioSink;
bool m_missingPlugins;
#if ENABLE(VIDEO_TRACK)
Vector<RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
Vector<RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
Vector<RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
#endif
#if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
HashMap<AtomicString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
#endif
#if ENABLE(MEDIA_SOURCE)
RefPtr<MediaSourcePrivateClient> m_mediaSource;
bool isMediaSource() const { return m_mediaSource; }
#else
bool isMediaSource() const { return false; }
#endif
};
}
#endif // USE(GSTREAMER)
#endif