| @@ -37,6 +37,7 @@ · 36 unmodified lines |
| 37 | #include "pixdesc.h" | 37 | #include "pixdesc.h" |
| 38 | #include "mathematics.h" | 38 | #include "mathematics.h" |
| 39 | #include "samplefmt.h" | 39 | #include "samplefmt.h" |
| | 40 | #include "bprint.h" |
| 40 | | 41 | |
| 41 | #include <float.h> | 42 | #include <float.h> |
| 42 | | 43 | |
| @@ -1835,6 +1836,44 @@ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_fla · 1792 unmodified lines |
| 1835 | return av_opt_is_set_to_default(target, o); | 1836 | return av_opt_is_set_to_default(target, o); |
| 1836 | } | 1837 | } |
| 1837 | | 1838 | |
| | 1839 | int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, |
| | 1840 | const char key_val_sep, const char pairs_sep) |
| | 1841 | { |
| | 1842 | const AVOption *o = NULL; |
| | 1843 | uint8_t *buf; |
| | 1844 | AVBPrint bprint; |
| | 1845 | int ret, cnt = 0; |
| | 1846 | |
| | 1847 | if (!obj || !buffer) |
| | 1848 | return AVERROR(EINVAL); |
| | 1849 | |
| | 1850 | *buffer = NULL; |
| | 1851 | av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED); |
| | 1852 | |
| | 1853 | while (o = av_opt_next(obj, o)) { |
| | 1854 | if (o->type == AV_OPT_TYPE_CONST) |
| | 1855 | continue; |
| | 1856 | if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != opt_flags) |
| | 1857 | continue; |
| | 1858 | else if (((o->flags & opt_flags) != opt_flags)) |
| | 1859 | continue; |
| | 1860 | if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0) |
| | 1861 | continue; |
| | 1862 | if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) { |
| | 1863 | av_bprint_finalize(&bprint, NULL); |
| | 1864 | return ret; |
| | 1865 | } |
| | 1866 | if (buf) { |
| | 1867 | if (cnt++) |
| | 1868 | av_bprint_append_data(&bprint, &pairs_sep, 1); |
| | 1869 | av_bprintf(&bprint, "%s%c%s", o->name, key_val_sep, buf); |
| | 1870 | av_freep(&buf); |
| | 1871 | } |
| | 1872 | } |
| | 1873 | av_bprint_finalize(&bprint, buffer); |
| | 1874 | return 0; |
| | 1875 | } |
| | 1876 | |
| 1838 | #ifdef TEST | 1877 | #ifdef TEST |
| 1839 | | 1878 | |
| 1840 | typedef struct TestContext | 1879 | typedef struct TestContext |
| @@ -1854,6 +1893,10 @@ typedef struct TestContext · 13 unmodified lines |
| 1854 | int64_t channel_layout; | 1893 | int64_t channel_layout; |
| 1855 | void *binary; | 1894 | void *binary; |
| 1856 | int binary_size; | 1895 | int binary_size; |
| | 1896 | void *binary1; |
| | 1897 | int binary_size1; |
| | 1898 | void *binary2; |
| | 1899 | int binary_size2; |
| 1857 | int64_t num64; | 1900 | int64_t num64; |
| 1858 | float flt; | 1901 | float flt; |
| 1859 | double dbl; | 1902 | double dbl; |
| @@ -1882,6 +1925,8 @@ static const AVOption test_options[]= { · 22 unmodified lines |
| 1882 | {"color", "set color", OFFSET(color), AV_OPT_TYPE_COLOR, {.str = "pink"}, 0, 0}, | 1925 | {"color", "set color", OFFSET(color), AV_OPT_TYPE_COLOR, {.str = "pink"}, 0, 0}, |
| 1883 | {"cl", "set channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64 = AV_CH_LAYOUT_HEXAGONAL}, 0, INT64_MAX}, | 1926 | {"cl", "set channel layout", OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64 = AV_CH_LAYOUT_HEXAGONAL}, 0, INT64_MAX}, |
| 1884 | {"bin", "set binary value", OFFSET(binary), AV_OPT_TYPE_BINARY, {.str="62696e00"}, 0, 0 }, | 1927 | {"bin", "set binary value", OFFSET(binary), AV_OPT_TYPE_BINARY, {.str="62696e00"}, 0, 0 }, |
| | 1928 | {"bin1", "set binary value", OFFSET(binary1), AV_OPT_TYPE_BINARY, {.str=NULL}, 0, 0 }, |
| | 1929 | {"bin2", "set binary value", OFFSET(binary2), AV_OPT_TYPE_BINARY, {.str=""}, 0, 0 }, |
| 1885 | {"num64", "set num 64bit", OFFSET(num64), AV_OPT_TYPE_INT64, {.i64 = 1}, 0, 100 }, | 1930 | {"num64", "set num 64bit", OFFSET(num64), AV_OPT_TYPE_INT64, {.i64 = 1}, 0, 100 }, |
| 1886 | {"flt", "set float", OFFSET(flt), AV_OPT_TYPE_FLOAT, {.dbl = 1.0/3}, 0, 100 }, | 1931 | {"flt", "set float", OFFSET(flt), AV_OPT_TYPE_FLOAT, {.dbl = 1.0/3}, 0, 100 }, |
| 1887 | {"dbl", "set double", OFFSET(dbl), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0/3}, 0, 100 }, | 1932 | {"dbl", "set double", OFFSET(dbl), AV_OPT_TYPE_DOUBLE, {.dbl = 1.0/3}, 0, 100 }, |
| @@ -1951,6 +1996,30 @@ int main(void) · 63 unmodified lines |
| 1951 | av_opt_free(&test_ctx); | 1996 | av_opt_free(&test_ctx); |
| 1952 | } | 1997 | } |
| 1953 | | 1998 | |
| | 1999 | printf("\nTest av_opt_serialize()\n"); |
| | 2000 | { |
| | 2001 | TestContext test_ctx = { 0 }; |
| | 2002 | char *buf; |
| | 2003 | test_ctx.class = &test_class; |
| | 2004 | |
| | 2005 | av_log_set_level(AV_LOG_QUIET); |
| | 2006 | |
| | 2007 | av_opt_set_defaults(&test_ctx); |
| | 2008 | if (av_opt_serialize(&test_ctx, 0, 0, &buf, '=', ',') >= 0) { |
| | 2009 | printf("%s\n", buf); |
| | 2010 | av_opt_free(&test_ctx); |
| | 2011 | memset(&test_ctx, 0, sizeof(test_ctx)); |
| | 2012 | test_ctx.class = &test_class; |
| | 2013 | av_set_options_string(&test_ctx, buf, "=", ","); |
| | 2014 | av_free(buf); |
| | 2015 | if (av_opt_serialize(&test_ctx, 0, 0, &buf, '=', ',') >= 0) { |
| | 2016 | printf("%s\n", buf); |
| | 2017 | av_free(buf); |
| | 2018 | } |
| | 2019 | } |
| | 2020 | av_opt_free(&test_ctx); |
| | 2021 | } |
| | 2022 | |
| 1954 | printf("\nTesting av_set_options_string()\n"); | 2023 | printf("\nTesting av_set_options_string()\n"); |
| 1955 | { | 2024 | { |
| 1956 | TestContext test_ctx = { 0 }; | 2025 | TestContext test_ctx = { 0 }; |