| Index: media/cast/sender/frame_sender.cc
|
| diff --git a/media/cast/sender/frame_sender.cc b/media/cast/sender/frame_sender.cc
|
| index 8ddfdb7e39c2e898236b91ad3177a4c785edea5a..31eff5a824878a2ff60176d7ce3dc6cd9af0cfee 100644
|
| --- a/media/cast/sender/frame_sender.cc
|
| +++ b/media/cast/sender/frame_sender.cc
|
| @@ -59,6 +59,7 @@ FrameSender::FrameSender(scoped_refptr<CastEnvironment> cast_environment,
|
| latest_acked_frame_id_(0),
|
| duplicate_ack_counter_(0),
|
| congestion_control_(congestion_control),
|
| + picture_lost_at_receiver_(false),
|
| rtp_timebase_(rtp_timebase),
|
| is_audio_(is_audio),
|
| weak_factory_(this) {
|
| @@ -219,8 +220,20 @@ void FrameSender::SendEncodedFrame(
|
| << last_sent_frame_id_ << ", latest_acked=" << latest_acked_frame_id_;
|
|
|
| const uint32_t frame_id = encoded_frame->frame_id;
|
| -
|
| const bool is_first_frame_to_be_sent = last_send_time_.is_null();
|
| +
|
| + if (picture_lost_at_receiver_ &&
|
| + (encoded_frame->dependency == EncodedFrame::KEY)) {
|
| + picture_lost_at_receiver_ = false;
|
| + DCHECK(frame_id > latest_acked_frame_id_);
|
| + // Cancel sending remaining frames.
|
| + std::vector<uint32_t> cancel_sending_frames;
|
| + for (uint32_t id = latest_acked_frame_id_ + 1; id < frame_id; ++id) {
|
| + cancel_sending_frames.push_back(id);
|
| + }
|
| + transport_sender_->CancelSendingFrames(ssrc_, cancel_sending_frames);
|
| + }
|
| +
|
| last_send_time_ = cast_environment_->Clock()->NowTicks();
|
| last_sent_frame_id_ = frame_id;
|
| // If this is the first frame about to be sent, fake the value of
|
| @@ -381,6 +394,10 @@ void FrameSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) {
|
| }
|
| }
|
|
|
| +void FrameSender::OnReceivedPli() {
|
| + picture_lost_at_receiver_ = true;
|
| +}
|
| +
|
| bool FrameSender::ShouldDropNextFrame(base::TimeDelta frame_duration) const {
|
| // Check that accepting the next frame won't cause more frames to become
|
| // in-flight than the system's design limit.
|
|
|