#include "base/time/time.h"
#include "media/cast/transport/cast_transport_config.h"
#include "media/cast/transport/cast_transport_defines.h"
+#include "media/cast/transport/pacing/paced_sender.h"
namespace media {
namespace cast {
namespace transport {
class StoredPacket;
-typedef std::map<uint32, linked_ptr<StoredPacket> > PacketMap;
-typedef std::multimap<base::TimeTicks, uint32> TimeToPacketMap;
+
+// StorageIndex contains {frame_id, packet_id}.
+typedef std::pair<uint32, uint16> StorageIndex;
+typedef std::map<StorageIndex, std::pair<PacketKey, PacketRef> > PacketMap;
+
+// Frame IDs are generally stored as 8-bit values when sent over the
+// wire. This means that having a history longer than 255 frames makes
+// no sense.
+const int kMaxStoredFrames = 255;
class PacketStorage {
public:
- static const unsigned int kMaxStoredPackets = 1000;
-
- PacketStorage(base::TickClock* clock, int max_time_stored_ms);
+ PacketStorage(int stored_frames);
virtual ~PacketStorage();
- void StorePacket(uint32 frame_id, uint16 packet_id, const Packet* packet);
+ // Returns true if this class is configured correctly.
+ // (stored frames > 0 && stored_frames < kMaxStoredFrames)
+ bool IsValid() const;
+
+ void StorePacket(uint32 frame_id,
+ uint16 packet_id,
+ const PacketKey& key,
+ PacketRef packet);
// Copies all missing packets into the packet list.
- PacketList GetPackets(
- const MissingFramesAndPacketsMap& missing_frames_and_packets);
+ void GetPackets(
+ const MissingFramesAndPacketsMap& missing_frames_and_packets,
+ SendPacketVector* packets_to_resend);
// Copies packet into the packet list.
- bool GetPacket(uint8 frame_id, uint16 packet_id, PacketList* packets);
-
+ bool GetPacket(uint8 frame_id_8bit,
+ uint16 packet_id,
+ SendPacketVector* packets);
private:
- void CleanupOldPackets(base::TimeTicks now);
+ FRIEND_TEST_ALL_PREFIXES(PacketStorageTest, PacketContent);
+
+ // Same as GetPacket, but takes a 32-bit frame id.
+ bool GetPacket32(uint32 frame_id,
+ uint16 packet_id,
+ SendPacketVector* packets);
+ void CleanupOldPackets(uint32 current_frame_id);
- base::TickClock* const clock_; // Not owned by this class.
- base::TimeDelta max_time_stored_;
PacketMap stored_packets_;
- TimeToPacketMap time_to_packet_map_;
- std::list<linked_ptr<StoredPacket> > free_packets_;
+ int stored_frames_;
DISALLOW_COPY_AND_ASSIGN(PacketStorage);
};