Files
svcmobrel-release 690955501b Updating prebuilts and/or headers
60e29f95ea52df4407d771330897813cdb38340f - libv4lconvert/libv4lsyscall-priv.h
1f1d1e05443c4b824cd697c0ce5efa9ea1277964 - libv4lconvert/ov518-decomp.c
f4d73412805f12fa08dd79a43798a7f8d7acece9 - libv4lconvert/pac207.c
cc3f3e94a21795990610e63887c30528bde7b42e - libv4lconvert/bayer.c
3c49d99b9753208a9c1c2a9c738a1e7ad291ca22 - libv4lconvert/jpeg_memsrcdest.h
3271d74d02e2f33c16e3e50aeb1268eb9c440782 - libv4lconvert/rgbyuv.c
1949e23fe99ccd0a05dcd084848f6d38b0af7ab6 - libv4lconvert/hm12.c
4eff5c1a5e0b99ce4d6e9aa63645d9628467fdc3 - libv4lconvert/sn9c2028-decomp.c
b2c19c2eac71d39d3fb883cdc159a69c2afa8fd6 - libv4lconvert/ov511-decomp.c
84c9c3812d4b5f237c8cd616d37fc1161a212acc - libv4lconvert/se401.c
463725aa4dd3fecaf89c0b8bbf4747f8f7577935 - libv4lconvert/jpeg.c
fbbffd8182b4fe2e85289b6e784f70cba7ea7b1d - libv4lconvert/sq905c.c
db3c69c666e451c5d4ef6d1b5a3117f4b128baa4 - libv4lconvert/libv4lconvert-priv.h
8b7644ac3d5c4161cfb6dcc2a34013f4c379c665 - libv4lconvert/libv4lconvert.export
5c0ab7b5e7c5c2eac27f7e92a4c84acd61983658 - libv4lconvert/Makefile
72953a5a3a56b0188d35f49246356b9c8c35756c - libv4lconvert/helper.c
66dd7958319442bd52ba40ede28fbfe31bb4e074 - libv4lconvert/cpia1.c
1d9c446cd8a232da87bd79acebc93e018ec72499 - libv4lconvert/jidctflt.c
cc8982bb6f753249181c715fe6430ffefc78c23b - libv4lconvert/stv0680.c
25130d299463897a09e8b9adf72389dac2e89fa4 - libv4lconvert/tinyjpeg-internal.h
22a502c238e48f4b939c81de41feccfc7c366766 - libv4lconvert/Makefile.dGPU
fb3344cfa8df97688332ee4fd3b17968437e8ad5 - libv4lconvert/helper-funcs.h
5430e46abb1ac7039ed0309ca338237533ff29c9 - libv4lconvert/sn9c20x.c
d6c1aba89bbcb6fef46a6f22b7ea01025435c44d - libv4lconvert/Makefile.am
3e8e6c1fb85e3c4b58c4e9b2b0a223ddc793edcb - libv4lconvert/libv4lconvert.pc.in
6ad4947dca51a7e67e056561cdb445d6c354d23c - libv4lconvert/libv4lconvert.c
ff7444c48a8da88f8a466cfb138e30e585828cb3 - libv4lconvert/jl2005bcd.c
803c4d0b9364050eda163452b8792e62e221ab6d - libv4lconvert/tinyjpeg.h
f061a4e0e45ca8e0dbab630dd477e19a6c915fda - libv4lconvert/spca501.c
07f8e7c84abfbbe76d49d8bfd1f4eae6ea39a90b - libv4lconvert/jpgl.c
fa751ff0f78845f3b4591396710df3b165bc8d11 - libv4lconvert/mr97310a.c
be9e3bf3d7d1086b6eed0c1bf2f574c2b1737c00 - libv4lconvert/tinyjpeg.c
033894511bd7e8a374a52486889658faa17918c4 - libv4lconvert/flip.c
b694b6348e035b3da880824c2c2768145c9b5199 - libv4lconvert/jpeg_memsrcdest.c
725c9b8d0bfadba566cf200921e602961cb12705 - libv4lconvert/spca561-decompress.c
ddd39b2fe0e2a86a6c64031ccc0d36edfd9b0f1a - libv4lconvert/sn9c10x.c
f08c902ecd48c2739956606b502fc0b8e4007703 - libv4lconvert/crop.c
dae9c69b7f019d7d4494cd56e2cf757e8510824a - libv4lconvert/processing/whitebalance.c
0390d660eb130f0e580832bcf8ad5069010d2696 - libv4lconvert/processing/libv4lprocessing.h
a54c2cb0439e606af01d0b4f02704f411819d98c - libv4lconvert/processing/libv4lprocessing.c
ebf12bcf99f35fb9c400b04a1439e68598268249 - libv4lconvert/processing/gamma.c
33ab91b54108e8c24cbb80c5c335d96391d440b2 - libv4lconvert/processing/libv4lprocessing-priv.h
7da402829dbff238ca6ac829c037a85476185db6 - libv4lconvert/processing/autogain.c
1e08fb01a598d71e3fc69656c4f2291f7dc13105 - libv4lconvert/control/libv4lcontrol.h
19a7fd04cdeba61172f281806d030472dee79fcd - libv4lconvert/control/libv4lcontrol.c
70f4992835e964b2698473971904375333e3659b - libv4lconvert/control/libv4lcontrol-priv.h
9d456d1772885d900865a8958c0291e13d509de5 - libv4l2/v4l2convert.c
7fa618184ff89737d13164be0b79e227d81f398c - libv4l2/log.c
d1f2b6f016cfb90c616d848418feb915e3737fa7 - libv4l2/libv4l2.c
766aaca553b0166eb736557e44ad42b69464aa53 - libv4l2/libv4l2.export
e6516370c43e4869e05a540d2e4ef584ac64890a - libv4l2/v4l2-plugin.c
76ed189d56eb01e6b8bccb4490fad9a4b2af126d - libv4l2/Makefile
4ba98a607592ed0b8327b387af354544c65c9b67 - libv4l2/v4l2-plugin-android.c
2542aabb7fbff4b1a09faaadec6006c4410a6d10 - libv4l2/libv4l2-priv.h
ffecae84262f548deac1da0fa51f1aba6b6f96a0 - libv4l2/Makefile.dGPU
8e335567bf404eeb3d180dd384309f687f2ab944 - libv4l2/Makefile.am
cbcee4426c19c168c6f49d04af3a0b2e30c0b681 - libv4l2/libv4l2.pc.in
c84a9a115a21d1fd20da0f6ca3df7b46dd23cd2a - include/config.h
1edc439e6c0fc98513fa4a69557eb6221d043be0 - include/libv4l2.h
6feb5b2b8c99c99712dd1ea7fe9ab674d58bf86b - include/libv4l1.h
bc44111fd6b2f0374a9fc67b1b23666c5c498b2c - include/libv4l2rds.h
f751b481c4a9203345cdbb6459d0f2882f7cdbd9 - include/libv4lconvert.h
f2b73fa5ab10ea7038e58bd9a4461d8e16316249 - include/libv4l1-videodev.h
94434b9692371b7d5f54ddef2141d22d90079ce9 - include/libv4l-plugin.h
c8b4fc511833f0993fa740a529e1f61e0f5a216f - include/libdvbv5/mpeg_es.h
fb8d640da36b6a156cbe0ef12dc25468de89a2a1 - include/libdvbv5/dvb-sat.h
9a2b20076d6728b5799096e4149e33a73119e1ef - include/libdvbv5/desc_sat.h
ac87e3306569dae329809f27ef227c5d50f0b60e - include/libdvbv5/desc_event_short.h
efa3a711499f68ae370d49d98dc1963bf6bafcd8 - include/libdvbv5/desc_extension.h
ad13bfa0b1642fc72cca387e62bc193974c8d5ee - include/libdvbv5/atsc_header.h
b867a2e7941d718aa64b2f6a1402322b616cb2da - include/libdvbv5/pmt.h
bdf514383ca0afe981cf4fd6af86440db2dc6667 - include/libdvbv5/pat.h
96db22ef84892a36d5df3cffa0b30d5bad01939c - include/libdvbv5/desc_logical_channel.h
92d4c28148d0b537c8afc289e1a76de68435cba0 - include/libdvbv5/dvb-scan.h
7544b5fb8f621a9c637c40d8f7a2a71f6ab4bd63 - include/libdvbv5/desc_hierarchy.h
b72b6d1ffcdd81e3e631c7c20bb30e5c287dc7ff - include/libdvbv5/vct.h
9d523ee179af955a687662996050ee3cfaacf2ab - include/libdvbv5/crc32.h
6e6fd4c61c1f61006c63214cbe4868d49428ddb9 - include/libdvbv5/mpeg_pes.h
d7a096d51e3050c8f52e0e2111d88b71a5313da1 - include/libdvbv5/dvb-demux.h
5b4a5e7fb30a7f28118be012837e73a7151d2619 - include/libdvbv5/cat.h
30e9a7240938943de2725f2b335b19ad320179a5 - include/libdvbv5/header.h
4c412880f0c49cd00cb16e56eed082c4744211a5 - include/libdvbv5/countries.h
e81b7f75c11f175cf365fc7fb535e80828f10e24 - include/libdvbv5/dvb-file.h
2560f18846a535a2c02e1ae449511e731f11c011 - include/libdvbv5/desc_ca_identifier.h
c18291ff9009bfe71a2c7c6f0fce75331dc95e30 - include/libdvbv5/sdt.h
44ab16a8d4eae09690c71a6301927c1da55dda6d - include/libdvbv5/descriptors.h
188fc2cbec97288787a7f66554a4b6288224f980 - include/libdvbv5/desc_isdbt_delivery.h
c1212a9308d96730de547648d3cda2fc144d0e29 - include/libdvbv5/desc_atsc_service_location.h
7fb0966c6a1ccdf1a8844aed4a94d4ae1d02fcd7 - include/libdvbv5/dvb-fe.h
40a06b5375dbc0de88a15d26cc6c1e9a505119bc - include/libdvbv5/eit.h
22c83d133e5c1d2648efb3028e0d89c970d0aad4 - include/libdvbv5/desc_partial_reception.h
1ba874a7cad36ff31e4af3bfb37b98c05063d6b2 - include/libdvbv5/desc_event_extended.h
146f4f53fc49c66b59905249c0142efffd72fc54 - include/libdvbv5/desc_network_name.h
100c02ce3bc364ddff895c75f4fb1f928a748d2d - include/libdvbv5/desc_cable_delivery.h
7645dda247bcd45628afbb74ec2707a47050992e - include/libdvbv5/nit.h
73b7b0cf684de0e8a4eae49a8521f81b411d7b72 - include/libdvbv5/desc_ts_info.h
6bd2ed0beaf6aa4838e239198564fd8e1d20a3a1 - include/libdvbv5/desc_t2_delivery.h
d562371bb8a3b961c4d63a0f5618453bdff4bcd3 - include/libdvbv5/dvb-log.h
ef979f3276cc3cad6e947865a42643fbba860c69 - include/libdvbv5/mgt.h
2f55ba765c689500401111747bb381b5aca77b30 - include/libdvbv5/desc_ca.h
450fab787e61210c0c5f527df92c31c90b44a113 - include/libdvbv5/desc_service.h
cabecc6d7c9fdf1c437273bd6a746bf83c156f72 - include/libdvbv5/desc_frequency_list.h
5e2dfc1d9a71805389e9a7932812695d0309050c - include/libdvbv5/dvb-frontend.h
7a6093b13354d054cac78ea118a96e813cac3395 - include/libdvbv5/atsc_eit.h
9b5cfad4a5f41cbf886507da6e79b07314827b32 - include/libdvbv5/desc_language.h
98365b48442b9e3abb58101983b5da8c14f78289 - include/libdvbv5/dvb-v5-std.h
4fe7def34ff640fc5e327b3596298169fdfe2f1c - include/libdvbv5/mpeg_ts.h
02168c58e3c772f116f075085579ac4a8422e819 - include/libdvbv5/desc_terrestrial_delivery.h

