Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Unified Diff: media/cast/transport/rtp_sender/packet_storage/packet_storage.cc

Issue 317243007: Cast: reduce the amount of retransmission packets (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moved FastCopyPacket to RtpSender Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
diff --git a/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc b/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
index 6206d02f429b1d6c6f560160b0a972dd45a0e4a6..a748baa27ab5a44bd1d943efe72dccf6453b7f30 100644
--- a/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
+++ b/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
@@ -12,123 +12,52 @@ namespace media {
namespace cast {
namespace transport {
-typedef PacketMap::iterator PacketMapIterator;
-
-PacketStorage::PacketStorage(int stored_frames)
- : stored_frames_(stored_frames) {
+PacketStorage::PacketStorage(size_t stored_frames)
+ : max_stored_frames_(stored_frames),
+ first_frame_id_in_list_(0),
+ last_frame_id_in_list_(0) {
}
PacketStorage::~PacketStorage() {
}
bool PacketStorage::IsValid() const {
- return stored_frames_ > 0 && stored_frames_ <= kMaxStoredFrames;
+ return max_stored_frames_ > 0 &&
+ static_cast<int>(max_stored_frames_) <= kMaxUnackedFrames;
}
-void PacketStorage::CleanupOldPackets(uint32 current_frame_id) {
- uint32 frame_to_remove = current_frame_id - stored_frames_;
- while (!stored_packets_.empty()) {
- if (IsOlderFrameId(stored_packets_.begin()->first.first,
- frame_to_remove)) {
- stored_packets_.erase(stored_packets_.begin());
- } else {
- break;
- }
- }
+size_t PacketStorage::GetNumberOfStoredFrames() const {
+ return frames_.size();
}
-void PacketStorage::StorePacket(uint32 frame_id,
- uint16 packet_id,
- const PacketKey& key,
- PacketRef packet) {
- CleanupOldPackets(frame_id);
- StorageIndex index(frame_id, packet_id);
- PacketMapIterator it = stored_packets_.find(index);
- if (it != stored_packets_.end()) {
- // We have already saved this.
- DCHECK(false) << "Invalid state";
- return;
+void PacketStorage::StoreFrame(uint32 frame_id,
+ const SendPacketVector& packets) {
+ if (frames_.empty()) {
+ first_frame_id_in_list_ = frame_id;
+ } else {
+ // Make sure frame IDs are consecutive.
+ DCHECK_EQ(last_frame_id_in_list_ + 1, frame_id);
}
- stored_packets_[index] = std::make_pair(key, packet);
-}
-
-void PacketStorage::GetPackets(
- const MissingFramesAndPacketsMap& missing_frames_and_packets,
- SendPacketVector* packets_to_resend) {
-
- // Iterate over all frames in the list.
- for (MissingFramesAndPacketsMap::const_iterator it =
- missing_frames_and_packets.begin();
- it != missing_frames_and_packets.end();
- ++it) {
- uint8 frame_id = it->first;
- const PacketIdSet& packets_set = it->second;
- bool success = false;
- if (packets_set.empty()) {
- VLOG(1) << "Missing all packets in frame " << static_cast<int>(frame_id);
- uint16 packet_id = 0;
- do {
- // Get packet from storage.
- success = GetPacket(frame_id, packet_id, packets_to_resend);
- ++packet_id;
- } while (success);
- } else {
- // Iterate over all of the packets in the frame.
- for (PacketIdSet::const_iterator set_it = packets_set.begin();
- set_it != packets_set.end();
- ++set_it) {
- GetPacket(frame_id, *set_it, packets_to_resend);
- }
- }
- }
-}
+ // Save new frame to the end of the list.
+ last_frame_id_in_list_ = frame_id;
+ frames_.push_back(packets);
-bool PacketStorage::GetPacket32(uint32 frame_id,
- uint16 packet_id,
- SendPacketVector* packets) {
- StorageIndex index(frame_id, packet_id);
- PacketMapIterator it = stored_packets_.find(index);
- if (it == stored_packets_.end()) {
- return false;
- }
- // Minor trickery, the caller (rtp_sender.cc) really wants a copy of the
- // packet so that it can update the sequence number before it sends it to
- // the transport. If the packet only has one ref, we can safely let
- // rtp_sender.cc have our packet and modify it. If it has more references
- // then we must return a copy of it instead. This should really only happen
- // when rtp_sender.cc is trying to re-send a packet that is already in the
- // queue to sent.
- if (it->second.second->HasOneRef()) {
- packets->push_back(it->second);
- } else {
- packets->push_back(
- std::make_pair(it->second.first,
- make_scoped_refptr(
- new base::RefCountedData<Packet>(
- it->second.second->data))));
+ // Evict the oldest frame if the list is too long.
+ if (frames_.size() > max_stored_frames_) {
+ frames_.pop_front();
+ ++first_frame_id_in_list_;
}
- return true;
}
-bool PacketStorage::GetPacket(uint8 frame_id_8bit,
- uint16 packet_id,
- SendPacketVector* packets) {
- if (stored_packets_.empty()) {
- return false;
- }
- uint32 last_stored = stored_packets_.rbegin()->first.first;
- uint32 frame_id_32bit = (last_stored & ~0xFF) | frame_id_8bit;
- if (IsNewerFrameId(frame_id_32bit, last_stored)) {
- frame_id_32bit -= 0x100;
- }
- DCHECK_EQ(frame_id_8bit, frame_id_32bit & 0xff);
- DCHECK(IsOlderFrameId(frame_id_32bit, last_stored) &&
- IsNewerFrameId(frame_id_32bit + stored_frames_ + 1, last_stored))
- << " 32bit: " << frame_id_32bit
- << " 8bit: " << static_cast<int>(frame_id_8bit)
- << " last_stored: " << last_stored;
- return GetPacket32(frame_id_32bit, packet_id, packets);
+const SendPacketVector* PacketStorage::GetFrame8(uint8 frame_id_8bits) const {
+ // The requested frame ID has only 8-bits so convert the first frame ID
+ // in list to match.
+ uint8 index_8bits = first_frame_id_in_list_ & 0xFF;
+ index_8bits = frame_id_8bits - index_8bits;
+ if (index_8bits >= frames_.size())
+ return NULL;
+ return &(frames_[index_8bits]);
}
} // namespace transport

Powered by Google App Engine
This is Rietveld 408576698