add support to passthough mjpeg images
This commit is contained in:
48
webcam.cpp
48
webcam.cpp
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user