|
|
|
@ -1376,7 +1376,7 @@ srs_error_t SrsRtcPlayer::on_rtcp_rr(char* data, int nb_data)
|
|
|
|
|
|
|
|
|
|
SrsRtcPublisher::SrsRtcPublisher(SrsRtcSession* session)
|
|
|
|
|
{
|
|
|
|
|
report_timer = new SrsHourGlass(this, 10 * SRS_UTIME_MILLISECONDS);
|
|
|
|
|
report_timer = new SrsHourGlass(this, 200 * SRS_UTIME_MILLISECONDS);
|
|
|
|
|
|
|
|
|
|
session_ = session;
|
|
|
|
|
request_keyframe_ = false;
|
|
|
|
@ -1422,14 +1422,10 @@ srs_error_t SrsRtcPublisher::initialize(uint32_t vssrc, uint32_t assrc, SrsReque
|
|
|
|
|
srs_trace("RTC player video(ssrc=%u), audio(ssrc=%u), nack=%d",
|
|
|
|
|
video_ssrc, audio_ssrc, nack_enabled_);
|
|
|
|
|
|
|
|
|
|
if ((err = report_timer->tick(EVENT_REPORT, 200 * SRS_UTIME_MILLISECONDS)) != srs_success) {
|
|
|
|
|
if ((err = report_timer->tick(0 * SRS_UTIME_MILLISECONDS)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "hourglass tick");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((err = report_timer->tick(EVENT_NACK, 10*SRS_UTIME_MILLISECONDS)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "NACK tick");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((err = report_timer->start()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "start report_timer");
|
|
|
|
|
}
|
|
|
|
@ -1760,6 +1756,7 @@ srs_error_t SrsRtcPublisher::on_nack(SrsRtpPacket2* pkt)
|
|
|
|
|
SrsRtpNackForReceiver* nack_receiver = audio_nack_;
|
|
|
|
|
SrsRtpRingBuffer* ring_queue = audio_queue_;
|
|
|
|
|
|
|
|
|
|
// TODO: FIXME: use is_audio() to jugdement
|
|
|
|
|
uint32_t ssrc = pkt->header.get_ssrc();
|
|
|
|
|
uint16_t seq = pkt->header.get_sequence();
|
|
|
|
|
bool video = (ssrc == video_ssrc) ? true : false;
|
|
|
|
@ -1768,8 +1765,13 @@ srs_error_t SrsRtcPublisher::on_nack(SrsRtpPacket2* pkt)
|
|
|
|
|
ring_queue = video_queue_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: check whether is necessary?
|
|
|
|
|
nack_receiver->remove_timeout_packets();
|
|
|
|
|
|
|
|
|
|
SrsRtpNackInfo* nack_info = nack_receiver->find(seq);
|
|
|
|
|
if (nack_info) {
|
|
|
|
|
// seq had been received.
|
|
|
|
|
nack_receiver->remove(seq);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1784,6 +1786,11 @@ srs_error_t SrsRtcPublisher::on_nack(SrsRtpPacket2* pkt)
|
|
|
|
|
nack_receiver->check_queue_size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// insert into video_queue and audio_queue
|
|
|
|
|
ring_queue->set(seq, pkt->copy());
|
|
|
|
|
// send_nack
|
|
|
|
|
check_send_nacks(nack_receiver, ssrc);
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2142,17 +2149,10 @@ srs_error_t SrsRtcPublisher::notify(int type, srs_utime_t interval, srs_utime_t
|
|
|
|
|
{
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
// TODO: FIXME: Check error.
|
|
|
|
|
if (type == EVENT_REPORT) {
|
|
|
|
|
send_rtcp_rr(video_ssrc, video_queue_);
|
|
|
|
|
send_rtcp_rr(audio_ssrc, audio_queue_);
|
|
|
|
|
send_rtcp_xr_rrtr(video_ssrc);
|
|
|
|
|
send_rtcp_xr_rrtr(audio_ssrc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (type == EVENT_NACK) {
|
|
|
|
|
check_send_nacks(video_nack_, video_ssrc);
|
|
|
|
|
check_send_nacks(audio_nack_, audio_ssrc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|