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

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

Issue 2308533003: Break tight coupling of VideoCaptureDeviceClient to renderer_host (Closed)
Patch Set: mcasas' comments Created 4 years, 3 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 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 d72cb3dea7174a2c64f229300efd8ebc70817c54..df225b24e75d7f25ffb2fb8e6d195488660d73d0 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -21,6 +21,7 @@
#include "content/browser/renderer_host/media/media_stream_manager.h"
#include "content/browser/renderer_host/media/video_capture_buffer_pool.h"
#include "content/browser/renderer_host/media/video_capture_device_client.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"
@@ -79,6 +80,50 @@ void ReturnVideoFrame(const scoped_refptr<VideoFrame>& video_frame,
#endif
}
+std::unique_ptr<VideoCaptureJpegDecoder> CreateGpuJpegDecoder(
+ const VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) {
+ return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb);
+}
+
+// Decorator for VideoFrameReceiver that forwards all incoming calls
+// to the Browser IO thread.
+class PostOnIOThreadVideoFrameReceiver : public VideoFrameReceiver {
+ public:
+ PostOnIOThreadVideoFrameReceiver(
miu 2016/09/13 00:33:29 Sorry, didn't see this the last time around: Pleas
chfremer 2016/09/14 16:26:01 Done.
+ const base::WeakPtr<VideoFrameReceiver>& receiver)
+ : receiver_(receiver) {}
+
+ void OnIncomingCapturedVideoFrame(
miu 2016/09/12 20:16:46 Please use base::ThreadChecker to ensure all these
chfremer 2016/09/12 22:23:33 Hmm, I am not sure I agree that this would be an i
miu 2016/09/13 00:33:29 Generally, in Chromium code, we try to adhere to t
chfremer 2016/09/14 16:26:01 Thanks. This insight is super useful for me learni
miu 2016/09/16 21:10:25 There is variance in styles/attitudes, depending o
chfremer 2016/09/17 00:09:21 Thanks for this explanation, which I find helpful.
+ std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
+ const scoped_refptr<media::VideoFrame>& frame) override {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_,
+ base::Passed(&buffer), 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,
miu 2016/09/12 20:16:46 This makes me wonder whether receiver_ needs to be
chfremer 2016/09/12 22:23:33 Thanks. This is an interesting question. I haven't
chfremer 2016/09/14 16:26:01 After thinking about it more carefully, I don't th
miu 2016/09/16 21:10:25 What I was thinking (I now realize is not quite ri
chfremer 2016/09/17 00:09:21 Yes, that is exactly right. Adding the decorator b
+ base::Bind(&VideoFrameReceiver::OnBufferDestroyed,
+ receiver_, buffer_id_to_drop));
+ }
+
+ private:
+ base::WeakPtr<VideoFrameReceiver> receiver_;
+};
+
} // anonymous namespace
struct VideoCaptureController::ControllerClient {
@@ -148,7 +193,12 @@ std::unique_ptr<media::VideoCaptureDevice::Client>
VideoCaptureController::NewDeviceClient() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
return base::MakeUnique<VideoCaptureDeviceClient>(
- this->GetWeakPtrForIOThread(), buffer_pool_);
+ base::MakeUnique<PostOnIOThreadVideoFrameReceiver>(
+ this->GetWeakPtrForIOThread()),
+ buffer_pool_,
+ base::Bind(&CreateGpuJpegDecoder,
+ base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame,
+ this->GetWeakPtrForIOThread())));
}
void VideoCaptureController::AddClient(
@@ -354,7 +404,7 @@ VideoCaptureController::~VideoCaptureController() {
controller_clients_.end());
}
-void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
+void VideoCaptureController::OnIncomingCapturedVideoFrame(
std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
const scoped_refptr<VideoFrame>& frame) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -425,7 +475,7 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
buffer_pool_->HoldForConsumers(buffer_id, count);
}
-void VideoCaptureController::DoErrorOnIOThread() {
+void VideoCaptureController::OnError() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
state_ = VIDEO_CAPTURE_STATE_ERROR;
@@ -436,13 +486,12 @@ void VideoCaptureController::DoErrorOnIOThread() {
}
}
-void VideoCaptureController::DoLogOnIOThread(const std::string& message) {
+void VideoCaptureController::OnLog(const std::string& message) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
MediaStreamManager::SendMessageToNativeLog("Video capture: " + message);
}
-void VideoCaptureController::DoBufferDestroyedOnIOThread(
- int buffer_id_to_drop) {
+void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
for (auto* client : controller_clients_) {

Powered by Google App Engine
This is Rietveld 408576698