add support to passthough mjpeg images

This commit is contained in:
2023-11-18 16:23:52 +01:00
parent 24487a6a51
commit 76bd00363b
5 changed files with 72 additions and 21 deletions

View File

@ -85,10 +85,11 @@ static void v4lconvert_yuyv_to_rgb24(const unsigned char *src,
}
}
Webcam::Webcam(const string& device, int width, int height, bool mjpeg) :
Webcam::Webcam(const string& device, int width, int height, bool mjpeg, bool passthrough) :
device(device),
xres(width),
yres(height),
passthrough_format(passthrough),
format(mjpeg ? V4L2_PIX_FMT_MJPEG : V4L2_PIX_FMT_YUYV)
{
open_device();
@ -99,7 +100,7 @@ Webcam::Webcam(const string& device, int width, int height, bool mjpeg) :
rgb_frame.width = xres;
rgb_frame.height = yres;
rgb_frame.channels = 3;
rgb_frame.data = std::shared_ptr<unsigned char>(new unsigned char[rgb_frame.size()]);
rgb_frame.data = std::shared_ptr<unsigned char>(new unsigned char[rgb_frame.size()], std::default_delete<int[]>());
start_capturing();
}
@ -138,21 +139,42 @@ const Image& Webcam::frame(int timeout)
}
int idx = read_frame();
if (idx != -1) {
if (format == V4L2_PIX_FMT_YUYV)
if(!passthrough_format)
{
v4lconvert_yuyv_to_rgb24((unsigned char *) buffers[idx].data,
rgb_frame.data.get(),
xres,
yres,
stride);
}
else if(format == V4L2_PIX_FMT_MJPEG)
{
rgb_frame = decompressJpegImage((unsigned char *) buffers[idx].data, buffers[idx].size);
if (format == V4L2_PIX_FMT_YUYV)
{
v4lconvert_yuyv_to_rgb24((unsigned char *) buffers[idx].data,
rgb_frame.data.get(),
xres,
yres,
stride);
}
else if(format == V4L2_PIX_FMT_MJPEG)
{
rgb_frame = decompressJpegImage((unsigned char *) buffers[idx].data, buffers[idx].size);
}
else
{
assert(false);
}
}
else
{
assert(false);
if(format == V4L2_PIX_FMT_YUYV)
{
rgb_frame.setBuffer(std::shared_ptr<unsigned char>(new unsigned char[buffers[idx].size], std::default_delete<int[]>()),
buffers[idx].size, Image::FORMAT_YUYV);
}
else if(format == V4L2_PIX_FMT_MJPEG)
{
rgb_frame.setBuffer(std::shared_ptr<unsigned char>(new unsigned char[buffers[idx].size], std::default_delete<int[]>()),
buffers[idx].size, Image::FORMAT_RGB);
}
else
{
assert(false);
}
memcpy(rgb_frame.data.get(), buffers[idx].data, buffers[idx].size);
}
return rgb_frame;
}