| Index: media/cast/net/rtp/frame_buffer.cc
|
| diff --git a/media/cast/net/rtp/frame_buffer.cc b/media/cast/net/rtp/frame_buffer.cc
|
| index 4a911635f9ca7f52547f1720ec1ed832b55267d6..319aad2502a494a6aaeb45ffabd235a0a736b218 100644
|
| --- a/media/cast/net/rtp/frame_buffer.cc
|
| +++ b/media/cast/net/rtp/frame_buffer.cc
|
| @@ -13,6 +13,7 @@ FrameBuffer::FrameBuffer()
|
| : frame_id_(0),
|
| max_packet_id_(0),
|
| num_packets_received_(0),
|
| + max_seen_packet_id_(0),
|
| new_playout_delay_ms_(0),
|
| is_key_frame_(false),
|
| total_data_size_(0),
|
| @@ -21,7 +22,7 @@ FrameBuffer::FrameBuffer()
|
|
|
| FrameBuffer::~FrameBuffer() {}
|
|
|
| -void FrameBuffer::InsertPacket(const uint8* payload_data,
|
| +bool FrameBuffer::InsertPacket(const uint8* payload_data,
|
| size_t payload_size,
|
| const RtpCastHeader& rtp_header) {
|
| // Is this the first packet in the frame?
|
| @@ -37,11 +38,11 @@ void FrameBuffer::InsertPacket(const uint8* payload_data,
|
| }
|
| // Is this the correct frame?
|
| if (rtp_header.frame_id != frame_id_)
|
| - return;
|
| + return false;
|
|
|
| // Insert every packet only once.
|
| if (packets_.find(rtp_header.packet_id) != packets_.end()) {
|
| - return;
|
| + return false;
|
| }
|
|
|
| std::vector<uint8> data;
|
| @@ -54,7 +55,9 @@ void FrameBuffer::InsertPacket(const uint8* payload_data,
|
| payload_data, payload_data + payload_size, retval.first->second.begin());
|
|
|
| ++num_packets_received_;
|
| + max_seen_packet_id_ = std::max(max_seen_packet_id_, rtp_header.packet_id);
|
| total_data_size_ += payload_size;
|
| + return true;
|
| }
|
|
|
| bool FrameBuffer::Complete() const {
|
| @@ -86,5 +89,28 @@ bool FrameBuffer::AssembleEncodedFrame(EncodedFrame* frame) const {
|
| return true;
|
| }
|
|
|
| +void FrameBuffer::GetMissingPackets(bool newest_frame,
|
| + PacketIdSet* missing_packets) const {
|
| + // Missing packets capped by max_seen_packet_id_.
|
| + // (Iff it's the latest frame)
|
| + int maximum = newest_frame ? max_seen_packet_id_ : max_packet_id_;
|
| + int packet = 0;
|
| + for (PacketMap::const_iterator i = packets_.begin();
|
| + i != packets_.end() && packet <= maximum;
|
| + ++i) {
|
| + int end = std::min<int>(i->first, maximum + 1);
|
| + while (packet < end) {
|
| + missing_packets->insert(packet);
|
| + packet++;
|
| + }
|
| + packet++;
|
| + }
|
| + while (packet <= maximum) {
|
| + missing_packets->insert(packet);
|
| + packet++;
|
| + }
|
| +}
|
| +
|
| +
|
| } // namespace cast
|
| } // namespace media
|
|
|