diff --git a/image.h b/image.h index df02955..05a8612 100644 --- a/image.h +++ b/image.h @@ -6,39 +6,16 @@ class Image { -private: - - ssize_t bufferSize = -1; - public: - - enum { - FORMAT_RGB, - FORMAT_JPEG, - FORMAT_YUYV - } typedef format_t; - std::shared_ptr data = nullptr; uint32_t width; uint32_t height; uint8_t channels; - format_t format = FORMAT_RGB; - - const size_t size() const + const uint32_t size() { - return bufferSize < 0 ? width*height*channels : bufferSize; + return width*height*channels; } - void setSize(size_t size) - { - bufferSize = size; - } - void setBuffer(std::shared_ptr buffer, size_t size, format_t inFormat = FORMAT_RGB) - { - data = buffer; - bufferSize = size; - format = inFormat; - } - void save(const char* filename) const + void save(const char* filename) { std::ofstream outfile(filename); outfile.write((char *) data.get(), size()); diff --git a/jpeg_img.cpp b/jpeg_img.cpp index d5656a9..c159558 100644 --- a/jpeg_img.cpp +++ b/jpeg_img.cpp @@ -13,8 +13,7 @@ Image decompressJpegImage(const unsigned char* buffer, size_t size) jpeg_create_decompress( &info ); //fills info structure jpeg_mem_src(&info, buffer, size); - if(jpeg_read_header(&info, true) != JPEG_HEADER_OK) - std::cerr<<"Could not read jpeg header"; + jpeg_read_header( &info, true ); jpeg_start_decompress( &info ); @@ -25,7 +24,7 @@ Image decompressJpegImage(const unsigned char* buffer, size_t size) image.channels = info.num_components; // 3 = RGB, 4 = RGBA // read RGB(A) scanlines one at a time into jdata[] - image.data = std::shared_ptr(new unsigned char[image.size()], std::default_delete()); + image.data = std::shared_ptr(new unsigned char[image.size()]); unsigned char* rowptr; while(info.output_scanline < image.height) { @@ -58,7 +57,7 @@ Image decompressJpegImage(FILE *file) image.channels = info.num_components; // 3 = RGB, 4 = RGBA // read RGB(A) scanlines one at a time into jdata[] - image.data = std::shared_ptr(new unsigned char[image.size()], std::default_delete()); + image.data = std::shared_ptr(new unsigned char[image.size()]); unsigned char* rowptr; while ( info.output_scanline < image.height ) { diff --git a/main.cpp b/main.cpp index 897c6c6..3ee0d92 100644 --- a/main.cpp +++ b/main.cpp @@ -41,16 +41,12 @@ int main(int argc, char* argv[]) Config config; argp_parse(&argp, argc, argv, 0, 0, &config); - bool passthough = config.mjpeg && config.overlay.empty(); - std::cout<<"UVOS webcam sender v0.1\n"; - Webcam webcam(config.device, config.Xres, config.Yres, config.mjpeg, passthough); + Webcam webcam(config.device, config.Xres, config.Yres); std::stringstream ss; - ss<<"nc "<Yres = std::stoi(arg); - break; case 'o': config->overlay = arg; break; diff --git a/webcam.cpp b/webcam.cpp index 26576a7..85e238e 100644 --- a/webcam.cpp +++ b/webcam.cpp @@ -85,12 +85,11 @@ static void v4lconvert_yuyv_to_rgb24(const unsigned char *src, } } -Webcam::Webcam(const string& device, int width, int height, bool mjpeg, bool passthrough) : +Webcam::Webcam(const string& device, int width, int height, bool mjpeg) : device(device), xres(width), yres(height), - passthrough_format(passthrough), - format(mjpeg ? V4L2_PIX_FMT_MJPEG : V4L2_PIX_FMT_YUYV) + format(mjpeg ? V4L2_PIX_FMT_JPEG : V4L2_PIX_FMT_YUYV) { open_device(); init_device(); @@ -100,7 +99,7 @@ Webcam::Webcam(const string& device, int width, int height, bool mjpeg, bool pas rgb_frame.width = xres; rgb_frame.height = yres; rgb_frame.channels = 3; - rgb_frame.data = std::shared_ptr(new unsigned char[rgb_frame.size()], std::default_delete()); + rgb_frame.data = std::shared_ptr(new unsigned char[rgb_frame.size()]); start_capturing(); } @@ -139,42 +138,17 @@ const Image& Webcam::frame(int timeout) } int idx = read_frame(); if (idx != -1) { - if(!passthrough_format) + if (format == V4L2_PIX_FMT_YUYV) { - 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); - } + v4lconvert_yuyv_to_rgb24((unsigned char *) buffers[idx].data, + rgb_frame.data.get(), + xres, + yres, + stride); } - else + else if(format == V4L2_PIX_FMT_JPEG) { - if(format == V4L2_PIX_FMT_YUYV) - { - rgb_frame.setBuffer(std::shared_ptr(new unsigned char[buffers[idx].size], std::default_delete()), - buffers[idx].size, Image::FORMAT_YUYV); - } - else if(format == V4L2_PIX_FMT_MJPEG) - { - rgb_frame.setBuffer(std::shared_ptr(new unsigned char[buffers[idx].size], std::default_delete()), - buffers[idx].size, Image::FORMAT_RGB); - } - else - { - assert(false); - } - memcpy(rgb_frame.data.get(), buffers[idx].data, buffers[idx].size); + rgb_frame = decompressJpegImage((unsigned char *) buffers[idx].data, buffers[idx].size); } return rgb_frame; } @@ -362,8 +336,7 @@ void Webcam::init_device(void) { // note that libv4l2 (look for 'v4l-utils') provides helpers // to manage conversions - throw runtime_error("Webcam does not support the requested format. Support for more formats need to be added! video format is " - + std::to_string(fmt.fmt.pix.pixelformat)); + throw runtime_error("Webcam does not support the requested format. Support for more formats need to be added!"); } /* Note VIDIOC_S_FMT may change width and height. */ diff --git a/webcam.h b/webcam.h index bc8c0ef..09f2fdb 100644 --- a/webcam.h +++ b/webcam.h @@ -18,7 +18,7 @@ class Webcam { public: Webcam(const std::string& device = "/dev/video0", int width = 640, - int height = 480, bool mjpeg = false, bool passthrough = false); + int height = 480, bool mjpeg = false); ~Webcam(); @@ -60,7 +60,6 @@ private: size_t stride; bool force_format = true; - bool passthrough_format; uint32_t format; };