Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: content/browser/renderer_host/media/video_capture_controller.cc

Issue 2659653002: Fix for issue 684766 Old/erroneous frame feedback during tab capture (Closed)
Patch Set: Exercise ResurrectLastOutputBuffer() and apply git cl format Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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>
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 frame_buffer_pool_->ReleaseBufferHold(buffer_id_); 138 frame_buffer_pool_->ReleaseBufferHold(buffer_id_);
139 max_consumer_utilization_ = 139 max_consumer_utilization_ =
140 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; 140 media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded;
141 } 141 }
142 } 142 }
143 143
144 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() { 144 bool VideoCaptureController::BufferState::HasZeroConsumerHoldCount() {
145 return consumer_hold_count_ == 0; 145 return consumer_hold_count_ == 0;
146 } 146 }
147 147
148 void VideoCaptureController::BufferState::SetFrameFeedbackId(int id) {
149 DCHECK_CURRENTLY_ON(BrowserThread::IO);
150 frame_feedback_id_ = id;
151 }
152
148 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( 153 void VideoCaptureController::BufferState::SetConsumerFeedbackObserver(
149 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) { 154 media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer) {
150 DCHECK_CURRENTLY_ON(BrowserThread::IO); 155 DCHECK_CURRENTLY_ON(BrowserThread::IO);
151 consumer_feedback_observer_ = consumer_feedback_observer; 156 consumer_feedback_observer_ = consumer_feedback_observer;
152 } 157 }
153 158
154 void VideoCaptureController::BufferState::SetFrameBufferPool( 159 void VideoCaptureController::BufferState::SetFrameBufferPool(
155 media::FrameBufferPool* frame_buffer_pool) { 160 media::FrameBufferPool* frame_buffer_pool) {
156 DCHECK_CURRENTLY_ON(BrowserThread::IO); 161 DCHECK_CURRENTLY_ON(BrowserThread::IO);
157 frame_buffer_pool_ = frame_buffer_pool; 162 frame_buffer_pool_ = frame_buffer_pool;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 } 375 }
371 376
372 void VideoCaptureController::OnIncomingCapturedVideoFrame( 377 void VideoCaptureController::OnIncomingCapturedVideoFrame(
373 media::VideoCaptureDevice::Client::Buffer buffer, 378 media::VideoCaptureDevice::Client::Buffer buffer,
374 scoped_refptr<VideoFrame> frame) { 379 scoped_refptr<VideoFrame> frame) {
375 DCHECK_CURRENTLY_ON(BrowserThread::IO); 380 DCHECK_CURRENTLY_ON(BrowserThread::IO);
376 const int buffer_id = buffer.id(); 381 const int buffer_id = buffer.id();
377 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); 382 DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId);
378 383
379 // Insert if not exists. 384 // Insert if not exists.
380 const auto it = 385 const auto insert_result = buffer_id_to_state_map_.insert(std::make_pair(
381 buffer_id_to_state_map_ 386 buffer_id, BufferState(buffer_id, buffer.frame_feedback_id(),
382 .insert(std::make_pair( 387 consumer_feedback_observer_.get(),
383 buffer_id, BufferState(buffer_id, buffer.frame_feedback_id(), 388 frame_buffer_pool_.get())));
384 consumer_feedback_observer_.get(), 389 BufferState& buffer_state = insert_result.first->second;
385 frame_buffer_pool_.get())))
386 .first;
387 BufferState& buffer_state = it->second;
388 DCHECK(buffer_state.HasZeroConsumerHoldCount()); 390 DCHECK(buffer_state.HasZeroConsumerHoldCount());
391 // If a BufferState for |buffer_id| already existed, we must update the
392 // |frame_feedback_id| of the existing entry.
393 if (!insert_result.second)
394 buffer_state.SetFrameFeedbackId(buffer.frame_feedback_id());
389 395
390 if (state_ == VIDEO_CAPTURE_STATE_STARTED) { 396 if (state_ == VIDEO_CAPTURE_STATE_STARTED) {
391 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) { 397 if (!frame->metadata()->HasKey(VideoFrameMetadata::FRAME_RATE)) {
392 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE, 398 frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE,
393 video_capture_format_.frame_rate); 399 video_capture_format_.frame_rate);
394 } 400 }
395 std::unique_ptr<base::DictionaryValue> metadata = 401 std::unique_ptr<base::DictionaryValue> metadata =
396 frame->metadata()->CopyInternalValues(); 402 frame->metadata()->CopyInternalValues();
397 403
398 // Only I420 and Y16 pixel formats are currently supported. 404 // Only I420 and Y16 pixel formats are currently supported.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 int session_id, 519 int session_id,
514 const ControllerClients& clients) { 520 const ControllerClients& clients) {
515 for (const auto& client : clients) { 521 for (const auto& client : clients) {
516 if (client->session_id == session_id) 522 if (client->session_id == session_id)
517 return client.get(); 523 return client.get();
518 } 524 }
519 return nullptr; 525 return nullptr;
520 } 526 }
521 527
522 } // namespace content 528 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698