[FFmpeg-devel] [PATCH] libavcodec/libx264.c: distinguish between x264 parameter errors
Etienne Buira
etienne.buira.lists at free.fr
Wed Jun 22 20:26:15 CEST 2011
On Wed, Jun 22, 2011 at 08:10:47PM +0200, Erik Slagter wrote:
> Hi all,
Hi
> The current code in libx264.c (#define OPT_STR) does
> not distinguish between two types of errors returned
> by libx264: parameter not existing or parameter's value bad.
>
> This ommitment has given me some headaches, because I
> didn't understand why my "profile=high" was "bad". After
> all it appeared that "profile" isn't a valid "x264opt" at
> all and needs to specified on the command line on it's own.
>
> To save others this frustration, I'd like to have this
> trivial patch in, it makes ffmpeg throw different error
> messages for both errors. I had to change the #define into
> a proper function, but imho that's only for the better.
libx264 option passing is currently weird, you can look at a thread
that last from a few weeks ([RFC] Specifying KEYINT (-g) has no effect
in libx264).
> This is against current git.
>
> diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
> index cc5b983..2959ba1 100644
> --- a/libavcodec/libx264.c
> +++ b/libavcodec/libx264.c
> @@ -198,14 +198,36 @@ static void check_default_settings(AVCodecContext *avctx)
> }
> }
>
> -#define OPT_STR(opt, param) \
> - do { \
> - if (param && x264_param_parse(&x4->params, opt, param) < 0) { \
> - av_log(avctx, AV_LOG_ERROR, \
> - "bad value for '%s': '%s'\n", opt, param); \
> - return -1; \
> - } \
> - } while (0); \
> +static int opt_str(AVCodecContext *avctx, X264Context *x4, const char *opt, const char *param)
> +{
> + switch(x264_param_parse(&x4->params, opt, param))
> + {
> + case(0):
> + {
> + break;
> + }
> +
> + case(X264_PARAM_BAD_NAME):
> + {
> + av_log(avctx, AV_LOG_ERROR, "no such option: \"%s\"\n", opt);
> + return(0);
> + }
> +
> + case(X264_PARAM_BAD_VALUE):
> + {
> + av_log(avctx, AV_LOG_ERROR, "bad value: \"%s\" for option \"%s\"\n", param, opt);
> + return(0);
> + }
> +
> + default:
> + {
> + av_log(avctx, AV_LOG_ERROR, "unknown parameter error, option: \"%s\", value: \"%s\"\n", param, opt);
> + return(0);
> + }
> + }
> +
> + return(1);
> +}
Why not a function which returns the x264_param_parse return value,
with an helper macro OPT_STR that will take care of returning -1 ?
> static av_cold int X264_init(AVCodecContext *avctx)
> {
> @@ -308,7 +330,8 @@ static av_cold int X264_init(AVCodecContext *avctx)
> x4->params.p_log_private = avctx;
> x4->params.i_log_level = X264_LOG_DEBUG;
>
> - OPT_STR("weightp", x4->weightp);
> + if(!opt_str(avctx, x4, "weightp", x4->weightp ? x4->weightp : "0"))
> + return(-1);
The x4->weightp ? x4->weightp : "0" construct avoids the benefits of
OPT_STR, which is to overwrite the value only if it has really been
specified in the options.
More information about the ffmpeg-devel
mailing list