[FFmpeg-devel] [PATCH] libavcodec/libx264.c: distinguish between x264 parameter errors

Erik Slagter erik at slagter.name
Wed Jun 22 20:35:37 CEST 2011


> 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).

Yeah, I know. And that's only one case. I am now focussing on getting
interlacing actually working with libx264, which means not only tff/bff
needs to be set, but also nal-hrd needs to be enabled and of course
_working_ from ffmpeg (currently not: "VBV parameters cannot be changed
when NAL HRD is in use")

>> 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 ?

Personally I don't mind having a few lines of code extra if it means
the purpose of the code is clear at a glance. But I assume the ffmpeg
devels try to squeeze out as much lines as possible ;-)

>>     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.

The reason I separated this code out is that I thought a "null" value (at the
actual option parsing, not the default settings) would signify an absent
value (which is perfectly legal for some options). I now see that an empty
string is used for that. This means indeed room for optimisation.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5110 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20110622/8ecf9dd1/attachment.p7s>


More information about the ffmpeg-devel mailing list