зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1208371 - Hook up DecodedStream with PrincipalHandle. r=mt,jwwang
MozReview-Commit-ID: 1LmiFyfjhsr --HG-- extra : rebase_source : e1ceca65cd1f5ff64ab6fff8fafc1ddd08f44b87
This commit is contained in:
Родитель
ddd2ef4974
Коммит
e1b8d01dd1
|
@ -556,6 +556,8 @@ MediaDecoder::MediaDecoder(MediaDecoderOwner* aOwner)
|
|||
"MediaDecoder::mLogicallySeeking (Canonical)")
|
||||
, mSameOriginMedia(AbstractThread::MainThread(), false,
|
||||
"MediaDecoder::mSameOriginMedia (Canonical)")
|
||||
, mMediaPrincipalHandle(AbstractThread::MainThread(), PRINCIPAL_HANDLE_NONE,
|
||||
"MediaDecoder::mMediaPrincipalHandle (Canonical)")
|
||||
, mPlaybackBytesPerSecond(AbstractThread::MainThread(), 0.0,
|
||||
"MediaDecoder::mPlaybackBytesPerSecond (Canonical)")
|
||||
, mPlaybackRateReliable(AbstractThread::MainThread(), true,
|
||||
|
@ -1195,6 +1197,8 @@ MediaDecoder::NotifyPrincipalChanged()
|
|||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MOZ_ASSERT(!mShuttingDown);
|
||||
nsCOMPtr<nsIPrincipal> newPrincipal = GetCurrentPrincipal();
|
||||
mMediaPrincipalHandle = MakePrincipalHandle(newPrincipal);
|
||||
mOwner->NotifyDecoderPrincipalChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -782,6 +782,10 @@ protected:
|
|||
// passed to MediaStreams when this is true.
|
||||
Canonical<bool> mSameOriginMedia;
|
||||
|
||||
// An identifier for the principal of the media. Used to track when
|
||||
// main-thread induced principal changes get reflected on MSG thread.
|
||||
Canonical<PrincipalHandle> mMediaPrincipalHandle;
|
||||
|
||||
// Estimate of the current playback rate (bytes/second).
|
||||
Canonical<double> mPlaybackBytesPerSecond;
|
||||
|
||||
|
@ -829,6 +833,9 @@ public:
|
|||
AbstractCanonical<bool>* CanonicalSameOriginMedia() {
|
||||
return &mSameOriginMedia;
|
||||
}
|
||||
AbstractCanonical<PrincipalHandle>* CanonicalMediaPrincipalHandle() {
|
||||
return &mMediaPrincipalHandle;
|
||||
}
|
||||
AbstractCanonical<double>* CanonicalPlaybackBytesPerSecond() {
|
||||
return &mPlaybackBytesPerSecond;
|
||||
}
|
||||
|
|
|
@ -267,6 +267,8 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
|
|||
"MediaDecoderStateMachine::mPreservesPitch (Mirror)"),
|
||||
mSameOriginMedia(mTaskQueue, false,
|
||||
"MediaDecoderStateMachine::mSameOriginMedia (Mirror)"),
|
||||
mMediaPrincipalHandle(mTaskQueue, PRINCIPAL_HANDLE_NONE,
|
||||
"MediaDecoderStateMachine::mMediaPrincipalHandle (Mirror)"),
|
||||
mPlaybackBytesPerSecond(mTaskQueue, 0.0,
|
||||
"MediaDecoderStateMachine::mPlaybackBytesPerSecond (Mirror)"),
|
||||
mPlaybackRateReliable(mTaskQueue, true,
|
||||
|
@ -355,6 +357,7 @@ MediaDecoderStateMachine::InitializationTask(MediaDecoder* aDecoder)
|
|||
mLogicalPlaybackRate.Connect(aDecoder->CanonicalPlaybackRate());
|
||||
mPreservesPitch.Connect(aDecoder->CanonicalPreservesPitch());
|
||||
mSameOriginMedia.Connect(aDecoder->CanonicalSameOriginMedia());
|
||||
mMediaPrincipalHandle.Connect(aDecoder->CanonicalMediaPrincipalHandle());
|
||||
mPlaybackBytesPerSecond.Connect(aDecoder->CanonicalPlaybackBytesPerSecond());
|
||||
mPlaybackRateReliable.Connect(aDecoder->CanonicalPlaybackRateReliable());
|
||||
mDecoderPosition.Connect(aDecoder->CanonicalDecoderPosition());
|
||||
|
@ -394,7 +397,8 @@ MediaDecoderStateMachine::CreateMediaSink(bool aAudioCaptured)
|
|||
{
|
||||
RefPtr<media::MediaSink> audioSink = aAudioCaptured
|
||||
? new DecodedStream(mTaskQueue, mAudioQueue, mVideoQueue,
|
||||
mOutputStreamManager, mSameOriginMedia.Ref())
|
||||
mOutputStreamManager, mSameOriginMedia.Ref(),
|
||||
mMediaPrincipalHandle.Ref())
|
||||
: CreateAudioSink();
|
||||
|
||||
RefPtr<media::MediaSink> mediaSink =
|
||||
|
@ -2154,6 +2158,7 @@ MediaDecoderStateMachine::FinishShutdown()
|
|||
mLogicalPlaybackRate.DisconnectIfConnected();
|
||||
mPreservesPitch.DisconnectIfConnected();
|
||||
mSameOriginMedia.DisconnectIfConnected();
|
||||
mMediaPrincipalHandle.DisconnectIfConnected();
|
||||
mPlaybackBytesPerSecond.DisconnectIfConnected();
|
||||
mPlaybackRateReliable.DisconnectIfConnected();
|
||||
mDecoderPosition.DisconnectIfConnected();
|
||||
|
|
|
@ -1087,6 +1087,10 @@ private:
|
|||
// passed to MediaStreams when this is true.
|
||||
Mirror<bool> mSameOriginMedia;
|
||||
|
||||
// An identifier for the principal of the media. Used to track when
|
||||
// main-thread induced principal changes get reflected on MSG thread.
|
||||
Mirror<PrincipalHandle> mMediaPrincipalHandle;
|
||||
|
||||
// Estimate of the current playback rate (bytes/second).
|
||||
Mirror<double> mPlaybackBytesPerSecond;
|
||||
|
||||
|
|
|
@ -211,11 +211,13 @@ DecodedStream::DecodedStream(AbstractThread* aOwnerThread,
|
|||
MediaQueue<MediaData>& aAudioQueue,
|
||||
MediaQueue<MediaData>& aVideoQueue,
|
||||
OutputStreamManager* aOutputStreamManager,
|
||||
const bool& aSameOrigin)
|
||||
const bool& aSameOrigin,
|
||||
const PrincipalHandle& aPrincipalHandle)
|
||||
: mOwnerThread(aOwnerThread)
|
||||
, mOutputStreamManager(aOutputStreamManager)
|
||||
, mPlaying(false)
|
||||
, mSameOrigin(aSameOrigin)
|
||||
, mPrincipalHandle(aPrincipalHandle)
|
||||
, mAudioQueue(aAudioQueue)
|
||||
, mVideoQueue(aVideoQueue)
|
||||
{
|
||||
|
@ -401,7 +403,8 @@ DecodedStream::SetPreservesPitch(bool aPreservesPitch)
|
|||
|
||||
static void
|
||||
SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
|
||||
MediaData* aData, AudioSegment* aOutput, uint32_t aRate)
|
||||
MediaData* aData, AudioSegment* aOutput, uint32_t aRate,
|
||||
const PrincipalHandle& aPrincipalHandle)
|
||||
{
|
||||
// The amount of audio frames that is used to fuzz rounding errors.
|
||||
static const int64_t AUDIO_FUZZ_FRAMES = 1;
|
||||
|
@ -440,14 +443,15 @@ SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
|
|||
for (uint32_t i = 0; i < audio->mChannels; ++i) {
|
||||
channels.AppendElement(bufferData + i * audio->mFrames);
|
||||
}
|
||||
aOutput->AppendFrames(buffer.forget(), channels, audio->mFrames, PRINCIPAL_HANDLE_NONE /* Fixed in later patch */);
|
||||
aOutput->AppendFrames(buffer.forget(), channels, audio->mFrames, aPrincipalHandle);
|
||||
aStream->mAudioFramesWritten += audio->mFrames;
|
||||
|
||||
aStream->mNextAudioTime = audio->GetEndTime();
|
||||
}
|
||||
|
||||
void
|
||||
DecodedStream::SendAudio(double aVolume, bool aIsSameOrigin)
|
||||
DecodedStream::SendAudio(double aVolume, bool aIsSameOrigin,
|
||||
const PrincipalHandle& aPrincipalHandle)
|
||||
{
|
||||
AssertOwnerThread();
|
||||
|
||||
|
@ -465,7 +469,8 @@ DecodedStream::SendAudio(double aVolume, bool aIsSameOrigin)
|
|||
// is ref-counted.
|
||||
mAudioQueue.GetElementsAfter(mData->mNextAudioTime, &audio);
|
||||
for (uint32_t i = 0; i < audio.Length(); ++i) {
|
||||
SendStreamAudio(mData.get(), mStartTime.ref(), audio[i], &output, rate);
|
||||
SendStreamAudio(mData.get(), mStartTime.ref(), audio[i], &output, rate,
|
||||
aPrincipalHandle);
|
||||
}
|
||||
|
||||
output.ApplyVolume(aVolume);
|
||||
|
@ -493,13 +498,14 @@ WriteVideoToMediaStream(MediaStream* aStream,
|
|||
int64_t aEndMicroseconds,
|
||||
int64_t aStartMicroseconds,
|
||||
const mozilla::gfx::IntSize& aIntrinsicSize,
|
||||
VideoSegment* aOutput)
|
||||
VideoSegment* aOutput,
|
||||
const PrincipalHandle& aPrincipalHandle)
|
||||
{
|
||||
RefPtr<layers::Image> image = aImage;
|
||||
StreamTime duration =
|
||||
aStream->MicrosecondsToStreamTimeRoundDown(aEndMicroseconds) -
|
||||
aStream->MicrosecondsToStreamTimeRoundDown(aStartMicroseconds);
|
||||
aOutput->AppendFrame(image.forget(), duration, aIntrinsicSize, PRINCIPAL_HANDLE_NONE /* Fixed in later patch */);
|
||||
aOutput->AppendFrame(image.forget(), duration, aIntrinsicSize, aPrincipalHandle);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -514,7 +520,7 @@ ZeroDurationAtLastChunk(VideoSegment& aInput)
|
|||
}
|
||||
|
||||
void
|
||||
DecodedStream::SendVideo(bool aIsSameOrigin)
|
||||
DecodedStream::SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle)
|
||||
{
|
||||
AssertOwnerThread();
|
||||
|
||||
|
@ -545,13 +551,14 @@ DecodedStream::SendVideo(bool aIsSameOrigin)
|
|||
// and capture happens at 15 sec, we'll have to append a black frame
|
||||
// that is 15 sec long.
|
||||
WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage, v->mTime,
|
||||
mData->mNextVideoTime, mData->mLastVideoImageDisplaySize, &output);
|
||||
mData->mNextVideoTime, mData->mLastVideoImageDisplaySize, &output,
|
||||
aPrincipalHandle);
|
||||
mData->mNextVideoTime = v->mTime;
|
||||
}
|
||||
|
||||
if (mData->mNextVideoTime < v->GetEndTime()) {
|
||||
WriteVideoToMediaStream(sourceStream, v->mImage,
|
||||
v->GetEndTime(), mData->mNextVideoTime, v->mDisplay, &output);
|
||||
WriteVideoToMediaStream(sourceStream, v->mImage, v->GetEndTime(),
|
||||
mData->mNextVideoTime, v->mDisplay, &output, aPrincipalHandle);
|
||||
mData->mNextVideoTime = v->GetEndTime();
|
||||
mData->mLastVideoImage = v->mImage;
|
||||
mData->mLastVideoImageDisplaySize = v->mDisplay;
|
||||
|
@ -578,7 +585,7 @@ DecodedStream::SendVideo(bool aIsSameOrigin)
|
|||
int64_t deviation_usec = sourceStream->StreamTimeToMicroseconds(1);
|
||||
WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage,
|
||||
mData->mNextVideoTime + deviation_usec, mData->mNextVideoTime,
|
||||
mData->mLastVideoImageDisplaySize, &endSegment);
|
||||
mData->mLastVideoImageDisplaySize, &endSegment, aPrincipalHandle);
|
||||
mData->mNextVideoTime += deviation_usec;
|
||||
MOZ_ASSERT(endSegment.GetDuration() > 0);
|
||||
if (!aIsSameOrigin) {
|
||||
|
@ -631,8 +638,8 @@ DecodedStream::SendData()
|
|||
return;
|
||||
}
|
||||
|
||||
SendAudio(mParams.mVolume, mSameOrigin);
|
||||
SendVideo(mSameOrigin);
|
||||
SendAudio(mParams.mVolume, mSameOrigin, mPrincipalHandle);
|
||||
SendVideo(mSameOrigin, mPrincipalHandle);
|
||||
AdvanceTracks();
|
||||
|
||||
bool finished = (!mInfo.HasAudio() || mAudioQueue.IsFinished()) &&
|
||||
|
|
|
@ -37,7 +37,8 @@ public:
|
|||
MediaQueue<MediaData>& aAudioQueue,
|
||||
MediaQueue<MediaData>& aVideoQueue,
|
||||
OutputStreamManager* aOutputStreamManager,
|
||||
const bool& aSameOrigin);
|
||||
const bool& aSameOrigin,
|
||||
const PrincipalHandle& aPrincipalHandle);
|
||||
|
||||
// MediaSink functions.
|
||||
const PlaybackParams& GetPlaybackParams() const override;
|
||||
|
@ -68,8 +69,8 @@ protected:
|
|||
private:
|
||||
void DestroyData(UniquePtr<DecodedStreamData> aData);
|
||||
void AdvanceTracks();
|
||||
void SendAudio(double aVolume, bool aIsSameOrigin);
|
||||
void SendVideo(bool aIsSameOrigin);
|
||||
void SendAudio(double aVolume, bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
|
||||
void SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
|
||||
void SendData();
|
||||
|
||||
void AssertOwnerThread() const {
|
||||
|
@ -95,6 +96,8 @@ private:
|
|||
|
||||
bool mPlaying;
|
||||
const bool& mSameOrigin; // valid until Shutdown() is called.
|
||||
const PrincipalHandle& mPrincipalHandle; // valid until Shutdown() is called.
|
||||
|
||||
PlaybackParams mParams;
|
||||
|
||||
Maybe<int64_t> mStartTime;
|
||||
|
|
Загрузка…
Ссылка в новой задаче