diff options
Diffstat (limited to 'chromium/media/capture/video/video_capture_buffer_pool_impl.cc')
-rw-r--r-- | chromium/media/capture/video/video_capture_buffer_pool_impl.cc | 78 |
1 files changed, 45 insertions, 33 deletions
diff --git a/chromium/media/capture/video/video_capture_buffer_pool_impl.cc b/chromium/media/capture/video/video_capture_buffer_pool_impl.cc index 64180e436d1..6913bfed465 100644 --- a/chromium/media/capture/video/video_capture_buffer_pool_impl.cc +++ b/chromium/media/capture/video/video_capture_buffer_pool_impl.cc @@ -133,33 +133,49 @@ void VideoCaptureBufferPoolImpl::RelinquishProducerReservation(int buffer_id) { NOTREACHED() << "Invalid buffer_id."; return; } - DCHECK(tracker->held_by_producer()); - tracker->set_held_by_producer(false); + tracker->SetHeldByProducer(false); } int VideoCaptureBufferPoolImpl::ReserveIdForExternalBuffer( - std::vector<int>* buffer_ids_to_drop) { + const gfx::GpuMemoryBufferHandle& handle, + int* buffer_id_to_drop) { base::AutoLock lock(lock_); - int buffer_id = next_buffer_id_++; - external_buffers_[buffer_id] = false; - - for (auto it = external_buffers_.begin(); it != external_buffers_.end();) { - if (it->second) { - buffer_ids_to_drop->push_back(it->first); - it = external_buffers_.erase(it); - } else { - ++it; + + // Look for a tracker that matches this buffer and is not in use. While + // iterating, find the least recently used tracker. + *buffer_id_to_drop = kInvalidId; + auto lru_tracker_it = trackers_.end(); + for (auto it = trackers_.begin(); it != trackers_.end(); ++it) { + VideoCaptureBufferTracker* const tracker = it->second.get(); + if (tracker->IsHeldByProducerOrConsumer()) + continue; + + if (tracker->IsSameGpuMemoryBuffer(handle)) { + tracker->SetHeldByProducer(true); + return it->first; + } + + if (lru_tracker_it == trackers_.end() || + lru_tracker_it->second->LastCustomerUseSequenceNumber() > + tracker->LastCustomerUseSequenceNumber()) { + lru_tracker_it = it; } } - return buffer_id; -} -void VideoCaptureBufferPoolImpl::RelinquishExternalBufferReservation( - int buffer_id) { - base::AutoLock lock(lock_); - auto found = external_buffers_.find(buffer_id); - CHECK(found != external_buffers_.end()); - found->second = true; + // Free the least recently used tracker, if needed. + if (trackers_.size() >= static_cast<size_t>(count_) && + lru_tracker_it != trackers_.end()) { + *buffer_id_to_drop = lru_tracker_it->first; + trackers_.erase(lru_tracker_it); + } + + // Create the new tracker. + const int new_buffer_id = next_buffer_id_++; + auto tracker = + buffer_tracker_factory_->CreateTrackerForExternalGpuMemoryBuffer(handle); + tracker->SetHeldByProducer(true); + trackers_[new_buffer_id] = std::move(tracker); + return new_buffer_id; } void VideoCaptureBufferPoolImpl::HoldForConsumers(int buffer_id, @@ -170,11 +186,8 @@ void VideoCaptureBufferPoolImpl::HoldForConsumers(int buffer_id, NOTREACHED() << "Invalid buffer_id."; return; } - DCHECK(tracker->held_by_producer()); - DCHECK(!tracker->consumer_hold_count()); - - tracker->set_consumer_hold_count(num_clients); - // Note: |held_by_producer()| will stay true until + tracker->AddConsumerHolds(num_clients); + // Note: The buffer will stay held by the producer until // RelinquishProducerReservation() (usually called by destructor of the object // wrapping this tracker, e.g. a VideoFrame). } @@ -187,10 +200,7 @@ void VideoCaptureBufferPoolImpl::RelinquishConsumerHold(int buffer_id, NOTREACHED() << "Invalid buffer_id."; return; } - DCHECK_GE(tracker->consumer_hold_count(), num_clients); - - tracker->set_consumer_hold_count(tracker->consumer_hold_count() - - num_clients); + tracker->RemoveConsumerHolds(num_clients); } double VideoCaptureBufferPoolImpl::GetBufferPoolUtilization() const { @@ -198,7 +208,7 @@ double VideoCaptureBufferPoolImpl::GetBufferPoolUtilization() const { int num_buffers_held = 0; for (const auto& entry : trackers_) { VideoCaptureBufferTracker* const tracker = entry.second.get(); - if (tracker->held_by_producer() || tracker->consumer_hold_count() > 0) + if (tracker->IsHeldByProducerOrConsumer()) ++num_buffers_held; } return static_cast<double>(num_buffers_held) / count_; @@ -221,10 +231,10 @@ VideoCaptureBufferPoolImpl::ReserveForProducerInternal( auto tracker_to_drop = trackers_.end(); for (auto it = trackers_.begin(); it != trackers_.end(); ++it) { VideoCaptureBufferTracker* const tracker = it->second.get(); - if (!tracker->consumer_hold_count() && !tracker->held_by_producer()) { + if (!tracker->IsHeldByProducerOrConsumer()) { if (tracker->IsReusableForFormat(dimensions, pixel_format, strides)) { // Reuse this buffer - tracker->set_held_by_producer(true); + tracker->SetHeldByProducer(true); tracker->set_frame_feedback_id(frame_feedback_id); *buffer_id = it->first; return VideoCaptureDevice::Client::ReserveResult::kSucceeded; @@ -242,6 +252,8 @@ VideoCaptureBufferPoolImpl::ReserveForProducerInternal( if (tracker_to_drop == trackers_.end()) { // We're out of space, and can't find an unused tracker to reallocate. *buffer_id = kInvalidId; + DLOG(ERROR) << __func__ + << " max buffer count exceeded count_ = " << count_; return VideoCaptureDevice::Client::ReserveResult::kMaxBufferCountExceeded; } *buffer_id_to_drop = tracker_to_drop->first; @@ -259,7 +271,7 @@ VideoCaptureBufferPoolImpl::ReserveForProducerInternal( return VideoCaptureDevice::Client::ReserveResult::kAllocationFailed; } - tracker->set_held_by_producer(true); + tracker->SetHeldByProducer(true); tracker->set_frame_feedback_id(frame_feedback_id); trackers_[new_buffer_id] = std::move(tracker); |