Example #1
0
int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** options)
{
    int ret;
    const AVBitStreamFilter *filter;
    AVBSFContext *bsf;

    filter = av_bsf_get_by_name(bsf_name);
    if (!filter)
        return AVERROR_BSF_NOT_FOUND;

    ret = av_bsf_alloc(filter, &bsf);
    if (ret < 0)
        return ret;

    if (options) {
        ret = av_opt_set_dict2(bsf, options, AV_OPT_SEARCH_CHILDREN);
        if (ret < 0)
            goto end;
    }

    ret = av_bsf_list_append(lst, bsf);

end:
    if (ret < 0)
        av_bsf_free(&bsf);

    return ret;
}
Example #2
0
static int list_devices_for_context(AVFormatContext *s, AVDictionary *options,
                                    AVDeviceInfoList **device_list)
{
    AVDictionary *tmp = NULL;
    int ret;

    av_dict_copy(&tmp, options, 0);
    if ((ret = av_opt_set_dict2(s, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0)
        goto fail;
    ret = avdevice_list_devices(s, device_list);
  fail:
    av_dict_free(&tmp);
    avformat_free_context(s);
    return ret;
}
Example #3
0
QVector<QPair<QString, QString>> CameraDevice::getRawDeviceListGeneric()
{
    QVector<QPair<QString, QString>> devices;

    if (!getDefaultInputFormat())
        return devices;

    // Alloc an input device context
    AVFormatContext *s;
    if (!(s = avformat_alloc_context()))
        return devices;
    if (!iformat->priv_class || !AV_IS_INPUT_DEVICE(iformat->priv_class->category))
    {
        avformat_free_context(s);
        return devices;
    }
    s->iformat = iformat;
    if (s->iformat->priv_data_size > 0)
    {
        s->priv_data = av_mallocz(s->iformat->priv_data_size);
        if (!s->priv_data)
        {
            avformat_free_context(s);
            return devices;
        }
        if (s->iformat->priv_class)
        {
            *(const AVClass**)s->priv_data= s->iformat->priv_class;
            av_opt_set_defaults(s->priv_data);
        }
    }
    else
    {
        s->priv_data = NULL;
    }

    // List the devices for this context
    AVDeviceInfoList* devlist = nullptr;
    AVDictionary *tmp = nullptr;
    av_dict_copy(&tmp, nullptr, 0);
    if (av_opt_set_dict2(s, &tmp, AV_OPT_SEARCH_CHILDREN) < 0)
    {
        av_dict_free(&tmp);
        avformat_free_context(s);
    }
    avdevice_list_devices(s, &devlist);
    if (!devlist)
    {
        qWarning() << "avdevice_list_devices failed";
        return devices;
    }

    // Convert the list to a QVector
    devices.resize(devlist->nb_devices);
    for (int i=0; i<devlist->nb_devices; i++)
    {
        AVDeviceInfo* dev = devlist->devices[i];
        devices[i].first = dev->device_name;
        devices[i].second = dev->device_description;
    }
    avdevice_free_list_devices(&devlist);
    return devices;
}
Example #4
0
/* add a codec and set the default parameters */
static void add_codec(FFServerStream *stream, AVCodecContext *av,
                      FFServerConfig *config)
{
    AVStream *st;
    AVDictionary **opts, *recommended = NULL;
    char *enc_config;

    if(stream->nb_streams >= FF_ARRAY_ELEMS(stream->streams))
        return;

    opts = av->codec_type == AVMEDIA_TYPE_AUDIO ?
           &config->audio_opts : &config->video_opts;
    av_dict_copy(&recommended, *opts, 0);
    av_opt_set_dict2(av->priv_data, opts, AV_OPT_SEARCH_CHILDREN);
    av_opt_set_dict2(av, opts, AV_OPT_SEARCH_CHILDREN);

    if (av_dict_count(*opts))
        av_log(NULL, AV_LOG_WARNING,
               "Something is wrong, %d options are not set!\n",
               av_dict_count(*opts));

    if (!config->stream_use_defaults) {
        switch(av->codec_type) {
        case AVMEDIA_TYPE_AUDIO:
            if (av->bit_rate == 0)
                report_config_error(config->filename, config->line_num,
                                    AV_LOG_ERROR, &config->errors,
                                    "audio bit rate is not set\n");
            if (av->sample_rate == 0)
                report_config_error(config->filename, config->line_num,
                                    AV_LOG_ERROR, &config->errors,
                                    "audio sample rate is not set\n");
            break;
        case AVMEDIA_TYPE_VIDEO:
            if (av->width == 0 || av->height == 0)
                report_config_error(config->filename, config->line_num,
                                    AV_LOG_ERROR, &config->errors,
                                    "video size is not set\n");
            break;
        default:
            av_assert0(0);
        }
        goto done;
    }

    /* stream_use_defaults = true */

    /* compute default parameters */
    switch(av->codec_type) {
    case AVMEDIA_TYPE_AUDIO:
        if (!av_dict_get(recommended, "b", NULL, 0)) {
            av->bit_rate = 64000;
            av_dict_set_int(&recommended, "b", av->bit_rate, 0);
            WARNING("Setting default value for audio bit rate = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->bit_rate);
        }
        if (!av_dict_get(recommended, "ar", NULL, 0)) {
            av->sample_rate = 22050;
            av_dict_set_int(&recommended, "ar", av->sample_rate, 0);
            WARNING("Setting default value for audio sample rate = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->sample_rate);
        }
        if (!av_dict_get(recommended, "ac", NULL, 0)) {
            av->channels = 1;
            av_dict_set_int(&recommended, "ac", av->channels, 0);
            WARNING("Setting default value for audio channel count = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->channels);
        }
        break;
    case AVMEDIA_TYPE_VIDEO:
        if (!av_dict_get(recommended, "b", NULL, 0)) {
            av->bit_rate = 64000;
            av_dict_set_int(&recommended, "b", av->bit_rate, 0);
            WARNING("Setting default value for video bit rate = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->bit_rate);
        }
        if (!av_dict_get(recommended, "time_base", NULL, 0)) {
            av->time_base.den = 5;
            av->time_base.num = 1;
            av_dict_set(&recommended, "time_base", "1/5", 0);
            WARNING("Setting default value for video frame rate = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->time_base.den);
        }
        if (!av_dict_get(recommended, "video_size", NULL, 0)) {
            av->width = 160;
            av->height = 128;
            av_dict_set(&recommended, "video_size", "160x128", 0);
            WARNING("Setting default value for video size = %dx%d. "
                    "Use NoDefaults to disable it.\n",
                    av->width, av->height);
        }
        /* Bitrate tolerance is less for streaming */
        if (!av_dict_get(recommended, "bt", NULL, 0)) {
            av->bit_rate_tolerance = FFMAX(av->bit_rate / 4,
                                           (int64_t)av->bit_rate*av->time_base.num/av->time_base.den);
            av_dict_set_int(&recommended, "bt", av->bit_rate_tolerance, 0);
            WARNING("Setting default value for video bit rate tolerance = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->bit_rate_tolerance);
        }

        if (!av_dict_get(recommended, "rc_eq", NULL, 0)) {
            av->rc_eq = av_strdup("tex^qComp");
            av_dict_set(&recommended, "rc_eq", "tex^qComp", 0);
            WARNING("Setting default value for video rate control equation = "
                    "%s. Use NoDefaults to disable it.\n",
                    av->rc_eq);
        }
        if (!av_dict_get(recommended, "maxrate", NULL, 0)) {
            av->rc_max_rate = av->bit_rate * 2;
            av_dict_set_int(&recommended, "maxrate", av->rc_max_rate, 0);
            WARNING("Setting default value for video max rate = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->rc_max_rate);
        }

        if (av->rc_max_rate && !av_dict_get(recommended, "bufsize", NULL, 0)) {
            av->rc_buffer_size = av->rc_max_rate;
            av_dict_set_int(&recommended, "bufsize", av->rc_buffer_size, 0);
            WARNING("Setting default value for video buffer size = %d. "
                    "Use NoDefaults to disable it.\n",
                    av->rc_buffer_size);
        }
        break;
    default:
        abort();
    }

done:
    st = av_mallocz(sizeof(AVStream));
    if (!st)
        return;
    av_dict_get_string(recommended, &enc_config, '=', ',');
    av_dict_free(&recommended);
    av_stream_set_recommended_encoder_configuration(st, enc_config);
    st->codec = av;
    stream->streams[stream->nb_streams++] = st;
}
Example #5
0
static void ffserver_apply_stream_config(AVCodecContext *enc, const AVDictionary *conf, AVDictionary **opts)
{
    AVDictionaryEntry *e;

    /* Return values from ffserver_set_*_param are ignored.
       Values are initially parsed and checked before inserting to
       AVDictionary. */

    //video params
    if ((e = av_dict_get(conf, "VideoBitRateRangeMin", NULL, 0)))
        ffserver_set_int_param(&enc->rc_min_rate, e->value, 1000, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoBitRateRangeMax", NULL, 0)))
        ffserver_set_int_param(&enc->rc_max_rate, e->value, 1000, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "Debug", NULL, 0)))
        ffserver_set_int_param(&enc->debug, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "Strict", NULL, 0)))
        ffserver_set_int_param(&enc->strict_std_compliance, e->value, 0,
                INT_MIN, INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoBufferSize", NULL, 0)))
        ffserver_set_int_param(&enc->rc_buffer_size, e->value, 8*1024,
                INT_MIN, INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoBitRateTolerance", NULL, 0)))
        ffserver_set_int_param(&enc->bit_rate_tolerance, e->value, 1000,
                INT_MIN, INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoBitRate", NULL, 0)))
        ffserver_set_int_param(&enc->bit_rate, e->value, 1000, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoSizeWidth", NULL, 0)))
        ffserver_set_int_param(&enc->width, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoSizeHeight", NULL, 0)))
        ffserver_set_int_param(&enc->height, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "PixelFormat", NULL, 0))) {
        int val;
        ffserver_set_int_param(&val, e->value, 0, INT_MIN, INT_MAX, NULL, 0,
                NULL);
        enc->pix_fmt = val;
    }
    if ((e = av_dict_get(conf, "VideoGopSize", NULL, 0)))
        ffserver_set_int_param(&enc->gop_size, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoFrameRateNum", NULL, 0)))
        ffserver_set_int_param(&enc->time_base.num, e->value, 0, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoFrameRateDen", NULL, 0)))
        ffserver_set_int_param(&enc->time_base.den, e->value, 0, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoQDiff", NULL, 0)))
        ffserver_set_int_param(&enc->max_qdiff, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "VideoQMax", NULL, 0)))
        ffserver_set_int_param(&enc->qmax, e->value, 0, INT_MIN, INT_MAX, NULL,
                0, NULL);
    if ((e = av_dict_get(conf, "VideoQMin", NULL, 0)))
        ffserver_set_int_param(&enc->qmin, e->value, 0, INT_MIN, INT_MAX, NULL,
                0, NULL);
    if ((e = av_dict_get(conf, "LumiMask", NULL, 0)))
        ffserver_set_float_param(&enc->lumi_masking, e->value, 0, -FLT_MAX,
                FLT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "DarkMask", NULL, 0)))
        ffserver_set_float_param(&enc->dark_masking, e->value, 0, -FLT_MAX,
                FLT_MAX, NULL, 0, NULL);
    if (av_dict_get(conf, "BitExact", NULL, 0))
        enc->flags |= CODEC_FLAG_BITEXACT;
    if (av_dict_get(conf, "DctFastint", NULL, 0))
        enc->dct_algo  = FF_DCT_FASTINT;
    if (av_dict_get(conf, "IdctSimple", NULL, 0))
        enc->idct_algo = FF_IDCT_SIMPLE;
    if (av_dict_get(conf, "VideoHighQuality", NULL, 0))
        enc->mb_decision = FF_MB_DECISION_BITS;
    if ((e = av_dict_get(conf, "VideoTag", NULL, 0)))
        enc->codec_tag = MKTAG(e->value[0], e->value[1], e->value[2], e->value[3]);
    if (av_dict_get(conf, "Qscale", NULL, 0)) {
        enc->flags |= CODEC_FLAG_QSCALE;
        ffserver_set_int_param(&enc->global_quality, e->value, FF_QP2LAMBDA,
                INT_MIN, INT_MAX, NULL, 0, NULL);
    }
    if (av_dict_get(conf, "Video4MotionVector", NULL, 0)) {
        enc->mb_decision = FF_MB_DECISION_BITS; //FIXME remove
        enc->flags |= CODEC_FLAG_4MV;
    }
    //audio params
    if ((e = av_dict_get(conf, "AudioChannels", NULL, 0)))
        ffserver_set_int_param(&enc->channels, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);
    if ((e = av_dict_get(conf, "AudioSampleRate", NULL, 0)))
        ffserver_set_int_param(&enc->sample_rate, e->value, 0, INT_MIN,
                INT_MAX, NULL, 0, NULL);
    if ((e = av_dict_get(conf, "AudioBitRate", NULL, 0)))
        ffserver_set_int_param(&enc->bit_rate, e->value, 0, INT_MIN, INT_MAX,
                NULL, 0, NULL);

    av_opt_set_dict2(enc, opts, AV_OPT_SEARCH_CHILDREN);
}