Bug 1219142. Part 1 - add AbstractMediaDecoder::DataArrivedEvent() to publish events. r=jya.

This commit is contained in:
JW Wang 2015-11-18 09:00:56 +08:00
Родитель 26b0d282a5
Коммит fbb85ac25a
5 изменённых файлов: 29 добавлений и 2 удалений

Просмотреть файл

@ -10,6 +10,7 @@
#include "mozilla/Attributes.h"
#include "mozilla/StateMirroring.h"
#include "MediaEventSource.h"
#include "MediaInfo.h"
#include "nsISupports.h"
#include "nsDataHashtable.h"
@ -68,6 +69,15 @@ public:
virtual AbstractCanonical<media::NullableTimeUnit>* CanonicalDurationOrNull() { return nullptr; };
// Return an event that will be notified when data arrives in MediaResource.
// MediaDecoderReader will register with this event to receive notifications
// in order to udpate buffer ranges.
// Return null if this decoder doesn't support the event.
virtual MediaEventSource<void>* DataArrivedEvent()
{
return nullptr;
}
protected:
virtual void UpdateEstimatedMediaDuration(int64_t aDuration) {};
public:

Просмотреть файл

@ -1447,10 +1447,13 @@ void
MediaDecoder::NotifyDataArrived() {
MOZ_ASSERT(NS_IsMainThread());
if (mDecoderStateMachine) {
mDecoderStateMachine->DispatchNotifyDataArrived();
// Don't publish events since task queues might be shutting down.
if (mShuttingDown) {
return;
}
mDataArrivedEvent.Notify();
// ReadyState computation depends on MediaDecoder::CanPlayThrough, which
// depends on the download rate.
UpdateReadyState();

Просмотреть файл

@ -820,6 +820,11 @@ protected:
RefPtr<MediaResource> mResource;
private:
MediaEventSource<void>*
DataArrivedEvent() override { return &mDataArrivedEvent; }
MediaEventProducer<void> mDataArrivedEvent;
// The state machine object for handling the decoding. It is safe to
// call methods of this object from other threads. Its internal data
// is synchronised on a monitor. The lifetime of this object is

Просмотреть файл

@ -79,6 +79,11 @@ MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder)
MOZ_COUNT_CTOR(MediaDecoderReader);
MOZ_ASSERT(NS_IsMainThread());
if (mDecoder && mDecoder->DataArrivedEvent()) {
mDataArrivedListener = mDecoder->DataArrivedEvent()->Connect(
mTaskQueue, this, &MediaDecoderReader::NotifyDataArrived);
}
// Dispatch initialization that needs to happen on that task queue.
nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethod(this, &MediaDecoderReader::InitializationTask);
mTaskQueue->Dispatch(r.forget());
@ -360,6 +365,8 @@ MediaDecoderReader::Shutdown()
mBaseAudioPromise.RejectIfExists(END_OF_STREAM, __func__);
mBaseVideoPromise.RejectIfExists(END_OF_STREAM, __func__);
mDataArrivedListener.DisconnectIfExists();
ReleaseMediaResources();
mDuration.DisconnectIfConnected();
mBuffered.DisconnectAll();

Просмотреть файл

@ -428,6 +428,8 @@ private:
// "discontinuity" in the stream. For example after a seek.
bool mAudioDiscontinuity;
bool mVideoDiscontinuity;
MediaEventListener mDataArrivedListener;
};
} // namespace mozilla