nsresult PeerConnectionMedia::AddStream(nsIDOMMediaStream* aMediaStream, uint32_t *stream_id) { if (!aMediaStream) { CSFLogError(logTag, "%s - aMediaStream is NULL", __FUNCTION__); return NS_ERROR_FAILURE; } DOMMediaStream* stream = static_cast<DOMMediaStream*>(aMediaStream); CSFLogDebug(logTag, "%s: MediaStream: %p", __FUNCTION__, aMediaStream); // Adding tracks here based on nsDOMMediaStream expectation settings uint32_t hints = stream->GetHintContents(); #ifdef MOZILLA_INTERNAL_API if (!Preferences::GetBool("media.peerconnection.video.enabled", true)) { hints &= ~(DOMMediaStream::HINT_CONTENTS_VIDEO); } #endif if (!(hints & (DOMMediaStream::HINT_CONTENTS_AUDIO | DOMMediaStream::HINT_CONTENTS_VIDEO))) { CSFLogDebug(logTag, "Empty Stream !!"); return NS_OK; } // Now see if we already have a stream of this type, since we only // allow one of each. // TODO([email protected]): remove this when multiple of each stream // is allowed mozilla::MutexAutoLock lock(mLocalSourceStreamsLock); for (uint32_t u = 0; u < mLocalSourceStreams.Length(); u++) { nsRefPtr<LocalSourceStreamInfo> localSourceStream = mLocalSourceStreams[u]; if (localSourceStream->GetMediaStream()->GetHintContents() & hints) { CSFLogError(logTag, "Only one stream of any given type allowed"); return NS_ERROR_FAILURE; } } // OK, we're good to add nsRefPtr<LocalSourceStreamInfo> localSourceStream = new LocalSourceStreamInfo(stream, this); *stream_id = mLocalSourceStreams.Length(); if (hints & DOMMediaStream::HINT_CONTENTS_AUDIO) { localSourceStream->ExpectAudio(TRACK_AUDIO); } if (hints & DOMMediaStream::HINT_CONTENTS_VIDEO) { localSourceStream->ExpectVideo(TRACK_VIDEO); } mLocalSourceStreams.AppendElement(localSourceStream); return NS_OK; }
NS_IMETHODIMP PeerConnectionImpl::RemoveStream(nsIDOMMediaStream* aMediaStream) { PC_AUTO_ENTER_API_CALL(true); uint32_t stream_id; nsresult res = mMedia->RemoveStream(aMediaStream, &stream_id); if (NS_FAILED(res)) return res; DOMMediaStream* stream = static_cast<DOMMediaStream*>(aMediaStream); uint32_t hints = stream->GetHintContents(); if (hints & DOMMediaStream::HINT_CONTENTS_AUDIO) { mCall->removeStream(stream_id, 0, AUDIO); } if (hints & DOMMediaStream::HINT_CONTENTS_VIDEO) { mCall->removeStream(stream_id, 1, VIDEO); } return NS_OK; }
NS_IMETHODIMP PeerConnectionImpl::AddStream(nsIDOMMediaStream* aMediaStream) { PC_AUTO_ENTER_API_CALL(true); uint32_t stream_id; nsresult res = mMedia->AddStream(aMediaStream, &stream_id); if (NS_FAILED(res)) return res; DOMMediaStream* stream = static_cast<DOMMediaStream*>(aMediaStream); uint32_t hints = stream->GetHintContents(); // TODO([email protected]): these integers should be the track IDs if (hints & DOMMediaStream::HINT_CONTENTS_AUDIO) { mCall->addStream(stream_id, 0, AUDIO); } if (hints & DOMMediaStream::HINT_CONTENTS_VIDEO) { mCall->addStream(stream_id, 1, VIDEO); } return NS_OK; }