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

Unified Diff: content/browser/renderer_host/media/video_capture_controller.cc

Issue 2551193002: [Mojo Video Capture] Decouple VCController from VCBufferPool and VCDeviceClient (Closed)
Patch Set: mcasas comments Created 4 years 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 side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698