#ifndef MediaSourceBase_h
#define MediaSourceBase_h
#include "core/dom/ActiveDOMObject.h"
#include "core/events/EventTarget.h"
#include "core/html/HTMLMediaSource.h"
#include "core/html/URLRegistry.h"
#include "public/platform/WebMediaSource.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/Vector.h"
namespace blink {
class WebSourceBuffer;
}
namespace WebCore {
class ExceptionState;
class GenericEventQueue;
class MediaSourceBase : public RefCountedWillBeRefCountedGarbageCollected<MediaSourceBase>, public HTMLMediaSource, public ActiveDOMObject, public EventTargetWithInlineData {
DEFINE_EVENT_TARGET_REFCOUNTING(RefCountedWillBeRefCountedGarbageCollected<MediaSourceBase>);
public:
static const AtomicString& openKeyword();
static const AtomicString& closedKeyword();
static const AtomicString& endedKeyword();
virtual ~MediaSourceBase();
void addedToRegistry();
void removedFromRegistry();
void openIfInEndedState();
bool isOpen() const;
virtual bool attachToElement(HTMLMediaElement*) OVERRIDE FINAL;
virtual void setWebMediaSourceAndOpen(PassOwnPtr<blink::WebMediaSource>) OVERRIDE FINAL;
virtual void close() OVERRIDE FINAL;
virtual bool isClosed() const OVERRIDE FINAL;
virtual double duration() const OVERRIDE FINAL;
virtual PassRefPtr<TimeRanges> buffered() const OVERRIDE FINAL;
virtual void refHTMLMediaSource() OVERRIDE FINAL { ref(); }
virtual void derefHTMLMediaSource() OVERRIDE FINAL { deref(); }
void setDuration(double, ExceptionState&);
const AtomicString& readyState() const { return m_readyState; }
void setReadyState(const AtomicString&);
void endOfStream(const AtomicString& error, ExceptionState&);
void endOfStream(ExceptionState&);
virtual bool hasPendingActivity() const OVERRIDE FINAL;
virtual void stop() OVERRIDE FINAL;
virtual ExecutionContext* executionContext() const OVERRIDE FINAL;
virtual URLRegistry& registry() const OVERRIDE FINAL;
virtual void trace(Visitor*) { }
protected:
explicit MediaSourceBase(ExecutionContext*);
virtual void onReadyStateChange(const AtomicString& oldState, const AtomicString& newState) = 0;
virtual Vector<RefPtr<TimeRanges> > activeRanges() const = 0;
virtual bool isUpdating() const = 0;
PassOwnPtr<blink::WebSourceBuffer> createWebSourceBuffer(const String& type, const Vector<String>& codecs, ExceptionState&);
void scheduleEvent(const AtomicString& eventName);
GenericEventQueue* asyncEventQueue() const { return m_asyncEventQueue.get(); }
private:
void endOfStreamInternal(const blink::WebMediaSource::EndOfStreamStatus, ExceptionState&);
OwnPtr<blink::WebMediaSource> m_webMediaSource;
AtomicString m_readyState;
OwnPtr<GenericEventQueue> m_asyncEventQueue;
HTMLMediaElement* m_attachedElement;
};
}
#endif