diff --git a/0001-v4lconvert-Fix-decoding-of-jpeg-data-with-no-vertica.patch b/0001-v4lconvert-Fix-decoding-of-jpeg-data-with-no-vertica.patch new file mode 100644 index 0000000..c09fff8 --- /dev/null +++ b/0001-v4lconvert-Fix-decoding-of-jpeg-data-with-no-vertica.patch @@ -0,0 +1,91 @@ +From 757d7910ddf43d9a9187dddae4f51a57fb723e8d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 20 Nov 2014 13:03:35 +0100 +Subject: [PATCH] v4lconvert: Fix decoding of jpeg data with no vertical + sub-sampling + +Our YUV output is always 2x subsampled in both vertical and horizontal +direction, but some cameras generate JPEG data which is only subsampled in +the horizontal direction. + +Since averaging the extra UV data these JPEGs contains is seomwhat slow, +and UV data is not all that important anyways, we simple take every other +line. Or at least that is the intent. + +But before this commit the code was not doing this properly, for each 16 +Y input lines 1 - 16 we also get 16 UV input lines 1 - 16, but we only need +8 output lines. so we should store input line 1 or 2 in output line 1, input +line 3 or 4 in output line 2, etc. Instead we were storing input lines +9 - 16 into output lines 1 - 8, which leads to some unwanted color bleeding. + +More over this also leads for 1920x1080 JPEG to us writing (1080 / 8 + 1) / 2 +* 8 = 544 UV output lines rather then 540, this means that the last 4 U output +lines overwrite the first 4 V output lines, and worse that the last 4 V output +lines overrun the output buffer. + +So far this only lead to some wrong colors in various places, but since that +we dynamically allocate the output buffer to just the right size this actually +causes a crash. + +This commit fixes both the crash, and the wrong colors. + +Signed-off-by: Hans de Goede +--- + lib/libv4lconvert/jpeg.c | 37 ++++++++++++++++++++++++------------- + 1 file changed, 24 insertions(+), 13 deletions(-) + +diff --git a/lib/libv4lconvert/jpeg.c b/lib/libv4lconvert/jpeg.c +index aa9cace..0142d44 100644 +--- a/lib/libv4lconvert/jpeg.c ++++ b/lib/libv4lconvert/jpeg.c +@@ -242,23 +242,34 @@ static int decode_libjpeg_h_samp2(struct v4lconvert_data *data, + y_rows[y] = ydest; + ydest += width; + } +- for (y = 0; y < 8; y++) { +- u_rows[y] = udest; +- v_rows[y] = vdest; +- udest += width / 2; +- vdest += width / 2; ++ /* ++ * For v_samp == 1 were going to get 1 set of uv values per ++ * line, but we need only 1 set per 2 lines since our output ++ * has v_samp == 2. We store every 2 sets in 1 line, ++ * effectively using the second set for each output line. ++ */ ++ if (v_samp == 1) { ++ for (y = 0; y < 8; y++) { ++ u_rows[y] = udest; ++ v_rows[y] = vdest; ++ y++; ++ u_rows[y] = udest; ++ v_rows[y] = vdest; ++ udest += width / 2; ++ vdest += width / 2; ++ } ++ } else { /* v_samp == 2 */ ++ for (y = 0; y < 8; y++) { ++ u_rows[y] = udest; ++ v_rows[y] = vdest; ++ udest += width / 2; ++ vdest += width / 2; ++ } + } ++ + y = jpeg_read_raw_data(cinfo, rows, 8 * v_samp); + if (y != 8 * v_samp) + return -1; +- +- /* For v_samp == 1 were going to get another set of uv values, +- but we need only 1 set since our output has v_samp == 2, so +- rewind u and vdest and overwrite the previous set. */ +- if (cinfo->output_scanline % 16) { +- udest -= width * 8 / 2; +- vdest -= width * 8 / 2; +- } + } + return 0; + } +-- +2.1.0 + diff --git a/v4l-utils.spec b/v4l-utils.spec index 6ef7f65..42e0be7 100644 --- a/v4l-utils.spec +++ b/v4l-utils.spec @@ -1,12 +1,13 @@ Name: v4l-utils Version: 1.6.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Utilities for video4linux and DVB devices Group: Applications/System # libdvbv5, dvbv5 utils, ir-keytable and v4l2-sysfs-path are GPLv2 only License: GPLv2+ and GPLv2 URL: http://www.linuxtv.org/downloads/v4l-utils/ Source0: http://linuxtv.org/downloads/v4l-utils/v4l-utils-%{version}.tar.bz2 +Patch1: 0001-v4lconvert-Fix-decoding-of-jpeg-data-with-no-vertica.patch BuildRequires: libjpeg-devel qt4-devel kernel-headers desktop-file-utils BuildRequires: alsa-lib-devel doxygen # For /lib/udev/rules.d ownership @@ -97,6 +98,7 @@ files for developing applications that use libdvbv5. %prep %setup -q +%patch1 -p1 %build @@ -190,6 +192,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %changelog +* Thu Nov 20 2014 Hans de Goede - 1.6.0-2 +- Fix crash when decoding 1920x1080 jpeg to YUV420 + * Sun Oct 05 2014 Mauro Carvalho Chehab - 1.6.0-1 - Upgrade to version 1.6.0