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:
@ -11,6 +11,7 @@
|
||||
#ifndef WEBRTC_BASE_BUFFER_H_
|
||||
#define WEBRTC_BASE_BUFFER_H_
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <memory>
|
||||
#include <type_traits>
|
||||
|
||||
@ -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];
|
||||
|
||||
Reference in New Issue
Block a user