Index: content/renderer/media/video_frame_deliverer.cc |
diff --git a/content/renderer/media/video_frame_deliverer.cc b/content/renderer/media/video_frame_deliverer.cc |
index 67b11c42ecdc4482f8b23c733c6c1a48cb0e5703..c291d0a7f1b8ec827f95b4e3cdfcd879bc946831 100644 |
--- a/content/renderer/media/video_frame_deliverer.cc |
+++ b/content/renderer/media/video_frame_deliverer.cc |
@@ -8,6 +8,11 @@ |
#include "base/location.h" |
namespace content { |
+namespace { |
+void ResetCallback(VideoCaptureDeliverFrameCB callback) { |
+ callback.Reset(); |
+} |
+} // namespace |
VideoFrameDeliverer::VideoFrameDeliverer( |
const scoped_refptr<base::MessageLoopProxy>& io_message_loop) |
@@ -41,15 +46,18 @@ void VideoFrameDeliverer::RemoveCallback(void* id) { |
io_message_loop_->PostTask( |
FROM_HERE, |
base::Bind(&VideoFrameDeliverer::RemoveCallbackOnIO, |
- this, id)); |
+ this, id, base::MessageLoopProxy::current())); |
} |
-void VideoFrameDeliverer::RemoveCallbackOnIO(void* id) { |
+void VideoFrameDeliverer::RemoveCallbackOnIO( |
+ void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) { |
DCHECK(io_message_loop_->BelongsToCurrentThread()); |
std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin(); |
for (; it != callbacks_.end(); ++it) { |
if (it->first == id) { |
+ VideoCaptureDeliverFrameCB callback = it->second; |
callbacks_.erase(it); |
+ message_loop->PostTask(FROM_HERE, base::Bind(&ResetCallback, callback)); |
piman
2014/05/09 03:44:23
So, this is racy.
If the target message loop is fr
|
return; |
} |
} |