X-Git-Url: https://git.piment-noir.org/?p=deb_ffmpeg.git;a=blobdiff_plain;f=ffmpeg%2Fffprobe.c;h=24ecafd2ec1f7abdceb23eab9eead7b9589b193b;hp=9bb0f0f10c0114cc2573333d6e06ce87187024fc;hb=f6fa7814ccfe3e76514b36cf04f5cd3cb657c8cf;hpb=2ba45a602cbfa7b771effba9b11bb4245c21bc00 diff --git a/ffmpeg/ffprobe.c b/ffmpeg/ffprobe.c index 9bb0f0f..24ecafd 100644 --- a/ffmpeg/ffprobe.c +++ b/ffmpeg/ffprobe.c @@ -66,6 +66,9 @@ static int do_show_stream_disposition = 0; static int do_show_data = 0; static int do_show_program_version = 0; static int do_show_library_versions = 0; +static int do_show_pixel_formats = 0; +static int do_show_pixel_format_flags = 0; +static int do_show_pixel_format_components = 0; static int do_show_chapter_tags = 0; static int do_show_format_tags = 0; @@ -132,6 +135,11 @@ typedef enum { SECTION_ID_PACKET, SECTION_ID_PACKETS, SECTION_ID_PACKETS_AND_FRAMES, + SECTION_ID_PIXEL_FORMAT, + SECTION_ID_PIXEL_FORMAT_FLAGS, + SECTION_ID_PIXEL_FORMAT_COMPONENT, + SECTION_ID_PIXEL_FORMAT_COMPONENTS, + SECTION_ID_PIXEL_FORMATS, SECTION_ID_PROGRAM_STREAM_DISPOSITION, SECTION_ID_PROGRAM_STREAM_TAGS, SECTION_ID_PROGRAM, @@ -165,6 +173,11 @@ static struct section sections[] = { [SECTION_ID_PACKETS] = { SECTION_ID_PACKETS, "packets", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} }, [SECTION_ID_PACKETS_AND_FRAMES] = { SECTION_ID_PACKETS_AND_FRAMES, "packets_and_frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} }, [SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet", 0, { -1 } }, + [SECTION_ID_PIXEL_FORMATS] = { SECTION_ID_PIXEL_FORMATS, "pixel_formats", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PIXEL_FORMAT, -1 } }, + [SECTION_ID_PIXEL_FORMAT] = { SECTION_ID_PIXEL_FORMAT, "pixel_format", 0, { SECTION_ID_PIXEL_FORMAT_FLAGS, SECTION_ID_PIXEL_FORMAT_COMPONENTS, -1 } }, + [SECTION_ID_PIXEL_FORMAT_FLAGS] = { SECTION_ID_PIXEL_FORMAT_FLAGS, "flags", 0, { -1 }, .unique_name = "pixel_format_flags" }, + [SECTION_ID_PIXEL_FORMAT_COMPONENTS] = { SECTION_ID_PIXEL_FORMAT_COMPONENTS, "components", SECTION_FLAG_IS_ARRAY, {SECTION_ID_PIXEL_FORMAT_COMPONENT, -1 }, .unique_name = "pixel_format_components" }, + [SECTION_ID_PIXEL_FORMAT_COMPONENT] = { SECTION_ID_PIXEL_FORMAT_COMPONENT, "component", 0, { -1 } }, [SECTION_ID_PROGRAM_STREAM_DISPOSITION] = { SECTION_ID_PROGRAM_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "program_stream_disposition" }, [SECTION_ID_PROGRAM_STREAM_TAGS] = { SECTION_ID_PROGRAM_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "program_stream_tags" }, [SECTION_ID_PROGRAM] = { SECTION_ID_PROGRAM, "program", 0, { SECTION_ID_PROGRAM_TAGS, SECTION_ID_PROGRAM_STREAMS, -1 } }, @@ -175,7 +188,8 @@ static struct section sections[] = { [SECTION_ID_PROGRAMS] = { SECTION_ID_PROGRAMS, "programs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PROGRAM, -1 } }, [SECTION_ID_ROOT] = { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER, { SECTION_ID_CHAPTERS, SECTION_ID_FORMAT, SECTION_ID_FRAMES, SECTION_ID_PROGRAMS, SECTION_ID_STREAMS, - SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, -1} }, + SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, + SECTION_ID_PIXEL_FORMATS, -1} }, [SECTION_ID_STREAMS] = { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM, -1 } }, [SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream", 0, { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, -1 } }, [SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" }, @@ -2098,12 +2112,28 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id else print_str_opt("pix_fmt", "unknown"); print_int("level", dec_ctx->level); if (dec_ctx->color_range != AVCOL_RANGE_UNSPECIFIED) - print_str ("color_range", dec_ctx->color_range == AVCOL_RANGE_MPEG ? "tv": "pc"); + print_str ("color_range", av_color_range_name(dec_ctx->color_range)); else print_str_opt("color_range", "N/A"); s = av_get_colorspace_name(dec_ctx->colorspace); if (s) print_str ("color_space", s); else print_str_opt("color_space", "unknown"); + + if (dec_ctx->color_trc != AVCOL_TRC_UNSPECIFIED) + print_str("color_transfer", av_color_transfer_name(dec_ctx->color_trc)); + else + print_str_opt("color_transfer", av_color_transfer_name(dec_ctx->color_trc)); + + if (dec_ctx->color_primaries != AVCOL_PRI_UNSPECIFIED) + print_str("color_primaries", av_color_primaries_name(dec_ctx->color_primaries)); + else + print_str_opt("color_primaries", av_color_primaries_name(dec_ctx->color_primaries)); + + if (dec_ctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED) + print_str("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location)); + else + print_str_opt("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location)); + if (dec_ctx->timecode_frame_start >= 0) { char tcbuf[AV_TIMECODE_STR_SIZE]; av_timecode_make_mpeg_tc_string(tcbuf, dec_ctx->timecode_frame_start); @@ -2356,12 +2386,19 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename) AVFormatContext *fmt_ctx = NULL; AVDictionaryEntry *t; AVDictionary **opts; + int scan_all_pmts_set = 0; + if (!av_dict_get(format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) { + av_dict_set(&format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE); + scan_all_pmts_set = 1; + } if ((err = avformat_open_input(&fmt_ctx, filename, iformat, &format_opts)) < 0) { print_error(filename, err); return err; } + if (scan_all_pmts_set) + av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE); if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) { av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key); return AVERROR_OPTION_NOT_FOUND; @@ -2557,6 +2594,58 @@ static void ffprobe_show_library_versions(WriterContext *w) writer_print_section_footer(w); } +#define PRINT_PIX_FMT_FLAG(flagname, name) \ + do { \ + print_int(name, !!(pixdesc->flags & AV_PIX_FMT_FLAG_##flagname)); \ + } while (0) + +static void ffprobe_show_pixel_formats(WriterContext *w) +{ + const AVPixFmtDescriptor *pixdesc = NULL; + int i, n; + + writer_print_section_header(w, SECTION_ID_PIXEL_FORMATS); + while (pixdesc = av_pix_fmt_desc_next(pixdesc)) { + writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT); + print_str("name", pixdesc->name); + print_int("nb_components", pixdesc->nb_components); + if ((pixdesc->nb_components >= 3) && !(pixdesc->flags & AV_PIX_FMT_FLAG_RGB)) { + print_int ("log2_chroma_w", pixdesc->log2_chroma_w); + print_int ("log2_chroma_h", pixdesc->log2_chroma_h); + } else { + print_str_opt("log2_chroma_w", "N/A"); + print_str_opt("log2_chroma_h", "N/A"); + } + n = av_get_bits_per_pixel(pixdesc); + if (n) print_int ("bits_per_pixel", n); + else print_str_opt("bits_per_pixel", "N/A"); + if (do_show_pixel_format_flags) { + writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_FLAGS); + PRINT_PIX_FMT_FLAG(BE, "big_endian"); + PRINT_PIX_FMT_FLAG(PAL, "palette"); + PRINT_PIX_FMT_FLAG(BITSTREAM, "bitstream"); + PRINT_PIX_FMT_FLAG(HWACCEL, "hwaccel"); + PRINT_PIX_FMT_FLAG(PLANAR, "planar"); + PRINT_PIX_FMT_FLAG(RGB, "rgb"); + PRINT_PIX_FMT_FLAG(PSEUDOPAL, "pseudopal"); + PRINT_PIX_FMT_FLAG(ALPHA, "alpha"); + writer_print_section_footer(w); + } + if (do_show_pixel_format_components && (pixdesc->nb_components > 0)) { + writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENTS); + for (i = 0; i < pixdesc->nb_components; i++) { + writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENT); + print_int("index", i + 1); + print_int("bit_depth", pixdesc->comp[i].depth_minus1 + 1); + writer_print_section_footer(w); + } + writer_print_section_footer(w); + } + writer_print_section_footer(w); + } + writer_print_section_footer(w); +} + static int opt_format(void *optctx, const char *opt, const char *arg) { iformat = av_find_input_format(arg); @@ -2890,6 +2979,7 @@ DEFINE_OPT_SHOW_SECTION(format, FORMAT); DEFINE_OPT_SHOW_SECTION(frames, FRAMES); DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS); DEFINE_OPT_SHOW_SECTION(packets, PACKETS); +DEFINE_OPT_SHOW_SECTION(pixel_formats, PIXEL_FORMATS); DEFINE_OPT_SHOW_SECTION(program_version, PROGRAM_VERSION); DEFINE_OPT_SHOW_SECTION(streams, STREAMS); DEFINE_OPT_SHOW_SECTION(programs, PROGRAMS); @@ -2928,6 +3018,7 @@ static const OptionDef real_options[] = { { "show_program_version", 0, {(void*)&opt_show_program_version}, "show ffprobe version" }, { "show_library_versions", 0, {(void*)&opt_show_library_versions}, "show library versions" }, { "show_versions", 0, {(void*)&opt_show_versions}, "show program and library versions" }, + { "show_pixel_formats", 0, {(void*)&opt_show_pixel_formats}, "show pixel format descriptions" }, { "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" }, { "private", OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" }, { "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" }, @@ -2984,6 +3075,9 @@ int main(int argc, char **argv) SET_DO_SHOW(FRAMES, frames); SET_DO_SHOW(LIBRARY_VERSIONS, library_versions); SET_DO_SHOW(PACKETS, packets); + SET_DO_SHOW(PIXEL_FORMATS, pixel_formats); + SET_DO_SHOW(PIXEL_FORMAT_FLAGS, pixel_format_flags); + SET_DO_SHOW(PIXEL_FORMAT_COMPONENTS, pixel_format_components); SET_DO_SHOW(PROGRAM_VERSION, program_version); SET_DO_SHOW(PROGRAMS, programs); SET_DO_SHOW(STREAMS, streams); @@ -3048,10 +3142,12 @@ int main(int argc, char **argv) ffprobe_show_program_version(wctx); if (do_show_library_versions) ffprobe_show_library_versions(wctx); + if (do_show_pixel_formats) + ffprobe_show_pixel_formats(wctx); if (!input_filename && ((do_show_format || do_show_programs || do_show_streams || do_show_chapters || do_show_packets || do_show_error) || - (!do_show_program_version && !do_show_library_versions))) { + (!do_show_program_version && !do_show_library_versions && !do_show_pixel_formats))) { show_usage(); av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n"); av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);