OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "media/cast/receiver/frame_receiver.h" | 5 #include "media/cast/receiver/frame_receiver.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/big_endian.h" | 9 #include "base/big_endian.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 | 249 |
250 // At this point, we have a decrypted EncodedFrame ready to be emitted. | 250 // At this point, we have a decrypted EncodedFrame ready to be emitted. |
251 encoded_frame->reference_time = playout_time; | 251 encoded_frame->reference_time = playout_time; |
252 framer_.ReleaseFrame(encoded_frame->frame_id); | 252 framer_.ReleaseFrame(encoded_frame->frame_id); |
253 if (encoded_frame->new_playout_delay_ms) { | 253 if (encoded_frame->new_playout_delay_ms) { |
254 target_playout_delay_ = base::TimeDelta::FromMilliseconds( | 254 target_playout_delay_ = base::TimeDelta::FromMilliseconds( |
255 encoded_frame->new_playout_delay_ms); | 255 encoded_frame->new_playout_delay_ms); |
256 } | 256 } |
257 cast_environment_->PostTask(CastEnvironment::MAIN, | 257 cast_environment_->PostTask(CastEnvironment::MAIN, |
258 FROM_HERE, | 258 FROM_HERE, |
259 base::Bind(frame_request_queue_.front(), | 259 base::Bind(&FrameReceiver::EmitOneFrame, |
| 260 weak_factory_.GetWeakPtr(), |
| 261 frame_request_queue_.front(), |
260 base::Passed(&encoded_frame))); | 262 base::Passed(&encoded_frame))); |
261 frame_request_queue_.pop_front(); | 263 frame_request_queue_.pop_front(); |
262 } | 264 } |
263 } | 265 } |
264 | 266 |
265 void FrameReceiver::EmitAvailableEncodedFramesAfterWaiting() { | 267 void FrameReceiver::EmitAvailableEncodedFramesAfterWaiting() { |
266 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 268 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
267 DCHECK(is_waiting_for_consecutive_frame_); | 269 DCHECK(is_waiting_for_consecutive_frame_); |
268 is_waiting_for_consecutive_frame_ = false; | 270 is_waiting_for_consecutive_frame_ = false; |
269 EmitAvailableEncodedFrames(); | 271 EmitAvailableEncodedFrames(); |
270 } | 272 } |
271 | 273 |
| 274 void FrameReceiver::EmitOneFrame(const ReceiveEncodedFrameCallback& callback, |
| 275 scoped_ptr<EncodedFrame> encoded_frame) const { |
| 276 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 277 if (!callback.is_null()) |
| 278 callback.Run(encoded_frame.Pass()); |
| 279 } |
| 280 |
272 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { | 281 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { |
273 base::TimeDelta target_playout_delay = target_playout_delay_; | 282 base::TimeDelta target_playout_delay = target_playout_delay_; |
274 if (frame.new_playout_delay_ms) { | 283 if (frame.new_playout_delay_ms) { |
275 target_playout_delay = base::TimeDelta::FromMilliseconds( | 284 target_playout_delay = base::TimeDelta::FromMilliseconds( |
276 frame.new_playout_delay_ms); | 285 frame.new_playout_delay_ms); |
277 } | 286 } |
278 return lip_sync_reference_time_ + | 287 return lip_sync_reference_time_ + |
279 lip_sync_drift_.Current() + | 288 lip_sync_drift_.Current() + |
280 RtpDeltaToTimeDelta( | 289 RtpDeltaToTimeDelta( |
281 static_cast<int32>(frame.rtp_timestamp - lip_sync_rtp_timestamp_), | 290 static_cast<int32>(frame.rtp_timestamp - lip_sync_rtp_timestamp_), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 } | 329 } |
321 | 330 |
322 void FrameReceiver::SendNextRtcpReport() { | 331 void FrameReceiver::SendNextRtcpReport() { |
323 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 332 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
324 rtcp_.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); | 333 rtcp_.SendRtcpFromRtpReceiver(NULL, base::TimeDelta(), NULL, &stats_); |
325 ScheduleNextRtcpReport(); | 334 ScheduleNextRtcpReport(); |
326 } | 335 } |
327 | 336 |
328 } // namespace cast | 337 } // namespace cast |
329 } // namespace media | 338 } // namespace media |
OLD | NEW |