Performance fix for H264 RBSP parsing.

An rtc::Buffer is used to write output of RBSP parsing, usually one byte
at a time. It turns out that container will then expand its capacity one
byte at a time, for each byte reallocating the whole buffer and copying
the contents over, turning this into an O(n^2) operation.

Fix is for now only to preallocate the container storage. Longer term, I
think we should mull over if we really need custom containers...

R=pbos@webrtc.org
TBR=mflodman@webrtc.org
BUG=

Review URL: https://codereview.webrtc.org/2073763002 .

Cr-Commit-Position: refs/heads/master@{#13167}
This commit is contained in:
Erik Språng
2016-06-16 15:54:44 +02:00
parent fc3a8ee47b
commit 1642620a7d
2 changed files with 3 additions and 1 deletions

View File

@ -11,6 +11,7 @@
#ifndef WEBRTC_BASE_BUFFER_H_
#define WEBRTC_BASE_BUFFER_H_
#include <algorithm>
#include <cstring>
#include <memory>
#include <type_traits>

View File

@ -59,7 +59,7 @@ NaluType ParseNaluType(uint8_t data) {
}
std::unique_ptr<rtc::Buffer> ParseRbsp(const uint8_t* data, size_t length) {
std::unique_ptr<rtc::Buffer> rbsp_buffer(new rtc::Buffer());
std::unique_ptr<rtc::Buffer> rbsp_buffer(new rtc::Buffer(0, length));
const char* sps_bytes = reinterpret_cast<const char*>(data);
for (size_t i = 0; i < length;) {
// Be careful about over/underflow here. byte_length_ - 3 can underflow, and
@ -84,6 +84,7 @@ void WriteRbsp(const uint8_t* bytes, size_t length, rtc::Buffer* destination) {
static const uint8_t kZerosInStartSequence = 2;
static const uint8_t kEmulationByte = 0x03u;
size_t num_consecutive_zeros = 0;
destination->EnsureCapacity(destination->size() + length);
for (size_t i = 0; i < length; ++i) {
uint8_t byte = bytes[i];