@@ -22,30 +22,67 @@ void RtpPaddingRemovalHandler::read(Context *ctx, std::shared_ptr<dataPacket> pa
2222
2323 if (!chead->isRtcp () && enabled_ && packet->type == VIDEO_PACKET) {
2424 uint32_t ssrc = rtp_header->getSSRC ();
25- auto translator_it = translator_map_.find (ssrc);
26- std::shared_ptr<SequenceNumberTranslator> translator;
27- if (translator_it != translator_map_.end ()) {
28- translator = translator_it->second ;
29- } else {
30- ELOG_DEBUG (" message: no Translator found creating a new one, ssrc: %u" , ssrc);
31- translator = std::make_shared<SequenceNumberTranslator>();
32- translator_map_[ssrc] = translator;
33- }
25+ std::shared_ptr<SequenceNumberTranslator> translator = getTranslatorForSsrc (ssrc, true );
3426 if (!removePaddingBytes (packet, translator)) {
3527 return ;
3628 }
3729 uint16_t sequence_number = rtp_header->getSeqNumber ();
3830 SequenceNumber sequence_number_info = translator->get (sequence_number, false );
3931
4032 if (sequence_number_info.type != SequenceNumberType::Valid) {
33+ ELOG_DEBUG (" Invalid translation %u, ssrc: %u" , sequence_number, ssrc);
4134 return ;
4235 }
36+ ELOG_DEBUG (" Changing seq_number from %u to %u, ssrc %u" , sequence_number, sequence_number_info.output ,
37+ ssrc);
4338 rtp_header->setSeqNumber (sequence_number_info.output );
4439 }
4540 ctx->fireRead (packet);
4641}
4742
4843void RtpPaddingRemovalHandler::write (Context *ctx, std::shared_ptr<dataPacket> packet) {
44+ RtcpHeader* rtcp_head = reinterpret_cast <RtcpHeader*>(packet->data );
45+ if (!enabled_ || packet->type != VIDEO_PACKET || !rtcp_head->isFeedback ()) {
46+ ctx->fireWrite (packet);
47+ return ;
48+ }
49+ uint32_t ssrc = rtcp_head->getSourceSSRC ();
50+ std::shared_ptr<SequenceNumberTranslator> translator = getTranslatorForSsrc (ssrc, false );
51+ if (!translator) {
52+ ELOG_DEBUG (" No translator for ssrc %u, %s" , ssrc, connection_->toLog ());
53+ ctx->fireWrite (packet);
54+ return ;
55+ }
56+ RtpUtils::forEachRRBlock (packet, [this , translator, ssrc](RtcpHeader *chead) {
57+ if (chead->packettype == RTCP_RTP_Feedback_PT) {
58+ RtpUtils::forEachNack (chead, [this , chead, translator, ssrc](uint16_t new_seq_num, uint16_t new_plb,
59+ RtcpHeader* nack_header) {
60+ uint16_t initial_seq_num = new_seq_num;
61+ std::vector<uint16_t > seq_nums;
62+ for (int i = -1 ; i <= 15 ; i++) {
63+ uint16_t seq_num = initial_seq_num + i + 1 ;
64+ SequenceNumber input_seq_num = translator->reverse (seq_num);
65+ if (input_seq_num.type == SequenceNumberType::Valid) {
66+ seq_nums.push_back (input_seq_num.input );
67+ } else {
68+ ELOG_DEBUG (" Input is not valid for %u, ssrc %u, %s" , seq_num, ssrc, connection_->toLog ());
69+ }
70+ ELOG_DEBUG (" Lost packet %u, input %u, ssrc %u" , seq_num, input_seq_num.input , ssrc);
71+ }
72+ if (seq_nums.size () > 0 ) {
73+ uint16_t pid = seq_nums[0 ];
74+ uint16_t blp = 0 ;
75+ for (uint16_t index = 1 ; index < seq_nums.size () ; index++) {
76+ uint16_t distance = seq_nums[index] - pid - 1 ;
77+ blp |= (1 << distance);
78+ }
79+ nack_header->setNackPid (pid);
80+ nack_header->setNackBlp (blp);
81+ ELOG_DEBUG (" Translated pid %u, translated blp %u, ssrc %u, %s" , pid, blp, ssrc, connection_->toLog ());
82+ }
83+ });
84+ }
85+ });
4986 ctx->fireWrite (packet);
5087}
5188
@@ -58,22 +95,39 @@ bool RtpPaddingRemovalHandler::removePaddingBytes(std::shared_ptr<dataPacket> pa
5895 if (padding_length + header_length == packet->length ) {
5996 uint16_t sequence_number = rtp_header->getSeqNumber ();
6097 translator->get (sequence_number, true );
98+ ELOG_DEBUG (" Dropping packet %u, %s" , sequence_number, connection_->toLog ());
6199 return false ;
62100 }
63101 packet->length -= padding_length;
64102 rtp_header->padding = 0 ;
65103 return true ;
66104}
67105
106+ std::shared_ptr<SequenceNumberTranslator> RtpPaddingRemovalHandler::getTranslatorForSsrc (uint32_t ssrc,
107+ bool should_create) {
108+ auto translator_it = translator_map_.find (ssrc);
109+ std::shared_ptr<SequenceNumberTranslator> translator;
110+ if (translator_it != translator_map_.end ()) {
111+ ELOG_DEBUG (" Found Translator for %u, %s" , ssrc, connection_->toLog ());
112+ translator = translator_it->second ;
113+ } else if (should_create) {
114+ ELOG_DEBUG (" message: no Translator found creating a new one, ssrc: %u, %s" , ssrc,
115+ connection_->toLog ());
116+ translator = std::make_shared<SequenceNumberTranslator>();
117+ translator_map_[ssrc] = translator;
118+ }
119+ return translator;
120+ }
121+
68122void RtpPaddingRemovalHandler::notifyUpdate () {
69123 auto pipeline = getContext ()->getPipelineShared ();
70124 if (!pipeline) {
71125 return ;
72126 }
73-
74127 if (initialized_) {
75128 return ;
76129 }
130+ connection_ = pipeline->getService <WebRtcConnection>().get ();
77131 initialized_ = true ;
78132}
79133} // namespace erizo
0 commit comments