Added a ParsePayload method to AudioDecoder.

It allows the decoder to split the input up into usable chunks before
they are put into NetEq's PacketBuffer. Eventually, all packet splitting
will move into ParsePayload.

There's currently a base implementation of ParsePayload. It will
generate a single Frame that calls the underlying AudioDecoder for
getting Duration() and to Decode.

BUG=webrtc:5805
BUG=chromium:428099

Review-Url: https://codereview.webrtc.org/2326953003
Cr-Commit-Position: refs/heads/master@{#14300}
This commit is contained in:
ossu
2016-09-20 01:38:00 -07:00
committed by Commit bot
parent 02bd5125e9
commit 61a208b1b8
8 changed files with 268 additions and 115 deletions

View File

@ -68,7 +68,7 @@ bool PacketBuffer::Empty() const {
}
int PacketBuffer::InsertPacket(Packet* packet) {
if (!packet || packet->payload.empty()) {
if (!packet || packet->empty()) {
if (packet) {
delete packet;
}
@ -209,7 +209,7 @@ Packet* PacketBuffer::GetNextPacket(size_t* discard_count) {
Packet* packet = buffer_.front();
// Assert that the packet sanity checks in InsertPacket method works.
assert(packet && !packet->payload.empty());
RTC_DCHECK(packet && !packet->empty());
buffer_.pop_front();
// Discard other packets with the same timestamp. These are duplicates or
@ -237,8 +237,8 @@ int PacketBuffer::DiscardNextPacket() {
return kBufferEmpty;
}
// Assert that the packet sanity checks in InsertPacket method works.
assert(buffer_.front());
assert(!buffer_.front()->payload.empty());
RTC_DCHECK(buffer_.front());
RTC_DCHECK(!buffer_.front()->empty());
DeleteFirstPacket(&buffer_);
return kOK;
}
@ -260,26 +260,32 @@ int PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit) {
return DiscardOldPackets(timestamp_limit, 0);
}
void PacketBuffer::DiscardPacketsWithPayloadType(uint8_t payload_type) {
for (auto it = buffer_.begin(); it != buffer_.end(); /* */) {
Packet *packet = *it;
if (packet->header.payloadType == payload_type) {
delete packet;
it = buffer_.erase(it);
} else {
++it;
}
}
}
size_t PacketBuffer::NumPacketsInBuffer() const {
return buffer_.size();
}
size_t PacketBuffer::NumSamplesInBuffer(DecoderDatabase* decoder_database,
size_t last_decoded_length) const {
PacketList::const_iterator it;
size_t PacketBuffer::NumSamplesInBuffer(size_t last_decoded_length) const {
size_t num_samples = 0;
size_t last_duration = last_decoded_length;
for (it = buffer_.begin(); it != buffer_.end(); ++it) {
Packet* packet = (*it);
AudioDecoder* decoder =
decoder_database->GetDecoder(packet->header.payloadType);
if (decoder) {
for (Packet* packet : buffer_) {
if (packet->frame) {
if (!packet->primary) {
continue;
}
int duration = decoder->PacketDuration(packet->payload.data(),
packet->payload.size());
if (duration >= 0) {
size_t duration = packet->frame->Duration();
if (duration > 0) {
last_duration = duration; // Save the most up-to-date (valid) duration.
}
}