gecko/content/media/nsDOMMediaStream.h
Robert O'Callahan 727fa86a21 Bug 779715. Part 6: Rework capturing MediaStreams from media elements to use TrackUnionStreams. r=cpearce,jesup
Moves to a new setup where a decoder manages a single SourceMediaStream internally. Each stream
returned from mozCaptureStream(UntilEnded) is a TrackUnionStream which is fed by the
decoder's SourceMediaStream.
We want the captured streams to be blocked while the media element is not playing. We do that
by blocking any captured stream that has no SourceMediaStream feeding into it, and blocking
any SourceMediaStream while its decoder is not playing.
We arrange for the decoders's PlaybackEnded to be delayed until its SourceMediaStream has
finished according to the media stream graph. This ensures the state of captured media streams
corresponds more closely to the media element state.

--HG--
extra : rebase_source : 3324ff0e9bdce9c71a23c0f5f2032815e9046081
2012-08-01 00:17:22 +12:00

73 lines
2.4 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
/* 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 NSDOMMEDIASTREAM_H_
#define NSDOMMEDIASTREAM_H_
#include "nsIDOMMediaStream.h"
#include "MediaStreamGraph.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIPrincipal.h"
// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
// GetTickCount() and conflicts with NS_DECL_NSIDOMMEDIASTREAM, containing
// currentTime getter.
#ifdef GetCurrentTime
#undef GetCurrentTime
#endif
/**
* DOM wrapper for MediaStreams.
*/
class nsDOMMediaStream : public nsIDOMMediaStream
{
typedef mozilla::MediaStream MediaStream;
public:
nsDOMMediaStream() : mStream(nullptr) {}
virtual ~nsDOMMediaStream();
NS_DECL_CYCLE_COLLECTION_CLASS(nsDOMMediaStream)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSIDOMMEDIASTREAM
MediaStream* GetStream() { return mStream; }
bool IsFinished() { return !mStream || mStream->IsFinished(); }
/**
* Returns a principal indicating who may access this stream. The stream contents
* can only be accessed by principals subsuming this principal.
*/
nsIPrincipal* GetPrincipal() { return mPrincipal; }
/**
* Indicate that data will be contributed to this stream from origin aPrincipal.
* If aPrincipal is null, this is ignored. Otherwise, from now on the contents
* of this stream can only be accessed by principals that subsume aPrincipal.
* Returns true if the stream's principal changed.
*/
bool CombineWithPrincipal(nsIPrincipal* aPrincipal);
/**
* Create an nsDOMMediaStream whose underlying stream is a SourceMediaStream.
*/
static already_AddRefed<nsDOMMediaStream> CreateInputStream();
/**
* Create an nsDOMMediaStream whose underlying stream is a TrackUnionStream.
*/
static already_AddRefed<nsDOMMediaStream> CreateTrackUnionStream();
protected:
// MediaStream is owned by the graph, but we tell it when to die, and it won't
// die until we let it.
MediaStream* mStream;
// Principal identifying who may access the contents of this stream.
// If null, this stream can be used by anyone because it has no content yet.
nsCOMPtr<nsIPrincipal> mPrincipal;
};
#endif /* NSDOMMEDIASTREAM_H_ */