rewrite ringbuffer
This commit is contained in:
parent
37db983a2f
commit
97ca5aba51
@ -5,11 +5,11 @@ using namespace std::chrono;
|
|||||||
|
|
||||||
ImageBuffer::ImageBuffer(size_t buffer_size, QObject *parent) : QObject(parent), buffer_size(buffer_size) {
|
ImageBuffer::ImageBuffer(size_t buffer_size, QObject *parent) : QObject(parent), buffer_size(buffer_size) {
|
||||||
buffer.resize(buffer_size, nullptr);
|
buffer.resize(buffer_size, nullptr);
|
||||||
std::cerr << "imagebuffer constructor!" << std::endl;
|
qDebug() << "Imagebuffer constructor!";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageBuffer::clear() {
|
void ImageBuffer::clear() {
|
||||||
// std::cerr << "Clear Image buffer!" << std::endl;
|
qDebug() << "Clear Image buffer!";
|
||||||
|
|
||||||
for (auto & img: buffer) {
|
for (auto & img: buffer) {
|
||||||
if (img != nullptr)
|
if (img != nullptr)
|
||||||
@ -25,16 +25,21 @@ size_t ImageBuffer::capacity() {
|
|||||||
|
|
||||||
double ImageBuffer::bufferPressure() {
|
double ImageBuffer::bufferPressure() {
|
||||||
double pressure;
|
double pressure;
|
||||||
|
size_t l = bufferLoad();
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
pressure = static_cast<double>(load)/static_cast<double>(buffer.capacity());
|
pressure = l / buffer_size * 100;
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
return pressure * 100;
|
return pressure;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ImageBuffer::bufferLoad() {
|
size_t ImageBuffer::bufferLoad() {
|
||||||
size_t l;
|
size_t l;
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
l = load;
|
if (read_idx > head_idx){
|
||||||
|
l = buffer_size - read_idx - head_idx;
|
||||||
|
} else {
|
||||||
|
l = head_idx - read_idx;
|
||||||
|
}
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
@ -42,35 +47,31 @@ size_t ImageBuffer::bufferLoad() {
|
|||||||
void ImageBuffer::resize(size_t new_size) {
|
void ImageBuffer::resize(size_t new_size) {
|
||||||
qDebug() << "Buffer Resize";
|
qDebug() << "Buffer Resize";
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
|
|
||||||
buffer_size = new_size;
|
buffer_size = new_size;
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
buffer.resize(new_size, nullptr);
|
buffer.resize(buffer_size, nullptr);
|
||||||
current_read_index = 0;
|
framecounts.clear();
|
||||||
current_write_index = 0;
|
framecounts.resize(buffer_size, 0);
|
||||||
|
read_idx = 0;
|
||||||
|
head_idx = 0;
|
||||||
load = 0;
|
load = 0;
|
||||||
|
framecount = 0;
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageBuffer::push(MyImage *img) {
|
void ImageBuffer::push(MyImage *img) {
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
if (buffer[current_write_index] != nullptr) {
|
head_idx += 1;
|
||||||
qWarning() << "possible frame drop detected!!";
|
framecount +=1;
|
||||||
qWarning() << "buffer.push write: " << current_write_index << " read: " << current_read_index << " load: " << load;
|
if (head_idx >= buffer_size) {
|
||||||
delete(buffer[current_write_index]);
|
head_idx = 0;
|
||||||
}
|
}
|
||||||
buffer[current_write_index] = img;
|
if (buffer[head_idx] != nullptr) {
|
||||||
current_write_index += 1;
|
delete(buffer[head_idx]);
|
||||||
load += 1;
|
|
||||||
if (current_write_index >= buffer_size){
|
|
||||||
current_write_index = 0;
|
|
||||||
}
|
|
||||||
if (load >= buffer_size){
|
|
||||||
load = buffer_size;
|
|
||||||
if (current_read_index == current_write_index)
|
|
||||||
current_read_index = current_write_index < buffer_size - 1 ? current_write_index + 1 : 0;
|
|
||||||
}
|
}
|
||||||
// std::cout << "Buffer.afterpush: load = " << load << " write index =" << current_write_index << " read index = " << current_read_index << std::endl;
|
buffer[head_idx] = img;
|
||||||
|
framecounts[head_idx] = framecount;
|
||||||
|
load = load < buffer_size ? load +=1 : buffer_size;
|
||||||
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
@ -83,35 +84,28 @@ bool ImageBuffer::bufferNotEmpty() {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
MyImage* ImageBuffer::pop() {
|
MyImage* ImageBuffer::read(size_t &framecount){
|
||||||
bool ret = false;
|
MyImage *img = nullptr;
|
||||||
MyImage * img;
|
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
if (load > 0) {
|
if (read_idx < head_idx) {
|
||||||
img = buffer[current_read_index];
|
read_idx += 1;
|
||||||
current_read_index < (buffer_size - 1) ? current_read_index += 1 : current_read_index = 0;
|
} else if (read_idx > head_idx) {
|
||||||
load -= 1;
|
read_idx < buffer_size ? read_idx += 1 : read_idx = 0;
|
||||||
|
} else {
|
||||||
|
framecount = 0;
|
||||||
|
return img;
|
||||||
}
|
}
|
||||||
|
img = buffer[read_idx];
|
||||||
|
framecount = framecounts[read_idx];
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
std::cerr << "buffer.pop write: " << current_write_index << " read: " << current_read_index << " load: " << load << std::endl;
|
|
||||||
|
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
MyImage* ImageBuffer::readLast() {
|
MyImage* ImageBuffer::readLast(size_t &framecount) {
|
||||||
MyImage *img;
|
MyImage *img = nullptr;
|
||||||
img = nullptr;
|
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
if (load > 0) {
|
img = buffer[head_idx];
|
||||||
size_t idx = current_write_index - 1;
|
framecount = framecounts[head_idx];
|
||||||
|
|
||||||
if (idx < 0) {
|
|
||||||
std::cerr << "Bank" << std::endl;
|
|
||||||
idx = buffer_size - 1;
|
|
||||||
}
|
|
||||||
std::cerr << "read form index " << idx << std::endl;
|
|
||||||
img = buffer[idx];
|
|
||||||
}
|
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,8 @@ public:
|
|||||||
void clear();
|
void clear();
|
||||||
void resize(size_t new_size);
|
void resize(size_t new_size);
|
||||||
void push(MyImage *img);
|
void push(MyImage *img);
|
||||||
MyImage* pop();
|
MyImage* read(size_t &framecount);
|
||||||
MyImage* readLast();
|
MyImage* readLast(size_t &framecount);
|
||||||
size_t capacity();
|
size_t capacity();
|
||||||
double bufferPressure();
|
double bufferPressure();
|
||||||
size_t bufferLoad();
|
size_t bufferLoad();
|
||||||
@ -29,10 +29,12 @@ private:
|
|||||||
int numUsedBytes = 0;
|
int numUsedBytes = 0;
|
||||||
|
|
||||||
std::vector<MyImage*> buffer;
|
std::vector<MyImage*> buffer;
|
||||||
size_t current_write_index = 0;
|
std::vector<size_t> framecounts;
|
||||||
size_t current_read_index = 0;
|
size_t head_idx = 0;
|
||||||
|
size_t read_idx = 0;
|
||||||
size_t load = 0;
|
size_t load = 0;
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
|
size_t framecount = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user