Discussion:
[Libav-user] Libavdevice. Reading formats info.
Hristo Ivanov
2018-10-23 16:53:35 UTC
Permalink
Hi.

The different devices ffmpeg supports have different options, I am
interested in the 'list_formats' of the decklink devices. Using the
ffmpeg.exe tool the following command:

ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro'

prints the formats that can be used with the device.

I want to recover this information from my program which uses the libav
libraries. My current solution looks like this.


std::string formatListing;

int main(int argc, char* argv[]) {
av_log_set_level(AV_LOG_VERBOSE);
av_log_set_callback(my_log_callback);

AVInputFormat* inpF = av_find_input_format("decklink");
AVFormatContext* ifmt_ctx = avformat_alloc_context();
AVDictionary* options = NULL;
av_dict_set(&options, "list_formats", "1", NULL);

avformat_open_input(&ifmt_ctx, deviceName.c_str(), inpF, &options);

........... // Parse the string in formatListing.
}

void my_log_callback(void *ptr, int level, const char *fmt, va_list vl) {
AVClass* avc = ptr ? *(AVClass **) ptr : NULL;
std::string className = avc ? avc->item_name(ptr) : "";

if (className == "decklink") {
char buf[500];
vsnprintf(buf, 500, fmt, vl);
formatListing += buf;
}

if (avc != NULL)
const char* aux = avc->item_name(ptr);

av_log_default_callback(ptr, level, fmt, vl);
}


This code works fine, but I don't like it. Is there a more elegant solution
to this which doesn't involve a log callback?

Thanks.

Loading...