gecko-dev/dom/media/mediasource/SourceBufferList.h
Chris Double d37876d9b3 Bug 1065215 - MSE endOfStream() called within an 'updateend' event can fail with 'object no longer usable' - r=karlt
Reopens the MediaSource when SourceBuffer::Remove is called on an Ended
MediaSource. Only run the Range Removal algorithm when MediaSource
duration is changed instead of calling Remove on SourceBuffers.
Updates tests for the fact that update{start,end} can now be called
more than once due to DurationChange.

--HG--
extra : rebase_source : d4c96b982ffa9f5cd0b24e6e3a4ef5dffe9be6f6
2014-11-19 17:16:41 +13:00

100 lines
2.7 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_SourceBufferList_h_
#define mozilla_dom_SourceBufferList_h_
#include "SourceBuffer.h"
#include "js/RootingAPI.h"
#include "mozilla/Assertions.h"
#include "mozilla/Attributes.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "nsCycleCollectionNoteChild.h"
#include "nsCycleCollectionParticipant.h"
#include "nsISupports.h"
#include "nsTArray.h"
struct JSContext;
class JSObject;
namespace mozilla {
class ErrorResult;
template <typename T> class AsyncEventRunner;
namespace dom {
class MediaSource;
class SourceBufferList MOZ_FINAL : public DOMEventTargetHelper
{
public:
/** WebIDL Methods. */
SourceBuffer* IndexedGetter(uint32_t aIndex, bool& aFound);
uint32_t Length();
/** End WebIDL methods. */
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBufferList,
DOMEventTargetHelper)
explicit SourceBufferList(MediaSource* aMediaSource);
MediaSource* GetParentObject() const;
JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
// Append a SourceBuffer and fire "addsourcebuffer" at the list.
void Append(SourceBuffer* aSourceBuffer);
// Remove a SourceBuffer and fire "removesourcebuffer" at the list.
void Remove(SourceBuffer* aSourceBuffer);
// Returns true if aSourceBuffer is present in the list.
bool Contains(SourceBuffer* aSourceBuffer);
// Remove all SourceBuffers and fire a single "removesourcebuffer" at the list.
void Clear();
// True if list has zero entries.
bool IsEmpty();
// Returns true if updating is true on any SourceBuffers in the list.
bool AnyUpdating();
// Runs the range removal steps from the MSE specification on each SourceBuffer.
void RangeRemoval(double aStart, double aEnd);
// Mark all SourceBuffers input buffers as ended.
void Ended();
// Evicts data for the given time range from each SourceBuffer in the list.
void Evict(double aStart, double aEnd);
// Returns the highest end time of any of the Sourcebuffers.
double GetHighestBufferedEndTime();
#if defined(DEBUG)
void Dump(const char* aPath);
#endif
private:
~SourceBufferList();
friend class AsyncEventRunner<SourceBufferList>;
void DispatchSimpleEvent(const char* aName);
void QueueAsyncSimpleEvent(const char* aName);
nsRefPtr<MediaSource> mMediaSource;
nsTArray<nsRefPtr<SourceBuffer> > mSourceBuffers;
};
} // namespace dom
} // namespace mozilla
#endif /* mozilla_dom_SourceBufferList_h_ */