| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/media/video_capture_controller.h" | 5 #include "content/browser/renderer_host/media/video_capture_controller.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| 11 #include <set> | 11 #include <set> |
| 12 | 12 |
| 13 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/metrics/sparse_histogram.h" | 17 #include "base/metrics/sparse_histogram.h" |
| 18 #include "build/build_config.h" | 18 #include "build/build_config.h" |
| 19 #include "components/display_compositor/gl_helper.h" | 19 #include "components/display_compositor/gl_helper.h" |
| 20 #include "content/browser/renderer_host/media/media_stream_manager.h" | 20 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 21 #include "content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h" | |
| 22 #include "content/browser/renderer_host/media/video_capture_manager.h" | 21 #include "content/browser/renderer_host/media/video_capture_manager.h" |
| 23 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 24 #include "content/public/common/content_switches.h" | 23 #include "content/public/common/content_switches.h" |
| 25 #include "media/base/video_frame.h" | 24 #include "media/base/video_frame.h" |
| 26 #include "media/capture/video/video_capture_buffer_pool_impl.h" | 25 #include "media/capture/video/video_capture_buffer_pool.h" |
| 27 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" | 26 #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" |
| 28 #include "media/capture/video/video_capture_device_client.h" | 27 #include "media/capture/video/video_capture_device_client.h" |
| 29 | 28 |
| 30 #if !defined(OS_ANDROID) | 29 #if !defined(OS_ANDROID) |
| 31 #include "content/browser/compositor/image_transport_factory.h" | 30 #include "content/browser/compositor/image_transport_factory.h" |
| 32 #endif | 31 #endif |
| 33 | 32 |
| 34 using media::VideoCaptureFormat; | 33 using media::VideoCaptureFormat; |
| 35 using media::VideoFrame; | 34 using media::VideoFrame; |
| 36 using media::VideoFrameMetadata; | 35 using media::VideoFrameMetadata; |
| 37 | 36 |
| 38 namespace content { | 37 namespace content { |
| 39 | 38 |
| 40 namespace { | 39 namespace { |
| 41 | 40 |
| 42 static const int kInfiniteRatio = 99999; | 41 static const int kInfiniteRatio = 99999; |
| 43 | 42 |
| 44 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \ | 43 #define UMA_HISTOGRAM_ASPECT_RATIO(name, width, height) \ |
| 45 UMA_HISTOGRAM_SPARSE_SLOWLY( \ | 44 UMA_HISTOGRAM_SPARSE_SLOWLY( \ |
| 46 name, \ | 45 name, \ |
| 47 (height) ? ((width) * 100) / (height) : kInfiniteRatio); | 46 (height) ? ((width) * 100) / (height) : kInfiniteRatio); |
| 48 | 47 |
| 49 std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder( | |
| 50 const media::VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) { | |
| 51 return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb); | |
| 52 } | |
| 53 | |
| 54 // Decorator for media::VideoFrameReceiver that forwards all incoming calls | |
| 55 // to the Browser IO thread. | |
| 56 class VideoFrameReceiverOnIOThread : public media::VideoFrameReceiver { | |
| 57 public: | |
| 58 explicit VideoFrameReceiverOnIOThread( | |
| 59 const base::WeakPtr<VideoFrameReceiver>& receiver) | |
| 60 : receiver_(receiver) {} | |
| 61 | |
| 62 void OnIncomingCapturedVideoFrame( | |
| 63 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, | |
| 64 scoped_refptr<media::VideoFrame> frame) override { | |
| 65 BrowserThread::PostTask( | |
| 66 BrowserThread::IO, FROM_HERE, | |
| 67 base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_, | |
| 68 base::Passed(&buffer), std::move(frame))); | |
| 69 } | |
| 70 | |
| 71 void OnError() override { | |
| 72 BrowserThread::PostTask( | |
| 73 BrowserThread::IO, FROM_HERE, | |
| 74 base::Bind(&VideoFrameReceiver::OnError, receiver_)); | |
| 75 } | |
| 76 | |
| 77 void OnLog(const std::string& message) override { | |
| 78 BrowserThread::PostTask( | |
| 79 BrowserThread::IO, FROM_HERE, | |
| 80 base::Bind(&VideoFrameReceiver::OnLog, receiver_, message)); | |
| 81 } | |
| 82 | |
| 83 void OnBufferDestroyed(int buffer_id_to_drop) override { | |
| 84 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
| 85 base::Bind(&VideoFrameReceiver::OnBufferDestroyed, | |
| 86 receiver_, buffer_id_to_drop)); | |
| 87 } | |
| 88 | |
| 89 private: | |
| 90 base::WeakPtr<VideoFrameReceiver> receiver_; | |
| 91 }; | |
| 92 | |
| 93 } // anonymous namespace | 48 } // anonymous namespace |
| 94 | 49 |
| 95 struct VideoCaptureController::ControllerClient { | 50 struct VideoCaptureController::ControllerClient { |
| 96 ControllerClient(VideoCaptureControllerID id, | 51 ControllerClient(VideoCaptureControllerID id, |
| 97 VideoCaptureControllerEventHandler* handler, | 52 VideoCaptureControllerEventHandler* handler, |
| 98 media::VideoCaptureSessionId session_id, | 53 media::VideoCaptureSessionId session_id, |
| 99 const media::VideoCaptureParams& params) | 54 const media::VideoCaptureParams& params) |
| 100 : controller_id(id), | 55 : controller_id(id), |
| 101 event_handler(handler), | 56 event_handler(handler), |
| 102 session_id(session_id), | 57 session_id(session_id), |
| (...skipping 30 matching lines...) Expand all Loading... |
| 133 | 88 |
| 134 // Indicates whether the client is paused, if true, VideoCaptureController | 89 // Indicates whether the client is paused, if true, VideoCaptureController |
| 135 // stops updating its buffer. | 90 // stops updating its buffer. |
| 136 bool paused; | 91 bool paused; |
| 137 }; | 92 }; |
| 138 | 93 |
| 139 VideoCaptureController::BufferState::BufferState( | 94 VideoCaptureController::BufferState::BufferState( |
| 140 int buffer_id, | 95 int buffer_id, |
| 141 int frame_feedback_id, | 96 int frame_feedback_id, |
| 142 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, | 97 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, |
| 143 scoped_refptr<media::VideoCaptureBufferPool> buffer_pool, | 98 media::FrameBufferPool* frame_buffer_pool, |
| 144 scoped_refptr<media::VideoFrame> frame) | 99 scoped_refptr<media::VideoFrame> frame) |
| 145 : buffer_id_(buffer_id), | 100 : buffer_id_(buffer_id), |
| 146 frame_feedback_id_(frame_feedback_id), | 101 frame_feedback_id_(frame_feedback_id), |
| 147 consumer_feedback_observer_(consumer_feedback_observer), | 102 consumer_feedback_observer_(consumer_feedback_observer), |
| 148 buffer_pool_(std::move(buffer_pool)), | 103 frame_buffer_pool_(frame_buffer_pool), |
| 149 frame_(std::move(frame)), | 104 frame_(std::move(frame)), |
| 150 max_consumer_utilization_( | 105 max_consumer_utilization_( |
| 151 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), | 106 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), |
| 152 consumer_hold_count_(0) {} | 107 consumer_hold_count_(0) {} |
| 153 | 108 |
| 154 VideoCaptureController::BufferState::~BufferState() = default; | 109 VideoCaptureController::BufferState::~BufferState() = default; |
| 155 | 110 |
| 156 VideoCaptureController::BufferState::BufferState( | 111 VideoCaptureController::BufferState::BufferState( |
| 157 const VideoCaptureController::BufferState& other) = default; | 112 const VideoCaptureController::BufferState& other) = default; |
| 158 | 113 |
| 159 void VideoCaptureController::BufferState::RecordConsumerUtilization( | 114 void VideoCaptureController::BufferState::RecordConsumerUtilization( |
| 160 double utilization) { | 115 double utilization) { |
| 161 if (std::isfinite(utilization) && utilization >= 0.0) { | 116 if (std::isfinite(utilization) && utilization >= 0.0) { |
| 162 max_consumer_utilization_ = | 117 max_consumer_utilization_ = |
| 163 std::max(max_consumer_utilization_, utilization); | 118 std::max(max_consumer_utilization_, utilization); |
| 164 } | 119 } |
| 165 } | 120 } |
| 166 | 121 |
| 167 void VideoCaptureController::BufferState::IncreaseConsumerCount() { | 122 void VideoCaptureController::BufferState::IncreaseConsumerCount() { |
| 168 if (consumer_hold_count_ == 0) | 123 if (consumer_hold_count_ == 0) |
| 169 buffer_pool_->HoldForConsumers(buffer_id_, 1); | 124 if (frame_buffer_pool_ != nullptr) |
| 125 frame_buffer_pool_->SetBufferHold(buffer_id_); |
| 170 consumer_hold_count_++; | 126 consumer_hold_count_++; |
| 171 } | 127 } |
| 172 | 128 |
| 173 void VideoCaptureController::BufferState::DecreaseConsumerCount() { | 129 void VideoCaptureController::BufferState::DecreaseConsumerCount() { |
| 174 consumer_hold_count_--; | 130 consumer_hold_count_--; |
| 175 if (consumer_hold_count_ == 0) { | 131 if (consumer_hold_count_ == 0) { |
| 176 if (consumer_feedback_observer_ != nullptr && | 132 if (consumer_feedback_observer_ != nullptr && |
| 177 max_consumer_utilization_ != | 133 max_consumer_utilization_ != |
| 178 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) { | 134 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded) { |
| 179 consumer_feedback_observer_->OnUtilizationReport( | 135 consumer_feedback_observer_->OnUtilizationReport( |
| 180 frame_feedback_id_, max_consumer_utilization_); | 136 frame_feedback_id_, max_consumer_utilization_); |
| 181 } | 137 } |
| 182 buffer_pool_->RelinquishConsumerHold(buffer_id_, 1); | 138 if (frame_buffer_pool_ != nullptr) |
| 139 frame_buffer_pool_->ReleaseBufferHold(buffer_id_); |
| 183 max_consumer_utilization_ = | 140 max_consumer_utilization_ = |
| 184 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; | 141 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; |
| 185 } | 142 } |
| 186 } | 143 } |
| 187 | 144 |
| 188 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { | 145 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { |
| 189 return consumer_hold_count_ == 0; | 146 return consumer_hold_count_ == 0; |
| 190 } | 147 } |
| 191 | 148 |
| 192 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( | 149 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( |
| 193 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { | 150 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { |
| 194 consumer_feedback_observer_ = consumer_feedback_observer; | 151 consumer_feedback_observer_ = consumer_feedback_observer; |
| 195 } | 152 } |
| 196 | 153 |
| 197 VideoCaptureController::VideoCaptureController(int max_buffers) | 154 void VideoCaptureController::BufferState::SetFrameBufferPool( |
| 198 : buffer_pool_(new media::VideoCaptureBufferPoolImpl( | 155 media::FrameBufferPool* frame_buffer_pool) { |
| 199 base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), | 156 frame_buffer_pool_ = frame_buffer_pool; |
| 200 max_buffers)), | 157 } |
| 158 |
| 159 VideoCaptureController::VideoCaptureController() |
| 160 : frame_buffer_pool_(nullptr), |
| 201 consumer_feedback_observer_(nullptr), | 161 consumer_feedback_observer_(nullptr), |
| 202 state_(VIDEO_CAPTURE_STATE_STARTED), | 162 state_(VIDEO_CAPTURE_STATE_STARTED), |
| 203 has_received_frames_(false), | 163 has_received_frames_(false), |
| 204 weak_ptr_factory_(this) { | 164 weak_ptr_factory_(this) { |
| 205 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 165 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 206 } | 166 } |
| 207 | 167 |
| 168 VideoCaptureController::~VideoCaptureController() = default; |
| 169 |
| 208 base::WeakPtr<VideoCaptureController> | 170 base::WeakPtr<VideoCaptureController> |
| 209 VideoCaptureController::GetWeakPtrForIOThread() { | 171 VideoCaptureController::GetWeakPtrForIOThread() { |
| 210 return weak_ptr_factory_.GetWeakPtr(); | 172 return weak_ptr_factory_.GetWeakPtr(); |
| 211 } | 173 } |
| 212 | 174 |
| 175 void VideoCaptureController::SetFrameBufferPool( |
| 176 std::unique_ptr<media::FrameBufferPool> frame_buffer_pool) { |
| 177 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 178 frame_buffer_pool_ = std::move(frame_buffer_pool); |
| 179 // Update existing BufferState entries. |
| 180 for (auto& entry : buffer_id_to_state_map_) |
| 181 entry.second.SetFrameBufferPool(frame_buffer_pool_.get()); |
| 182 } |
| 183 |
| 213 void VideoCaptureController::SetConsumerFeedbackObserver( | 184 void VideoCaptureController::SetConsumerFeedbackObserver( |
| 214 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> | 185 std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> |
| 215 consumer_feedback_observer) { | 186 consumer_feedback_observer) { |
| 216 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 217 consumer_feedback_observer_ = std::move(consumer_feedback_observer); | 188 consumer_feedback_observer_ = std::move(consumer_feedback_observer); |
| 218 // Update existing BufferState entries. | 189 // Update existing BufferState entries. |
| 219 for (auto& entry : buffer_id_to_state_map_) | 190 for (auto& entry : buffer_id_to_state_map_) |
| 220 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); | 191 entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); |
| 221 } | 192 } |
| 222 | 193 |
| 223 std::unique_ptr<media::VideoCaptureDevice::Client> | |
| 224 VideoCaptureController::NewDeviceClient() { | |
| 225 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 226 return base::MakeUnique<media::VideoCaptureDeviceClient>( | |
| 227 base::MakeUnique<VideoFrameReceiverOnIOThread>( | |
| 228 this->GetWeakPtrForIOThread()), | |
| 229 buffer_pool_, | |
| 230 base::Bind(&CreateGpuJpegDecoder, | |
| 231 base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, | |
| 232 this->GetWeakPtrForIOThread()))); | |
| 233 } | |
| 234 | |
| 235 void VideoCaptureController::AddClient( | 194 void VideoCaptureController::AddClient( |
| 236 VideoCaptureControllerID id, | 195 VideoCaptureControllerID id, |
| 237 VideoCaptureControllerEventHandler* event_handler, | 196 VideoCaptureControllerEventHandler* event_handler, |
| 238 media::VideoCaptureSessionId session_id, | 197 media::VideoCaptureSessionId session_id, |
| 239 const media::VideoCaptureParams& params) { | 198 const media::VideoCaptureParams& params) { |
| 240 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 199 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 241 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id | 200 DVLOG(1) << "VideoCaptureController::AddClient() -- id=" << id |
| 242 << ", session_id=" << session_id | 201 << ", session_id=" << session_id |
| 243 << ", params.requested_format=" | 202 << ", params.requested_format=" |
| 244 << media::VideoCaptureFormat::ToString(params.requested_format); | 203 << media::VideoCaptureFormat::ToString(params.requested_format); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 buffer_state.DecreaseConsumerCount(); | 362 buffer_state.DecreaseConsumerCount(); |
| 404 client->buffers_in_use.erase(buffers_in_use_entry_iter); | 363 client->buffers_in_use.erase(buffers_in_use_entry_iter); |
| 405 } | 364 } |
| 406 | 365 |
| 407 const media::VideoCaptureFormat& | 366 const media::VideoCaptureFormat& |
| 408 VideoCaptureController::GetVideoCaptureFormat() const { | 367 VideoCaptureController::GetVideoCaptureFormat() const { |
| 409 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 368 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 410 return video_capture_format_; | 369 return video_capture_format_; |
| 411 } | 370 } |
| 412 | 371 |
| 413 VideoCaptureController::~VideoCaptureController() { | |
| 414 } | |
| 415 | |
| 416 void VideoCaptureController::OnIncomingCapturedVideoFrame( | 372 void VideoCaptureController::OnIncomingCapturedVideoFrame( |
| 417 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, | 373 std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| 418 scoped_refptr<VideoFrame> frame) { | 374 scoped_refptr<VideoFrame> frame) { |
| 419 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 375 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 376 DCHECK(frame_buffer_pool_); |
| 420 const int buffer_id = buffer->id(); | 377 const int buffer_id = buffer->id(); |
| 421 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); | 378 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); |
| 422 | 379 |
| 423 // Insert if not exists. | 380 // Insert if not exists. |
| 424 const auto it = | 381 const auto it = |
| 425 buffer_id_to_state_map_ | 382 buffer_id_to_state_map_ |
| 426 .insert(std::make_pair( | 383 .insert(std::make_pair( |
| 427 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), | 384 buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), |
| 428 consumer_feedback_observer_.get(), | 385 consumer_feedback_observer_.get(), |
| 429 buffer_pool_, frame))) | 386 frame_buffer_pool_.get(), frame))) |
| 430 .first; | 387 .first; |
| 431 BufferState& buffer_state = it->second; | 388 BufferState& buffer_state = it->second; |
| 432 DCHECK(buffer_state.HasZeroConsumerHoldCount()); | 389 DCHECK(buffer_state.HasZeroConsumerHoldCount()); |
| 433 | 390 |
| 434 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { | 391 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { |
| 435 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { | 392 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { |
| 436 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, | 393 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, |
| 437 video_capture_format_.frame_rate); | 394 video_capture_format_.frame_rate); |
| 438 } | 395 } |
| 439 std::unique_ptr<base::DictionaryValue> metadata = | 396 std::unique_ptr<base::DictionaryValue> metadata = |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 } | 469 } |
| 513 } | 470 } |
| 514 | 471 |
| 515 void VideoCaptureController::OnLog(const std::string& message) { | 472 void VideoCaptureController::OnLog(const std::string& message) { |
| 516 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 473 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 517 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); | 474 MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); |
| 518 } | 475 } |
| 519 | 476 |
| 520 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { | 477 void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { |
| 521 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 478 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 479 DCHECK(frame_buffer_pool_); |
| 522 | 480 |
| 523 for (const auto& client : controller_clients_) { | 481 for (const auto& client : controller_clients_) { |
| 524 if (client->session_closed) | 482 if (client->session_closed) |
| 525 continue; | 483 continue; |
| 526 | 484 |
| 527 auto known_buffers_entry_iter = | 485 auto known_buffers_entry_iter = |
| 528 std::find(std::begin(client->known_buffers), | 486 std::find(std::begin(client->known_buffers), |
| 529 std::end(client->known_buffers), buffer_id_to_drop); | 487 std::end(client->known_buffers), buffer_id_to_drop); |
| 530 if (known_buffers_entry_iter != std::end(client->known_buffers)) { | 488 if (known_buffers_entry_iter != std::end(client->known_buffers)) { |
| 531 client->known_buffers.erase(known_buffers_entry_iter); | 489 client->known_buffers.erase(known_buffers_entry_iter); |
| 532 client->event_handler->OnBufferDestroyed(client->controller_id, | 490 client->event_handler->OnBufferDestroyed(client->controller_id, |
| 533 buffer_id_to_drop); | 491 buffer_id_to_drop); |
| 534 } | 492 } |
| 535 } | 493 } |
| 536 | 494 |
| 537 buffer_id_to_state_map_.erase(buffer_id_to_drop); | 495 buffer_id_to_state_map_.erase(buffer_id_to_drop); |
| 538 } | 496 } |
| 539 | 497 |
| 540 void VideoCaptureController::DoNewBufferOnIOThread( | 498 void VideoCaptureController::DoNewBufferOnIOThread( |
| 541 ControllerClient* client, | 499 ControllerClient* client, |
| 542 media::VideoCaptureDevice::Client::Buffer* buffer, | 500 media::VideoCaptureDevice::Client::Buffer* buffer, |
| 543 const scoped_refptr<media::VideoFrame>& frame) { | 501 const scoped_refptr<media::VideoFrame>& frame) { |
| 544 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 502 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 545 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); | 503 DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); |
| 546 | 504 |
| 547 const int buffer_id = buffer->id(); | 505 const int buffer_id = buffer->id(); |
| 548 mojo::ScopedSharedBufferHandle handle = | 506 mojo::ScopedSharedBufferHandle handle = |
| 549 buffer_pool_->GetHandleForTransit(buffer_id); | 507 frame_buffer_pool_->GetHandleForTransit(buffer_id); |
| 550 client->event_handler->OnBufferCreated(client->controller_id, | 508 client->event_handler->OnBufferCreated(client->controller_id, |
| 551 std::move(handle), | 509 std::move(handle), |
| 552 buffer->mapped_size(), buffer_id); | 510 buffer->mapped_size(), buffer_id); |
| 553 } | 511 } |
| 554 | 512 |
| 555 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( | 513 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( |
| 556 VideoCaptureControllerID id, | 514 VideoCaptureControllerID id, |
| 557 VideoCaptureControllerEventHandler* handler, | 515 VideoCaptureControllerEventHandler* handler, |
| 558 const ControllerClients& clients) { | 516 const ControllerClients& clients) { |
| 559 for (const auto& client : clients) { | 517 for (const auto& client : clients) { |
| 560 if (client->controller_id == id && client->event_handler == handler) | 518 if (client->controller_id == id && client->event_handler == handler) |
| 561 return client.get(); | 519 return client.get(); |
| 562 } | 520 } |
| 563 return nullptr; | 521 return nullptr; |
| 564 } | 522 } |
| 565 | 523 |
| 566 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( | 524 VideoCaptureController::ControllerClient* VideoCaptureController::FindClient( |
| 567 int session_id, | 525 int session_id, |
| 568 const ControllerClients& clients) { | 526 const ControllerClients& clients) { |
| 569 for (const auto& client : clients) { | 527 for (const auto& client : clients) { |
| 570 if (client->session_id == session_id) | 528 if (client->session_id == session_id) |
| 571 return client.get(); | 529 return client.get(); |
| 572 } | 530 } |
| 573 return nullptr; | 531 return nullptr; |
| 574 } | 532 } |
| 575 | 533 |
| 576 } // namespace content | 534 } // namespace content |
| OLD | NEW |