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:
parent
94f6fa0526
commit
2c53b13a3b
@ -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));
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user