[FFmpeg-devel] [PATCH 4/4] ffserver_config: postpone codec context creation

Lukasz Marek lukasz.m.luki2 at gmail.com
Sat Oct 25 19:53:44 CEST 2014


On 24.10.2014 00:18, Reynaldo H. Verdejo Pinochet wrote:
> Hi Lukasz
>> +static int ffserver_apply_stream_config(AVCodecContext *enc, const AVDictionary *conf, AVDictionary **opts)
>> +{
>> +    static const char *error_message = "Cannot parse '%s' as number for %s parameter.\n";
>> +    AVDictionaryEntry *e;
>> +    char *tailp;
>> +    int ret = 0;
>> +
>> +#define SET_INT_PARAM(factor, param, key)                   \
>> +    if ((e = av_dict_get(conf, #key, NULL, 0))) {           \
>> +        if (!e->value[0]) {                                 \
>> +            av_log(NULL, AV_LOG_ERROR, error_message, e->value, #key); \
>> +            ret = AVERROR(EINVAL);                          \
>> +        }                                                   \
>> +        enc->param = strtol(e->value, &tailp, 0);           \
>> +        if (factor) enc->param *= (factor);                 \
>> +        if (tailp[0] || errno) {                            \
>> +            av_log(NULL, AV_LOG_ERROR, error_message, e->value, #key); \
>> +            ret = AVERROR(errno);                           \
>> +        }                                                   \
>> +    }
>> +#define SET_DOUBLE_PARAM(factor, param, key)                \
>> +    if ((e = av_dict_get(conf, #key, NULL, 0))) {           \
>> +        if (!e->value[0]) {                                 \
>> +            av_log(NULL, AV_LOG_ERROR, error_message, e->value, #key); \
>> +            ret = AVERROR(EINVAL);                          \
>> +        }                                                   \
>> +        enc->param = strtod(e->value, &tailp);              \
>> +        if (factor) enc->param *= (factor);                 \
>> +        if (tailp[0] || errno) {                            \
>> +            av_log(NULL, AV_LOG_ERROR, error_message, e->value, #key); \
>> +            ret = AVERROR(errno);                           \
>> +        }                                                   \
>> +    }
>
> Can you turn those two macros into static inline funcs?. Also,
> looks like it shouldn't be too hard to factor those two into
> just 1 func. This is mostly to aid debugging. Nothing vital.

I changed macros to functions. I think inline is not required in such 
code. Small comment, there is plenty of atoi in parsing code.
It returns 0 in case parsed string is not a number and ignores random 
suffixed. Probably more problems can be pointed here. I prepared these 
functions to replace all atoi with them.

Since these functions allows to check ranges, I split back all options 
to separate if's, so every option can have its own range.

>> [..]
>> @@ -624,136 +712,104 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
>>           stream->max_time = atof(arg) * 1000;
>>       } else if (!av_strcasecmp(cmd, "AudioBitRate")) {
>>           ffserver_get_arg(arg, sizeof(arg), p);
>> -        config->audio_enc.bit_rate = lrintf(atof(arg) * 1000);
>> -    } else if (!av_strcasecmp(cmd, "AudioChannels")) {
>> +        av_dict_set_int(&config->audio_conf, cmd, lrintf(atof(arg) * 1000), 0);
>> +    } else if (!av_strcasecmp(cmd, "AudioChannels") ||
>> +               !av_strcasecmp(cmd, "AudioSampleRate")) {
>>           ffserver_get_arg(arg, sizeof(arg), p);
>> -        config->audio_enc.channels = atoi(arg);
>> -    } else if (!av_strcasecmp(cmd, "AudioSampleRate")) {
>> -        ffserver_get_arg(arg, sizeof(arg), p);
>> -        config->audio_enc.sample_rate = atoi(arg);
>> +        av_dict_set(&config->audio_conf, cmd, arg, 0);
>
> Here and on every occurrence:
>
> Any particular reason why not to check av_dict_set*()'s return
> for < 0? Only reason I ask is because the config code already
> has failed allocation checks elsewhere. Also, should help avoiding
> some coverity scan noise.

I forgot about that. Checks added.


>> [..]
>> -
>> +    AVDictionary *video_opts;     /* Contains AVOptions for video encoder */
>> +    AVDictionary *video_conf;     /* Contains values stored in video AVCodecContext.fields */
>> +    AVDictionary *audio_opts;     /* Contains AVOptions for audio encoder */
>> +    AVDictionary *audio_conf;     /* Contains values stored in audio AVCodecContext.fields */
>
> Would drop the repeated "Contains".

Dropped.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-ffserver_config-postpone-codec-context-creation.patch
Type: text/x-patch
Size: 29026 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141025/5323a891/attachment.bin>


More information about the ffmpeg-devel mailing list