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/media_recorder_handler.h" | 5 #include "content/renderer/media/media_recorder_handler.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 return base::EqualsCaseInsensitiveASCII(codec, name); | 75 return base::EqualsCaseInsensitiveASCII(codec, name); |
76 }); | 76 }); |
77 if (found == &codecs[codecs_count]) | 77 if (found == &codecs[codecs_count]) |
78 return false; | 78 return false; |
79 } | 79 } |
80 return true; | 80 return true; |
81 } | 81 } |
82 | 82 |
83 bool MediaRecorderHandler::initialize( | 83 bool MediaRecorderHandler::initialize( |
84 blink::WebMediaRecorderHandlerClient* client, | 84 blink::WebMediaRecorderHandlerClient* client, |
85 const blink::WebMediaStream& media_stream, | 85 const blink::WebMediaStream& web_media_stream, |
86 const blink::WebString& type, | 86 const blink::WebString& type, |
87 const blink::WebString& codecs) { | 87 const blink::WebString& codecs) { |
88 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 88 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
89 // Save histogram data so we can see how much MediaStream Recorder is used. | 89 // Save histogram data so we can see how much MediaStream Recorder is used. |
90 // The histogram counts the number of calls to the JS API. | 90 // The histogram counts the number of calls to the JS API. |
91 UpdateWebRTCMethodCount(WEBKIT_MEDIA_STREAM_RECORDER); | 91 UpdateWebRTCMethodCount(WEBKIT_MEDIA_STREAM_RECORDER); |
92 | 92 |
93 if (!canSupportMimeType(type, codecs)) { | 93 if (!canSupportMimeType(type, codecs)) { |
94 DLOG(ERROR) << "Can't support " << type.utf8() | 94 DLOG(ERROR) << "Can't support " << type.utf8() |
95 << ";codecs=" << codecs.utf8(); | 95 << ";codecs=" << codecs.utf8(); |
96 return false; | 96 return false; |
97 } | 97 } |
98 use_vp9_ = base::ToLowerASCII(codecs.utf8()).find("vp9") != std::string::npos; | 98 use_vp9_ = base::ToLowerASCII(codecs.utf8()).find("vp9") != std::string::npos; |
99 media_stream_ = media_stream; | |
100 DCHECK(client); | 99 DCHECK(client); |
101 client_ = client; | 100 client_ = client; |
102 | 101 |
| 102 web_media_stream_ = web_media_stream; |
| 103 MediaStream::GetMediaStream(web_media_stream)->AddObserver(this); |
| 104 |
103 return true; | 105 return true; |
104 } | 106 } |
105 | 107 |
106 bool MediaRecorderHandler::start() { | 108 bool MediaRecorderHandler::start() { |
107 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 109 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
108 DCHECK(!recording_); | 110 DCHECK(!recording_); |
109 return start(0); | 111 return start(0); |
110 } | 112 } |
111 | 113 |
112 bool MediaRecorderHandler::start(int timeslice) { | 114 bool MediaRecorderHandler::start(int timeslice) { |
113 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 115 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
114 DCHECK(!recording_); | 116 DCHECK(!recording_); |
115 DCHECK(!media_stream_.isNull()); | 117 DCHECK(!web_media_stream_.isNull()); |
116 DCHECK(timeslice_.is_zero()); | 118 DCHECK(timeslice_.is_zero()); |
117 DCHECK(!webm_muxer_); | 119 DCHECK(!webm_muxer_); |
118 | 120 |
119 timeslice_ = TimeDelta::FromMilliseconds(timeslice); | 121 timeslice_ = TimeDelta::FromMilliseconds(timeslice); |
120 slice_origin_timestamp_ = TimeTicks::Now(); | 122 slice_origin_timestamp_ = TimeTicks::Now(); |
121 | 123 |
122 blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks; | 124 blink::WebVector<blink::WebMediaStreamTrack> video_tracks, audio_tracks; |
123 media_stream_.videoTracks(video_tracks); | 125 web_media_stream_.videoTracks(video_tracks); |
124 media_stream_.audioTracks(audio_tracks); | 126 web_media_stream_.audioTracks(audio_tracks); |
125 | 127 |
126 if (video_tracks.isEmpty() && audio_tracks.isEmpty()) { | 128 if (video_tracks.isEmpty() && audio_tracks.isEmpty()) { |
127 LOG(WARNING) << __FUNCTION__ << ": no media tracks."; | 129 LOG(WARNING) << __FUNCTION__ << ": no media tracks."; |
128 return false; | 130 return false; |
129 } | 131 } |
130 | 132 |
131 const bool use_audio_tracks = | 133 const bool use_audio_tracks = |
132 !audio_tracks.isEmpty() && | 134 !audio_tracks.isEmpty() && |
133 MediaStreamAudioTrack::GetTrack(audio_tracks[0]); | 135 MediaStreamAudioTrack::GetTrack(audio_tracks[0]); |
134 | 136 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 } | 200 } |
199 | 201 |
200 void MediaRecorderHandler::resume() { | 202 void MediaRecorderHandler::resume() { |
201 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 203 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
202 DCHECK(!recording_); | 204 DCHECK(!recording_); |
203 recording_ = true; | 205 recording_ = true; |
204 for (const auto& video_recorder : video_recorders_) | 206 for (const auto& video_recorder : video_recorders_) |
205 video_recorder->Resume(); | 207 video_recorder->Resume(); |
206 } | 208 } |
207 | 209 |
| 210 void MediaRecorderHandler::TrackAdded(const blink::WebMediaStreamTrack& track) { |
| 211 client_->onError("Track added"); |
| 212 } |
| 213 |
| 214 void MediaRecorderHandler::TrackRemoved( |
| 215 const blink::WebMediaStreamTrack& track) { |
| 216 client_->onError("Track removed"); |
| 217 } |
| 218 |
208 void MediaRecorderHandler::OnEncodedVideo( | 219 void MediaRecorderHandler::OnEncodedVideo( |
209 const scoped_refptr<media::VideoFrame>& video_frame, | 220 const scoped_refptr<media::VideoFrame>& video_frame, |
210 scoped_ptr<std::string> encoded_data, | 221 scoped_ptr<std::string> encoded_data, |
211 TimeTicks timestamp, | 222 TimeTicks timestamp, |
212 bool is_key_frame) { | 223 bool is_key_frame) { |
213 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 224 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
214 if (!webm_muxer_) | 225 if (!webm_muxer_) |
215 return; | 226 return; |
216 webm_muxer_->OnEncodedVideo(video_frame, std::move(encoded_data), timestamp, | 227 webm_muxer_->OnEncodedVideo(video_frame, std::move(encoded_data), timestamp, |
217 is_key_frame); | 228 is_key_frame); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 recorder->OnData(audio_bus, timestamp); | 267 recorder->OnData(audio_bus, timestamp); |
257 } | 268 } |
258 | 269 |
259 void MediaRecorderHandler::SetAudioFormatForTesting( | 270 void MediaRecorderHandler::SetAudioFormatForTesting( |
260 const media::AudioParameters& params) { | 271 const media::AudioParameters& params) { |
261 for (auto* recorder : audio_recorders_) | 272 for (auto* recorder : audio_recorders_) |
262 recorder->OnSetFormat(params); | 273 recorder->OnSetFormat(params); |
263 } | 274 } |
264 | 275 |
265 } // namespace content | 276 } // namespace content |
OLD | NEW |