| Index: media/cast/transport/pacing/paced_sender.cc
|
| diff --git a/media/cast/transport/pacing/paced_sender.cc b/media/cast/transport/pacing/paced_sender.cc
|
| index 0af66d2fe2de5fbe944e9f1fb9b46da3d78a845a..d4b502119baa8390382a31e749f51662aa510ffd 100644
|
| --- a/media/cast/transport/pacing/paced_sender.cc
|
| +++ b/media/cast/transport/pacing/paced_sender.cc
|
| @@ -35,6 +35,13 @@ CastLoggingEvent GetLoggingEvent(bool is_audio, bool retransmit) {
|
|
|
| } // namespace
|
|
|
| +
|
| +PacketKey PacedPacketSender::MakePacketKey(const base::TimeTicks& ticks,
|
| + uint32 ssrc,
|
| + uint16 packet_id) {
|
| + return std::make_pair(ticks, std::make_pair(ssrc, packet_id));
|
| +}
|
| +
|
| PacedSender::PacedSender(
|
| base::TickClock* clock,
|
| LoggingImpl* logging,
|
| @@ -64,34 +71,38 @@ void PacedSender::RegisterVideoSsrc(uint32 video_ssrc) {
|
| video_ssrc_ = video_ssrc;
|
| }
|
|
|
| -bool PacedSender::SendPackets(const PacketList& packets) {
|
| +bool PacedSender::SendPackets(const SendPacketVector& packets) {
|
| if (packets.empty()) {
|
| return true;
|
| }
|
| - packet_list_.insert(packet_list_.end(), packets.begin(), packets.end());
|
| + for (size_t i = 0; i < packets.size(); i++) {
|
| + packet_list_[packets[i].first] =
|
| + make_pair(PacketType_Normal, packets[i].second);
|
| + }
|
| if (state_ == State_Unblocked) {
|
| SendStoredPackets();
|
| }
|
| return true;
|
| }
|
|
|
| -bool PacedSender::ResendPackets(const PacketList& packets) {
|
| +bool PacedSender::ResendPackets(const SendPacketVector& packets) {
|
| if (packets.empty()) {
|
| return true;
|
| }
|
| - resend_packet_list_.insert(resend_packet_list_.end(),
|
| - packets.begin(),
|
| - packets.end());
|
| + for (size_t i = 0; i < packets.size(); i++) {
|
| + packet_list_[packets[i].first] =
|
| + make_pair(PacketType_Resend, packets[i].second);
|
| + }
|
| if (state_ == State_Unblocked) {
|
| SendStoredPackets();
|
| }
|
| return true;
|
| }
|
|
|
| -bool PacedSender::SendRtcpPacket(PacketRef packet) {
|
| +bool PacedSender::SendRtcpPacket(uint32 ssrc, PacketRef packet) {
|
| if (state_ == State_TransportBlocked) {
|
| -
|
| - rtcp_packet_list_.push_back(packet);
|
| + packet_list_[PacedPacketSender::MakePacketKey(base::TimeTicks(), ssrc, 0)] =
|
| + make_pair(PacketType_RTCP, packet);
|
| } else {
|
| // We pass the RTCP packets straight through.
|
| if (!transport_->SendPacket(
|
| @@ -106,35 +117,21 @@ bool PacedSender::SendRtcpPacket(PacketRef packet) {
|
| }
|
|
|
| PacketRef PacedSender::GetNextPacket(PacketType* packet_type) {
|
| - PacketRef ret;
|
| - if (!rtcp_packet_list_.empty()) {
|
| - ret = rtcp_packet_list_.front();
|
| - rtcp_packet_list_.pop_front();
|
| - *packet_type = PacketType_RTCP;
|
| - } else if (!resend_packet_list_.empty()) {
|
| - ret = resend_packet_list_.front();
|
| - resend_packet_list_.pop_front();
|
| - *packet_type = PacketType_Resend;
|
| - } else if (!packet_list_.empty()) {
|
| - ret = packet_list_.front();
|
| - packet_list_.pop_front();
|
| - *packet_type = PacketType_Normal;
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| + std::map<PacketKey, std::pair<PacketType, PacketRef> >::iterator i;
|
| + i = packet_list_.begin();
|
| + DCHECK(i != packet_list_.end());
|
| + *packet_type = i->second.first;
|
| + PacketRef ret = i->second.second;
|
| + packet_list_.erase(i);
|
| return ret;
|
| }
|
|
|
| bool PacedSender::empty() const {
|
| - return rtcp_packet_list_.empty() &&
|
| - resend_packet_list_.empty() &&
|
| - packet_list_.empty();
|
| + return packet_list_.empty();
|
| }
|
|
|
| size_t PacedSender::size() const {
|
| - return rtcp_packet_list_.size() +
|
| - resend_packet_list_.size() +
|
| - packet_list_.size();
|
| + return packet_list_.size();
|
| }
|
|
|
| // This function can be called from three places:
|
|
|