summaryrefslogtreecommitdiffstats
path: root/media/cast/cast_receiver_impl.cc
diff options
context:
space:
mode:
authorpwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 00:06:22 +0000
committerpwestin@google.com <pwestin@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-18 00:06:22 +0000
commit8dd5e6fbebe5011a1ca78beb645116bbb1e55f36 (patch)
treed9a5fa81eb5ff2704e5ade036e98641c133707af /media/cast/cast_receiver_impl.cc
parent0e6324b42184712dd66baaeedd8752b69ec5c224 (diff)
downloadchromium_src-8dd5e6fbebe5011a1ca78beb645116bbb1e55f36.zip
chromium_src-8dd5e6fbebe5011a1ca78beb645116bbb1e55f36.tar.gz
chromium_src-8dd5e6fbebe5011a1ca78beb645116bbb1e55f36.tar.bz2
Cast: Refactor the way timers are first scheduled.
Change the way we schedule the first timers to avoid weak ptrs beeing accessed by multiple threads. Inside the CastSender and CastReceiver objects objects where passed using weak ptrs; the issue was that these objects might have been created and used by another thread; weak ptr require all usage to be from the same thread. This cl make sure that all access to the objects are from the same thread. BUG=319399 Review URL: https://codereview.chromium.org/64753006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235569 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/cast/cast_receiver_impl.cc')
-rw-r--r--media/cast/cast_receiver_impl.cc47
1 files changed, 24 insertions, 23 deletions
diff --git a/media/cast/cast_receiver_impl.cc b/media/cast/cast_receiver_impl.cc
index 2a88cd2..e2c004f 100644
--- a/media/cast/cast_receiver_impl.cc
+++ b/media/cast/cast_receiver_impl.cc
@@ -18,8 +18,8 @@ namespace cast {
class LocalFrameReceiver : public FrameReceiver {
public:
LocalFrameReceiver(scoped_refptr<CastEnvironment> cast_environment,
- base::WeakPtr<AudioReceiver> audio_receiver,
- base::WeakPtr<VideoReceiver> video_receiver)
+ AudioReceiver* audio_receiver,
+ VideoReceiver* video_receiver)
: cast_environment_(cast_environment),
audio_receiver_(audio_receiver),
video_receiver_(video_receiver) {}
@@ -27,15 +27,15 @@ class LocalFrameReceiver : public FrameReceiver {
virtual void GetRawVideoFrame(
const VideoFrameDecodedCallback& callback) OVERRIDE {
cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
- base::Bind(&VideoReceiver::GetRawVideoFrame, video_receiver_,
- callback));
+ base::Bind(&VideoReceiver::GetRawVideoFrame,
+ video_receiver_->AsWeakPtr(), callback));
}
virtual void GetEncodedVideoFrame(
const VideoFrameEncodedCallback& callback) OVERRIDE {
cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
- base::Bind(&VideoReceiver::GetEncodedVideoFrame, video_receiver_,
- callback));
+ base::Bind(&VideoReceiver::GetEncodedVideoFrame,
+ video_receiver_->AsWeakPtr(), callback));
}
virtual void GetRawAudioFrame(
@@ -43,14 +43,15 @@ class LocalFrameReceiver : public FrameReceiver {
int desired_frequency,
const AudioFrameDecodedCallback& callback) OVERRIDE {
cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, base::Bind(
- &AudioReceiver::GetRawAudioFrame, audio_receiver_,
+ &AudioReceiver::GetRawAudioFrame, audio_receiver_->AsWeakPtr(),
number_of_10ms_blocks, desired_frequency, callback));
}
virtual void GetCodedAudioFrame(
const AudioFrameEncodedCallback& callback) OVERRIDE {
- cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, base::Bind(
- &AudioReceiver::GetEncodedAudioFrame, audio_receiver_, callback));
+ cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
+ base::Bind(&AudioReceiver::GetEncodedAudioFrame,
+ audio_receiver_->AsWeakPtr(), callback));
}
protected:
@@ -60,16 +61,16 @@ class LocalFrameReceiver : public FrameReceiver {
friend class base::RefCountedThreadSafe<LocalFrameReceiver>;
scoped_refptr<CastEnvironment> cast_environment_;
- base::WeakPtr<AudioReceiver> audio_receiver_;
- base::WeakPtr<VideoReceiver> video_receiver_;
+ AudioReceiver* audio_receiver_;
+ VideoReceiver* video_receiver_;
};
// The video and audio receivers should only be called from the main thread.
class LocalPacketReceiver : public PacketReceiver {
public:
LocalPacketReceiver(scoped_refptr<CastEnvironment> cast_environment,
- base::WeakPtr<AudioReceiver> audio_receiver,
- base::WeakPtr<VideoReceiver> video_receiver,
+ AudioReceiver* audio_receiver,
+ VideoReceiver* video_receiver,
uint32 ssrc_of_audio_sender,
uint32 ssrc_of_video_sender)
: cast_environment_(cast_environment),
@@ -103,12 +104,12 @@ class LocalPacketReceiver : public PacketReceiver {
}
if (ssrc_of_sender == ssrc_of_audio_sender_) {
cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
- base::Bind(&AudioReceiver::IncomingPacket, audio_receiver_,
- packet, length, callback));
+ base::Bind(&AudioReceiver::IncomingPacket,
+ audio_receiver_->AsWeakPtr(), packet, length, callback));
} else if (ssrc_of_sender == ssrc_of_video_sender_) {
cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
- base::Bind(&VideoReceiver::IncomingPacket, video_receiver_,
- packet, length, callback));
+ base::Bind(&VideoReceiver::IncomingPacket,
+ video_receiver_->AsWeakPtr(), packet, length, callback));
} else {
// No action; just log and call the callback informing that we are done
// with the packet.
@@ -126,8 +127,8 @@ class LocalPacketReceiver : public PacketReceiver {
friend class base::RefCountedThreadSafe<LocalPacketReceiver>;
scoped_refptr<CastEnvironment> cast_environment_;
- base::WeakPtr<AudioReceiver> audio_receiver_;
- base::WeakPtr<VideoReceiver> video_receiver_;
+ AudioReceiver* audio_receiver_;
+ VideoReceiver* video_receiver_;
const uint32 ssrc_of_audio_sender_;
const uint32 ssrc_of_video_sender_;
};
@@ -152,11 +153,11 @@ CastReceiverImpl::CastReceiverImpl(
audio_receiver_(cast_environment, audio_config, &pacer_),
video_receiver_(cast_environment, video_config, &pacer_),
frame_receiver_(new LocalFrameReceiver(cast_environment,
- audio_receiver_.AsWeakPtr(),
- video_receiver_.AsWeakPtr())),
+ &audio_receiver_,
+ &video_receiver_)),
packet_receiver_(new LocalPacketReceiver(cast_environment,
- audio_receiver_.AsWeakPtr(),
- video_receiver_.AsWeakPtr(),
+ &audio_receiver_,
+ &video_receiver_,
audio_config.incoming_ssrc,
video_config.incoming_ssrc)) {}