Qt: use vector for camera video sink buffer

This commit is contained in:
Megamouse 2023-11-22 23:43:46 +01:00
parent fdcb481f07
commit aae155e954
2 changed files with 12 additions and 30 deletions

View file

@ -16,17 +16,6 @@ qt_camera_video_sink::qt_camera_video_sink(bool front_facing, QObject *parent)
qt_camera_video_sink::~qt_camera_video_sink() qt_camera_video_sink::~qt_camera_video_sink()
{ {
std::lock_guard lock(m_mutex);
// Free memory
for (auto& image_buffer : m_image_buffer)
{
if (image_buffer.data)
{
delete[] image_buffer.data;
image_buffer.data = nullptr;
}
}
} }
bool qt_camera_video_sink::present(const QVideoFrame& frame) bool qt_camera_video_sink::present(const QVideoFrame& frame)
@ -90,26 +79,20 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame)
image_buffer& image_buffer = m_image_buffer[m_write_index]; image_buffer& image_buffer = m_image_buffer[m_write_index];
// Reset buffer if necessary // Reset buffer if necessary
if (image_buffer.size != new_size) if (image_buffer.data.size() != new_size)
{ {
image_buffer.size = 0; image_buffer.data.clear();
if (image_buffer.data)
{
delete[] image_buffer.data;
image_buffer.data = nullptr;
}
} }
// Create buffer if necessary // Create buffer if necessary
if (!image_buffer.data && new_size > 0) if (image_buffer.data.empty() && new_size > 0)
{ {
image_buffer.data = new u8[new_size]; image_buffer.data.resize(new_size);
image_buffer.size = new_size;
image_buffer.width = m_width; image_buffer.width = m_width;
image_buffer.height = m_height; image_buffer.height = m_height;
} }
if (image_buffer.size > 0 && !image.isNull()) if (!image_buffer.data.empty() && !image.isNull())
{ {
// Convert image to proper layout // Convert image to proper layout
// TODO: check if pixel format and bytes per pixel match and convert if necessary // TODO: check if pixel format and bytes per pixel match and convert if necessary
@ -231,7 +214,7 @@ bool qt_camera_video_sink::present(const QVideoFrame& frame)
case CELL_CAMERA_YUV420: case CELL_CAMERA_YUV420:
case CELL_CAMERA_FORMAT_UNKNOWN: case CELL_CAMERA_FORMAT_UNKNOWN:
default: default:
std::memcpy(image_buffer.data, image.constBits(), std::min<usz>(image_buffer.size, image.height() * image.bytesPerLine())); std::memcpy(image_buffer.data.data(), image.constBits(), std::min<usz>(image_buffer.data.size(), image.height() * image.bytesPerLine()));
break; break;
} }
} }
@ -289,14 +272,14 @@ void qt_camera_video_sink::get_image(u8* buf, u64 size, u32& width, u32& height,
frame_number = image_buffer.frame_number; frame_number = image_buffer.frame_number;
// Copy to out buffer // Copy to out buffer
if (buf && image_buffer.data) if (buf && !image_buffer.data.empty())
{ {
bytes_read = std::min<u64>(image_buffer.size, size); bytes_read = std::min<u64>(image_buffer.data.size(), size);
std::memcpy(buf, image_buffer.data, bytes_read); std::memcpy(buf, image_buffer.data.data(), bytes_read);
if (image_buffer.size != size) if (image_buffer.data.size() != size)
{ {
camera_log.error("Buffer size mismatch: in=%d, out=%d. Cropping to incoming size. Please contact a developer.", size, image_buffer.size); camera_log.error("Buffer size mismatch: in=%d, out=%d. Cropping to incoming size. Please contact a developer.", size, image_buffer.data.size());
} }
} }
else else

View file

@ -41,8 +41,7 @@ private:
u64 frame_number = 0; u64 frame_number = 0;
u32 width = 0; u32 width = 0;
u32 height = 0; u32 height = 0;
u64 size = 0; std::vector<u8> data;
u8* data = nullptr;
}; };
std::array<image_buffer, 2> m_image_buffer; std::array<image_buffer, 2> m_image_buffer;
}; };