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

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: mac fix Created 6 years, 7 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..6206d02f429b1d6c6f560160b0a972dd45a0e4a6 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,28 @@ 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) {
}
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();
- }
+bool PacketStorage::IsValid() const {
+ return stored_frames_ > 0 && stored_frames_ <= kMaxStoredFrames;
+}
- // 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_;
+ 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 +41,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 +50,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 +84,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 +111,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;
+ 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