Change-Id: I992b847be813f79a6556cf02d6428c151a2ea53e
2023-01-24 11:20:57 -08:00

429 lines
12 KiB
C

/*
# (C) 2008-2011 Hans de Goede <hdegoede@redhat.com>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License, version 2.1,
# as published by the Free Software Foundation.
#
# 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., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
*/
#ifdef ANDROID
#include <android-config.h>
#else
#include <config.h>
#endif
#include <errno.h>
#include <stdlib.h>
#include "libv4lconvert-priv.h"
#ifdef HAVE_JPEG
#include "jpeg_memsrcdest.h"
#endif
int v4lconvert_decode_jpeg_tinyjpeg(struct v4lconvert_data *data,
unsigned char *src, int src_size, unsigned char *dest,
struct v4l2_format *fmt, unsigned int dest_pix_fmt, int flags)
{
int result = 0;
unsigned char *components[3];
unsigned int header_width, header_height;
unsigned int width = fmt->fmt.pix.width;
unsigned int height = fmt->fmt.pix.height;
if (!data->tinyjpeg) {
data->tinyjpeg = tinyjpeg_init();
if (!data->tinyjpeg)
return v4lconvert_oom_error(data);
}
flags |= TINYJPEG_FLAGS_MJPEG_TABLE;
tinyjpeg_set_flags(data->tinyjpeg, flags);
if (tinyjpeg_parse_header(data->tinyjpeg, src, src_size)) {
V4LCONVERT_ERR("parsing JPEG header: %s",
tinyjpeg_get_errorstring(data->tinyjpeg));
errno = EAGAIN;
return -1;
}
tinyjpeg_get_size(data->tinyjpeg, &header_width, &header_height);
if (data->control_flags & V4LCONTROL_ROTATED_90_JPEG) {
unsigned int tmp = width;
width = height;
height = tmp;
}
if (header_width != width || header_height != height) {
V4LCONVERT_ERR("unexpected width / height in JPEG header: "
"expected: %ux%u, header: %ux%u\n",
width, height, header_width, header_height);
errno = EIO;
return -1;
}
fmt->fmt.pix.width = header_width;
fmt->fmt.pix.height = header_height;
components[0] = dest;
switch (dest_pix_fmt) {
case V4L2_PIX_FMT_RGB24:
tinyjpeg_set_components(data->tinyjpeg, components, 1);
result = tinyjpeg_decode(data->tinyjpeg, TINYJPEG_FMT_RGB24);
break;
case V4L2_PIX_FMT_BGR24:
tinyjpeg_set_components(data->tinyjpeg, components, 1);
result = tinyjpeg_decode(data->tinyjpeg, TINYJPEG_FMT_BGR24);
break;
case V4L2_PIX_FMT_YUV420:
components[1] = components[0] + width * height;
components[2] = components[1] + width * height / 4;
tinyjpeg_set_components(data->tinyjpeg, components, 3);
result = tinyjpeg_decode(data->tinyjpeg, TINYJPEG_FMT_YUV420P);
break;
case V4L2_PIX_FMT_YVU420:
components[2] = components[0] + width * height;
components[1] = components[2] + width * height / 4;
tinyjpeg_set_components(data->tinyjpeg, components, 3);
result = tinyjpeg_decode(data->tinyjpeg, TINYJPEG_FMT_YUV420P);
break;
}
if (result) {
/* The JPEG header checked out ok but we got an error
during decompression. Some webcams, esp pixart and
sn9c20x based ones regulary generate corrupt frames,
which are best thrown away to avoid flashes in the
video stream. We use EPIPE to signal the upper layer
we have some video data, but it is incomplete.
The upper layer (usually libv4l2) should respond to
this by trying a number of times to get a new frame
and if that fails just passing up whatever we did
manage to decompress. */
V4LCONVERT_ERR("decompressing JPEG: %s",
tinyjpeg_get_errorstring(data->tinyjpeg));
errno = EPIPE;
return -1;
}
return 0;
}
#ifdef HAVE_JPEG
static void jerr_error_exit(j_common_ptr cinfo)
{
struct v4lconvert_data *data = cinfo->client_data;
longjmp(data->jerr_jmp_state, data->jerr_errno);
}
static void jerr_emit_message(j_common_ptr cinfo, int msg_level)
{
char buffer[JMSG_LENGTH_MAX];
struct v4lconvert_data *data = cinfo->client_data;
/* < -1 error, == -1 warning, >= 0 trace */
if (msg_level < -1)
return;
cinfo->err->format_message(cinfo, buffer);
snprintf(data->error_msg, V4LCONVERT_ERROR_MSG_SIZE,
"v4l-convert: libjpeg error: %s\n", buffer);
}
static void init_libjpeg_cinfo(struct v4lconvert_data *data)
{
struct jpeg_compress_struct cinfo;
unsigned char *jpeg_header = NULL;
unsigned long jpeg_header_size = 0;
if (data->cinfo_initialized)
return;
/* Setup our error handling */
jpeg_std_error(&data->jerr);
data->jerr.error_exit = jerr_error_exit;
data->jerr.emit_message = jerr_emit_message;
/* Create a jpeg compression object with default params and write
default jpeg headers to a mem buffer, so that we can use them to
pre-fill a jpeg_decompress_struct with default quant and huffman
tables, so that libjpeg can be used to parse [m]jpg-s with
incomplete headers */
cinfo.err = &data->jerr;
cinfo.client_data = data;
jpeg_create_compress(&cinfo);
jpeg_mem_dest(&cinfo, &jpeg_header, &jpeg_header_size);
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_write_tables(&cinfo);
jpeg_destroy_compress(&cinfo);
/* Init the jpeg_decompress_struct */
data->cinfo.err = &data->jerr;
data->cinfo.client_data = data;
jpeg_create_decompress(&data->cinfo);
jpeg_mem_src(&data->cinfo, jpeg_header, jpeg_header_size);
jpeg_read_header(&data->cinfo, FALSE);
free(jpeg_header);
data->cinfo_initialized = 1;
}
static int decode_libjpeg_h_samp1(struct v4lconvert_data *data,
unsigned char *ydest, unsigned char *udest, unsigned char *vdest,
int v_samp)
{
struct jpeg_decompress_struct *cinfo = &data->cinfo;
int x, y;
unsigned char *uv_buf;
unsigned int width = cinfo->image_width;
JSAMPROW y_rows[16], u_rows[8], v_rows[8];
JSAMPARRAY rows[3] = { y_rows, u_rows, v_rows };
uv_buf = v4lconvert_alloc_buffer(width * 16,
&data->convert_pixfmt_buf,
&data->convert_pixfmt_buf_size);
if (!uv_buf)
return v4lconvert_oom_error(data);
for (y = 0; y < 8; y++) {
u_rows[y] = uv_buf;
uv_buf += width;
v_rows[y] = uv_buf;
uv_buf += width;
}
uv_buf -= width * 16;
while (cinfo->output_scanline < cinfo->image_height) {
for (y = 0; y < 8 * v_samp; y++) {
y_rows[y] = ydest;
ydest += cinfo->image_width;
}
y = jpeg_read_raw_data(cinfo, rows, 8 * v_samp);
if (y != 8 * v_samp)
return -1;
/* For v_samp == 1 skip copying uv vals every other time */
if (cinfo->output_scanline % 16)
continue;
/* Copy over every other u + v pixel for 8 lines */
for (y = 0; y < 8; y++) {
for (x = 0; x < width; x += 2) {
*udest++ = *uv_buf++;
uv_buf++;
}
for (x = 0; x < width; x += 2) {
*vdest++ = *uv_buf++;
uv_buf++;
}
}
uv_buf -= width * 16;
}
return 0;
}
static int decode_libjpeg_h_samp2(struct v4lconvert_data *data,
unsigned char *ydest, unsigned char *udest, unsigned char *vdest,
int v_samp)
{
struct jpeg_decompress_struct *cinfo = &data->cinfo;
int y;
unsigned int width = cinfo->image_width;
JSAMPROW y_rows[16], u_rows[8], v_rows[8];
JSAMPARRAY rows[3] = { y_rows, u_rows, v_rows };
while (cinfo->output_scanline < cinfo->image_height) {
for (y = 0; y < 8 * v_samp; y++) {
y_rows[y] = ydest;
ydest += width;
}
/*
* 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;
}
return 0;
}
int v4lconvert_decode_jpeg_libjpeg(struct v4lconvert_data *data,
unsigned char *src, int src_size, unsigned char *dest,
struct v4l2_format *fmt, unsigned int dest_pix_fmt)
{
unsigned int width = fmt->fmt.pix.width;
unsigned int height = fmt->fmt.pix.height;
int result = 0;
/* libjpeg errors before decoding the first line should signal EAGAIN */
data->jerr_errno = EAGAIN;
result = setjmp(data->jerr_jmp_state);
if (result) {
if (data->cinfo_initialized)
jpeg_abort_decompress(&data->cinfo);
errno = result;
return -1;
}
init_libjpeg_cinfo(data);
jpeg_mem_src(&data->cinfo, src, src_size);
jpeg_read_header(&data->cinfo, TRUE);
if (data->cinfo.image_width != width ||
data->cinfo.image_height != height) {
V4LCONVERT_ERR("unexpected width / height in JPEG header: "
"expected: %ux%u, header: %ux%u\n", width,
height, data->cinfo.image_width,
data->cinfo.image_height);
errno = EIO;
return -1;
}
if (data->cinfo.num_components != 3) {
V4LCONVERT_ERR("unexpected no components in JPEG: %d\n",
data->cinfo.num_components);
errno = EIO;
return -1;
}
if (dest_pix_fmt == V4L2_PIX_FMT_RGB24 ||
dest_pix_fmt == V4L2_PIX_FMT_BGR24) {
JSAMPROW row_pointer[1];
#ifdef JCS_EXTENSIONS
if (dest_pix_fmt == V4L2_PIX_FMT_BGR24)
data->cinfo.out_color_space = JCS_EXT_BGR;
#endif
row_pointer[0] = dest;
jpeg_start_decompress(&data->cinfo);
/* Make libjpeg errors report that we've got some data */
data->jerr_errno = EPIPE;
while (data->cinfo.output_scanline < height) {
jpeg_read_scanlines(&data->cinfo, row_pointer, 1);
row_pointer[0] += 3 * width;
}
jpeg_finish_decompress(&data->cinfo);
#ifndef JCS_EXTENSIONS
if (dest_pix_fmt == V4L2_PIX_FMT_BGR24)
v4lconvert_swap_rgb(dest, dest, width, height);
#endif
} else {
int h_samp, v_samp;
unsigned char *udest, *vdest;
if (data->cinfo.max_h_samp_factor == 2 &&
data->cinfo.cur_comp_info[0]->h_samp_factor == 2 &&
data->cinfo.cur_comp_info[1]->h_samp_factor == 1 &&
data->cinfo.cur_comp_info[2]->h_samp_factor == 1) {
h_samp = 2;
#if 0 /* HDG: untested, disable for now */
} else if (data->cinfo.max_h_samp_factor == 1 &&
data->cinfo.cur_comp_info[0]->h_samp_factor == 1 &&
data->cinfo.cur_comp_info[1]->h_samp_factor == 1 &&
data->cinfo.cur_comp_info[2]->h_samp_factor == 1) {
h_samp = 1;
#endif
} else {
fprintf(stderr,
"libv4lconvert: unsupported jpeg h-sampling "
"factors %d:%d:%d, please report this to "
"hdegoede@redhat.com\n",
data->cinfo.cur_comp_info[0]->h_samp_factor,
data->cinfo.cur_comp_info[1]->h_samp_factor,
data->cinfo.cur_comp_info[2]->h_samp_factor);
errno = EOPNOTSUPP;
return -1;
}
if (data->cinfo.max_v_samp_factor == 2 &&
data->cinfo.cur_comp_info[0]->v_samp_factor == 2 &&
data->cinfo.cur_comp_info[1]->v_samp_factor == 1 &&
data->cinfo.cur_comp_info[2]->v_samp_factor == 1) {
v_samp = 2;
} else if (data->cinfo.max_v_samp_factor == 1 &&
data->cinfo.cur_comp_info[0]->v_samp_factor == 1 &&
data->cinfo.cur_comp_info[1]->v_samp_factor == 1 &&
data->cinfo.cur_comp_info[2]->v_samp_factor == 1) {
v_samp = 1;
} else {
fprintf(stderr,
"libv4lconvert: unsupported jpeg v-sampling "
"factors %d:%d:%d, please report this to "
"hdegoede@redhat.com\n",
data->cinfo.cur_comp_info[0]->v_samp_factor,
data->cinfo.cur_comp_info[1]->v_samp_factor,
data->cinfo.cur_comp_info[2]->v_samp_factor);
errno = EOPNOTSUPP;
return -1;
}
/* We don't want any padding as that may overflow our dest */
if (width % (8 * h_samp) || height % (8 * v_samp)) {
V4LCONVERT_ERR(
"resolution is not a multiple of dctsize");
errno = EIO;
return -1;
}
if (dest_pix_fmt == V4L2_PIX_FMT_YVU420) {
vdest = dest + width * height;
udest = vdest + (width * height) / 4;
} else {
udest = dest + width * height;
vdest = udest + (width * height) / 4;
}
data->cinfo.raw_data_out = TRUE;
data->cinfo.do_fancy_upsampling = FALSE;
jpeg_start_decompress(&data->cinfo);
/* Make libjpeg errors report that we've got some data */
data->jerr_errno = EPIPE;
if (h_samp == 1) {
result = decode_libjpeg_h_samp1(data, dest, udest,
vdest, v_samp);
} else {
result = decode_libjpeg_h_samp2(data, dest, udest,
vdest, v_samp);
}
if (result)
jpeg_abort_decompress(&data->cinfo);
else
jpeg_finish_decompress(&data->cinfo);
}
return result;
}
#endif // HAVE_JPEG