lavfi: add internal functions for parsing format arguments

Signed-off-by: Stefano Sabatini <stefano.sabatini-lala@poste.it>
This commit is contained in:
Mina Nagy Zaki 2011-08-04 12:28:14 +03:00 committed by Stefano Sabatini
parent 3560089e12
commit 3f07d40ea2
2 changed files with 101 additions and 0 deletions

View File

@ -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;
}

View File

@ -61,4 +61,46 @@ void ff_avfilter_default_free_buffer(AVFilterBuffer *buf);
/** Tell is a format is contained in the provided list terminated by -1. */
int ff_fmt_is_in(int fmt, const int *fmts);
/* Functions to parse audio format arguments */
/**
* Parse a sample rate.
*
* @param ret unsigned integer pointer to where the value should be written
* @param arg string to parse
* @param log_ctx log context
* @return 0 in case of success, a negative AVERROR code on error
*/
int ff_parse_sample_rate(unsigned *ret, const char *arg, void *log_ctx);
/**
* Parse a sample format name or a corresponding integer representation.
*
* @param ret integer pointer to where the value should be written
* @param arg string to parse
* @param log_ctx log context
* @return 0 in case of success, a negative AVERROR code on error
*/
int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx);
/**
* Parse a channel layout or a corresponding integer representation.
*
* @param ret 64bit integer pointer to where the value should be written.
* @param arg string to parse
* @param log_ctx log context
* @return 0 in case of success, a negative AVERROR code on error
*/
int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx);
/**
* Parse a packing format or a corresponding integer representation.
*
* @param ret integer pointer to where the value should be written
* @param arg string to parse
* @param log_ctx log context
* @return 0 in case of success, a negative AVERROR code on error
*/
int ff_parse_packing_format(int *ret, const char *arg, void *log_ctx);
#endif /* AVFILTER_INTERNAL_H */