From fa59c01eadd849ed2e5b0cf1406347bf632c80ed Mon Sep 17 00:00:00 2001 From: "hans@rhel5-devel.localdomain" Date: Mon, 13 Apr 2009 20:02:34 +0200 Subject: libv4l: add video processing: whitebalance and normalize From: Hans de Goede As the version number shows this work is the basis for a beta release of the 0.6.x series, the big change here is the addition of video processing to libv4l currently this only does whitebalance and normalizing (which turns out to be useless for most cams) but the basic framework for doing video processing, and being able to control it through fake v4l2 controls using for example v4l2ucp is there. The initial version of this code was written by 3 of my computer science students: Elmar Kleijn, Sjoerd Piepenbrink and Radjnies Bhansingh. This initial hg commit is a cleaned up and somewhat bug fixed version of their code. Priority: normal Signed-off-by: Hans de Goede --- .../libv4lconvert/processing/libv4lprocessing.c | 179 +++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c new file mode 100644 index 000000000..d61c29275 --- /dev/null +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -0,0 +1,179 @@ +/* +# (C) 2008-2009 Elmar Kleijn +# (C) 2008-2009 Sjoerd Piepenbrink +# (C) 2008-2009 Hans de Goede + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include +#include +#include +#include "libv4lprocessing.h" +#include "libv4lprocessing-priv.h" +#include "../libv4lconvert-priv.h" /* for PIX_FMT defines */ + +struct v4lprocessing_data *v4lprocessing_create(struct v4lcontrol_data* control) +{ + struct v4lprocessing_data *data = + calloc(1, sizeof(struct v4lprocessing_data)); + + if (!data) + return NULL; + + data->control = control; + + return data; +} + +void v4lprocessing_destroy(struct v4lprocessing_data *data) +{ + free(data); +} + +static int v4lprocessing_get_process(struct v4lprocessing_data *data, + unsigned int pix_fmt) +{ + int process = V4L2PROCESSING_PROCESS_NONE; + + switch(pix_fmt) { + case V4L2_PIX_FMT_SBGGR8: + case V4L2_PIX_FMT_SGBRG8: + case V4L2_PIX_FMT_SGRBG8: + case V4L2_PIX_FMT_SRGGB8: + if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE)) { + process |= V4L2PROCESSING_PROCESS_BAYER_NORMALIZE; + } + if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE)) { + process |= V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE; + } + break; + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE)) { + process |= V4L2PROCESSING_PROCESS_RGB_NORMALIZE; + } + if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE)) { + process |= V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE; + } + break; + } + + return process; +} + +static void v4lprocessing_update_processing_data( + struct v4lprocessing_data *data, + unsigned int pix_fmt, unsigned char *buf, unsigned int width, + unsigned int height) +{ + switch (data->process) { + case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE: + bayer_normalize_analyse(buf, width, height, data); + break; + + case V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE: + bayer_whitebalance_analyse(buf, width, height, pix_fmt, data); + break; + + case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE_WHITEBALANCE: + bayer_normalize_whitebalance_analyse(buf, width, height, pix_fmt, data); + break; + + case V4L2PROCESSING_PROCESS_RGB_NORMALIZE: + rgb_normalize_analyse(buf, width, height, data); + break; + + case V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE: + rgb_whitebalance_analyse(buf, width, height, data); + break; + + case V4L2PROCESSING_PROCESS_RGB_NORMALIZE_WHITEBALANCE: + rgb_normalize_whitebalance_analyse(buf, width, height, data); + break; + } +} + +int v4lprocessing_pre_processing(struct v4lprocessing_data *data) +{ + data->do_process = + v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE) || + v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE); + + return data->do_process; +} + +void v4lprocessing_processing(struct v4lprocessing_data *data, + unsigned char *buf, const struct v4l2_format *fmt) +{ + int low_bound, high_bound, process; + + if (!data->do_process) + return; + + process = v4lprocessing_get_process(data, fmt->fmt.pix.pixelformat); + if (process == V4L2PROCESSING_PROCESS_NONE) { + data->process = process; + return; + } + + low_bound = v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORM_LOW_BOUND); + high_bound = v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORM_HIGH_BOUND); + + if (process != data->process || low_bound != data->norm_low_bound || + high_bound != data->norm_high_bound) { + data->process = process; + data->norm_low_bound = low_bound; + data->norm_high_bound = high_bound; + data->processing_data_update = V4L2PROCESSING_UPDATE_RATE; + } + + if (data->processing_data_update == V4L2PROCESSING_UPDATE_RATE) { + data->processing_data_update = 0; + v4lprocessing_update_processing_data(data, fmt->fmt.pix.pixelformat, buf, fmt->fmt.pix.width, fmt->fmt.pix.height); + } else + data->processing_data_update++; + + switch (data->process) { + case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE: + bayer_normalize(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); + break; + + case V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE: + bayer_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, fmt->fmt.pix.pixelformat, data); + break; + + case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE_WHITEBALANCE: + bayer_normalize_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, fmt->fmt.pix.pixelformat, + data); + break; + + case V4L2PROCESSING_PROCESS_RGB_NORMALIZE: + rgb_normalize(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); + break; + + case V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE: + rgb_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); + break; + + case V4L2PROCESSING_PROCESS_RGB_NORMALIZE_WHITEBALANCE: + rgb_normalize_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); + break; + } + data->do_process = 0; +} -- cgit v1.2.3 From b1352a9018aeac6722d2e8d606f9c0ea140e0abd Mon Sep 17 00:00:00 2001 From: "hans@rhel5-devel.localdomain" Date: Mon, 13 Apr 2009 21:56:28 +0200 Subject: libv4l: Fix video processing parameter updating From: Hans de Goede Unless the source format of a conversion was a format supported to do processing on we would update the processing parameters each frame instead of every 10 frames Priority: normal Signed-off-by: Hans de Goede --- v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c index d61c29275..f986da02d 100644 --- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -115,6 +115,9 @@ int v4lprocessing_pre_processing(struct v4lprocessing_data *data) v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE) || v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE); + if (!data->do_process) + data->process = V4L2PROCESSING_PROCESS_NONE; + return data->do_process; } @@ -128,7 +131,6 @@ void v4lprocessing_processing(struct v4lprocessing_data *data, process = v4lprocessing_get_process(data, fmt->fmt.pix.pixelformat); if (process == V4L2PROCESSING_PROCESS_NONE) { - data->process = process; return; } -- cgit v1.2.3 From 62805a6b176a0bbd17ab8fa421791765186fb77d Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Thu, 21 May 2009 13:08:29 +0200 Subject: libv4l: rewrite video processing code From: Hans de Goede Rewrite video processing code to make it easier to add more video filters (and with little extra processing cost). As part of this the normalize filter has been removed as it wasn't functioning satisfactory anyways Priority: normal Signed-off-by: Hans de Goede --- .../libv4lconvert/processing/libv4lprocessing.c | 202 ++++++++++----------- 1 file changed, 100 insertions(+), 102 deletions(-) (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c index f986da02d..3a3802aab 100644 --- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -28,6 +28,10 @@ #include "libv4lprocessing-priv.h" #include "../libv4lconvert-priv.h" /* for PIX_FMT defines */ +static struct v4lprocessing_filter *filters[] = { + &whitebalance_filter, +}; + struct v4lprocessing_data *v4lprocessing_create(struct v4lcontrol_data* control) { struct v4lprocessing_data *data = @@ -46,136 +50,130 @@ void v4lprocessing_destroy(struct v4lprocessing_data *data) free(data); } -static int v4lprocessing_get_process(struct v4lprocessing_data *data, - unsigned int pix_fmt) +int v4lprocessing_pre_processing(struct v4lprocessing_data *data) { - int process = V4L2PROCESSING_PROCESS_NONE; + int i; - switch(pix_fmt) { - case V4L2_PIX_FMT_SBGGR8: - case V4L2_PIX_FMT_SGBRG8: - case V4L2_PIX_FMT_SGRBG8: - case V4L2_PIX_FMT_SRGGB8: - if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE)) { - process |= V4L2PROCESSING_PROCESS_BAYER_NORMALIZE; - } - if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE)) { - process |= V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE; - } - break; - case V4L2_PIX_FMT_RGB24: - case V4L2_PIX_FMT_BGR24: - if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE)) { - process |= V4L2PROCESSING_PROCESS_RGB_NORMALIZE; - } - if (v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE)) { - process |= V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE; - } - break; + data->do_process = 0; + for (i = 0; i < ARRAY_SIZE(filters); i++) { + if (filters[i]->active(data)) + data->do_process = 1; } - return process; + return data->do_process; } -static void v4lprocessing_update_processing_data( - struct v4lprocessing_data *data, - unsigned int pix_fmt, unsigned char *buf, unsigned int width, - unsigned int height) +static void v4lprocessing_update_lookup_tables(struct v4lprocessing_data *data, + unsigned char *buf, const struct v4l2_format *fmt) { - switch (data->process) { - case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE: - bayer_normalize_analyse(buf, width, height, data); - break; + int i; - case V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE: - bayer_whitebalance_analyse(buf, width, height, pix_fmt, data); - break; + for (i = 0; i < 256; i++) { + data->comp1[i] = i; + data->green[i] = i; + data->comp2[i] = i; + } - case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE_WHITEBALANCE: - bayer_normalize_whitebalance_analyse(buf, width, height, pix_fmt, data); - break; + data->lookup_table_active = 0; + for (i = 0; i < ARRAY_SIZE(filters); i++) { + if (filters[i]->active(data)) { + if (filters[i]->calculate_lookup_tables(data, buf, fmt)) + data->lookup_table_active = 1; + } + } +} + +static void v4lprocessing_do_processing(struct v4lprocessing_data *data, + unsigned char *buf, const struct v4l2_format *fmt) +{ + int x, y; - case V4L2PROCESSING_PROCESS_RGB_NORMALIZE: - rgb_normalize_analyse(buf, width, height, data); + switch (fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_SGBRG8: + case V4L2_PIX_FMT_SGRBG8: /* Bayer patterns starting with green */ + for (y = 0; y < fmt->fmt.pix.height / 2; y++) { + for (x = 0; x < fmt->fmt.pix.width / 2; x++) { + *buf = data->green[*buf]; + buf++; + *buf = data->comp1[*buf]; + buf++; + } + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width; + for (x = 0; x < fmt->fmt.pix.width / 2; x++) { + *buf = data->comp2[*buf]; + buf++; + *buf = data->green[*buf]; + buf++; + } + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width; + } break; - case V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE: - rgb_whitebalance_analyse(buf, width, height, data); + case V4L2_PIX_FMT_SBGGR8: + case V4L2_PIX_FMT_SRGGB8: /* Bayer patterns *NOT* starting with green */ + for (y = 0; y < fmt->fmt.pix.height / 2; y++) { + for (x = 0; x < fmt->fmt.pix.width / 2; x++) { + *buf = data->comp1[*buf]; + buf++; + *buf = data->green[*buf]; + buf++; + } + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width; + for (x = 0; x < fmt->fmt.pix.width / 2; x++) { + *buf = data->green[*buf]; + buf++; + *buf = data->comp2[*buf]; + buf++; + } + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width; + } break; - case V4L2PROCESSING_PROCESS_RGB_NORMALIZE_WHITEBALANCE: - rgb_normalize_whitebalance_analyse(buf, width, height, data); + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + for (y = 0; y < fmt->fmt.pix.height; y++) { + for (x = 0; x < fmt->fmt.pix.width; x++) { + *buf = data->comp1[*buf]; + buf++; + *buf = data->green[*buf]; + buf++; + *buf = data->comp2[*buf]; + buf++; + } + buf += fmt->fmt.pix.bytesperline - 3 * fmt->fmt.pix.width; + } break; } } -int v4lprocessing_pre_processing(struct v4lprocessing_data *data) -{ - data->do_process = - v4lcontrol_get_ctrl(data->control, V4LCONTROL_WHITEBALANCE) || - v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORMALIZE); - - if (!data->do_process) - data->process = V4L2PROCESSING_PROCESS_NONE; - - return data->do_process; -} - void v4lprocessing_processing(struct v4lprocessing_data *data, unsigned char *buf, const struct v4l2_format *fmt) { - int low_bound, high_bound, process; - if (!data->do_process) return; - process = v4lprocessing_get_process(data, fmt->fmt.pix.pixelformat); - if (process == V4L2PROCESSING_PROCESS_NONE) { - return; - } - - low_bound = v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORM_LOW_BOUND); - high_bound = v4lcontrol_get_ctrl(data->control, V4LCONTROL_NORM_HIGH_BOUND); - - if (process != data->process || low_bound != data->norm_low_bound || - high_bound != data->norm_high_bound) { - data->process = process; - data->norm_low_bound = low_bound; - data->norm_high_bound = high_bound; - data->processing_data_update = V4L2PROCESSING_UPDATE_RATE; + /* Do we support the current pixformat? */ + switch (fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_SGBRG8: + case V4L2_PIX_FMT_SGRBG8: + case V4L2_PIX_FMT_SBGGR8: + case V4L2_PIX_FMT_SRGGB8: + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + break; + default: + return; /* Non supported pix format */ } - if (data->processing_data_update == V4L2PROCESSING_UPDATE_RATE) { - data->processing_data_update = 0; - v4lprocessing_update_processing_data(data, fmt->fmt.pix.pixelformat, buf, fmt->fmt.pix.width, fmt->fmt.pix.height); + if (v4lcontrol_controls_changed(data->control) || + data->lookup_table_update_counter == V4L2PROCESSING_UPDATE_RATE) { + v4lprocessing_update_lookup_tables(data, buf, fmt); + data->lookup_table_update_counter = 0; } else - data->processing_data_update++; - - switch (data->process) { - case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE: - bayer_normalize(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); - break; - - case V4L2PROCESSING_PROCESS_BAYER_WHITEBALANCE: - bayer_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, fmt->fmt.pix.pixelformat, data); - break; - - case V4L2PROCESSING_PROCESS_BAYER_NORMALIZE_WHITEBALANCE: - bayer_normalize_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, fmt->fmt.pix.pixelformat, - data); - break; - - case V4L2PROCESSING_PROCESS_RGB_NORMALIZE: - rgb_normalize(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); - break; + data->lookup_table_update_counter++; - case V4L2PROCESSING_PROCESS_RGB_WHITEBALANCE: - rgb_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); - break; + if (data->lookup_table_active) + v4lprocessing_do_processing(data, buf, fmt); - case V4L2PROCESSING_PROCESS_RGB_NORMALIZE_WHITEBALANCE: - rgb_normalize_whitebalance(buf, fmt->fmt.pix.width, fmt->fmt.pix.height, data); - break; - } data->do_process = 0; } -- cgit v1.2.3 From 51949cfaadebd8e341fed1e85eca683dd40195d2 Mon Sep 17 00:00:00 2001 From: "hans@rhel5-devel.localdomain" Date: Mon, 25 May 2009 15:25:15 +0200 Subject: libv4l: add software autogain / exposure From: Hans de Goede Add software autogain / exposure, for camera's which have gain and exposure controls but do not contain the ability to calculate the average lumination in hardware (which is needed to do this in the kernel). This patch enables this for the spca561 rev12a, but it should be usefull for other cameras too. Priority: normal Signed-off-by: Hans de Goede --- v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c index 3a3802aab..01de6c111 100644 --- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -30,9 +30,10 @@ static struct v4lprocessing_filter *filters[] = { &whitebalance_filter, + &autogain_filter, }; -struct v4lprocessing_data *v4lprocessing_create(struct v4lcontrol_data* control) +struct v4lprocessing_data *v4lprocessing_create(int fd, struct v4lcontrol_data* control) { struct v4lprocessing_data *data = calloc(1, sizeof(struct v4lprocessing_data)); @@ -40,6 +41,7 @@ struct v4lprocessing_data *v4lprocessing_create(struct v4lcontrol_data* control) if (!data) return NULL; + data->fd = fd; data->control = control; return data; -- cgit v1.2.3 From 08f4c9bb91fbc3e348322f140e1a0c1f662b7478 Mon Sep 17 00:00:00 2001 From: "hans@rhel5-devel.localdomain" Date: Tue, 26 May 2009 10:07:18 +0200 Subject: libv4l: add gamma correction to video processing From: Hans de Goede add gamma correction to the video processing, and enable it by default (correct for a display gamma of 1.5) for pac207 based cams. Priority: normal Signed-off-by: Hans de Goede --- v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c | 1 + 1 file changed, 1 insertion(+) (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c index 01de6c111..f050086e3 100644 --- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -31,6 +31,7 @@ static struct v4lprocessing_filter *filters[] = { &whitebalance_filter, &autogain_filter, + &gamma_filter, }; struct v4lprocessing_data *v4lprocessing_create(int fd, struct v4lcontrol_data* control) -- cgit v1.2.3 From 5999b7d164dbf3118a3a75ee3f6f0b48cb8845c1 Mon Sep 17 00:00:00 2001 From: "hans@rhel5-devel.localdomain" Date: Tue, 2 Jun 2009 15:34:34 +0200 Subject: libv4l: initial support for compiling on FreeBSD From: Hans Petter Selasky Add a patch by Hans Petter Selasky , which should lead to allowing use of libv4l (and the Linux webcam drivers ported to userspace usb drivers) on FreeBSd, this is a work in progress Priority: normal Signed-off-by: Hans Petter Selasky Signed-off-by: Hans de Goede --- v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c | 1 - 1 file changed, 1 deletion(-) (limited to 'v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c') diff --git a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c index f050086e3..cbbcca73c 100644 --- a/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c +++ b/v4l2-apps/libv4l/libv4lconvert/processing/libv4lprocessing.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include "libv4lprocessing.h" #include "libv4lprocessing-priv.h" -- cgit v1.2.3