| 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
|
|
|