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

Side by Side 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: Retake. 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/renderer/media/video_track_recorder.h" 5 #include "content/renderer/media/video_track_recorder.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 } 928 }
929 #endif //#if BUILDFLAG(RTC_USE_H264) 929 #endif //#if BUILDFLAG(RTC_USE_H264)
930 930
931 } // anonymous namespace 931 } // anonymous namespace
932 932
933 VideoTrackRecorder::VideoTrackRecorder( 933 VideoTrackRecorder::VideoTrackRecorder(
934 CodecId codec, 934 CodecId codec,
935 const blink::WebMediaStreamTrack& track, 935 const blink::WebMediaStreamTrack& track,
936 const OnEncodedVideoCB& on_encoded_video_callback, 936 const OnEncodedVideoCB& on_encoded_video_callback,
937 int32_t bits_per_second) 937 int32_t bits_per_second)
938 : track_(track) { 938 : main_task_runner_(base::MessageLoop::current()->task_runner()),
939 track_(track),
940 codec_(codec),
941 on_encoded_video_callback_(on_encoded_video_callback),
942 bits_per_second_(bits_per_second),
943 paused_before_init_(false),
944 weak_ptr_factory_(this) {
939 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 945 DCHECK(main_render_thread_checker_.CalledOnValidThread());
940 DCHECK(!track_.isNull()); 946 DCHECK(!track_.isNull());
941 DCHECK(track_.getTrackData()); 947 DCHECK(track_.getTrackData());
942 948
943 const auto& vea_supported_profile = CodecIdToVEAProfile(codec); 949 // InitializeEncoder() will be called on Render IO thread.
944 // TODO(emircan): Prioritize software based encoders in lower resolutions. 950 // It is safe to use Unretained, because the class gets disconnected from
945 if (vea_supported_profile != media::VIDEO_CODEC_PROFILE_UNKNOWN) { 951 // track in dtor.
946 encoder_ = new VEAEncoder(on_encoded_video_callback, bits_per_second,
947 vea_supported_profile);
948 } else {
949 switch (codec) {
950 #if BUILDFLAG(RTC_USE_H264)
951 case CodecId::H264:
952 encoder_ = new H264Encoder(on_encoded_video_callback, bits_per_second);
953 break;
954 #endif
955 case CodecId::VP8:
956 case CodecId::VP9:
957 encoder_ = new VpxEncoder(codec == CodecId::VP9,
958 on_encoded_video_callback, bits_per_second);
959 break;
960 default:
961 NOTREACHED() << "Unsupported codec";
962 }
963 }
964
965 // StartFrameEncode() will be called on Render IO thread.
966 MediaStreamVideoSink::ConnectToTrack( 952 MediaStreamVideoSink::ConnectToTrack(
967 track_, 953 track_, base::Bind(&VideoTrackRecorder::InitializeEncoder,
968 base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode, encoder_), 954 base::Unretained(this)),
mcasas 2016/06/08 18:51:24 weak_ptr_factory_.GetWeakPtr()
emircan 2016/06/09 03:03:43 Weak_ptr would be attached to the IO thread then?
mcasas 2016/06/12 08:56:34 Yes, the WeakPtrFactory (and associated pointers)
emircan 2016/06/13 19:55:40 As I said in my previous comment, "I initially had
969 false); 955 false);
970 } 956 }
971 957
972 VideoTrackRecorder::~VideoTrackRecorder() { 958 VideoTrackRecorder::~VideoTrackRecorder() {
973 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 959 DCHECK(main_render_thread_checker_.CalledOnValidThread());
974 MediaStreamVideoSink::DisconnectFromTrack(); 960 MediaStreamVideoSink::DisconnectFromTrack();
975 track_.reset(); 961 track_.reset();
976 } 962 }
977 963
978 void VideoTrackRecorder::Pause() { 964 void VideoTrackRecorder::Pause() {
979 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 965 DCHECK(main_render_thread_checker_.CalledOnValidThread());
980 DCHECK(encoder_); 966 if (encoder_)
981 encoder_->SetPaused(true); 967 encoder_->SetPaused(true);
968 else
969 paused_before_init_ = true;
982 } 970 }
983 971
984 void VideoTrackRecorder::Resume() { 972 void VideoTrackRecorder::Resume() {
985 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 973 DCHECK(main_render_thread_checker_.CalledOnValidThread());
986 DCHECK(encoder_); 974 if (encoder_)
987 encoder_->SetPaused(false); 975 encoder_->SetPaused(false);
976 else
977 paused_before_init_ = false;
988 } 978 }
989 979
990 void VideoTrackRecorder::OnVideoFrameForTesting( 980 void VideoTrackRecorder::OnVideoFrameForTesting(
991 const scoped_refptr<media::VideoFrame>& frame, 981 const scoped_refptr<media::VideoFrame>& frame,
992 base::TimeTicks timestamp) { 982 base::TimeTicks timestamp) {
993 encoder_->StartFrameEncode(frame, timestamp); 983 // We run on a single thread for tests. However, we still need to initialize
984 // these variables for checks.
985 if (!origin_task_runner_.get())
986 origin_task_runner_ = base::MessageLoop::current()->task_runner();
987
988 if (encoder_)
989 encoder_->StartFrameEncode(frame, timestamp);
990 else
991 InitializeEncoderTask(frame, timestamp);
992 }
993
994 void VideoTrackRecorder::InitializeEncoder(
995 const scoped_refptr<media::VideoFrame>& frame,
996 base::TimeTicks capture_time) {
997 if (!origin_task_runner_.get())
998 origin_task_runner_ = base::MessageLoop::current()->task_runner();
999 DCHECK(origin_task_runner_->BelongsToCurrentThread());
1000
1001 main_task_runner_->PostTask(
1002 FROM_HERE,
1003 base::Bind(&VideoTrackRecorder::InitializeEncoderTask,
1004 weak_ptr_factory_.GetWeakPtr(), frame, capture_time));
mcasas 2016/06/08 18:51:24 I like the new model of PostTask() here, then Disc
emircan 2016/06/09 03:03:43 I initially had a one-shot callback where I add me
1005 }
1006
1007 void VideoTrackRecorder::InitializeEncoderTask(
1008 const scoped_refptr<media::VideoFrame>& frame,
1009 base::TimeTicks capture_time) {
1010 DVLOG(3) << __FUNCTION__;
1011 DCHECK(main_render_thread_checker_.CalledOnValidThread());
1012
1013 MediaStreamVideoSink::DisconnectFromTrack();
1014
1015 const gfx::Size& input_size = frame->visible_rect().size();
1016 const auto& vea_supported_profile = CodecIdToVEAProfile(codec_);
1017 if (vea_supported_profile != media::VIDEO_CODEC_PROFILE_UNKNOWN &&
1018 input_size.width() >= kVEAEncoderMinResolutionWidth &&
1019 input_size.height() >= kVEAEncoderMinResolutionHeight) {
1020 encoder_ = new VEAEncoder(on_encoded_video_callback_, bits_per_second_,
1021 vea_supported_profile);
1022 } else {
1023 switch (codec_) {
1024 #if BUILDFLAG(RTC_USE_H264)
1025 case CodecId::H264:
1026 encoder_ =
1027 new H264Encoder(on_encoded_video_callback_, bits_per_second_);
1028 break;
1029 #endif
1030 case CodecId::VP8:
1031 case CodecId::VP9:
1032 encoder_ = new VpxEncoder(codec_ == CodecId::VP9,
1033 on_encoded_video_callback_, bits_per_second_);
1034 break;
1035 default:
1036 NOTREACHED() << "Unsupported codec";
1037 }
1038 }
1039
1040 if (paused_before_init_) {
1041 encoder_->SetPaused(paused_before_init_);
1042 } else {
1043 // Send the first frame for encode on Render IO thread.
1044 origin_task_runner_->PostTask(
1045 FROM_HERE, base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode,
1046 encoder_, frame, capture_time));
1047 }
1048
1049 // StartFrameEncode() will be called on Render IO thread.
1050 MediaStreamVideoSink::ConnectToTrack(
1051 track_,
1052 base::Bind(&VideoTrackRecorder::Encoder::StartFrameEncode, encoder_),
1053 false);
994 } 1054 }
995 1055
996 } // namespace content 1056 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698