VCM:Accounting for bounds when inserting packets. We currently receive indicators to the first and last packets of the frame, but not have any sanity to verify that all packets are indeed within the bounds (when available). This cl attempts to fix that,

BUG=
R=marpan@google.com

Review URL: https://webrtc-codereview.appspot.com/2077004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4614 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
mikhal@webrtc.org
2013-08-26 17:10:11 +00:00
parent c9fa0fede5
commit f31a47abdc
7 changed files with 328 additions and 97 deletions

View File

@ -30,7 +30,9 @@ VCMSessionInfo::VCMSessionInfo()
packets_(),
empty_seq_num_low_(-1),
empty_seq_num_high_(-1),
packets_not_decodable_(0) {
packets_not_decodable_(0),
first_packet_seq_num_(-1),
last_packet_seq_num_(-1) {
}
void VCMSessionInfo::UpdateDataPointers(const uint8_t* old_base_ptr,
@ -100,6 +102,8 @@ void VCMSessionInfo::Reset() {
empty_seq_num_low_ = -1;
empty_seq_num_high_ = -1;
packets_not_decodable_ = 0;
first_packet_seq_num_ = -1;
last_packet_seq_num_ = -1;
}
int VCMSessionInfo::SessionLength() const {
@ -164,7 +168,7 @@ void VCMSessionInfo::ShiftSubsequentPackets(PacketIterator it,
}
void VCMSessionInfo::UpdateCompleteSession() {
if (packets_.front().isFirstPacket && packets_.back().markerBit) {
if (HaveFirstPacket() && HaveLastPacket()) {
// Do we have all the packets in this session?
bool complete_session = true;
PacketIterator it = packets_.begin();
@ -383,12 +387,12 @@ void VCMSessionInfo::SetNotDecodableIfIncomplete() {
bool
VCMSessionInfo::HaveFirstPacket() const {
return !packets_.empty() && packets_.front().isFirstPacket;
return !packets_.empty() && (first_packet_seq_num_ != -1);
}
bool
VCMSessionInfo::HaveLastPacket() const {
return (!packets_.empty() && packets_.back().markerBit);
return !packets_.empty() && (last_packet_seq_num_ != -1);
}
bool
@ -400,14 +404,6 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
uint8_t* frame_buffer,
VCMDecodeErrorMode decode_error_mode,
const FrameData& frame_data) {
// Check if this is first packet (only valid for some codecs)
if (packet.isFirstPacket) {
// The first packet in a frame signals the frame type.
frame_type_ = packet.frameType;
} else if (frame_type_ == kFrameEmpty && packet.frameType != kFrameEmpty) {
// Update the frame type with the first media packet.
frame_type_ = packet.frameType;
}
if (packet.frameType == kFrameEmpty) {
// Update sequence number of an empty packet.
// Only media packets are inserted into the packet list.
@ -415,8 +411,9 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
return 0;
}
if (packets_.size() == kMaxPacketsInSession)
if (packets_.size() == kMaxPacketsInSession) {
return -1;
}
// Find the position of this packet in the packet list in sequence number
// order and insert it. Loop over the list in reverse order.
@ -430,6 +427,32 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
(*rit).seqNum == packet.seqNum && (*rit).sizeBytes > 0)
return -2;
// Only insert media packets between first and last packets (when available).
// Placing check here, as to properly account for duplicate packets.
// Check if this is first packet (only valid for some codecs)
// Should only be set for one packet per session.
if (packet.isFirstPacket && first_packet_seq_num_ == -1) {
// The first packet in a frame signals the frame type.
frame_type_ = packet.frameType;
// Store the sequence number for the first packet.
first_packet_seq_num_ = static_cast<int>(packet.seqNum);
} else if (first_packet_seq_num_ != -1 &&
!IsNewerSequenceNumber(packet.seqNum, first_packet_seq_num_)) {
return -3;
} else if (frame_type_ == kFrameEmpty && packet.frameType != kFrameEmpty) {
// Update the frame type with the type of the first media packet.
// TODO(mikhal): Can this trigger?
frame_type_ = packet.frameType;
}
// Track the marker bit, should only be set for one packet per session.
if (packet.markerBit && last_packet_seq_num_ == -1) {
last_packet_seq_num_ = static_cast<int>(packet.seqNum);
} else if (last_packet_seq_num_ != -1 &&
IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_)) {
return -3;
}
// The insert operation invalidates the iterator |rit|.
PacketIterator packet_list_it = packets_.insert(rit.base(), packet);
@ -439,7 +462,6 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
decodable_ = true;
else if (decode_error_mode == kSelectiveErrors)
UpdateDecodableSession(frame_data);
return returnLength;
}