int show_codecs(void *optctx, const char *opt, const char *arg) { const AVCodecDescriptor **codecs; unsigned i, nb_codecs = get_codecs_sorted(&codecs); char tmp[1024]; th_writelog("Codecs:\n" " D..... = Decoding supported\n" " .E.... = Encoding supported\n" " ..V... = Video codec\n" " ..A... = Audio codec\n" " ..S... = Subtitle codec\n" " ...I.. = Intra frame-only codec\n" " ....L. = Lossy compression\n" " .....S = Lossless compression\n" " -------\n"); for (i = 0; i < nb_codecs; ++i) { const AVCodecDescriptor *desc = codecs[i]; const AVCodec *codec = NULL; _log(" "); _log(avcodec_find_decoder(desc->id) ? "D" : "."); _log(avcodec_find_encoder(desc->id) ? "E" : "."); _log(get_media_type_char(desc->type)); _log((desc->props & AV_CODEC_PROP_INTRA_ONLY) ? "I" : "."); _log((desc->props & AV_CODEC_PROP_LOSSY) ? "L" : "."); _log((desc->props & AV_CODEC_PROP_LOSSLESS) ? "S" : "."); sprintf(tmp, " %-20s %s", desc->name, desc->long_name ? desc->long_name : ""); _log(tmp); /* print decoders/encoders when there's more than one or their * names are different from codec name */ while ((codec = next_codec_for_id(desc->id, codec, 0))) { if (strcmp(codec->name, desc->name)) { print_codecs_for_id(desc->id, 0); break; } } codec = NULL; while ((codec = next_codec_for_id(desc->id, codec, 1))) { if (strcmp(codec->name, desc->name)) { print_codecs_for_id(desc->id, 1); break; } } _log("\n"); } av_free(codecs); av_log(0, 0, "%s", text.c_str()); return 0; }
static void get_codecs_for_id(const struct ff_format_desc *format_desc, struct ff_codec_desc **first, struct ff_codec_desc **current, enum AVCodecID id) { const AVCodec *codec = NULL; while ((codec = next_codec_for_id(id, codec))) add_codec_to_list(format_desc, first, current, codec->id, codec); }
static void print_codecs_for_id(enum AVCodecID id, int encoder) { const AVCodec *codec = NULL; _log(encoder ? "encoders" : "decoders"); while ((codec = next_codec_for_id(id, codec, encoder))) _log(codec->name); _log(")"); }