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

Unified Diff: content/renderer/media/video_track_recorder.cc

Issue 2000003002: Initialize based on frame sizes in VideoTrackRecorder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mrgpu2
Patch Set: Created 4 years, 6 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/renderer/media/video_track_recorder.cc
diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc
index d65e238e8795e5d07b6ffcba163d6c135fb684c0..30bd47605c46145352fe2a2e1c8c6145277dc76c 100644
--- a/content/renderer/media/video_track_recorder.cc
+++ b/content/renderer/media/video_track_recorder.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/macros.h"
+#include "base/synchronization/waitable_event.h"
#include "base/sys_info.h"
#include "base/task_runner_util.h"
#include "base/threading/thread.h"
@@ -71,13 +72,15 @@ media::VideoCodecProfile CodecIdToVEAProfile(
#if defined(OS_CHROMEOS)
return media::VIDEO_CODEC_PROFILE_UNKNOWN;
#endif // defined(OS_CHROMEOS)
- content::RenderThreadImpl* render_thread_impl =
+ content::RenderThreadImpl* const render_thread_impl =
content::RenderThreadImpl::current();
- if (!render_thread_impl)
+ if (!render_thread_impl) {
+ DVLOG(3) << "Couldn't access the render thread";
return media::VIDEO_CODEC_PROFILE_UNKNOWN;
+ }
- media::GpuVideoAcceleratorFactories* gpu_factories =
- content::RenderThreadImpl::current()->GetGpuFactories();
+ media::GpuVideoAcceleratorFactories* const gpu_factories =
+ render_thread_impl->GetGpuFactories();
if (!gpu_factories || !gpu_factories->IsGpuVideoAcceleratorEnabled()) {
DVLOG(3) << "Couldn't initialize GpuVideoAcceleratorFactories";
return media::VIDEO_CODEC_PROFILE_UNKNOWN;
@@ -936,37 +939,23 @@ VideoTrackRecorder::VideoTrackRecorder(
const blink::WebMediaStreamTrack& track,
const OnEncodedVideoCB& on_encoded_video_callback,
int32_t bits_per_second)
- : track_(track) {
+ : main_task_runner_(base::MessageLoop::current()->task_runner()),
+ track_(track),
+ codec_(codec),
+ on_encoded_video_callback_(on_encoded_video_callback),
+ bits_per_second_(bits_per_second),
+ paused_before_init_(false),
+ weak_ptr_factory_(this) {
DCHECK(main_render_thread_checker_.CalledOnValidThread());
DCHECK(!track_.isNull());
DCHECK(track_.getTrackData());
- const auto& vea_supported_profile = CodecIdToVEAProfile(codec);
- // TODO(emircan): Prioritize software based encoders in lower resolutions.
- if (vea_supported_profile != media::VIDEO_CODEC_PROFILE_UNKNOWN) {
- encoder_ = new VEAEncoder(on_encoded_video_callback, bits_per_second,
- vea_supported_profile);
- } else {
- switch (codec) {
-#if BUILDFLAG(RTC_USE_H264)
- case CodecId::H264:
- encoder_ = new H264Encoder(on_encoded_video_callback, bits_per_second);
- break;
-#endif
- case CodecId::VP8:
- case CodecId::VP9:
- encoder_ = new VpxEncoder(codec == CodecId::VP9,
- on_encoded_video_callback, bits_per_second);
- break;
- default:
- NOTREACHED() << "Unsupported codec";
- }
- }
-
- // StartFrameEncode() will be called on Render IO thread.
+ // ReceiveFirstFrameOnIOThread() will be called on Render IO thread.
+ // It is safe to use Unretained, because the class gets disconnected from
+ // track in dtor.
MediaStreamVideoSink::ConnectToTrack(
- track_,
- base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode, encoder_),
+ track_, base::Bind(&VideoTrackRecorder::ReceiveFirstFrameOnIOThread,
+ base::Unretained(this)),
false);
}
@@ -978,20 +967,106 @@ VideoTrackRecorder::~VideoTrackRecorder() {
void VideoTrackRecorder::Pause() {
DCHECK(main_render_thread_checker_.CalledOnValidThread());
- DCHECK(encoder_);
- encoder_->SetPaused(true);
+ if (encoder_)
+ encoder_->SetPaused(true);
+ else
+ paused_before_init_ = true;
}
void VideoTrackRecorder::Resume() {
DCHECK(main_render_thread_checker_.CalledOnValidThread());
- DCHECK(encoder_);
- encoder_->SetPaused(false);
+ if (encoder_)
+ encoder_->SetPaused(false);
+ else
+ paused_before_init_ = false;
}
void VideoTrackRecorder::OnVideoFrameForTesting(
const scoped_refptr<media::VideoFrame>& frame,
base::TimeTicks timestamp) {
- encoder_->StartFrameEncode(frame, timestamp);
+ DVLOG(3) << __FUNCTION__;
+ // We run on a single thread for tests. However, we still need to initialize
+ // these variables for checks.
+ if (!origin_task_runner_.get())
+ origin_task_runner_ = base::MessageLoop::current()->task_runner();
+
+ if (encoder_)
+ encoder_->StartFrameEncode(frame, timestamp);
+ else
+ InitializeEncoderOnMainThread(frame, timestamp, nullptr);
+}
+
+void VideoTrackRecorder::ReceiveFirstFrameOnIOThread(
+ const scoped_refptr<media::VideoFrame>& frame,
+ base::TimeTicks capture_time) {
+ DVLOG(3) << __FUNCTION__;
+ if (!origin_task_runner_.get())
+ origin_task_runner_ = base::MessageLoop::current()->task_runner();
+ DCHECK(origin_task_runner_->BelongsToCurrentThread());
+
+ DCHECK(!encoder_);
+ base::WaitableEvent initialization_waiter(
+ base::WaitableEvent::ResetPolicy::MANUAL,
+ base::WaitableEvent::InitialState::NOT_SIGNALED);
+ main_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&VideoTrackRecorder::InitializeEncoderOnMainThread,
+ weak_ptr_factory_.GetWeakPtr(), frame, capture_time,
+ &initialization_waiter));
+ initialization_waiter.Wait();
+ DCHECK(encoder_);
mcasas 2016/06/30 20:42:27 Keep this guy, right?
+}
+
+void VideoTrackRecorder::InitializeEncoderOnMainThread(
+ const scoped_refptr<media::VideoFrame>& frame,
+ base::TimeTicks capture_time,
+ base::WaitableEvent* async_waiter) {
+ DVLOG(3) << __FUNCTION__ << frame->visible_rect().size().ToString();
+ DCHECK(main_render_thread_checker_.CalledOnValidThread());
+
+ MediaStreamVideoSink::DisconnectFromTrack();
+
+ const gfx::Size& input_size = frame->visible_rect().size();
+ const auto& vea_supported_profile = CodecIdToVEAProfile(codec_);
+ if (vea_supported_profile != media::VIDEO_CODEC_PROFILE_UNKNOWN &&
+ input_size.width() >= kVEAEncoderMinResolutionWidth &&
+ input_size.height() >= kVEAEncoderMinResolutionHeight) {
+ encoder_ = new VEAEncoder(on_encoded_video_callback_, bits_per_second_,
+ vea_supported_profile);
+ } else {
+ switch (codec_) {
+#if BUILDFLAG(RTC_USE_H264)
+ case CodecId::H264:
+ encoder_ =
+ new H264Encoder(on_encoded_video_callback_, bits_per_second_);
+ break;
+#endif
+ case CodecId::VP8:
+ case CodecId::VP9:
+ encoder_ = new VpxEncoder(codec_ == CodecId::VP9,
+ on_encoded_video_callback_, bits_per_second_);
+ break;
+ default:
+ NOTREACHED() << "Unsupported codec";
+ }
+ }
+
+ if (paused_before_init_) {
+ encoder_->SetPaused(paused_before_init_);
+ } else {
+ // Send the first frame for encode on |origin_task_runner_|.
+ origin_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode,
+ encoder_, frame, capture_time));
+ }
+
+ // StartFrameEncode() will be called on Render IO thread.
+ MediaStreamVideoSink::ConnectToTrack(
+ track_,
+ base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode, encoder_),
+ false);
+
+ if (async_waiter)
+ async_waiter->Signal();
}
} // namespace content
« no previous file with comments | « content/renderer/media/video_track_recorder.h ('k') | content/renderer/media/video_track_recorder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698