static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd, const char **p,

                                        int line_num, FFServerStream **pstream)

{

    char arg[1024], arg2[1024];

    FFServerStream *stream;

    int val;



    av_assert0(pstream);

    stream = *pstream;



    if (!av_strcasecmp(cmd, "<Stream")) {

        char *q;

        FFServerStream *s;

        stream = av_mallocz(sizeof(FFServerStream));

        if (!stream)

            return AVERROR(ENOMEM);

        ffserver_get_arg(stream->filename, sizeof(stream->filename), p);

        q = strrchr(stream->filename, '>');

        if (q)

            *q = '\0';



        for (s = config->first_stream; s; s = s->next) {

            if (!strcmp(stream->filename, s->filename))

                ERROR("Stream '%s' already registered\n", s->filename);

        }



        stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL);

        if (stream->fmt) {

            config->audio_id = stream->fmt->audio_codec;

            config->video_id = stream->fmt->video_codec;

        } else {

            config->audio_id = AV_CODEC_ID_NONE;

            config->video_id = AV_CODEC_ID_NONE;

        }

        *pstream = stream;

        return 0;

    }

    av_assert0(stream);

    if (!av_strcasecmp(cmd, "Feed")) {

        FFServerStream *sfeed;

        ffserver_get_arg(arg, sizeof(arg), p);

        sfeed = config->first_feed;

        while (sfeed) {

            if (!strcmp(sfeed->filename, arg))

                break;

            sfeed = sfeed->next_feed;

        }

        if (!sfeed)

            ERROR("Feed with name '%s' for stream '%s' is not defined\n", arg, stream->filename);

        else

            stream->feed = sfeed;

    } else if (!av_strcasecmp(cmd, "Format")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (!strcmp(arg, "status")) {

            stream->stream_type = STREAM_TYPE_STATUS;

            stream->fmt = NULL;

        } else {

            stream->stream_type = STREAM_TYPE_LIVE;

            /* JPEG cannot be used here, so use single frame MJPEG */

            if (!strcmp(arg, "jpeg"))

                strcpy(arg, "mjpeg");

            stream->fmt = ffserver_guess_format(arg, NULL, NULL);

            if (!stream->fmt)

                ERROR("Unknown Format: %s\n", arg);

        }

        if (stream->fmt) {

            config->audio_id = stream->fmt->audio_codec;

            config->video_id = stream->fmt->video_codec;

        }

    } else if (!av_strcasecmp(cmd, "InputFormat")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->ifmt = av_find_input_format(arg);

        if (!stream->ifmt)

            ERROR("Unknown input format: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "FaviconURL")) {

        if (stream->stream_type == STREAM_TYPE_STATUS)

            ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), p);

        else

            ERROR("FaviconURL only permitted for status streams\n");

    } else if (!av_strcasecmp(cmd, "Author")    ||

               !av_strcasecmp(cmd, "Comment")   ||

               !av_strcasecmp(cmd, "Copyright") ||

               !av_strcasecmp(cmd, "Title")) {

        char key[32];

        int i;

        ffserver_get_arg(arg, sizeof(arg), p);

        for (i = 0; i < strlen(cmd); i++)

            key[i] = av_tolower(cmd[i]);

        key[i] = 0;

        WARNING("'%s' option in configuration file is deprecated, "

                "use 'Metadata %s VALUE' instead\n", cmd, key);

        if (av_dict_set(&stream->metadata, key, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Metadata")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_get_arg(arg2, sizeof(arg2), p);

        if (av_dict_set(&stream->metadata, arg, arg2, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Preroll")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->prebuffer = atof(arg) * 1000;

    } else if (!av_strcasecmp(cmd, "StartSendOnKey")) {

        stream->send_on_key = 1;

    } else if (!av_strcasecmp(cmd, "AudioCodec")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        config->audio_id = opt_codec(arg, AVMEDIA_TYPE_AUDIO);

        if (config->audio_id == AV_CODEC_ID_NONE)

            ERROR("Unknown AudioCodec: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "VideoCodec")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        config->video_id = opt_codec(arg, AVMEDIA_TYPE_VIDEO);

        if (config->video_id == AV_CODEC_ID_NONE)

            ERROR("Unknown VideoCodec: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "MaxTime")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->max_time = atof(arg) * 1000;

    } else if (!av_strcasecmp(cmd, "AudioBitRate")) {

        float f;

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(&f, arg, 1000, 0, FLT_MAX, config, line_num, "Invalid %s: %s\n", cmd, arg);

        if (av_dict_set_int(&config->audio_conf, cmd, lrintf(f), 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AudioChannels")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 8, config, line_num, "Invalid %s: %s, valid range is 1-8.", cmd, arg);

        if (av_dict_set(&config->audio_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AudioSampleRate")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->audio_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRateRange")) {

        int minrate, maxrate;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (sscanf(arg, "%d-%d", &minrate, &maxrate) == 2) {

            if (av_dict_set_int(&config->video_conf, "VideoBitRateRangeMin", minrate, 0) < 0 ||

                av_dict_set_int(&config->video_conf, "VideoBitRateRangeMax", maxrate, 0) < 0)

                goto nomem;

        } else

            ERROR("Incorrect format for VideoBitRateRange -- should be <min>-<max>: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "Debug")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Strict")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBufferSize")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 8*1024, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRateTolerance")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 1000, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRate")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 1000, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

           goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoSize")) {

        int ret, w, h;

        ffserver_get_arg(arg, sizeof(arg), p);

        ret = av_parse_video_size(&w, &h, arg);

        if (ret < 0)

            ERROR("Invalid video size '%s'\n", arg);

        else if ((w % 16) || (h % 16))

            ERROR("Image size must be a multiple of 16\n");

        if (av_dict_set_int(&config->video_conf, "VideoSizeWidth", w, 0) < 0 ||

            av_dict_set_int(&config->video_conf, "VideoSizeHeight", h, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoFrameRate")) {

        AVRational frame_rate;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (av_parse_video_rate(&frame_rate, arg) < 0) {

            ERROR("Incorrect frame rate: %s\n", arg);

        } else {

            if (av_dict_set_int(&config->video_conf, "VideoFrameRateNum", frame_rate.num, 0) < 0 ||

                av_dict_set_int(&config->video_conf, "VideoFrameRateDen", frame_rate.den, 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(cmd, "PixelFormat")) {

        enum AVPixelFormat pix_fmt;

        ffserver_get_arg(arg, sizeof(arg), p);

        pix_fmt = av_get_pix_fmt(arg);

        if (pix_fmt == AV_PIX_FMT_NONE)

            ERROR("Unknown pixel format: %s\n", arg);

        if (av_dict_set_int(&config->video_conf, cmd, pix_fmt, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoGopSize")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoIntraOnly")) {

        if (av_dict_set(&config->video_conf, cmd, "1", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoHighQuality")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Video4MotionVector")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AVOptionVideo") ||

               !av_strcasecmp(cmd, "AVOptionAudio")) {

        AVDictionary **dict;

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_get_arg(arg2, sizeof(arg2), p);

        if (!av_strcasecmp(cmd, "AVOptionVideo"))

            dict = &config->video_opts;

        else

            dict = &config->audio_opts;

        if (av_dict_set(dict, arg, arg2, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AVPresetVideo") ||

               !av_strcasecmp(cmd, "AVPresetAudio")) {

        char **preset = NULL;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (!av_strcasecmp(cmd, "AVPresetVideo")) {

            preset = &config->video_preset;

            ffserver_opt_preset(arg, NULL, 0, NULL, &config->video_id);

        } else {

            preset = &config->audio_preset;

            ffserver_opt_preset(arg, NULL, 0, &config->audio_id, NULL);

        }

        *preset = av_strdup(arg);

        if (!preset)

            return AVERROR(ENOMEM);

    } else if (!av_strcasecmp(cmd, "VideoTag")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (strlen(arg) == 4) {

            if (av_dict_set(&config->video_conf, "VideoTag", "arg", 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(cmd, "BitExact")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "DctFastint")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "IdctSimple")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Qscale")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQDiff")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQMax")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQMin")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "LumiMask")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(NULL, arg, 0, -FLT_MAX, FLT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "DarkMask")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(NULL, arg, 0, -FLT_MAX, FLT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "NoVideo")) {

        config->video_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(cmd, "NoAudio")) {

        config->audio_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(cmd, "ACL")) {

        ffserver_parse_acl_row(stream, NULL, NULL, *p, config->filename, line_num);

    } else if (!av_strcasecmp(cmd, "DynamicACL")) {

        ffserver_get_arg(stream->dynamic_acl, sizeof(stream->dynamic_acl), p);

    } else if (!av_strcasecmp(cmd, "RTSPOption")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        av_freep(&stream->rtsp_option);

        stream->rtsp_option = av_strdup(arg);

    } else if (!av_strcasecmp(cmd, "MulticastAddress")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (resolve_host(&stream->multicast_ip, arg) != 0)

            ERROR("Invalid host/IP address: %s\n", arg);

        stream->is_multicast = 1;

        stream->loop = 1; /* default is looping */

    } else if (!av_strcasecmp(cmd, "MulticastPort")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid MulticastPort: %s\n", arg);

        stream->multicast_port = val;

    } else if (!av_strcasecmp(cmd, "MulticastTTL")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(&val, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid MulticastTTL: %s\n", arg);

        stream->multicast_ttl = val;

    } else if (!av_strcasecmp(cmd, "NoLoop")) {

        stream->loop = 0;

    } else if (!av_strcasecmp(cmd, "</Stream>")) {

        if (stream->feed && stream->fmt && strcmp(stream->fmt->name, "ffm") != 0) {

            if (config->audio_id != AV_CODEC_ID_NONE) {

                AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(config->audio_id));

                if (config->audio_preset &&

                    ffserver_opt_preset(arg, audio_enc, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply preset '%s'\n", arg);

                if (ffserver_apply_stream_config(audio_enc, config->audio_conf, &config->audio_opts) < 0)

                    config->errors++;

                add_codec(stream, audio_enc);

            }

            if (config->video_id != AV_CODEC_ID_NONE) {

                AVCodecContext *video_enc = avcodec_alloc_context3(avcodec_find_encoder(config->video_id));

                if (config->video_preset &&

                    ffserver_opt_preset(arg, video_enc, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply preset '%s'\n", arg);

                if (ffserver_apply_stream_config(video_enc, config->video_conf, &config->video_opts) < 0)

                    config->errors++;

                add_codec(stream, video_enc);

            }

        }

        av_dict_free(&config->video_opts);

        av_dict_free(&config->video_conf);

        av_dict_free(&config->audio_opts);

        av_dict_free(&config->audio_conf);

        av_freep(&config->video_preset);

        av_freep(&config->audio_preset);

        *pstream = NULL;

    } else if (!av_strcasecmp(cmd, "File") || !av_strcasecmp(cmd, "ReadOnlyFile")) {

        ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), p);

    } else {

        ERROR("Invalid entry '%s' inside <Stream></Stream>\n", cmd);

    }

    return 0;

  nomem:

    av_log(NULL, AV_LOG_ERROR, "Out of memory. Aborting.\n");

    av_dict_free(&config->video_opts);

    av_dict_free(&config->video_conf);

    av_dict_free(&config->audio_opts);

    av_dict_free(&config->audio_conf);

    av_freep(&config->video_preset);

    av_freep(&config->audio_preset);

    return AVERROR(ENOMEM);

}

static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd, const char **p,

                                        int line_num, FFServerStream **pstream)

{

    char arg[1024], arg2[1024];

    FFServerStream *stream;

    int val;



    av_assert0(pstream);

    stream = *pstream;



    if (!av_strcasecmp(cmd, "<Stream")) {

        char *q;

        FFServerStream *s;

        stream = av_mallocz(sizeof(FFServerStream));

        if (!stream)

            return AVERROR(ENOMEM);

        ffserver_get_arg(stream->filename, sizeof(stream->filename), p);

        q = strrchr(stream->filename, '>');

        if (q)

            *q = '\0';



        for (s = config->first_stream; s; s = s->next) {

            if (!strcmp(stream->filename, s->filename))

                ERROR("Stream '%s' already registered\n", s->filename);

        }



        stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL);

        if (stream->fmt) {

            config->audio_id = stream->fmt->audio_codec;

            config->video_id = stream->fmt->video_codec;

        } else {

            config->audio_id = AV_CODEC_ID_NONE;

            config->video_id = AV_CODEC_ID_NONE;

        }

        *pstream = stream;

        return 0;

    }

    av_assert0(stream);

    if (!av_strcasecmp(cmd, "Feed")) {

        FFServerStream *sfeed;

        ffserver_get_arg(arg, sizeof(arg), p);

        sfeed = config->first_feed;

        while (sfeed) {

            if (!strcmp(sfeed->filename, arg))

                break;

            sfeed = sfeed->next_feed;

        }

        if (!sfeed)

            ERROR("Feed with name '%s' for stream '%s' is not defined\n", arg, stream->filename);

        else

            stream->feed = sfeed;

    } else if (!av_strcasecmp(cmd, "Format")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (!strcmp(arg, "status")) {

            stream->stream_type = STREAM_TYPE_STATUS;

            stream->fmt = NULL;

        } else {

            stream->stream_type = STREAM_TYPE_LIVE;

            

            if (!strcmp(arg, "jpeg"))

                strcpy(arg, "mjpeg");

            stream->fmt = ffserver_guess_format(arg, NULL, NULL);

            if (!stream->fmt)

                ERROR("Unknown Format: %s\n", arg);

        }

        if (stream->fmt) {

            config->audio_id = stream->fmt->audio_codec;

            config->video_id = stream->fmt->video_codec;

        }

    } else if (!av_strcasecmp(cmd, "InputFormat")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->ifmt = av_find_input_format(arg);

        if (!stream->ifmt)

            ERROR("Unknown input format: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "FaviconURL")) {

        if (stream->stream_type == STREAM_TYPE_STATUS)

            ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), p);

        else

            ERROR("FaviconURL only permitted for status streams\n");

    } else if (!av_strcasecmp(cmd, "Author")    ||

               !av_strcasecmp(cmd, "Comment")   ||

               !av_strcasecmp(cmd, "Copyright") ||

               !av_strcasecmp(cmd, "Title")) {

        char key[32];

        int i;

        ffserver_get_arg(arg, sizeof(arg), p);

        for (i = 0; i < strlen(cmd); i++)

            key[i] = av_tolower(cmd[i]);

        key[i] = 0;

        WARNING("'%s' option in configuration file is deprecated, "

                "use 'Metadata %s VALUE' instead\n", cmd, key);

        if (av_dict_set(&stream->metadata, key, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Metadata")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_get_arg(arg2, sizeof(arg2), p);

        if (av_dict_set(&stream->metadata, arg, arg2, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Preroll")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->prebuffer = atof(arg) * 1000;

    } else if (!av_strcasecmp(cmd, "StartSendOnKey")) {

        stream->send_on_key = 1;

    } else if (!av_strcasecmp(cmd, "AudioCodec")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        config->audio_id = opt_codec(arg, AVMEDIA_TYPE_AUDIO);

        if (config->audio_id == AV_CODEC_ID_NONE)

            ERROR("Unknown AudioCodec: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "VideoCodec")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        config->video_id = opt_codec(arg, AVMEDIA_TYPE_VIDEO);

        if (config->video_id == AV_CODEC_ID_NONE)

            ERROR("Unknown VideoCodec: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "MaxTime")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        stream->max_time = atof(arg) * 1000;

    } else if (!av_strcasecmp(cmd, "AudioBitRate")) {

        float f;

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(&f, arg, 1000, 0, FLT_MAX, config, line_num, "Invalid %s: %s\n", cmd, arg);

        if (av_dict_set_int(&config->audio_conf, cmd, lrintf(f), 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AudioChannels")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 8, config, line_num, "Invalid %s: %s, valid range is 1-8.", cmd, arg);

        if (av_dict_set(&config->audio_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AudioSampleRate")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->audio_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRateRange")) {

        int minrate, maxrate;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (sscanf(arg, "%d-%d", &minrate, &maxrate) == 2) {

            if (av_dict_set_int(&config->video_conf, "VideoBitRateRangeMin", minrate, 0) < 0 ||

                av_dict_set_int(&config->video_conf, "VideoBitRateRangeMax", maxrate, 0) < 0)

                goto nomem;

        } else

            ERROR("Incorrect format for VideoBitRateRange -- should be <min>-<max>: %s\n", arg);

    } else if (!av_strcasecmp(cmd, "Debug")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Strict")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBufferSize")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 8*1024, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRateTolerance")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 1000, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoBitRate")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 1000, 0, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

           goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoSize")) {

        int ret, w, h;

        ffserver_get_arg(arg, sizeof(arg), p);

        ret = av_parse_video_size(&w, &h, arg);

        if (ret < 0)

            ERROR("Invalid video size '%s'\n", arg);

        else if ((w % 16) || (h % 16))

            ERROR("Image size must be a multiple of 16\n");

        if (av_dict_set_int(&config->video_conf, "VideoSizeWidth", w, 0) < 0 ||

            av_dict_set_int(&config->video_conf, "VideoSizeHeight", h, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoFrameRate")) {

        AVRational frame_rate;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (av_parse_video_rate(&frame_rate, arg) < 0) {

            ERROR("Incorrect frame rate: %s\n", arg);

        } else {

            if (av_dict_set_int(&config->video_conf, "VideoFrameRateNum", frame_rate.num, 0) < 0 ||

                av_dict_set_int(&config->video_conf, "VideoFrameRateDen", frame_rate.den, 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(cmd, "PixelFormat")) {

        enum AVPixelFormat pix_fmt;

        ffserver_get_arg(arg, sizeof(arg), p);

        pix_fmt = av_get_pix_fmt(arg);

        if (pix_fmt == AV_PIX_FMT_NONE)

            ERROR("Unknown pixel format: %s\n", arg);

        if (av_dict_set_int(&config->video_conf, cmd, pix_fmt, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoGopSize")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoIntraOnly")) {

        if (av_dict_set(&config->video_conf, cmd, "1", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoHighQuality")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Video4MotionVector")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AVOptionVideo") ||

               !av_strcasecmp(cmd, "AVOptionAudio")) {

        AVDictionary **dict;

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_get_arg(arg2, sizeof(arg2), p);

        if (!av_strcasecmp(cmd, "AVOptionVideo"))

            dict = &config->video_opts;

        else

            dict = &config->audio_opts;

        if (av_dict_set(dict, arg, arg2, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "AVPresetVideo") ||

               !av_strcasecmp(cmd, "AVPresetAudio")) {

        char **preset = NULL;

        ffserver_get_arg(arg, sizeof(arg), p);

        if (!av_strcasecmp(cmd, "AVPresetVideo")) {

            preset = &config->video_preset;

            ffserver_opt_preset(arg, NULL, 0, NULL, &config->video_id);

        } else {

            preset = &config->audio_preset;

            ffserver_opt_preset(arg, NULL, 0, &config->audio_id, NULL);

        }

        *preset = av_strdup(arg);

        if (!preset)

            return AVERROR(ENOMEM);

    } else if (!av_strcasecmp(cmd, "VideoTag")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (strlen(arg) == 4) {

            if (av_dict_set(&config->video_conf, "VideoTag", "arg", 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(cmd, "BitExact")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "DctFastint")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "IdctSimple")) {

        if (av_dict_set(&config->video_conf, cmd, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "Qscale")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQDiff")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQMax")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "VideoQMin")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(NULL, arg, 0, 1, 31, config, line_num, "%s out of range\n", cmd);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "LumiMask")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(NULL, arg, 0, -FLT_MAX, FLT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "DarkMask")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_float_param(NULL, arg, 0, -FLT_MAX, FLT_MAX, config, line_num, "Invalid %s: %s", cmd, arg);

        if (av_dict_set(&config->video_conf, cmd, arg, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(cmd, "NoVideo")) {

        config->video_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(cmd, "NoAudio")) {

        config->audio_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(cmd, "ACL")) {

        ffserver_parse_acl_row(stream, NULL, NULL, *p, config->filename, line_num);

    } else if (!av_strcasecmp(cmd, "DynamicACL")) {

        ffserver_get_arg(stream->dynamic_acl, sizeof(stream->dynamic_acl), p);

    } else if (!av_strcasecmp(cmd, "RTSPOption")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        av_freep(&stream->rtsp_option);

        stream->rtsp_option = av_strdup(arg);

    } else if (!av_strcasecmp(cmd, "MulticastAddress")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        if (resolve_host(&stream->multicast_ip, arg) != 0)

            ERROR("Invalid host/IP address: %s\n", arg);

        stream->is_multicast = 1;

        stream->loop = 1; 

    } else if (!av_strcasecmp(cmd, "MulticastPort")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid MulticastPort: %s\n", arg);

        stream->multicast_port = val;

    } else if (!av_strcasecmp(cmd, "MulticastTTL")) {

        ffserver_get_arg(arg, sizeof(arg), p);

        ffserver_set_int_param(&val, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid MulticastTTL: %s\n", arg);

        stream->multicast_ttl = val;

    } else if (!av_strcasecmp(cmd, "NoLoop")) {

        stream->loop = 0;

    } else if (!av_strcasecmp(cmd, "</Stream>")) {

        if (stream->feed && stream->fmt && strcmp(stream->fmt->name, "ffm") != 0) {

            if (config->audio_id != AV_CODEC_ID_NONE) {

                AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(config->audio_id));

                if (config->audio_preset &&

                    ffserver_opt_preset(arg, audio_enc, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply preset '%s'\n", arg);

                if (ffserver_apply_stream_config(audio_enc, config->audio_conf, &config->audio_opts) < 0)

                    config->errors++;

                add_codec(stream, audio_enc);

            }

            if (config->video_id != AV_CODEC_ID_NONE) {

                AVCodecContext *video_enc = avcodec_alloc_context3(avcodec_find_encoder(config->video_id));

                if (config->video_preset &&

                    ffserver_opt_preset(arg, video_enc, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply preset '%s'\n", arg);

                if (ffserver_apply_stream_config(video_enc, config->video_conf, &config->video_opts) < 0)

                    config->errors++;

                add_codec(stream, video_enc);

            }

        }

        av_dict_free(&config->video_opts);

        av_dict_free(&config->video_conf);

        av_dict_free(&config->audio_opts);

        av_dict_free(&config->audio_conf);

        av_freep(&config->video_preset);

        av_freep(&config->audio_preset);

        *pstream = NULL;

    } else if (!av_strcasecmp(cmd, "File") || !av_strcasecmp(cmd, "ReadOnlyFile")) {

        ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), p);

    } else {

        ERROR("Invalid entry '%s' inside <Stream></Stream>\n", cmd);

    }

    return 0;

  nomem:

    av_log(NULL, AV_LOG_ERROR, "Out of memory. Aborting.\n");

    av_dict_free(&config->video_opts);

    av_dict_free(&config->video_conf);

    av_dict_free(&config->audio_opts);

    av_dict_free(&config->audio_conf);

    av_freep(&config->video_preset);

    av_freep(&config->audio_preset);

    return AVERROR(ENOMEM);

}

static int FUNC_0(FFServerConfig *VAR_0, const char *VAR_1, const char **VAR_2,

                                        int VAR_3, FFServerStream **VAR_4)

{

    char VAR_5[1024], VAR_6[1024];

    FFServerStream *stream;

    int VAR_7;



    av_assert0(VAR_4);

    stream = *VAR_4;



    if (!av_strcasecmp(VAR_1, "<Stream")) {

        char *VAR_8;

        FFServerStream *s;

        stream = av_mallocz(sizeof(FFServerStream));

        if (!stream)

            return AVERROR(ENOMEM);

        ffserver_get_arg(stream->filename, sizeof(stream->filename), VAR_2);

        VAR_8 = strrchr(stream->filename, '>');

        if (VAR_8)

            *VAR_8 = '\0';



        for (s = VAR_0->first_stream; s; s = s->next) {

            if (!strcmp(stream->filename, s->filename))

                ERROR("Stream '%s' already registered\n", s->filename);

        }



        stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL);

        if (stream->fmt) {

            VAR_0->audio_id = stream->fmt->audio_codec;

            VAR_0->video_id = stream->fmt->video_codec;

        } else {

            VAR_0->audio_id = AV_CODEC_ID_NONE;

            VAR_0->video_id = AV_CODEC_ID_NONE;

        }

        *VAR_4 = stream;

        return 0;

    }

    av_assert0(stream);

    if (!av_strcasecmp(VAR_1, "Feed")) {

        FFServerStream *sfeed;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        sfeed = VAR_0->first_feed;

        while (sfeed) {

            if (!strcmp(sfeed->filename, VAR_5))

                break;

            sfeed = sfeed->next_feed;

        }

        if (!sfeed)

            ERROR("Feed with name '%s' for stream '%s' is not defined\n", VAR_5, stream->filename);

        else

            stream->feed = sfeed;

    } else if (!av_strcasecmp(VAR_1, "Format")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (!strcmp(VAR_5, "status")) {

            stream->stream_type = STREAM_TYPE_STATUS;

            stream->fmt = NULL;

        } else {

            stream->stream_type = STREAM_TYPE_LIVE;

            

            if (!strcmp(VAR_5, "jpeg"))

                strcpy(VAR_5, "mjpeg");

            stream->fmt = ffserver_guess_format(VAR_5, NULL, NULL);

            if (!stream->fmt)

                ERROR("Unknown Format: %s\n", VAR_5);

        }

        if (stream->fmt) {

            VAR_0->audio_id = stream->fmt->audio_codec;

            VAR_0->video_id = stream->fmt->video_codec;

        }

    } else if (!av_strcasecmp(VAR_1, "InputFormat")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        stream->ifmt = av_find_input_format(VAR_5);

        if (!stream->ifmt)

            ERROR("Unknown input format: %s\n", VAR_5);

    } else if (!av_strcasecmp(VAR_1, "FaviconURL")) {

        if (stream->stream_type == STREAM_TYPE_STATUS)

            ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), VAR_2);

        else

            ERROR("FaviconURL only permitted for status streams\n");

    } else if (!av_strcasecmp(VAR_1, "Author")    ||

               !av_strcasecmp(VAR_1, "Comment")   ||

               !av_strcasecmp(VAR_1, "Copyright") ||

               !av_strcasecmp(VAR_1, "Title")) {

        char VAR_9[32];

        int VAR_10;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        for (VAR_10 = 0; VAR_10 < strlen(VAR_1); VAR_10++)

            VAR_9[VAR_10] = av_tolower(VAR_1[VAR_10]);

        VAR_9[VAR_10] = 0;

        WARNING("'%s' option in configuration file is deprecated, "

                "use 'Metadata %s VALUE' instead\n", VAR_1, VAR_9);

        if (av_dict_set(&stream->metadata, VAR_9, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "Metadata")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_get_arg(VAR_6, sizeof(VAR_6), VAR_2);

        if (av_dict_set(&stream->metadata, VAR_5, VAR_6, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "Preroll")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        stream->prebuffer = atof(VAR_5) * 1000;

    } else if (!av_strcasecmp(VAR_1, "StartSendOnKey")) {

        stream->send_on_key = 1;

    } else if (!av_strcasecmp(VAR_1, "AudioCodec")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        VAR_0->audio_id = opt_codec(VAR_5, AVMEDIA_TYPE_AUDIO);

        if (VAR_0->audio_id == AV_CODEC_ID_NONE)

            ERROR("Unknown AudioCodec: %s\n", VAR_5);

    } else if (!av_strcasecmp(VAR_1, "VideoCodec")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        VAR_0->video_id = opt_codec(VAR_5, AVMEDIA_TYPE_VIDEO);

        if (VAR_0->video_id == AV_CODEC_ID_NONE)

            ERROR("Unknown VideoCodec: %s\n", VAR_5);

    } else if (!av_strcasecmp(VAR_1, "MaxTime")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        stream->max_time = atof(VAR_5) * 1000;

    } else if (!av_strcasecmp(VAR_1, "AudioBitRate")) {

        float VAR_11;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_float_param(&VAR_11, VAR_5, 1000, 0, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s\n", VAR_1, VAR_5);

        if (av_dict_set_int(&VAR_0->audio_conf, VAR_1, lrintf(VAR_11), 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "AudioChannels")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, 1, 8, VAR_0, VAR_3, "Invalid %s: %s, valid range is 1-8.", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->audio_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "AudioSampleRate")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->audio_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoBitRateRange")) {

        int VAR_12, VAR_13;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (sscanf(VAR_5, "%d-%d", &VAR_12, &VAR_13) == 2) {

            if (av_dict_set_int(&VAR_0->video_conf, "VideoBitRateRangeMin", VAR_12, 0) < 0 ||

                av_dict_set_int(&VAR_0->video_conf, "VideoBitRateRangeMax", VAR_13, 0) < 0)

                goto nomem;

        } else

            ERROR("Incorrect format for VideoBitRateRange -- should be <min>-<max>: %s\n", VAR_5);

    } else if (!av_strcasecmp(VAR_1, "Debug")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "Strict")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoBufferSize")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 8*1024, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoBitRateTolerance")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 1000, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoBitRate")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 1000, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

           goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoSize")) {

        int VAR_14, VAR_15, VAR_16;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        VAR_14 = av_parse_video_size(&VAR_15, &VAR_16, VAR_5);

        if (VAR_14 < 0)

            ERROR("Invalid video size '%s'\n", VAR_5);

        else if ((VAR_15 % 16) || (VAR_16 % 16))

            ERROR("Image size must be a multiple of 16\n");

        if (av_dict_set_int(&VAR_0->video_conf, "VideoSizeWidth", VAR_15, 0) < 0 ||

            av_dict_set_int(&VAR_0->video_conf, "VideoSizeHeight", VAR_16, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoFrameRate")) {

        AVRational frame_rate;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (av_parse_video_rate(&frame_rate, VAR_5) < 0) {

            ERROR("Incorrect frame rate: %s\n", VAR_5);

        } else {

            if (av_dict_set_int(&VAR_0->video_conf, "VideoFrameRateNum", frame_rate.num, 0) < 0 ||

                av_dict_set_int(&VAR_0->video_conf, "VideoFrameRateDen", frame_rate.den, 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(VAR_1, "PixelFormat")) {

        enum AVPixelFormat VAR_17;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        VAR_17 = av_get_pix_fmt(VAR_5);

        if (VAR_17 == AV_PIX_FMT_NONE)

            ERROR("Unknown pixel format: %s\n", VAR_5);

        if (av_dict_set_int(&VAR_0->video_conf, VAR_1, VAR_17, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoGopSize")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoIntraOnly")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "1", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoHighQuality")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "Video4MotionVector")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "AVOptionVideo") ||

               !av_strcasecmp(VAR_1, "AVOptionAudio")) {

        AVDictionary **dict;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_get_arg(VAR_6, sizeof(VAR_6), VAR_2);

        if (!av_strcasecmp(VAR_1, "AVOptionVideo"))

            dict = &VAR_0->video_opts;

        else

            dict = &VAR_0->audio_opts;

        if (av_dict_set(dict, VAR_5, VAR_6, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "AVPresetVideo") ||

               !av_strcasecmp(VAR_1, "AVPresetAudio")) {

        char **VAR_18 = NULL;

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (!av_strcasecmp(VAR_1, "AVPresetVideo")) {

            VAR_18 = &VAR_0->video_preset;

            ffserver_opt_preset(VAR_5, NULL, 0, NULL, &VAR_0->video_id);

        } else {

            VAR_18 = &VAR_0->audio_preset;

            ffserver_opt_preset(VAR_5, NULL, 0, &VAR_0->audio_id, NULL);

        }

        *VAR_18 = av_strdup(VAR_5);

        if (!VAR_18)

            return AVERROR(ENOMEM);

    } else if (!av_strcasecmp(VAR_1, "VideoTag")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (strlen(VAR_5) == 4) {

            if (av_dict_set(&VAR_0->video_conf, "VideoTag", "VAR_5", 0) < 0)

                goto nomem;

        }

    } else if (!av_strcasecmp(VAR_1, "BitExact")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "DctFastint")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "IdctSimple")) {

        if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "Qscale")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoQDiff")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoQMax")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "VideoQMin")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "LumiMask")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_float_param(NULL, VAR_5, 0, -FLT_MAX, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "DarkMask")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_float_param(NULL, VAR_5, 0, -FLT_MAX, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5);

        if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)

            goto nomem;

    } else if (!av_strcasecmp(VAR_1, "NoVideo")) {

        VAR_0->video_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(VAR_1, "NoAudio")) {

        VAR_0->audio_id = AV_CODEC_ID_NONE;

    } else if (!av_strcasecmp(VAR_1, "ACL")) {

        ffserver_parse_acl_row(stream, NULL, NULL, *VAR_2, VAR_0->filename, VAR_3);

    } else if (!av_strcasecmp(VAR_1, "DynamicACL")) {

        ffserver_get_arg(stream->dynamic_acl, sizeof(stream->dynamic_acl), VAR_2);

    } else if (!av_strcasecmp(VAR_1, "RTSPOption")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        av_freep(&stream->rtsp_option);

        stream->rtsp_option = av_strdup(VAR_5);

    } else if (!av_strcasecmp(VAR_1, "MulticastAddress")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        if (resolve_host(&stream->multicast_ip, VAR_5) != 0)

            ERROR("Invalid host/IP address: %s\n", VAR_5);

        stream->is_multicast = 1;

        stream->loop = 1; 

    } else if (!av_strcasecmp(VAR_1, "MulticastPort")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(&VAR_7, VAR_5, 0, 1, 65535, VAR_0, VAR_3, "Invalid MulticastPort: %s\n", VAR_5);

        stream->multicast_port = VAR_7;

    } else if (!av_strcasecmp(VAR_1, "MulticastTTL")) {

        ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2);

        ffserver_set_int_param(&VAR_7, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid MulticastTTL: %s\n", VAR_5);

        stream->multicast_ttl = VAR_7;

    } else if (!av_strcasecmp(VAR_1, "NoLoop")) {

        stream->loop = 0;

    } else if (!av_strcasecmp(VAR_1, "</Stream>")) {

        if (stream->feed && stream->fmt && strcmp(stream->fmt->name, "ffm") != 0) {

            if (VAR_0->audio_id != AV_CODEC_ID_NONE) {

                AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(VAR_0->audio_id));

                if (VAR_0->audio_preset &&

                    ffserver_opt_preset(VAR_5, audio_enc, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply VAR_18 '%s'\n", VAR_5);

                if (ffserver_apply_stream_config(audio_enc, VAR_0->audio_conf, &VAR_0->audio_opts) < 0)

                    VAR_0->errors++;

                add_codec(stream, audio_enc);

            }

            if (VAR_0->video_id != AV_CODEC_ID_NONE) {

                AVCodecContext *video_enc = avcodec_alloc_context3(avcodec_find_encoder(VAR_0->video_id));

                if (VAR_0->video_preset &&

                    ffserver_opt_preset(VAR_5, video_enc, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,

                                        NULL, NULL) < 0)

                    ERROR("Could not apply VAR_18 '%s'\n", VAR_5);

                if (ffserver_apply_stream_config(video_enc, VAR_0->video_conf, &VAR_0->video_opts) < 0)

                    VAR_0->errors++;

                add_codec(stream, video_enc);

            }

        }

        av_dict_free(&VAR_0->video_opts);

        av_dict_free(&VAR_0->video_conf);

        av_dict_free(&VAR_0->audio_opts);

        av_dict_free(&VAR_0->audio_conf);

        av_freep(&VAR_0->video_preset);

        av_freep(&VAR_0->audio_preset);

        *VAR_4 = NULL;

    } else if (!av_strcasecmp(VAR_1, "File") || !av_strcasecmp(VAR_1, "ReadOnlyFile")) {

        ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), VAR_2);

    } else {

        ERROR("Invalid entry '%s' inside <Stream></Stream>\n", VAR_1);

    }

    return 0;

  nomem:

    av_log(NULL, AV_LOG_ERROR, "Out of memory. Aborting.\n");

    av_dict_free(&VAR_0->video_opts);

    av_dict_free(&VAR_0->video_conf);

    av_dict_free(&VAR_0->audio_opts);

    av_dict_free(&VAR_0->audio_conf);

    av_freep(&VAR_0->video_preset);

    av_freep(&VAR_0->audio_preset);

    return AVERROR(ENOMEM);

}

static int FUNC_0(FFServerConfig *VAR_0, const char *VAR_1, const char **VAR_2,
int VAR_3, FFServerStream **VAR_4)
{ char VAR_5[1024], VAR_6[1024]; FFServerStream *stream; int VAR_7; av_assert0(VAR_4); stream = *VAR_4; if (!av_strcasecmp(VAR_1, "<Stream")) { char *VAR_8; FFServerStream *s; stream = av_mallocz(sizeof(FFServerStream)); if (!stream)
return AVERROR(ENOMEM); ffserver_get_arg(stream->filename, sizeof(stream->filename), VAR_2); VAR_8 = strrchr(stream->filename, '>'); if (VAR_8)
*VAR_8 = '\0'; for (s = VAR_0->first_stream; s; s = s->next) { if (!strcmp(stream->filename, s->filename))
ERROR("Stream '%s' already registered\n", s->filename); } stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL); if (stream->fmt) { VAR_0->audio_id = stream->fmt->audio_codec; VAR_0->video_id = stream->fmt->video_codec; } else { VAR_0->audio_id = AV_CODEC_ID_NONE; VAR_0->video_id = AV_CODEC_ID_NONE; } *VAR_4 = stream; return 0; } av_assert0(stream); if (!av_strcasecmp(VAR_1, "Feed")) { FFServerStream *sfeed; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); sfeed = VAR_0->first_feed; while (sfeed) { if (!strcmp(sfeed->filename, VAR_5))
break; sfeed = sfeed->next_feed; } if (!sfeed)
ERROR("Feed with name '%s' for stream '%s' is not defined\n", VAR_5, stream->filename); else
stream->feed = sfeed; } else if (!av_strcasecmp(VAR_1, "Format")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (!strcmp(VAR_5, "status")) { stream->stream_type = STREAM_TYPE_STATUS; stream->fmt = NULL; } else { stream->stream_type = STREAM_TYPE_LIVE; if (!strcmp(VAR_5, "jpeg"))
strcpy(VAR_5, "mjpeg"); stream->fmt = ffserver_guess_format(VAR_5, NULL, NULL); if (!stream->fmt)
ERROR("Unknown Format: %s\n", VAR_5); } if (stream->fmt) { VAR_0->audio_id = stream->fmt->audio_codec; VAR_0->video_id = stream->fmt->video_codec; } } else if (!av_strcasecmp(VAR_1, "InputFormat")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); stream->ifmt = av_find_input_format(VAR_5); if (!stream->ifmt)
ERROR("Unknown input format: %s\n", VAR_5); } else if (!av_strcasecmp(VAR_1, "FaviconURL")) { if (stream->stream_type == STREAM_TYPE_STATUS)
ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), VAR_2); else
ERROR("FaviconURL only permitted for status streams\n"); } else if (!av_strcasecmp(VAR_1, "Author")    || !av_strcasecmp(VAR_1, "Comment")   ||
!av_strcasecmp(VAR_1, "Copyright") ||
!av_strcasecmp(VAR_1, "Title")) { char VAR_9[32]; int VAR_10; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); for (VAR_10 = 0; VAR_10 < strlen(VAR_1); VAR_10++) VAR_9[VAR_10] = av_tolower(VAR_1[VAR_10]); VAR_9[VAR_10] = 0; WARNING("'%s' option in configuration file is deprecated, "
"use 'Metadata %s VALUE' instead\n", VAR_1, VAR_9); if (av_dict_set(&stream->metadata, VAR_9, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "Metadata")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_get_arg(VAR_6, sizeof(VAR_6), VAR_2); if (av_dict_set(&stream->metadata, VAR_5, VAR_6, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "Preroll")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); stream->prebuffer = atof(VAR_5) * 1000; } else if (!av_strcasecmp(VAR_1, "StartSendOnKey")) { stream->send_on_key = 1; } else if (!av_strcasecmp(VAR_1, "AudioCodec")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); VAR_0->audio_id = opt_codec(VAR_5, AVMEDIA_TYPE_AUDIO); if (VAR_0->audio_id == AV_CODEC_ID_NONE)
ERROR("Unknown AudioCodec: %s\n", VAR_5); } else if (!av_strcasecmp(VAR_1, "VideoCodec")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); VAR_0->video_id = opt_codec(VAR_5, AVMEDIA_TYPE_VIDEO); if (VAR_0->video_id == AV_CODEC_ID_NONE)
ERROR("Unknown VideoCodec: %s\n", VAR_5); } else if (!av_strcasecmp(VAR_1, "MaxTime")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); stream->max_time = atof(VAR_5) * 1000; } else if (!av_strcasecmp(VAR_1, "AudioBitRate")) { float VAR_11; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_float_param(&VAR_11, VAR_5, 1000, 0, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s\n", VAR_1, VAR_5); if (av_dict_set_int(&VAR_0->audio_conf, VAR_1, lrintf(VAR_11), 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "AudioChannels")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, 1, 8, VAR_0, VAR_3, "Invalid %s: %s, valid range is 1-8.", VAR_1, VAR_5); if (av_dict_set(&VAR_0->audio_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "AudioSampleRate")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->audio_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoBitRateRange")) { int VAR_12, VAR_13; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (sscanf(VAR_5, "%d-%d", &VAR_12, &VAR_13) == 2) { if (av_dict_set_int(&VAR_0->video_conf, "VideoBitRateRangeMin", VAR_12, 0) < 0 ||
av_dict_set_int(&VAR_0->video_conf, "VideoBitRateRangeMax", VAR_13, 0) < 0)
goto nomem; } else ERROR("Incorrect format for VideoBitRateRange -- should be <min>-<max>: %s\n", VAR_5); } else if (!av_strcasecmp(VAR_1, "Debug")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "Strict")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoBufferSize")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 8*1024, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoBitRateTolerance")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 1000, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoBitRate")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 1000, 0, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoSize")) { int VAR_14, VAR_15, VAR_16; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); VAR_14 = av_parse_video_size(&VAR_15, &VAR_16, VAR_5); if (VAR_14 < 0)
ERROR("Invalid video size '%s'\n", VAR_5); else if ((VAR_15 % 16) || (VAR_16 % 16))
ERROR("Image size must be a multiple of 16\n"); if (av_dict_set_int(&VAR_0->video_conf, "VideoSizeWidth", VAR_15, 0) < 0 ||
av_dict_set_int(&VAR_0->video_conf, "VideoSizeHeight", VAR_16, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoFrameRate")) { AVRational frame_rate; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (av_parse_video_rate(&frame_rate, VAR_5) < 0) { ERROR("Incorrect frame rate: %s\n", VAR_5); } else { if (av_dict_set_int(&VAR_0->video_conf, "VideoFrameRateNum", frame_rate.num, 0) < 0 ||
av_dict_set_int(&VAR_0->video_conf, "VideoFrameRateDen", frame_rate.den, 0) < 0)
goto nomem; } } else if (!av_strcasecmp(VAR_1, "PixelFormat")) { enum AVPixelFormat VAR_17; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); VAR_17 = av_get_pix_fmt(VAR_5); if (VAR_17 == AV_PIX_FMT_NONE)
ERROR("Unknown pixel format: %s\n", VAR_5); if (av_dict_set_int(&VAR_0->video_conf, VAR_1, VAR_17, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoGopSize")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoIntraOnly")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "1", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoHighQuality")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "Video4MotionVector")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "AVOptionVideo") || !av_strcasecmp(VAR_1, "AVOptionAudio")) { AVDictionary **dict; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_get_arg(VAR_6, sizeof(VAR_6), VAR_2); if (!av_strcasecmp(VAR_1, "AVOptionVideo"))
dict = &VAR_0->video_opts; else
dict = &VAR_0->audio_opts; if (av_dict_set(dict, VAR_5, VAR_6, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "AVPresetVideo") || !av_strcasecmp(VAR_1, "AVPresetAudio")) { char **VAR_18 = NULL; ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (!av_strcasecmp(VAR_1, "AVPresetVideo")) { VAR_18 = &VAR_0->video_preset; ffserver_opt_preset(VAR_5, NULL, 0, NULL, &VAR_0->video_id); } else { VAR_18 = &VAR_0->audio_preset; ffserver_opt_preset(VAR_5, NULL, 0, &VAR_0->audio_id, NULL); } *VAR_18 = av_strdup(VAR_5); if (!VAR_18)
return AVERROR(ENOMEM); } else if (!av_strcasecmp(VAR_1, "VideoTag")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (strlen(VAR_5) == 4) { if (av_dict_set(&VAR_0->video_conf, "VideoTag", "VAR_5", 0) < 0)
goto nomem; } } else if (!av_strcasecmp(VAR_1, "BitExact")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "DctFastint")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "IdctSimple")) { if (av_dict_set(&VAR_0->video_conf, VAR_1, "", 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "Qscale")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoQDiff")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoQMax")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "VideoQMin")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(NULL, VAR_5, 0, 1, 31, VAR_0, VAR_3, "%s out of range\n", VAR_1); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "LumiMask")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_float_param(NULL, VAR_5, 0, -FLT_MAX, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "DarkMask")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_float_param(NULL, VAR_5, 0, -FLT_MAX, FLT_MAX, VAR_0, VAR_3, "Invalid %s: %s", VAR_1, VAR_5); if (av_dict_set(&VAR_0->video_conf, VAR_1, VAR_5, 0) < 0)
goto nomem; } else if (!av_strcasecmp(VAR_1, "NoVideo")) { VAR_0->video_id = AV_CODEC_ID_NONE; } else if (!av_strcasecmp(VAR_1, "NoAudio")) { VAR_0->audio_id = AV_CODEC_ID_NONE; } else if (!av_strcasecmp(VAR_1, "ACL")) { ffserver_parse_acl_row(stream, NULL, NULL, *VAR_2, VAR_0->filename, VAR_3); } else if (!av_strcasecmp(VAR_1, "DynamicACL")) { ffserver_get_arg(stream->dynamic_acl, sizeof(stream->dynamic_acl), VAR_2); } else if (!av_strcasecmp(VAR_1, "RTSPOption")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); av_freep(&stream->rtsp_option); stream->rtsp_option = av_strdup(VAR_5); } else if (!av_strcasecmp(VAR_1, "MulticastAddress")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); if (resolve_host(&stream->multicast_ip, VAR_5) != 0)
ERROR("Invalid host/IP address: %s\n", VAR_5); stream->is_multicast = 1; stream->loop = 1; } else if (!av_strcasecmp(VAR_1, "MulticastPort")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(&VAR_7, VAR_5, 0, 1, 65535, VAR_0, VAR_3, "Invalid MulticastPort: %s\n", VAR_5); stream->multicast_port = VAR_7; } else if (!av_strcasecmp(VAR_1, "MulticastTTL")) { ffserver_get_arg(VAR_5, sizeof(VAR_5), VAR_2); ffserver_set_int_param(&VAR_7, VAR_5, 0, INT_MIN, INT_MAX, VAR_0, VAR_3, "Invalid MulticastTTL: %s\n", VAR_5); stream->multicast_ttl = VAR_7; } else if (!av_strcasecmp(VAR_1, "NoLoop")) { stream->loop = 0; } else if (!av_strcasecmp(VAR_1, "</Stream>")) { if (stream->feed && stream->fmt && strcmp(stream->fmt->name, "ffm") != 0) { if (VAR_0->audio_id != AV_CODEC_ID_NONE) { AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(VAR_0->audio_id)); if (VAR_0->audio_preset &&
ffserver_opt_preset(VAR_5, audio_enc, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,
NULL, NULL) < 0)
ERROR("Could not apply VAR_18 '%s'\n", VAR_5); if (ffserver_apply_stream_config(audio_enc, VAR_0->audio_conf, &VAR_0->audio_opts) < 0)
VAR_0->errors++; add_codec(stream, audio_enc); } if (VAR_0->video_id != AV_CODEC_ID_NONE) { AVCodecContext *video_enc = avcodec_alloc_context3(avcodec_find_encoder(VAR_0->video_id)); if (VAR_0->video_preset &&
ffserver_opt_preset(VAR_5, video_enc, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_ENCODING_PARAM,
NULL, NULL) < 0)
ERROR("Could not apply VAR_18 '%s'\n", VAR_5); if (ffserver_apply_stream_config(video_enc, VAR_0->video_conf, &VAR_0->video_opts) < 0)
VAR_0->errors++; add_codec(stream, video_enc); } } av_dict_free(&VAR_0->video_opts); av_dict_free(&VAR_0->video_conf); av_dict_free(&VAR_0->audio_opts); av_dict_free(&VAR_0->audio_conf); av_freep(&VAR_0->video_preset); av_freep(&VAR_0->audio_preset); *VAR_4 = NULL; } else if (!av_strcasecmp(VAR_1, "File") || !av_strcasecmp(VAR_1, "ReadOnlyFile")) { ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename), VAR_2); } else { ERROR("Invalid entry '%s' inside <Stream></Stream>\n", VAR_1); } return 0; nomem:
av_log(NULL, AV_LOG_ERROR, "Out of memory. Aborting.\n"); av_dict_free(&VAR_0->video_opts); av_dict_free(&VAR_0->video_conf); av_dict_free(&VAR_0->audio_opts); av_dict_free(&VAR_0->audio_conf); av_freep(&VAR_0->video_preset); av_freep(&VAR_0->audio_preset); return AVERROR(ENOMEM); }