Bug 1155089 - Part 1: Reset |TrackID| for MediaPipelineTransmit::PipelineListener on replaceTrack(). r=bwc

--HG--
extra : rebase_source : 3ce3979f4b61ef204b468c244f03839b5c1bd3ed
This commit is contained in:
Andreas Pehrson 2015-04-22 11:59:43 +08:00
Родитель 0fb2aa4bf1
Коммит d1d704fa84
3 изменённых файлов: 33 добавлений и 0 удалений

Просмотреть файл

@ -688,6 +688,8 @@ nsresult MediaPipelineTransmit::ReplaceTrack(DOMMediaStream *domstream,
} }
domstream_ = domstream; // Detach clears it domstream_ = domstream; // Detach clears it
stream_ = domstream->GetStream(); stream_ = domstream->GetStream();
// Unsets the track id after RemoveListener() takes effect.
listener_->UnsetTrackId(stream_->GraphImpl());
track_id_ = track_id; track_id_ = track_id;
AttachToTrack(track_id); AttachToTrack(track_id);
return NS_OK; return NS_OK;
@ -853,6 +855,24 @@ nsresult MediaPipeline::PipelineTransport::SendRtcpPacket_s(
out_len); out_len);
} }
void MediaPipelineTransmit::PipelineListener::
UnsetTrackId(MediaStreamGraphImpl* graph) {
#ifndef USE_FAKE_MEDIA_STREAMS
class Message : public ControlMessage {
public:
Message(PipelineListener* listener) :
ControlMessage(nullptr), listener_(listener) {}
virtual void Run() override
{
listener_->UnsetTrackIdImpl();
}
nsRefPtr<PipelineListener> listener_;
};
graph->AppendMessage(new Message(this));
#else
UnsetTrackIdImpl();
#endif
}
// Called if we're attached with AddDirectListener() // Called if we're attached with AddDirectListener()
void MediaPipelineTransmit::PipelineListener:: void MediaPipelineTransmit::PipelineListener::
NotifyRealtimeData(MediaStreamGraph* graph, TrackID tid, NotifyRealtimeData(MediaStreamGraph* graph, TrackID tid,

Просмотреть файл

@ -466,6 +466,12 @@ public:
} }
} }
// Dispatches setting the internal TrackID to TRACK_INVALID to the media
// graph thread to keep it in sync with other MediaStreamGraph operations
// like RemoveListener() and AddListener(). The TrackID will be updated on
// the next NewData() callback.
void UnsetTrackId(MediaStreamGraphImpl* graph);
void SetActive(bool active) { active_ = active; } void SetActive(bool active) { active_ = active; }
void SetEnabled(bool enabled) { enabled_ = enabled; } void SetEnabled(bool enabled) { enabled_ = enabled; }
TrackID trackid() { TrackID trackid() {
@ -487,6 +493,11 @@ public:
const MediaSegment& media) override; const MediaSegment& media) override;
private: private:
void UnsetTrackIdImpl() {
MutexAutoLock lock(mMutex);
track_id_ = track_id_external_ = TRACK_INVALID;
}
void NewData(MediaStreamGraph* graph, TrackID tid, void NewData(MediaStreamGraph* graph, TrackID tid,
StreamTime offset, StreamTime offset,
uint32_t events, uint32_t events,

Просмотреть файл

@ -30,6 +30,7 @@ class nsIDOMWindow;
namespace mozilla { namespace mozilla {
class MediaStreamGraph; class MediaStreamGraph;
class MediaStreamGraphImpl;
class MediaSegment; class MediaSegment;
}; };
@ -103,6 +104,7 @@ class Fake_MediaStream {
virtual Fake_SourceMediaStream *AsSourceStream() { return nullptr; } virtual Fake_SourceMediaStream *AsSourceStream() { return nullptr; }
virtual mozilla::MediaStreamGraphImpl *GraphImpl() { return nullptr; }
virtual nsresult Start() { return NS_OK; } virtual nsresult Start() { return NS_OK; }
virtual nsresult Stop() { return NS_OK; } virtual nsresult Stop() { return NS_OK; }
virtual void StopStream() {} virtual void StopStream() {}