/* This is a wrapper around the ff_decklink_list_devices() which dumps the output to av_log() and exits (for backward compatibility with the "-list_devices" argument). */ void ff_decklink_list_devices_legacy(AVFormatContext *avctx, int show_inputs, int show_outputs) { struct AVDeviceInfoList *device_list = NULL; int ret; device_list = (struct AVDeviceInfoList *) av_mallocz(sizeof(AVDeviceInfoList)); if (!device_list) return; ret = ff_decklink_list_devices(avctx, device_list, show_inputs, show_outputs); if (ret == 0) { av_log(avctx, AV_LOG_INFO, "Blackmagic DeckLink %s devices:\n", show_inputs ? "input" : "output"); for (int i = 0; i < device_list->nb_devices; i++) { av_log(avctx, AV_LOG_INFO, "\t'%s'\n", device_list->devices[i]->device_name); } } avdevice_free_list_devices(&device_list); }
int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) { int ret; av_assert0(s); av_assert0(device_list); av_assert0(s->oformat || s->iformat); if ((s->oformat && !s->oformat->get_device_list) || (s->iformat && !s->iformat->get_device_list)) { *device_list = NULL; return AVERROR(ENOSYS); } *device_list = av_mallocz(sizeof(AVDeviceInfoList)); if (!(*device_list)) return AVERROR(ENOMEM); /* no default device by default */ (*device_list)->default_device = -1; if (s->oformat) ret = s->oformat->get_device_list(s, *device_list); else ret = s->iformat->get_device_list(s, *device_list); if (ret < 0) avdevice_free_list_devices(device_list); return ret; }
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; }