|
|
|
@@ -57,6 +57,7 @@ static int do_show_error = 0; |
|
|
|
static int do_show_format = 0; |
|
|
|
static int do_show_frames = 0; |
|
|
|
static int do_show_packets = 0; |
|
|
|
static int do_show_programs = 0; |
|
|
|
static int do_show_streams = 0; |
|
|
|
static int do_show_stream_disposition = 0; |
|
|
|
static int do_show_data = 0; |
|
|
|
@@ -108,7 +109,14 @@ typedef enum { |
|
|
|
SECTION_ID_PACKET, |
|
|
|
SECTION_ID_PACKETS, |
|
|
|
SECTION_ID_PACKETS_AND_FRAMES, |
|
|
|
SECTION_ID_PROGRAM_STREAM_DISPOSITION, |
|
|
|
SECTION_ID_PROGRAM_STREAM_TAGS, |
|
|
|
SECTION_ID_PROGRAM, |
|
|
|
SECTION_ID_PROGRAM_STREAMS, |
|
|
|
SECTION_ID_PROGRAM_STREAM, |
|
|
|
SECTION_ID_PROGRAM_TAGS, |
|
|
|
SECTION_ID_PROGRAM_VERSION, |
|
|
|
SECTION_ID_PROGRAMS, |
|
|
|
SECTION_ID_ROOT, |
|
|
|
SECTION_ID_STREAM, |
|
|
|
SECTION_ID_STREAM_DISPOSITION, |
|
|
|
@@ -131,10 +139,17 @@ 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_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 } }, |
|
|
|
[SECTION_ID_PROGRAM_STREAMS] = { SECTION_ID_PROGRAM_STREAMS, "streams", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PROGRAM_STREAM, -1 }, .unique_name = "program_streams" }, |
|
|
|
[SECTION_ID_PROGRAM_STREAM] = { SECTION_ID_PROGRAM_STREAM, "stream", 0, { SECTION_ID_PROGRAM_STREAM_DISPOSITION, SECTION_ID_PROGRAM_STREAM_TAGS, -1 }, .unique_name = "program_stream" }, |
|
|
|
[SECTION_ID_PROGRAM_TAGS] = { SECTION_ID_PROGRAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "program_tags" }, |
|
|
|
[SECTION_ID_PROGRAM_VERSION] = { SECTION_ID_PROGRAM_VERSION, "program_version", 0, { -1 } }, |
|
|
|
[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_STREAMS, SECTION_ID_PACKETS, |
|
|
|
SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, -1} }, |
|
|
|
{ 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_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" }, |
|
|
|
@@ -1611,7 +1626,7 @@ static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx) |
|
|
|
static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx, int in_program) |
|
|
|
{ |
|
|
|
AVStream *stream = fmt_ctx->streams[stream_idx]; |
|
|
|
AVCodecContext *dec_ctx; |
|
|
|
@@ -1623,7 +1638,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i |
|
|
|
|
|
|
|
av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED); |
|
|
|
|
|
|
|
writer_print_section_header(w, SECTION_ID_STREAM); |
|
|
|
writer_print_section_header(w, in_program ? SECTION_ID_PROGRAM_STREAM : SECTION_ID_STREAM); |
|
|
|
|
|
|
|
print_int("index", stream->index); |
|
|
|
|
|
|
|
@@ -1739,7 +1754,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i |
|
|
|
} while (0) |
|
|
|
|
|
|
|
if (do_show_stream_disposition) { |
|
|
|
writer_print_section_header(w, SECTION_ID_STREAM_DISPOSITION); |
|
|
|
writer_print_section_header(w, in_program ? SECTION_ID_PROGRAM_STREAM_DISPOSITION : SECTION_ID_STREAM_DISPOSITION); |
|
|
|
PRINT_DISPOSITION(DEFAULT, "default"); |
|
|
|
PRINT_DISPOSITION(DUB, "dub"); |
|
|
|
PRINT_DISPOSITION(ORIGINAL, "original"); |
|
|
|
@@ -1754,7 +1769,7 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i |
|
|
|
writer_print_section_footer(w); |
|
|
|
} |
|
|
|
|
|
|
|
show_tags(w, stream->metadata, SECTION_ID_STREAM_TAGS); |
|
|
|
show_tags(w, stream->metadata, in_program ? SECTION_ID_PROGRAM_STREAM_TAGS : SECTION_ID_STREAM_TAGS); |
|
|
|
|
|
|
|
writer_print_section_footer(w); |
|
|
|
av_bprint_finalize(&pbuf, NULL); |
|
|
|
@@ -1767,7 +1782,47 @@ static void show_streams(WriterContext *w, AVFormatContext *fmt_ctx) |
|
|
|
writer_print_section_header(w, SECTION_ID_STREAMS); |
|
|
|
for (i = 0; i < fmt_ctx->nb_streams; i++) |
|
|
|
if (selected_streams[i]) |
|
|
|
show_stream(w, fmt_ctx, i); |
|
|
|
show_stream(w, fmt_ctx, i, 0); |
|
|
|
writer_print_section_footer(w); |
|
|
|
} |
|
|
|
|
|
|
|
static void show_program(WriterContext *w, AVFormatContext *fmt_ctx, AVProgram *program) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
writer_print_section_header(w, SECTION_ID_PROGRAM); |
|
|
|
print_int("program_id", program->id); |
|
|
|
print_int("program_num", program->program_num); |
|
|
|
print_int("nb_streams", program->nb_stream_indexes); |
|
|
|
print_int("pmt_pid", program->pmt_pid); |
|
|
|
print_int("pcr_pid", program->pcr_pid); |
|
|
|
print_ts("start_pts", program->start_time); |
|
|
|
print_time("start_time", program->start_time, &AV_TIME_BASE_Q); |
|
|
|
print_ts("end_pts", program->end_time); |
|
|
|
print_time("end_time", program->end_time, &AV_TIME_BASE_Q); |
|
|
|
show_tags(w, program->metadata, SECTION_ID_PROGRAM_TAGS); |
|
|
|
|
|
|
|
writer_print_section_header(w, SECTION_ID_PROGRAM_STREAMS); |
|
|
|
for (i = 0; i < program->nb_stream_indexes; i++) { |
|
|
|
if (selected_streams[program->stream_index[i]]) |
|
|
|
show_stream(w, fmt_ctx, program->stream_index[i], 1); |
|
|
|
} |
|
|
|
writer_print_section_footer(w); |
|
|
|
|
|
|
|
writer_print_section_footer(w); |
|
|
|
} |
|
|
|
|
|
|
|
static void show_programs(WriterContext *w, AVFormatContext *fmt_ctx) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
writer_print_section_header(w, SECTION_ID_PROGRAMS); |
|
|
|
for (i = 0; i < fmt_ctx->nb_programs; i++) { |
|
|
|
AVProgram *program = fmt_ctx->programs[i]; |
|
|
|
if (!program) |
|
|
|
continue; |
|
|
|
show_program(w, fmt_ctx, program); |
|
|
|
} |
|
|
|
writer_print_section_footer(w); |
|
|
|
} |
|
|
|
|
|
|
|
@@ -1800,6 +1855,7 @@ static void show_format(WriterContext *w, AVFormatContext *fmt_ctx) |
|
|
|
writer_print_section_header(w, SECTION_ID_FORMAT); |
|
|
|
print_str("filename", fmt_ctx->filename); |
|
|
|
print_int("nb_streams", fmt_ctx->nb_streams); |
|
|
|
print_int("nb_programs", fmt_ctx->nb_programs); |
|
|
|
print_str("format_name", fmt_ctx->iformat->name); |
|
|
|
if (!do_bitexact) { |
|
|
|
if (fmt_ctx->iformat->long_name) print_str ("format_long_name", fmt_ctx->iformat->long_name); |
|
|
|
@@ -1953,6 +2009,8 @@ static int probe_file(WriterContext *wctx, const char *filename) |
|
|
|
if (do_show_frames || do_show_packets) |
|
|
|
writer_print_section_footer(wctx); |
|
|
|
} |
|
|
|
if (do_show_programs) |
|
|
|
show_programs(wctx, fmt_ctx); |
|
|
|
if (do_show_streams) |
|
|
|
show_streams(wctx, fmt_ctx); |
|
|
|
if (do_show_chapters) |
|
|
|
@@ -2219,6 +2277,7 @@ DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS); |
|
|
|
DEFINE_OPT_SHOW_SECTION(packets, PACKETS); |
|
|
|
DEFINE_OPT_SHOW_SECTION(program_version, PROGRAM_VERSION); |
|
|
|
DEFINE_OPT_SHOW_SECTION(streams, STREAMS); |
|
|
|
DEFINE_OPT_SHOW_SECTION(programs, PROGRAMS); |
|
|
|
|
|
|
|
static const OptionDef real_options[] = { |
|
|
|
#include "cmdutils_common_opts.h" |
|
|
|
@@ -2245,6 +2304,7 @@ static const OptionDef real_options[] = { |
|
|
|
{ "show_entries", HAS_ARG, {.func_arg = opt_show_entries}, |
|
|
|
"show a set of specified entries", "entry_list" }, |
|
|
|
{ "show_packets", 0, {(void*)&opt_show_packets}, "show packets info" }, |
|
|
|
{ "show_programs", 0, {(void*)&opt_show_programs}, "show programs info" }, |
|
|
|
{ "show_streams", 0, {(void*)&opt_show_streams}, "show streams info" }, |
|
|
|
{ "show_chapters", 0, {(void*)&opt_show_chapters}, "show chapters info" }, |
|
|
|
{ "count_frames", OPT_BOOL, {(void*)&do_count_frames}, "count the number of frames per stream" }, |
|
|
|
@@ -2308,8 +2368,10 @@ int main(int argc, char **argv) |
|
|
|
SET_DO_SHOW(LIBRARY_VERSIONS, library_versions); |
|
|
|
SET_DO_SHOW(PACKETS, packets); |
|
|
|
SET_DO_SHOW(PROGRAM_VERSION, program_version); |
|
|
|
SET_DO_SHOW(PROGRAMS, programs); |
|
|
|
SET_DO_SHOW(STREAMS, streams); |
|
|
|
SET_DO_SHOW(STREAM_DISPOSITION, stream_disposition); |
|
|
|
SET_DO_SHOW(PROGRAM_STREAM_DISPOSITION, stream_disposition); |
|
|
|
|
|
|
|
if (do_bitexact && (do_show_program_version || do_show_library_versions)) { |
|
|
|
av_log(NULL, AV_LOG_ERROR, |
|
|
|
@@ -2347,7 +2409,7 @@ int main(int argc, char **argv) |
|
|
|
ffprobe_show_library_versions(wctx); |
|
|
|
|
|
|
|
if (!input_filename && |
|
|
|
((do_show_format || do_show_streams || do_show_chapters || do_show_packets || do_show_error) || |
|
|
|
((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))) { |
|
|
|
show_usage(); |
|
|
|
av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n"); |
|
|
|
|