Request keyframe if the first received frame is not a keyframe.

BUG=webrtc:7669

Review-Url: https://codereview.webrtc.org/2874933004
Cr-Commit-Position: refs/heads/master@{#18169}
This commit is contained in:
philipel 2017-05-16 08:06:30 -07:00 committed by Commit bot
parent 94f6fa0526
commit 2c53b13a3b
3 changed files with 26 additions and 1 deletions

View File

@ -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<video_coding::RtpFrameObject> 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));

View File

@ -192,6 +192,8 @@ class RtpStreamReceiver : public RtpData,
// Maps a payload type to a map of out-of-band supplied codec parameters.
std::map<uint8_t, std::map<std::string, std::string>> pt_codec_params_;
int16_t last_payload_type_ = -1;
bool has_received_frame_;
};
} // namespace webrtc

View File

@ -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<uint8_t> 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