openh264/test/utils/BufferedData.h

83 lines
1.5 KiB
C
Raw Normal View History

2013-12-24 09:25:30 +01:00
#ifndef __BUFFEREDDATA_H__
#define __BUFFEREDDATA_H__
#include <stddef.h>
#include <stdlib.h>
#include "../test_stdint.h"
#include <algorithm>
2013-12-24 09:25:30 +01:00
2014-01-08 04:42:58 +01:00
class BufferedData {
public:
2014-06-26 03:50:41 +02:00
BufferedData() : data_ (NULL), capacity_ (0), length_ (0) {}
2013-12-24 09:25:30 +01:00
~BufferedData() {
2014-06-26 03:50:41 +02:00
free (data_);
2013-12-24 09:25:30 +01:00
}
2014-06-26 03:50:41 +02:00
bool PushBack (uint8_t c) {
if (!EnsureCapacity (length_ + 1)) {
2013-12-24 09:25:30 +01:00
return false;
}
data_[length_++] = c;
return true;
}
2014-06-26 03:50:41 +02:00
bool PushBack (const uint8_t* data, size_t len) {
if (!EnsureCapacity (length_ + len)) {
return false;
}
2014-06-26 03:50:41 +02:00
memcpy (data_ + length_, data, len);
length_ += len;
return true;
}
2014-06-26 03:50:41 +02:00
size_t PopFront (uint8_t* ptr, size_t len) {
len = std::min (length_, len);
memcpy (ptr, data_, len);
memmove (data_, data_ + len, length_ - len);
SetLength (length_ - len);
return len;
}
2013-12-24 09:25:30 +01:00
void Clear() {
length_ = 0;
}
2014-06-26 03:50:41 +02:00
void SetLength (size_t newLen) {
if (EnsureCapacity (newLen)) {
2013-12-24 09:25:30 +01:00
length_ = newLen;
}
}
size_t Length() const {
return length_;
}
uint8_t* data() {
return data_;
}
2014-01-08 04:42:58 +01:00
private:
2014-06-26 03:50:41 +02:00
bool EnsureCapacity (size_t capacity) {
2013-12-24 09:25:30 +01:00
if (capacity > capacity_) {
size_t newsize = capacity * 2;
2014-06-26 03:50:41 +02:00
uint8_t* data = static_cast<uint8_t*> (realloc (data_, newsize));
2013-12-24 09:25:30 +01:00
if (!data)
return false;
data_ = data;
capacity_ = newsize;
return true;
}
return true;
}
uint8_t* data_;
size_t capacity_;
size_t length_;
};
#endif //__BUFFEREDDATA_H__