diff --git a/webrtc/video/rtp_stream_receiver.cc b/webrtc/video/rtp_stream_receiver.cc index 53aa1ef3c1..9b9272dad2 100644 --- a/webrtc/video/rtp_stream_receiver.cc +++ b/webrtc/video/rtp_stream_receiver.cc @@ -111,7 +111,8 @@ RtpStreamReceiver::RtpStreamReceiver( packet_router)), complete_frame_callback_(complete_frame_callback), keyframe_request_sender_(keyframe_request_sender), - timing_(timing) { + timing_(timing), + has_received_frame_(false) { packet_router_->AddReceiveRtpModule(rtp_rtcp_.get()); rtp_receive_statistics_->RegisterRtpStatisticsCallback(receive_stats_proxy); rtp_receive_statistics_->RegisterRtcpStatisticsCallback(receive_stats_proxy); @@ -391,6 +392,13 @@ int32_t RtpStreamReceiver::ResendPackets(const uint16_t* sequence_numbers, void RtpStreamReceiver::OnReceivedFrame( std::unique_ptr frame) { + + if (!has_received_frame_) { + has_received_frame_ = true; + if (frame->FrameType() != kVideoFrameKey) + keyframe_request_sender_->RequestKeyFrame(); + } + if (!frame->delayed_by_retransmission()) timing_->IncomingTimestamp(frame->timestamp, clock_->TimeInMilliseconds()); reference_finder_->ManageFrame(std::move(frame)); diff --git a/webrtc/video/rtp_stream_receiver.h b/webrtc/video/rtp_stream_receiver.h index afd19a7add..89fc4f6b93 100644 --- a/webrtc/video/rtp_stream_receiver.h +++ b/webrtc/video/rtp_stream_receiver.h @@ -192,6 +192,8 @@ class RtpStreamReceiver : public RtpData, // Maps a payload type to a map of out-of-band supplied codec parameters. std::map> pt_codec_params_; int16_t last_payload_type_ = -1; + + bool has_received_frame_; }; } // namespace webrtc diff --git a/webrtc/video/rtp_stream_receiver_unittest.cc b/webrtc/video/rtp_stream_receiver_unittest.cc index c28ae81042..09ba501f1a 100644 --- a/webrtc/video/rtp_stream_receiver_unittest.cc +++ b/webrtc/video/rtp_stream_receiver_unittest.cc @@ -331,4 +331,19 @@ TEST_F(RtpStreamReceiverTest, PaddingInMediaStream) { rtp_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header); } +TEST_F(RtpStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) { + WebRtcRTPHeader rtp_header; + const std::vector data({1, 2, 3, 4}); + memset(&rtp_header, 0, sizeof(rtp_header)); + rtp_header.header.sequenceNumber = 1; + rtp_header.header.markerBit = 1; + rtp_header.type.Video.is_first_packet_in_frame = true; + rtp_header.frameType = kVideoFrameDelta; + rtp_header.type.Video.codec = kRtpVideoGeneric; + + EXPECT_CALL(mock_key_frame_request_sender_, RequestKeyFrame()); + rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), + &rtp_header); +} + } // namespace webrtc