From ba357e98691ee4fe1a503b8830c0050be4127475 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 24 Feb 2016 16:32:19 +0100 Subject: [PATCH] avprobe: switch to codecpar --- avprobe.c | 107 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 42 deletions(-) diff --git a/avprobe.c b/avprobe.c index 189574f85b..a0e14d4488 100644 --- a/avprobe.c +++ b/avprobe.c @@ -34,6 +34,8 @@ typedef struct InputStream { AVStream *st; + + AVCodecContext *dec_ctx; } InputStream; typedef struct InputFile { @@ -574,7 +576,7 @@ static void show_packet(AVFormatContext *fmt_ctx, AVPacket *pkt) AVStream *st = fmt_ctx->streams[pkt->stream_index]; probe_object_header("packet"); - probe_str("codec_type", media_type_string(st->codec->codec_type)); + probe_str("codec_type", media_type_string(st->codecpar->codec_type)); probe_int("stream_index", pkt->stream_index); probe_str("pts", ts_value_string(val_str, sizeof(val_str), pkt->pts)); probe_str("pts_time", time_value_string(val_str, sizeof(val_str), @@ -608,10 +610,11 @@ static void show_packets(InputFile *ifile) probe_array_footer("packets", 0); } -static void show_stream(InputFile *ifile, int stream_idx) +static void show_stream(InputFile *ifile, InputStream *ist) { AVFormatContext *fmt_ctx = ifile->fmt_ctx; - AVStream *stream = fmt_ctx->streams[stream_idx]; + AVStream *stream = ist->st; + AVCodecParameters *par; AVCodecContext *dec_ctx; const AVCodecDescriptor *codec_desc; const char *profile; @@ -623,8 +626,9 @@ static void show_stream(InputFile *ifile, int stream_idx) probe_int("index", stream->index); - dec_ctx = stream->codec; - codec_desc = avcodec_descriptor_get(dec_ctx->codec_id); + par = stream->codecpar; + dec_ctx = ist->dec_ctx; + codec_desc = avcodec_descriptor_get(par->codec_id); if (codec_desc) { probe_str("codec_name", codec_desc->name); probe_str("codec_long_name", codec_desc->long_name); @@ -632,31 +636,32 @@ static void show_stream(InputFile *ifile, int stream_idx) probe_str("codec_name", "unknown"); } - probe_str("codec_type", media_type_string(dec_ctx->codec_type)); - probe_str("codec_time_base", - rational_string(val_str, sizeof(val_str), - "/", &dec_ctx->time_base)); + probe_str("codec_type", media_type_string(par->codec_type)); /* print AVI/FourCC tag */ - av_get_codec_tag_string(val_str, sizeof(val_str), dec_ctx->codec_tag); + av_get_codec_tag_string(val_str, sizeof(val_str), par->codec_tag); probe_str("codec_tag_string", val_str); probe_str("codec_tag", tag_string(val_str, sizeof(val_str), - dec_ctx->codec_tag)); + par->codec_tag)); /* print profile, if there is one */ - profile = avcodec_profile_name(dec_ctx->codec_id, dec_ctx->profile); + profile = avcodec_profile_name(par->codec_id, par->profile); if (profile) probe_str("profile", profile); - switch (dec_ctx->codec_type) { + switch (par->codec_type) { case AVMEDIA_TYPE_VIDEO: - probe_int("width", dec_ctx->width); - probe_int("height", dec_ctx->height); - probe_int("coded_width", dec_ctx->coded_width); - probe_int("coded_height", dec_ctx->coded_height); - probe_int("has_b_frames", dec_ctx->has_b_frames); - if (dec_ctx->sample_aspect_ratio.num) + probe_int("width", par->width); + probe_int("height", par->height); + if (dec_ctx) { + probe_int("coded_width", dec_ctx->coded_width); + probe_int("coded_height", dec_ctx->coded_height); + probe_int("has_b_frames", dec_ctx->has_b_frames); + } + if (dec_ctx && dec_ctx->sample_aspect_ratio.num) sar = &dec_ctx->sample_aspect_ratio; + else if (par->sample_aspect_ratio.num) + sar = &par->sample_aspect_ratio; else if (stream->sample_aspect_ratio.num) sar = &stream->sample_aspect_ratio; @@ -664,31 +669,31 @@ static void show_stream(InputFile *ifile, int stream_idx) probe_str("sample_aspect_ratio", rational_string(val_str, sizeof(val_str), ":", sar)); av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, - dec_ctx->width * sar->num, dec_ctx->height * sar->den, + par->width * sar->num, par->height * sar->den, 1024*1024); probe_str("display_aspect_ratio", rational_string(val_str, sizeof(val_str), ":", &display_aspect_ratio)); } - desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt); + desc = av_pix_fmt_desc_get(par->format); probe_str("pix_fmt", desc ? desc->name : "unknown"); - probe_int("level", dec_ctx->level); + probe_int("level", par->level); - probe_str("color_range", av_color_range_name(dec_ctx->color_range)); - probe_str("color_space", av_color_space_name(dec_ctx->colorspace)); - probe_str("color_trc", av_color_transfer_name(dec_ctx->color_trc)); - probe_str("color_pri", av_color_primaries_name(dec_ctx->color_primaries)); - probe_str("chroma_loc", av_chroma_location_name(dec_ctx->chroma_sample_location)); + probe_str("color_range", av_color_range_name (par->color_range)); + probe_str("color_space", av_color_space_name (par->color_space)); + probe_str("color_trc", av_color_transfer_name (par->color_trc)); + probe_str("color_pri", av_color_primaries_name(par->color_primaries)); + probe_str("chroma_loc", av_chroma_location_name (par->chroma_location)); break; case AVMEDIA_TYPE_AUDIO: probe_str("sample_rate", value_string(val_str, sizeof(val_str), - dec_ctx->sample_rate, + par->sample_rate, unit_hertz_str)); - probe_int("channels", dec_ctx->channels); + probe_int("channels", par->channels); probe_int("bits_per_sample", - av_get_bits_per_sample(dec_ctx->codec_id)); + av_get_bits_per_sample(par->codec_id)); break; } @@ -697,10 +702,11 @@ static void show_stream(InputFile *ifile, int stream_idx) probe_str("avg_frame_rate", rational_string(val_str, sizeof(val_str), "/", &stream->avg_frame_rate)); - if (dec_ctx->bit_rate) + + if (par->bit_rate) probe_str("bit_rate", value_string(val_str, sizeof(val_str), - dec_ctx->bit_rate, unit_bit_per_second_str)); + par->bit_rate, unit_bit_per_second_str)); probe_str("time_base", rational_string(val_str, sizeof(val_str), "/", &stream->time_base)); @@ -808,16 +814,34 @@ static int open_input_file(InputFile *ifile, const char *filename) ist->st = stream; - if (stream->codec->codec_id == AV_CODEC_ID_PROBE) { + if (stream->codecpar->codec_id == AV_CODEC_ID_PROBE) { fprintf(stderr, "Failed to probe codec for input stream %d\n", stream->index); - } else if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { + continue; + } + + codec = avcodec_find_decoder(stream->codecpar->codec_id); + if (!codec) { fprintf(stderr, "Unsupported codec with id %d for input stream %d\n", - stream->codec->codec_id, stream->index); - } else if (avcodec_open2(stream->codec, codec, NULL) < 0) { + stream->codecpar->codec_id, stream->index); + continue; + } + + ist->dec_ctx = avcodec_alloc_context3(codec); + if (!ist->dec_ctx) + exit(1); + + err = avcodec_parameters_to_context(ist->dec_ctx, stream->codecpar); + if (err < 0) + exit(1); + + err = avcodec_open2(ist->dec_ctx, NULL, NULL); + if (err < 0) { fprintf(stderr, "Error while opening codec for input stream %d\n", stream->index); + exit(1); + } } @@ -828,13 +852,12 @@ static int open_input_file(InputFile *ifile, const char *filename) static void close_input_file(InputFile *ifile) { int i; - AVFormatContext *fmt_ctx = ifile->fmt_ctx; /* close decoder for each stream */ - for (i = 0; i < fmt_ctx->nb_streams; i++) { - AVStream *stream = fmt_ctx->streams[i]; + for (i = 0; i < ifile->nb_streams; i++) { + InputStream *ist = &ifile->streams[i]; - avcodec_close(stream->codec); + avcodec_free_context(&ist->dec_ctx); } av_freep(&ifile->streams); @@ -857,8 +880,8 @@ static int probe_file(const char *filename) if (do_show_streams) { probe_array_header("streams", 0); - for (i = 0; i < ifile.fmt_ctx->nb_streams; i++) - show_stream(&ifile, i); + for (i = 0; i < ifile.nb_streams; i++) + show_stream(&ifile, &ifile.streams[i]); probe_array_footer("streams", 0); }