diff --git a/media/webrtc/signaling/test/FakeMediaStreams.h b/media/webrtc/signaling/test/FakeMediaStreams.h index f15656a1d876da351ebf932a2b1d4290e1103619..2f1ec88be035c09a814961c704a26f06f72c8083 100644 --- a/media/webrtc/signaling/test/FakeMediaStreams.h +++ b/media/webrtc/signaling/test/FakeMediaStreams.h @@ -95,13 +95,46 @@ class Fake_SourceMediaStream : public Fake_MediaStream { public: Fake_SourceMediaStream() : mSegmentsAdded(0), mPullEnabled(false), + mStop(false), mPeriodic(new Fake_MediaPeriodic(this)) {} void AddTrack(mozilla::TrackID aID, mozilla::TrackRate aRate, mozilla::TrackTicks aStart, mozilla::MediaSegment* aSegment) {} void AppendToTrack(mozilla::TrackID aID, mozilla::MediaSegment* aSegment) { - ++mSegmentsAdded; + bool nonZeroSample = false; + MOZ_ASSERT(aSegment); + if(aSegment->GetType() == mozilla::MediaSegment::AUDIO) { + //On audio segment append, we verify for validity + //of the audio samples. + mozilla::AudioSegment* audio = + static_cast<mozilla::AudioSegment*>(aSegment); + mozilla::AudioSegment::ChunkIterator iter(*audio); + while(!iter.IsEnded()) { + mozilla::AudioChunk& chunk = *(iter); + MOZ_ASSERT(chunk.mBuffer); + const int16_t* buf = + static_cast<const int16_t*>(chunk.mBuffer->Data()); + for(int i=0; i<chunk.mDuration; i++) { + if(buf[i]) { + //atleast one non-zero sample found. + nonZeroSample = true; + break; + } + } + //process next chunk + iter.Next(); + } + if(nonZeroSample) { + //we increment segments count if + //atleast one non-zero samples was found. + ++mSegmentsAdded; + } + } else { + //in the case of video segment appended, we just increase the + //segment count. + ++mSegmentsAdded; + } } void AdvanceKnownTracksTime(mozilla::StreamTime aKnownTime) {} @@ -109,6 +142,10 @@ class Fake_SourceMediaStream : public Fake_MediaStream { void SetPullEnabled(bool aEnabled) { mPullEnabled = aEnabled; } + //Don't pull anymore data,if mStop is true. + void StopStream() { + mStop = true; + } virtual Fake_SourceMediaStream *AsSourceStream() { return this; } @@ -124,6 +161,7 @@ class Fake_SourceMediaStream : public Fake_MediaStream { protected: int mSegmentsAdded; bool mPullEnabled; + bool mStop; nsRefPtr<Fake_MediaPeriodic> mPeriodic; nsCOMPtr<nsITimer> mTimer; }; @@ -202,9 +240,17 @@ class Fake_MediaStreamBase : public Fake_MediaStream { class Fake_AudioStreamSource : public Fake_MediaStreamBase { public: - Fake_AudioStreamSource() : Fake_MediaStreamBase() {} - + Fake_AudioStreamSource() : Fake_MediaStreamBase(), + mCount(0), + mStop(false) {} + //Signaling Agent indicates us to stop generating + //further audio. + void StopStream() { + mStop = true; + } virtual void Periodic(); + int mCount; + bool mStop; }; class Fake_VideoStreamSource : public Fake_MediaStreamBase { diff --git a/media/webrtc/signaling/test/FakeMediaStreamsImpl.h b/media/webrtc/signaling/test/FakeMediaStreamsImpl.h index e48047c6b6cbe87e51e0e3df91c5f147176c8152..a6187ee0849c9e44c955f1a901921f0271a094c1 100644 --- a/media/webrtc/signaling/test/FakeMediaStreamsImpl.h +++ b/media/webrtc/signaling/test/FakeMediaStreamsImpl.h @@ -10,6 +10,9 @@ #include "nspr.h" #include "nsError.h" +static const int AUDIO_BUFFER_SIZE = 1600; +static const int NUM_CHANNELS = 2; + NS_IMPL_THREADSAFE_ISUPPORTS1(Fake_nsDOMMediaStream, nsIDOMMediaStream) // DOM Media stream @@ -42,7 +45,10 @@ nsresult Fake_SourceMediaStream::Stop() { } void Fake_SourceMediaStream::Periodic() { - if (mPullEnabled) { + // Pull more audio-samples iff pulling is enabled + // and we are not asked by the signaling agent to stop + //pulling data. + if (mPullEnabled && !mStop) { for (std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin(); it != mListeners.end(); ++it) { (*it)->NotifyPull(NULL, mozilla::MillisecondsToMediaTime(10)); @@ -50,7 +56,6 @@ void Fake_SourceMediaStream::Periodic() { } } - // Fake_MediaStreamBase nsresult Fake_MediaStreamBase::Start() { mTimer = do_CreateInstance(NS_TIMER_CONTRACTID); @@ -71,11 +76,29 @@ nsresult Fake_MediaStreamBase::Stop() { // Fake_AudioStreamSource void Fake_AudioStreamSource::Periodic() { + //Are we asked to stop pumping audio samples ? + if(mStop) { + return; + } + //Generate Signed 16 Bit Audio samples + nsRefPtr<mozilla::SharedBuffer> samples = + mozilla::SharedBuffer::Create(AUDIO_BUFFER_SIZE * NUM_CHANNELS * sizeof(int16_t)); + for(int i=0; i<(1600*2); i++) { + //saw tooth audio sample + reinterpret_cast<int16_t *>(samples->Data())[i] = + ((mCount % 8) * 4000) - (7*4000)/2; + mCount++; + } + mozilla::AudioSegment segment; segment.Init(1); - segment.InsertNullDataAtStart(160); + segment.AppendFrames(samples.forget(), + AUDIO_BUFFER_SIZE, + 0, + AUDIO_BUFFER_SIZE, + mozilla::AUDIO_FORMAT_S16); - for (std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin(); + for(std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin(); it != mListeners.end(); ++it) { (*it)->NotifyQueuedTrackChanges(NULL, // Graph 0, // TrackID diff --git a/media/webrtc/signaling/test/signaling_unittests.cpp b/media/webrtc/signaling/test/signaling_unittests.cpp index d053a184388f4dea084afb79002c0c297fc02b59..2348158537739cc387392eb32c64b67fa51f044f 100644 --- a/media/webrtc/signaling/test/signaling_unittests.cpp +++ b/media/webrtc/signaling/test/signaling_unittests.cpp @@ -677,6 +677,22 @@ void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer, domMediaStream_->GetStream())->GetSegmentsAdded(); } + //Stops generating new audio data for transmission. + //Should be called before Cleanup of the peer connection. + void CloseSendStreams() { + static_cast<Fake_AudioStreamSource*>( + domMediaStream_->GetStream())->StopStream(); + } + + //Stops pulling audio data off the receivers. + //Should be called before Cleanup of the peer connection. + void CloseReceiveStreams() { + std::vector<nsDOMMediaStream *> streams = + pObserver->GetStreams(); + for(int i=0; i < streams.size(); i++) { + streams[i]->GetStream()->AsSourceStream()->StopStream(); + } + } public: mozilla::RefPtr<sipcc::PeerConnectionImpl> pc; @@ -1189,6 +1205,8 @@ TEST_F(SignalingTest, OfferModifiedAnswer) OfferModifiedAnswer(constraints, constraints, SHOULD_SENDRECV_AV, SHOULD_SENDRECV_AV); PR_Sleep(kDefaultTimeout * 2); // Wait for completion + a1_.CloseSendStreams(); + a2_.CloseReceiveStreams(); } TEST_F(SignalingTest, FullCall) @@ -1199,6 +1217,8 @@ TEST_F(SignalingTest, FullCall) PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written + a1_.CloseSendStreams(); + a2_.CloseReceiveStreams(); // Check that we wrote a bunch of data ASSERT_GE(a1_.GetPacketsSent(0), 40); //ASSERT_GE(a2_.GetPacketsSent(0), 40); @@ -1214,6 +1234,8 @@ TEST_F(SignalingTest, FullCallTrickle) PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written + a1_.CloseSendStreams(); + a2_.CloseReceiveStreams(); ASSERT_GE(a1_.GetPacketsSent(0), 40); ASSERT_GE(a2_.GetPacketsReceived(0), 40); }