diff options
author | Mina Nagy Zaki <mnzaki@gmail.com> | 2011-08-04 12:28:14 +0300 |
---|---|---|
committer | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2011-08-14 10:31:09 +0200 |
commit | 3f07d40ea2861e0c2a1ce6cb56907e9e888a3491 (patch) | |
tree | 1a9e75ec6153c34fea3800a4c6681931162e2995 /libavfilter/formats.c | |
parent | 3560089e1204441f27b43825aaa34e3dfc47dd10 (diff) | |
download | ffmpeg-3f07d40ea2861e0c2a1ce6cb56907e9e888a3491.tar.gz |
lavfi: add internal functions for parsing format arguments
Signed-off-by: Stefano Sabatini <stefano.sabatini-lala@poste.it>
Diffstat (limited to 'libavfilter/formats.c')
-rw-r--r-- | libavfilter/formats.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 214718b779..d121b3b4bf 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/eval.h" #include "libavutil/pixdesc.h" #include "libavutil/audioconvert.h" #include "avfilter.h" @@ -233,3 +234,61 @@ void avfilter_formats_changeref(AVFilterFormats **oldref, } } +/* internal functions for parsing audio format arguments */ + +int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx) +{ + char *tail; + int sfmt = av_get_sample_fmt(arg); + if (sfmt == AV_SAMPLE_FMT_NONE) { + sfmt = strtol(arg, &tail, 0); + if (*tail || (unsigned)sfmt >= AV_SAMPLE_FMT_NB) { + av_log(log_ctx, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg); + return AVERROR(EINVAL); + } + } + *ret = sfmt; + return 0; +} + +int ff_parse_sample_rate(unsigned *ret, const char *arg, void *log_ctx) +{ + char *tail; + double srate = av_strtod(arg, &tail); + if (*tail || srate < 1 || (int)srate != srate) { + av_log(log_ctx, AV_LOG_ERROR, "Invalid sample rate '%s'\n", arg); + return AVERROR(EINVAL); + } + *ret = srate; + return 0; +} + +int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx) +{ + char *tail; + int64_t chlayout = av_get_channel_layout(arg); + if (chlayout == 0) { + chlayout = strtol(arg, &tail, 10); + if (*tail || chlayout == 0) { + av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n", arg); + return AVERROR(EINVAL); + } + } + *ret = chlayout; + return 0; +} + +int ff_parse_packing_format(int *ret, const char *arg, void *log_ctx) +{ + char *tail; + int planar = strtol(arg, &tail, 10); + if (*tail) { + planar = (strcmp(arg, "packed") != 0); + } else if (planar != 0 && planar != 1) { + av_log(log_ctx, AV_LOG_ERROR, "Invalid packing format '%s'\n", arg); + return AVERROR(EINVAL); + } + *ret = planar; + return 0; +} + |