void MediaDecoder::AddOutputStream(ProcessedMediaStream* aStream, bool aFinishWhenEnded) { MOZ_ASSERT(NS_IsMainThread()); LOG(PR_LOG_DEBUG, ("MediaDecoder::AddOutputStream this=%p aStream=%p!", this, aStream)); { ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); if (!mDecodedStream) { RecreateDecodedStream(mDecoderStateMachine ? int64_t(mDecoderStateMachine->GetCurrentTime()*USECS_PER_S) : 0); } OutputStreamData* os = mOutputStreams.AppendElement(); os->Init(aStream, aFinishWhenEnded); ConnectDecodedStreamToOutputStream(os); if (aFinishWhenEnded) { // Ensure that aStream finishes the moment mDecodedStream does. aStream->SetAutofinish(true); } } // This can be called before Load(), in which case our mDecoderStateMachine // won't have been created yet and we can rely on Load() to schedule it // once it is created. if (mDecoderStateMachine) { // Make sure the state machine thread runs so that any buffered data // is fed into our stream. ScheduleStateMachineThread(); } }
void DecodedStream::Connect(ProcessedMediaStream* aStream, bool aFinishWhenEnded) { MOZ_ASSERT(NS_IsMainThread()); GetReentrantMonitor().AssertCurrentThreadIn(); OutputStreamData* os = OutputStreams().AppendElement(); os->Init(this, aStream); Connect(os); if (aFinishWhenEnded) { // Ensure that aStream finishes the moment mDecodedStream does. aStream->SetAutofinish(true); } }
void OutputStreamManager::Add(ProcessedMediaStream* aStream, bool aFinishWhenEnded) { MOZ_ASSERT(NS_IsMainThread()); // All streams must belong to the same graph. MOZ_ASSERT(!Graph() || Graph() == aStream->Graph()); // Ensure that aStream finishes the moment mDecodedStream does. if (aFinishWhenEnded) { aStream->SetAutofinish(true); } OutputStreamData* p = mStreams.AppendElement(); p->Init(this, aStream); // Connect to the input stream if we have one. Otherwise the output stream // will be connected in Connect(). if (mInputStream) { p->Connect(mInputStream); } }