diff options
author | Hans Verkuil <hverkuil-cisco@xs4all.nl> | 2021-11-25 10:59:22 +0100 |
---|---|---|
committer | Hans Verkuil <hverkuil-cisco@xs4all.nl> | 2021-11-25 10:59:22 +0100 |
commit | 6e19bb895a16a9a247524ac526ab47f576cc36f6 (patch) | |
tree | 9c4ca63c49efe4f1b6215a8e39c9963a5e428e1f | |
parent | 0349bea74d06578b4d1c06533317876985c64ace (diff) | |
download | v4l-utils-6e19bb895a16a9a247524ac526ab47f576cc36f6.tar.gz |
v4l-utils: use v4l_getsubopt instead of getsubopt
Android doesn't have getsubopt at all, and some libc implementations
use a getsubopt variant that behaves slightly different.
So add a new v4l-getsubopt.h header that either just uses the glibc
function (if glibc is detected) or uses a static inline v4l_getsubopt
that is copied from glibc. This should avoid such problems.
Reported-by: Marian Buschsieweke <marian.buschsieweke@ovgu.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
-rw-r--r-- | android-config.h | 243 | ||||
-rw-r--r-- | include/v4l-getsubopt.h | 259 | ||||
-rw-r--r-- | utils/cx18-ctl/cx18-ctl.c | 3 | ||||
-rw-r--r-- | utils/ivtv-ctl/ivtv-ctl.c | 5 | ||||
-rw-r--r-- | utils/libcecutil/cec-parse.cpp | 3 | ||||
-rw-r--r-- | utils/rds-ctl/rds-ctl.cpp | 3 | ||||
-rw-r--r-- | utils/v4l2-compliance/v4l2-compliance.cpp | 3 | ||||
-rw-r--r-- | utils/v4l2-ctl/v4l2-ctl-common.cpp | 2 | ||||
-rw-r--r-- | utils/v4l2-ctl/v4l2-ctl-edid.cpp | 2 | ||||
-rw-r--r-- | utils/v4l2-ctl/v4l2-ctl-stds.cpp | 2 | ||||
-rw-r--r-- | utils/v4l2-ctl/v4l2-ctl.cpp | 4 | ||||
-rw-r--r-- | utils/v4l2-ctl/v4l2-ctl.h | 1 | ||||
-rw-r--r-- | utils/v4l2-dbg/v4l2-dbg.cpp | 3 |
13 files changed, 278 insertions, 255 deletions
diff --git a/android-config.h b/android-config.h index 9f12b8fc..bd4ef2fb 100644 --- a/android-config.h +++ b/android-config.h @@ -117,247 +117,4 @@ /* Define to `int' if <sys/types.h> does not define. */ /* #undef mode_t */ -/* - * Import strchrnul(...) from uClibc version 0.9.33.2 since this feature is - * missing in the Android C library. - */ - -/* Copyright (C) 1991,93,94,95,96,97,99,2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - bug fix and commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to strchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C Library 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. - - The GNU C Library 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 the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <string.h> -#include <stdlib.h> - -/* Find the first occurrence of C in S or the final NUL byte. */ -static inline char *strchrnul (const char *s, int c_in) -{ - const unsigned char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, magic_bits, charmask; - unsigned char c; - - c = (unsigned char) c_in; - - /* Handle the first few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s; - ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0; - ++char_ptr) - if (*char_ptr == c || *char_ptr == '\0') - return (char *) char_ptr; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - switch (sizeof (longword)) - { - case 4: magic_bits = 0x7efefeffL; break; - case 8: magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL; break; - default: - abort (); - } - - /* Set up a longword, each of whose bytes is C. */ - charmask = c | (c << 8); - charmask |= charmask << 16; - if (sizeof (longword) > 4) - /* Do the shift in two steps to avoid a warning if long has 32 bits. */ - charmask |= (charmask << 16) << 16; - if (sizeof (longword) > 8) - abort (); - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - for (;;) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. - - 3) But wait! Aren't we looking for C as well as zero? - Good point. So what we do is XOR LONGWORD with a longword, - each of whose bytes is C. This turns each byte that is C - into a zero. */ - - longword = *longword_ptr++; - - /* Add MAGIC_BITS to LONGWORD. */ - if ((((longword + magic_bits) - - /* Set those bits that were unchanged by the addition. */ - ^ ~longword) - - /* Look at only the hole bits. If any of the hole bits - are unchanged, most likely one of the bytes was a - zero. */ - & ~magic_bits) != 0 || - - /* That caught zeroes. Now test for C. */ - ((((longword ^ charmask) + magic_bits) ^ ~(longword ^ charmask)) - & ~magic_bits) != 0) - { - /* Which of the bytes was C or zero? - If none of them were, it was a misfire; continue the search. */ - - const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); - - if (*cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (sizeof (longword) > 4) - { - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - } - } - } - - /* This should never happen. */ - return NULL; -} - -/* - * Import getsubopt(...) from uClibc version 0.9.33.2 since this feature is - * missing in the Android C library. - */ - -/* Parse comma separate list into words. - Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - The GNU C Library 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. - - The GNU C Library 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 the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <stdlib.h> -#include <string.h> - -/* Parse comma separated suboption from *OPTIONP and match against - strings in TOKENS. If found return index and set *VALUEP to - optional value introduced by an equal sign. If the suboption is - not part of TOKENS return in *VALUEP beginning of unknown - suboption. On exit *OPTIONP is set to the beginning of the next - token or at the terminating NUL character. */ -static inline int -getsubopt (char **optionp, char *const *tokens, char **valuep) -{ - char *endp, *vstart; - int cnt; - - if (**optionp == '\0') - return -1; - - /* Find end of next token. */ - endp = strchrnul (*optionp, ','); - - /* Find start of value. */ - vstart = (char *) memchr (*optionp, '=', endp - *optionp); - if (vstart == NULL) - vstart = endp; - - /* Try to match the characters between *OPTIONP and VSTART against - one of the TOKENS. */ - for (cnt = 0; tokens[cnt] != NULL; ++cnt) - if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0 - && tokens[cnt][vstart - *optionp] == '\0') - { - /* We found the current option in TOKENS. */ - *valuep = vstart != endp ? vstart + 1 : NULL; - - if (*endp != '\0') - *endp++ = '\0'; - *optionp = endp; - - return cnt; - } - - /* The current suboption does not match any option. */ - *valuep = *optionp; - - if (*endp != '\0') - *endp++ = '\0'; - *optionp = endp; - - return -1; -} #endif diff --git a/include/v4l-getsubopt.h b/include/v4l-getsubopt.h new file mode 100644 index 00000000..60e7b976 --- /dev/null +++ b/include/v4l-getsubopt.h @@ -0,0 +1,259 @@ +#ifndef __V4L_GETSUBOPT__ +#define __V4L_GETSUBOPT__ + +/* + * Apparently non-glibc variants of getsubopt behave slightly + * differently, and on some OSes (Android) it is missing altogether. + * So add support for it here, if needed. + */ + +#if defined(__GLIBC__) + +#define v4l_getsubopt getsubopt + +#else + +/* + * Import strchrnul(...) from uClibc version 0.9.33.2 since this feature is + * missing in the Android C library. + */ + +/* Copyright (C) 1991,93,94,95,96,97,99,2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Based on strlen implementation by Torbjorn Granlund (tege@sics.se), + with help from Dan Sahlin (dan@sics.se) and + bug fix and commentary by Jim Blandy (jimb@ai.mit.edu); + adaptation to strchr suggested by Dick Karpinski (dick@cca.ucsf.edu), + and implemented by Roland McGrath (roland@ai.mit.edu). + + The GNU C Library 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. + + The GNU C Library 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <string.h> +#include <stdlib.h> + +/* Find the first occurrence of C in S or the final NUL byte. */ +static inline char *v4l_strchrnul (const char *s, int c_in) +{ + const unsigned char *char_ptr; + const unsigned long int *longword_ptr; + unsigned long int longword, magic_bits, charmask; + unsigned char c; + + c = (unsigned char) c_in; + + /* Handle the first few characters by reading one character at a time. + Do this until CHAR_PTR is aligned on a longword boundary. */ + for (char_ptr = (const unsigned char *) s; + ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0; + ++char_ptr) + if (*char_ptr == c || *char_ptr == '\0') + return (char *) char_ptr; + + /* All these elucidatory comments refer to 4-byte longwords, + but the theory applies equally well to 8-byte longwords. */ + + longword_ptr = (unsigned long int *) char_ptr; + + /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits + the "holes." Note that there is a hole just to the left of + each byte, with an extra at the end: + + bits: 01111110 11111110 11111110 11111111 + bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD + + The 1-bits make sure that carries propagate to the next 0-bit. + The 0-bits provide holes for carries to fall into. */ + switch (sizeof (longword)) + { + case 4: magic_bits = 0x7efefeffL; break; + case 8: magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL; break; + default: + abort (); + } + + /* Set up a longword, each of whose bytes is C. */ + charmask = c | (c << 8); + charmask |= charmask << 16; + if (sizeof (longword) > 4) + /* Do the shift in two steps to avoid a warning if long has 32 bits. */ + charmask |= (charmask << 16) << 16; + if (sizeof (longword) > 8) + abort (); + + /* Instead of the traditional loop which tests each character, + we will test a longword at a time. The tricky part is testing + if *any of the four* bytes in the longword in question are zero. */ + for (;;) + { + /* We tentatively exit the loop if adding MAGIC_BITS to + LONGWORD fails to change any of the hole bits of LONGWORD. + + 1) Is this safe? Will it catch all the zero bytes? + Suppose there is a byte with all zeros. Any carry bits + propagating from its left will fall into the hole at its + least significant bit and stop. Since there will be no + carry from its most significant bit, the LSB of the + byte to the left will be unchanged, and the zero will be + detected. + + 2) Is this worthwhile? Will it ignore everything except + zero bytes? Suppose every byte of LONGWORD has a bit set + somewhere. There will be a carry into bit 8. If bit 8 + is set, this will carry into bit 16. If bit 8 is clear, + one of bits 9-15 must be set, so there will be a carry + into bit 16. Similarly, there will be a carry into bit + 24. If one of bits 24-30 is set, there will be a carry + into bit 31, so all of the hole bits will be changed. + + The one misfire occurs when bits 24-30 are clear and bit + 31 is set; in this case, the hole at bit 31 is not + changed. If we had access to the processor carry flag, + we could close this loophole by putting the fourth hole + at bit 32! + + So it ignores everything except 128's, when they're aligned + properly. + + 3) But wait! Aren't we looking for C as well as zero? + Good point. So what we do is XOR LONGWORD with a longword, + each of whose bytes is C. This turns each byte that is C + into a zero. */ + + longword = *longword_ptr++; + + /* Add MAGIC_BITS to LONGWORD. */ + if ((((longword + magic_bits) + + /* Set those bits that were unchanged by the addition. */ + ^ ~longword) + + /* Look at only the hole bits. If any of the hole bits + are unchanged, most likely one of the bytes was a + zero. */ + & ~magic_bits) != 0 || + + /* That caught zeroes. Now test for C. */ + ((((longword ^ charmask) + magic_bits) ^ ~(longword ^ charmask)) + & ~magic_bits) != 0) + { + /* Which of the bytes was C or zero? + If none of them were, it was a misfire; continue the search. */ + + const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); + + if (*cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (sizeof (longword) > 4) + { + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + if (*++cp == c || *cp == '\0') + return (char *) cp; + } + } + } + + /* This should never happen. */ + return NULL; +} + +/* + * Import getsubopt(...) from uClibc version 0.9.33.2 since this feature is + * missing in the Android C library. + */ + +/* Parse comma separate list into words. + Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library 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. + + The GNU C Library 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Parse comma separated suboption from *OPTIONP and match against + strings in TOKENS. If found return index and set *VALUEP to + optional value introduced by an equal sign. If the suboption is + not part of TOKENS return in *VALUEP beginning of unknown + suboption. On exit *OPTIONP is set to the beginning of the next + token or at the terminating NUL character. */ +static inline int +v4l_getsubopt (char **optionp, char *const *tokens, char **valuep) +{ + char *endp, *vstart; + int cnt; + + if (**optionp == '\0') + return -1; + + /* Find end of next token. */ + endp = v4l_strchrnul (*optionp, ','); + + /* Find start of value. */ + vstart = (char *) memchr (*optionp, '=', endp - *optionp); + if (vstart == NULL) + vstart = endp; + + /* Try to match the characters between *OPTIONP and VSTART against + one of the TOKENS. */ + for (cnt = 0; tokens[cnt] != NULL; ++cnt) + if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0 + && tokens[cnt][vstart - *optionp] == '\0') + { + /* We found the current option in TOKENS. */ + *valuep = vstart != endp ? vstart + 1 : NULL; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + + return cnt; + } + + /* The current suboption does not match any option. */ + *valuep = *optionp; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + + return -1; +} + +#endif + +#endif diff --git a/utils/cx18-ctl/cx18-ctl.c b/utils/cx18-ctl/cx18-ctl.c index bf8ee967..16a2c82f 100644 --- a/utils/cx18-ctl/cx18-ctl.c +++ b/utils/cx18-ctl/cx18-ctl.c @@ -36,6 +36,7 @@ #include <math.h> #include <linux/videodev2.h> +#include <v4l-getsubopt.h> /* copied from cx18-driver.h */ #define CX18_DBGFLG_WARN (1 << 0) @@ -279,7 +280,7 @@ int main(int argc, char **argv) case OptSetGPIO: subs = optarg; while (*subs != '\0') { - switch (getsubopt(&subs, subopts, &value)) { + switch (v4l_getsubopt(&subs, subopts, &value)) { case SUB_DIR: if (value == NULL) { fprintf(stderr, diff --git a/utils/ivtv-ctl/ivtv-ctl.c b/utils/ivtv-ctl/ivtv-ctl.c index 9923827e..b42b3489 100644 --- a/utils/ivtv-ctl/ivtv-ctl.c +++ b/utils/ivtv-ctl/ivtv-ctl.c @@ -35,6 +35,7 @@ #include <math.h> #include <linux/videodev2.h> +#include <v4l-getsubopt.h> /* copied from ivtv-driver.h */ #define IVTV_DBGFLG_WARN (1 << 0) @@ -316,7 +317,7 @@ int main(int argc, char **argv) { subs = optarg; while (*subs != '\0') { - switch (getsubopt(&subs, subopts, &value)) { + switch (v4l_getsubopt(&subs, subopts, &value)) { case SUB_YUV_MODE: if (value == NULL) { fprintf(stderr, @@ -360,7 +361,7 @@ int main(int argc, char **argv) case OptSetGPIO: subs = optarg; while (*subs != '\0') { - switch (getsubopt(&subs, subopts, &value)) { + switch (v4l_getsubopt(&subs, subopts, &value)) { case SUB_DIR: if (value == NULL) { fprintf(stderr, diff --git a/utils/libcecutil/cec-parse.cpp b/utils/libcecutil/cec-parse.cpp index fd37f5b8..aa703136 100644 --- a/utils/libcecutil/cec-parse.cpp +++ b/utils/libcecutil/cec-parse.cpp @@ -10,6 +10,7 @@ #include <unistd.h> #include <linux/cec-funcs.h> +#include <v4l-getsubopt.h> #include "cec-htng-funcs.h" #include "cec-log.h" #include "cec-parse.h" @@ -147,7 +148,7 @@ static __u8 *args2short_aud_fmt_codes(__u8 audio_format_code1, int cec_parse_subopt(char **subs, const char * const *subopts, char **value) { - int opt = getsubopt(subs, const_cast<char * const *>(subopts), value); + int opt = v4l_getsubopt(subs, const_cast<char * const *>(subopts), value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/rds-ctl/rds-ctl.cpp b/utils/rds-ctl/rds-ctl.cpp index 80a9396a..2a17b430 100644 --- a/utils/rds-ctl/rds-ctl.cpp +++ b/utils/rds-ctl/rds-ctl.cpp @@ -26,6 +26,7 @@ #include <linux/videodev2.h> #include <libv4l2rds.h> +#include <v4l-getsubopt.h> using dev_vec = std::vector<std::string>; using dev_map = std::map<std::string, std::string>; @@ -362,7 +363,7 @@ static dev_vec list_devices() static int parse_subopt(char **subs, const char * const *subopts, char **value) { - int opt = getsubopt(subs, const_cast<char * const *>(subopts), value); + int opt = v4l_getsubopt(subs, const_cast<char * const *>(subopts), value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp index e4f29130..0eeabb2d 100644 --- a/utils/v4l2-compliance/v4l2-compliance.cpp +++ b/utils/v4l2-compliance/v4l2-compliance.cpp @@ -32,6 +32,7 @@ #include "v4l2-compliance.h" #include <media-info.h> +#include <v4l-getsubopt.h> /* Short option list @@ -820,7 +821,7 @@ static void streamingSetup(struct node *node) static int parse_subopt(char **subs, const char * const *subopts, char **value) { - int opt = getsubopt(subs, const_cast<char * const *>(subopts), value); + int opt = v4l_getsubopt(subs, const_cast<char * const *>(subopts), value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp index 44f2f274..89a9553d 100644 --- a/utils/v4l2-ctl/v4l2-ctl-common.cpp +++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp @@ -962,7 +962,7 @@ static bool parse_next_subopt(char **subs, char **value) static char *const subopts[] = { nullptr }; - int opt = getsubopt(subs, subopts, value); + int opt = v4l_getsubopt(subs, subopts, value); if (opt < 0 || *value) return false; diff --git a/utils/v4l2-ctl/v4l2-ctl-edid.cpp b/utils/v4l2-ctl/v4l2-ctl-edid.cpp index c3a4a28a..96659377 100644 --- a/utils/v4l2-ctl/v4l2-ctl-edid.cpp +++ b/utils/v4l2-ctl/v4l2-ctl-edid.cpp @@ -1150,7 +1150,7 @@ void edid_cmd(int ch, char *optarg) nullptr }; - int opt = getsubopt(&subs, (char* const*)subopts, &value); + int opt = v4l_getsubopt(&subs, (char* const*)subopts, &value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/v4l2-ctl/v4l2-ctl-stds.cpp b/utils/v4l2-ctl/v4l2-ctl-stds.cpp index 08154df4..6b596d00 100644 --- a/utils/v4l2-ctl/v4l2-ctl-stds.cpp +++ b/utils/v4l2-ctl/v4l2-ctl-stds.cpp @@ -185,7 +185,7 @@ static int parse_timing_subopt(char **subopt_str, int *value) nullptr }; - opt = getsubopt(subopt_str, (char* const*) subopt_list, &opt_str); + opt = v4l_getsubopt(subopt_str, (char* const*) subopt_list, &opt_str); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp index d7f8fe23..764a7c71 100644 --- a/utils/v4l2-ctl/v4l2-ctl.cpp +++ b/utils/v4l2-ctl/v4l2-ctl.cpp @@ -347,7 +347,7 @@ static bool is_rgb_or_hsv(__u32 pixelformat) case V4L2_PIX_FMT_YUV410: case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_HI240: - case V4L2_PIX_FMT_HM12: + case V4L2_PIX_FMT_NV12_16L16: case V4L2_PIX_FMT_M420: case V4L2_PIX_FMT_NV12: case V4L2_PIX_FMT_NV21: @@ -663,7 +663,7 @@ void print_video_formats_ext(cv4l_fd &fd, __u32 type, unsigned int mbus_code) int parse_subopt(char **subs, const char * const *subopts, char **value) { - int opt = getsubopt(subs, const_cast<char * const *>(subopts), value); + int opt = v4l_getsubopt(subs, const_cast<char * const *>(subopts), value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h index 24eee3d7..39161466 100644 --- a/utils/v4l2-ctl/v4l2-ctl.h +++ b/utils/v4l2-ctl/v4l2-ctl.h @@ -9,6 +9,7 @@ #include <linux/videodev2.h> #include <linux/v4l2-subdev.h> +#include <v4l-getsubopt.h> #include <v4l2-info.h> diff --git a/utils/v4l2-dbg/v4l2-dbg.cpp b/utils/v4l2-dbg/v4l2-dbg.cpp index d711c9e4..98064fa2 100644 --- a/utils/v4l2-dbg/v4l2-dbg.cpp +++ b/utils/v4l2-dbg/v4l2-dbg.cpp @@ -38,6 +38,7 @@ #endif #include <linux/videodev2.h> +#include <v4l-getsubopt.h> #include "v4l2-dbg-bttv.h" #include "v4l2-dbg-saa7134.h" @@ -364,7 +365,7 @@ static int doioctl(int fd, unsigned long int request, void *parm, const char *na static int parse_subopt(char **subs, const char * const *subopts, char **value) { - int opt = getsubopt(subs, const_cast<char * const *>(subopts), value); + int opt = v4l_getsubopt(subs, const_cast<char * const *>(subopts), value); if (opt == -1) { fprintf(stderr, "Invalid suboptions specified\n"); |