void DecodedStream::InitTracks() { AssertOwnerThread(); if (mData->mStreamInitialized) { return; } SourceMediaStream* sourceStream = mData->mStream; if (mInfo.HasAudio()) { TrackID audioTrackId = mInfo.mAudio.mTrackId; AudioSegment* audio = new AudioSegment(); sourceStream->AddAudioTrack(audioTrackId, mInfo.mAudio.mRate, 0, audio, SourceMediaStream::ADDTRACK_QUEUED); mData->mNextAudioTime = mStartTime.ref(); } if (mInfo.HasVideo()) { TrackID videoTrackId = mInfo.mVideo.mTrackId; VideoSegment* video = new VideoSegment(); sourceStream->AddTrack(videoTrackId, 0, video, SourceMediaStream::ADDTRACK_QUEUED); mData->mNextVideoTime = mStartTime.ref(); } sourceStream->FinishAddTracks(); mData->mStreamInitialized = true; }
void DOMHwMediaStream::Init(MediaStream* stream) { SourceMediaStream* srcStream = stream->AsSourceStream(); if (srcStream) { VideoSegment segment; #ifdef MOZ_WIDGET_GONK const StreamTime delta = STREAM_TIME_MAX; // Because MediaStreamGraph will run out frames in non-autoplay mode, // we must give it bigger frame length to cover this situation. mImageData.mOverlayId = DEFAULT_IMAGE_ID; mImageData.mSize.width = DEFAULT_IMAGE_WIDTH; mImageData.mSize.height = DEFAULT_IMAGE_HEIGHT; mOverlayImage->SetData(mImageData); RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get()); mozilla::gfx::IntSize size = image->GetSize(); segment.AppendFrame(image.forget(), delta, size); #endif srcStream->AddTrack(TRACK_VIDEO_PRIMARY, 0, new VideoSegment()); srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment); srcStream->FinishAddTracks(); srcStream->AdvanceKnownTracksTime(STREAM_TIME_MAX); } }
void RemoteSourceStreamInfo::StartReceiving() { if (mReceiving || mPipelines.empty()) { return; } mReceiving = true; SourceMediaStream* source = GetMediaStream()->GetInputStream()->AsSourceStream(); source->FinishAddTracks(); source->SetPullEnabled(true); // AdvanceKnownTracksTicksTime(HEAT_DEATH_OF_UNIVERSE) means that in // theory per the API, we can't add more tracks before that // time. However, the impl actually allows it, and it avoids a whole // bunch of locking that would be required (and potential blocking) // if we used smaller values and updated them on each NotifyPull. source->AdvanceKnownTracksTime(STREAM_TIME_MAX); CSFLogDebug(logTag, "Finished adding tracks to MediaStream %p", source); }