Index: content/browser/renderer_host/media/video_capture_controller.cc |
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc |
index 5f226b65422b880d21a94c1fe6795ede553eb2a5..ba64d2534d59785ac49e02ff27aba7a2610052df 100644 |
--- a/content/browser/renderer_host/media/video_capture_controller.cc |
+++ b/content/browser/renderer_host/media/video_capture_controller.cc |
@@ -18,12 +18,11 @@ |
#include "build/build_config.h" |
#include "components/display_compositor/gl_helper.h" |
#include "content/browser/renderer_host/media/media_stream_manager.h" |
-#include "content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h" |
#include "content/browser/renderer_host/media/video_capture_manager.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/common/content_switches.h" |
#include "media/base/video_frame.h" |
-#include "media/capture/video/video_capture_buffer_pool_impl.h" |
+#include "media/capture/video/video_capture_buffer_pool.h" |
#include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" |
#include "media/capture/video/video_capture_device_client.h" |
@@ -46,50 +45,6 @@ static const int kInfiniteRatio = 99999; |
name, \ |
(height) ? ((width) * 100) / (height) : kInfiniteRatio); |
-std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder( |
- const media::VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) { |
- return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb); |
-} |
- |
-// Decorator for media::VideoFrameReceiver that forwards all incoming calls |
-// to the Browser IO thread. |
-class VideoFrameReceiverOnIOThread : public media::VideoFrameReceiver { |
- public: |
- explicit VideoFrameReceiverOnIOThread( |
- const base::WeakPtr<VideoFrameReceiver>& receiver) |
- : receiver_(receiver) {} |
- |
- void OnIncomingCapturedVideoFrame( |
- std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
- scoped_refptr<media::VideoFrame> frame) override { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_, |
- base::Passed(&buffer), std::move(frame))); |
- } |
- |
- void OnError() override { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&VideoFrameReceiver::OnError, receiver_)); |
- } |
- |
- void OnLog(const std::string& message) override { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&VideoFrameReceiver::OnLog, receiver_, message)); |
- } |
- |
- void OnBufferDestroyed(int buffer_id_to_drop) override { |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&VideoFrameReceiver::OnBufferDestroyed, |
- receiver_, buffer_id_to_drop)); |
- } |
- |
- private: |
- base::WeakPtr<VideoFrameReceiver> receiver_; |
-}; |
- |
} // anonymous namespace |
struct VideoCaptureController::ControllerClient { |
@@ -140,12 +95,12 @@ VideoCaptureController::BufferState::BufferState( |
int buffer_id, |
int frame_feedback_id, |
media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, |
- scoped_refptr<media::VideoCaptureBufferPool> buffer_pool, |
+ media::FrameBufferPool* frame_buffer_pool, |
scoped_refptr<media::VideoFrame> frame) |
: buffer_id_(buffer_id), |
frame_feedback_id_(frame_feedback_id), |
consumer_feedback_observer_(consumer_feedback_observer), |
- buffer_pool_(std::move(buffer_pool)), |
+ frame_buffer_pool_(frame_buffer_pool), |
frame_(std::move(frame)), |
max_consumer_utilization_( |
media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), |
@@ -166,7 +121,8 @@ void VideoCaptureController::BufferState::RecordConsumerUtilization( |
void VideoCaptureController::BufferState::IncreaseConsumerCount() { |
if (consumer_hold_count_ == 0) |
- buffer_pool_->HoldForConsumers(buffer_id_, 1); |
+ if (frame_buffer_pool_ != nullptr) |
miu
2016/12/13 21:11:10
Instead of nesting if-statements, consider consoli
chfremer
2016/12/13 23:12:39
In this case, we have the statement in l.125 to be
|
+ frame_buffer_pool_->SetBufferHold(buffer_id_); |
consumer_hold_count_++; |
} |
@@ -179,7 +135,8 @@ void VideoCaptureController::BufferState::DecreaseConsumerCount() { |
consumer_feedback_observer_->OnUtilizationReport( |
frame_feedback_id_, max_consumer_utilization_); |
} |
- buffer_pool_->RelinquishConsumerHold(buffer_id_, 1); |
+ if (frame_buffer_pool_ != nullptr) |
+ frame_buffer_pool_->ReleaseBufferHold(buffer_id_); |
max_consumer_utilization_ = |
media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; |
} |
@@ -194,10 +151,13 @@ void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( |
consumer_feedback_observer_ = consumer_feedback_observer; |
} |
-VideoCaptureController::VideoCaptureController(int max_buffers) |
- : buffer_pool_(new media::VideoCaptureBufferPoolImpl( |
- base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), |
- max_buffers)), |
+void VideoCaptureController::BufferState::SetFrameBufferPool( |
+ media::FrameBufferPool* frame_buffer_pool) { |
+ frame_buffer_pool_ = frame_buffer_pool; |
+} |
+ |
+VideoCaptureController::VideoCaptureController() |
+ : frame_buffer_pool_(nullptr), |
consumer_feedback_observer_(nullptr), |
state_(VIDEO_CAPTURE_STATE_STARTED), |
has_received_frames_(false), |
@@ -205,11 +165,22 @@ VideoCaptureController::VideoCaptureController(int max_buffers) |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
} |
+VideoCaptureController::~VideoCaptureController() = default; |
+ |
base::WeakPtr<VideoCaptureController> |
VideoCaptureController::GetWeakPtrForIOThread() { |
return weak_ptr_factory_.GetWeakPtr(); |
} |
+void VideoCaptureController::SetFrameBufferPool( |
+ std::unique_ptr<media::FrameBufferPool> frame_buffer_pool) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ frame_buffer_pool_ = std::move(frame_buffer_pool); |
+ // Update existing BufferState entries. |
+ for (auto& entry : buffer_id_to_state_map_) |
+ entry.second.SetFrameBufferPool(frame_buffer_pool_.get()); |
+} |
+ |
void VideoCaptureController::SetConsumerFeedbackObserver( |
std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> |
consumer_feedback_observer) { |
@@ -220,18 +191,6 @@ void VideoCaptureController::SetConsumerFeedbackObserver( |
entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); |
} |
-std::unique_ptr<media::VideoCaptureDevice::Client> |
-VideoCaptureController::NewDeviceClient() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- return base::MakeUnique<media::VideoCaptureDeviceClient>( |
- base::MakeUnique<VideoFrameReceiverOnIOThread>( |
- this->GetWeakPtrForIOThread()), |
- buffer_pool_, |
- base::Bind(&CreateGpuJpegDecoder, |
- base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, |
- this->GetWeakPtrForIOThread()))); |
-} |
- |
void VideoCaptureController::AddClient( |
VideoCaptureControllerID id, |
VideoCaptureControllerEventHandler* event_handler, |
@@ -410,13 +369,11 @@ VideoCaptureController::GetVideoCaptureFormat() const { |
return video_capture_format_; |
} |
-VideoCaptureController::~VideoCaptureController() { |
-} |
- |
void VideoCaptureController::OnIncomingCapturedVideoFrame( |
std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
scoped_refptr<VideoFrame> frame) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK(frame_buffer_pool_); |
const int buffer_id = buffer->id(); |
DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); |
@@ -426,7 +383,7 @@ void VideoCaptureController::OnIncomingCapturedVideoFrame( |
.insert(std::make_pair( |
buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), |
consumer_feedback_observer_.get(), |
- buffer_pool_, frame))) |
+ frame_buffer_pool_.get(), frame))) |
.first; |
BufferState& buffer_state = it->second; |
DCHECK(buffer_state.HasZeroConsumerHoldCount()); |
@@ -520,6 +477,7 @@ void VideoCaptureController::OnLog(const std::string& message) { |
void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK(frame_buffer_pool_); |
for (const auto& client : controller_clients_) { |
if (client->session_closed) |
@@ -544,10 +502,11 @@ void VideoCaptureController::DoNewBufferOnIOThread( |
const scoped_refptr<media::VideoFrame>& frame) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); |
+ CHECK(frame_buffer_pool_); |
miu
2016/12/13 21:11:10
DCHECK instead of CHECK?
Actually, the since |fra
chfremer
2016/12/13 23:12:39
Done.
|
const int buffer_id = buffer->id(); |
mojo::ScopedSharedBufferHandle handle = |
- buffer_pool_->GetHandleForTransit(buffer_id); |
+ frame_buffer_pool_->GetHandleForTransit(buffer_id); |
client->event_handler->OnBufferCreated(client->controller_id, |
std::move(handle), |
buffer->mapped_size(), buffer_id); |