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

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

Issue 252923007: Cast: Fix two video freezing problems (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: hide max outstanding frames from cast library users Created 6 years, 8 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 ea1eb0b7c41f2111d66901f73ebb26d3c8c50677..ad4ae80f47cccc63e049cefda44e8d6d9e8af0d9 100644
--- a/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
+++ b/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc
@@ -12,49 +12,26 @@ namespace media {
namespace cast {
namespace transport {
-// Limit the max time delay to avoid frame id wrap around; 256 / 60 fps.
-const int kMaxAllowedTimeStoredMs = 4000;
-
typedef PacketMap::iterator PacketMapIterator;
-typedef TimeToPacketMap::iterator TimeToPacketIterator;
-
-PacketStorage::PacketStorage(base::TickClock* clock, int max_time_stored_ms)
- : clock_(clock) {
- max_time_stored_ = base::TimeDelta::FromMilliseconds(max_time_stored_ms);
- DCHECK_LE(max_time_stored_ms, kMaxAllowedTimeStoredMs) << "Invalid argument";
+PacketStorage::PacketStorage(int stored_frames)
+ : stored_frames_(stored_frames) {
+ DCHECK_GT(stored_frames, 0);
+ DCHECK_LT(stored_frames, 250);
Alpha Left Google 2014/04/29 00:55:05 Please add comments to explain why. Particularly w
hubbe 2014/04/29 17:19:58 Done.
}
PacketStorage::~PacketStorage() {
}
-void PacketStorage::CleanupOldPackets(base::TimeTicks now) {
- TimeToPacketIterator time_it = time_to_packet_map_.begin();
-
- // Check max size.
- while (time_to_packet_map_.size() >= kMaxStoredPackets) {
- PacketMapIterator store_it = stored_packets_.find(time_it->second);
-
- // We should always find the packet.
- DCHECK(store_it != stored_packets_.end()) << "Invalid state";
- time_to_packet_map_.erase(time_it);
- stored_packets_.erase(store_it);
- time_it = time_to_packet_map_.begin();
- }
-
- // Time out old packets.
- while (time_it != time_to_packet_map_.end()) {
- if (now < time_it->first + max_time_stored_) {
+void PacketStorage::CleanupOldPackets(uint32 current_frame_id) {
+ uint32 frame_to_remove = current_frame_id - stored_frames_;
Alpha Left Google 2014/04/29 00:55:05 Do we care about wrap around? For audio maybe?
hubbe 2014/04/29 17:19:58 We do. That's why I use IsOlderFrameId()
+ while (!stored_packets_.empty()) {
+ if (IsOlderFrameId(stored_packets_.begin()->first.first,
+ frame_to_remove)) {
+ stored_packets_.erase(stored_packets_.begin());
+ } else {
break;
}
- // Packet too old.
- PacketMapIterator store_it = stored_packets_.find(time_it->second);
-
- // We should always find the packet.
- DCHECK(store_it != stored_packets_.end()) << "Invalid state";
- time_to_packet_map_.erase(time_it);
- stored_packets_.erase(store_it);
- time_it = time_to_packet_map_.begin();
}
}
@@ -62,11 +39,8 @@ void PacketStorage::StorePacket(uint32 frame_id,
uint16 packet_id,
const PacketKey& key,
PacketRef packet) {
- base::TimeTicks now = clock_->NowTicks();
- CleanupOldPackets(now);
-
- // Internally we only use the 8 LSB of the frame id.
- uint32 index = ((0xff & frame_id) << 16) + packet_id;
+ 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.
@@ -74,7 +48,6 @@ void PacketStorage::StorePacket(uint32 frame_id,
return;
}
stored_packets_[index] = std::make_pair(key, packet);
- time_to_packet_map_.insert(std::make_pair(now, index));
}
void PacketStorage::GetPackets(
@@ -109,11 +82,10 @@ void PacketStorage::GetPackets(
}
}
-bool PacketStorage::GetPacket(uint8 frame_id,
- uint16 packet_id,
- SendPacketVector* packets) {
- // Internally we only use the 8 LSB of the frame id.
- uint32 index = (static_cast<uint32>(frame_id) << 16) + packet_id;
+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;
@@ -137,6 +109,26 @@ bool PacketStorage::GetPacket(uint8 frame_id,
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;
Alpha Left Google 2014/04/29 00:55:05 Do you know if we have a utility method somewhere
hubbe 2014/04/29 17:19:58 No idea. The obvious place for it (cast_defines.h)
+ 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);
+}
+
} // namespace transport
} // namespace cast
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698