Setting marker bit on DTMF correctly
BUG=1157
R=braveyao@webrtc.org, pbos@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/22469004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@7037 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.cc b/modules/rtp_rtcp/source/rtp_sender_audio.cc
index 99c0085..7efe987 100644
--- a/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -318,13 +318,15 @@
static_cast<uint16_t>(dtmfDurationSamples),
false);
} else {
- // set markerBit on the first packet in the burst
+ if (SendTelephoneEventPacket(
+ ended,
+ _dtmfTimestamp,
+ static_cast<uint16_t>(dtmfDurationSamples),
+ !_dtmfEventFirstPacketSent) != 0) {
+ return -1;
+ }
_dtmfEventFirstPacketSent = true;
- return SendTelephoneEventPacket(
- ended,
- _dtmfTimestamp,
- static_cast<uint16_t>(dtmfDurationSamples),
- !_dtmfEventFirstPacketSent);
+ return 0;
}
}
return 0;
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index e9b01de..7b62d0b 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -1073,6 +1073,61 @@
sizeof(extension)));
}
+// As RFC4733, named telephone events are carried as part of the audio stream
+// and must use the same sequence number and timestamp base as the regular
+// audio channel.
+// This test checks the marker bit for the first packet and the consequent
+// packets of the same telephone event. Since it is specifically for DTMF
+// events, ignoring audio packets and sending kFrameEmpty instead of those.
+TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) {
+ char payload_name[RTP_PAYLOAD_NAME_SIZE] = "telephone-event";
+ uint8_t payload_type = 126;
+ ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 0,
+ 0, 0));
+ // For Telephone events, payload is not added to the registered payload list,
+ // it will register only the payload used for audio stream.
+ // Registering the payload again for audio stream with different payload name.
+ strcpy(payload_name, "payload_name");
+ ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 8000,
+ 1, 0));
+ int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
+ // DTMF event key=9, duration=500 and attenuationdB=10
+ rtp_sender_->SendTelephoneEvent(9, 500, 10);
+ // During start, it takes the starting timestamp as last sent timestamp.
+ // The duration is calculated as the difference of current and last sent
+ // timestamp. So for first call it will skip since the duration is zero.
+ ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type,
+ capture_time_ms,
+ 0, NULL, 0,
+ NULL));
+ // DTMF Sample Length is (Frequency/1000) * Duration.
+ // So in this case, it is (8000/1000) * 500 = 4000.
+ // Sending it as two packets.
+ ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type,
+ capture_time_ms+2000,
+ 0, NULL, 0,
+ NULL));
+ scoped_ptr<webrtc::RtpHeaderParser> rtp_parser(
+ webrtc::RtpHeaderParser::Create());
+ ASSERT_TRUE(rtp_parser.get() != NULL);
+ webrtc::RTPHeader rtp_header;
+ ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_,
+ transport_.last_sent_packet_len_,
+ &rtp_header));
+ // Marker Bit should be set to 1 for first packet.
+ EXPECT_TRUE(rtp_header.markerBit);
+
+ ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type,
+ capture_time_ms+4000,
+ 0, NULL, 0,
+ NULL));
+ ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_,
+ transport_.last_sent_packet_len_,
+ &rtp_header));
+ // Marker Bit should be set to 0 for rest of the packets.
+ EXPECT_FALSE(rtp_header.markerBit);
+}
+
TEST_F(RtpSenderTest, BytesReportedCorrectly) {
const char* kPayloadName = "GENERIC";
const uint8_t kPayloadType = 127;