diff --git a/webrtc/modules/audio_coding/neteq/tools/packet_source.h b/webrtc/modules/audio_coding/neteq/tools/packet_source.h index c539b8e833..669bc14e46 100644 --- a/webrtc/modules/audio_coding/neteq/tools/packet_source.h +++ b/webrtc/modules/audio_coding/neteq/tools/packet_source.h @@ -24,7 +24,8 @@ class PacketSource { PacketSource() {} virtual ~PacketSource() {} - // Returns a pointer to the next packet. + // Returns a pointer to the next packet. Returns NULL if the source is + // depleted, or if an error occurred. virtual Packet* NextPacket() = 0; private: diff --git a/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.cc b/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.cc index 8278635394..6490d46857 100644 --- a/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.cc +++ b/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.cc @@ -47,47 +47,54 @@ bool RtpFileSource::RegisterRtpHeaderExtension(RTPExtensionType type, } Packet* RtpFileSource::NextPacket() { - uint16_t length; - if (fread(&length, sizeof(uint16_t), 1, in_file_) == 0) { - assert(false); - return NULL; - } - length = ntohs(length); + while (!EndOfFile()) { + uint16_t length; + if (fread(&length, sizeof(length), 1, in_file_) == 0) { + assert(false); + return NULL; + } + length = ntohs(length); - uint16_t plen; - if (fread(&plen, sizeof(uint16_t), 1, in_file_) == 0) { - assert(false); - return NULL; - } - plen = ntohs(plen); + uint16_t plen; + if (fread(&plen, sizeof(plen), 1, in_file_) == 0) { + assert(false); + return NULL; + } + plen = ntohs(plen); - uint32_t offset; - if (fread(&offset, sizeof(uint32_t), 1, in_file_) == 0) { - assert(false); - return NULL; - } + uint32_t offset; + if (fread(&offset, sizeof(offset), 1, in_file_) == 0) { + assert(false); + return NULL; + } + offset = ntohl(offset); - // Use length here because a plen of 0 specifies RTCP. - size_t packet_size_bytes = length - kPacketHeaderSize; - if (packet_size_bytes <= 0) { - // May be an RTCP packet. - return NULL; + // Use length here because a plen of 0 specifies RTCP. + assert(length >= kPacketHeaderSize); + size_t packet_size_bytes = length - kPacketHeaderSize; + if (packet_size_bytes == 0) { + // May be an RTCP packet. + // Read the next one. + continue; + } + scoped_ptr packet_memory(new uint8_t[packet_size_bytes]); + if (fread(packet_memory.get(), 1, packet_size_bytes, in_file_) != + packet_size_bytes) { + assert(false); + return NULL; + } + scoped_ptr packet(new Packet(packet_memory.release(), + packet_size_bytes, + plen, + offset, + *parser_.get())); + if (!packet->valid_header()) { + assert(false); + return NULL; + } + return packet.release(); } - uint8_t* packet_memory = new uint8_t[packet_size_bytes]; - if (fread(packet_memory, 1, packet_size_bytes, in_file_) != - packet_size_bytes) { - assert(false); - delete[] packet_memory; - return NULL; - } - Packet* packet = new Packet( - packet_memory, packet_size_bytes, plen, ntohl(offset), *parser_.get()); - if (!packet->valid_header()) { - assert(false); - delete packet; - return NULL; - } - return packet; + return NULL; } bool RtpFileSource::EndOfFile() const { diff --git a/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h b/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h index 527018e180..6b92a88698 100644 --- a/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h +++ b/webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h @@ -37,7 +37,8 @@ class RtpFileSource : public PacketSource { // Registers an RTP header extension and binds it to |id|. virtual bool RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id); - // Returns a pointer to the next packet. + // Returns a pointer to the next packet. Returns NULL if end of file was + // reached, or if a the data was corrupt. virtual Packet* NextPacket(); // Returns true if the end of file has been reached.