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