Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 |
| OLD | NEW |