Commit 47543450 authored by Anton Khirnov's avatar Anton Khirnov

avconv: print verbose per-stream transcoding statistics

parent a220b07b
...@@ -368,6 +368,7 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) ...@@ -368,6 +368,7 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
ost->last_mux_dts = pkt->dts; ost->last_mux_dts = pkt->dts;
ost->data_size += pkt->size; ost->data_size += pkt->size;
ost->packets_written++;
pkt->stream_index = ost->index; pkt->stream_index = ost->index;
ret = av_interleaved_write_frame(s, pkt); ret = av_interleaved_write_frame(s, pkt);
...@@ -405,6 +406,9 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost, ...@@ -405,6 +406,9 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
frame->pts = ost->sync_opts; frame->pts = ost->sync_opts;
ost->sync_opts = frame->pts + frame->nb_samples; ost->sync_opts = frame->pts + frame->nb_samples;
ost->samples_encoded += frame->nb_samples;
ost->frames_encoded++;
if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) { if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n"); av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
exit_program(1); exit_program(1);
...@@ -465,6 +469,9 @@ static void do_subtitle_out(AVFormatContext *s, ...@@ -465,6 +469,9 @@ static void do_subtitle_out(AVFormatContext *s,
sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
sub->end_display_time -= sub->start_display_time; sub->end_display_time -= sub->start_display_time;
sub->start_display_time = 0; sub->start_display_time = 0;
ost->frames_encoded++;
subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out, subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
subtitle_out_max_size, sub); subtitle_out_max_size, sub);
if (subtitle_out_size < 0) { if (subtitle_out_size < 0) {
...@@ -555,6 +562,9 @@ static void do_video_out(AVFormatContext *s, ...@@ -555,6 +562,9 @@ static void do_video_out(AVFormatContext *s,
in_picture->pict_type = AV_PICTURE_TYPE_I; in_picture->pict_type = AV_PICTURE_TYPE_I;
ost->forced_kf_index++; ost->forced_kf_index++;
} }
ost->frames_encoded++;
ret = avcodec_encode_video2(enc, &pkt, in_picture, &got_packet); ret = avcodec_encode_video2(enc, &pkt, in_picture, &got_packet);
if (ret < 0) { if (ret < 0) {
av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
...@@ -741,7 +751,7 @@ static void print_final_stats(int64_t total_size) ...@@ -741,7 +751,7 @@ static void print_final_stats(int64_t total_size)
uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size = 0; uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size = 0;
uint64_t data_size = 0; uint64_t data_size = 0;
float percent = -1.0; float percent = -1.0;
int i; int i, j;
for (i = 0; i < nb_output_streams; i++) { for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i]; OutputStream *ost = output_streams[i];
...@@ -768,6 +778,75 @@ static void print_final_stats(int64_t total_size) ...@@ -768,6 +778,75 @@ static void print_final_stats(int64_t total_size)
else else
av_log(NULL, AV_LOG_INFO, "unknown"); av_log(NULL, AV_LOG_INFO, "unknown");
av_log(NULL, AV_LOG_INFO, "\n"); av_log(NULL, AV_LOG_INFO, "\n");
/* print verbose per-stream stats */
for (i = 0; i < nb_input_files; i++) {
InputFile *f = input_files[i];
uint64_t total_packets = 0, total_size = 0;
av_log(NULL, AV_LOG_VERBOSE, "Input file #%d (%s):\n",
i, f->ctx->filename);
for (j = 0; j < f->nb_streams; j++) {
InputStream *ist = input_streams[f->ist_index + j];
enum AVMediaType type = ist->st->codec->codec_type;
total_size += ist->data_size;
total_packets += ist->nb_packets;
av_log(NULL, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ",
i, j, media_type_string(type));
av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ",
ist->nb_packets, ist->data_size);
if (ist->decoding_needed) {
av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames decoded",
ist->frames_decoded);
if (type == AVMEDIA_TYPE_AUDIO)
av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->samples_decoded);
av_log(NULL, AV_LOG_VERBOSE, "; ");
}
av_log(NULL, AV_LOG_VERBOSE, "\n");
}
av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n",
total_packets, total_size);
}
for (i = 0; i < nb_output_files; i++) {
OutputFile *of = output_files[i];
uint64_t total_packets = 0, total_size = 0;
av_log(NULL, AV_LOG_VERBOSE, "Output file #%d (%s):\n",
i, of->ctx->filename);
for (j = 0; j < of->ctx->nb_streams; j++) {
OutputStream *ost = output_streams[of->ost_index + j];
enum AVMediaType type = ost->st->codec->codec_type;
total_size += ost->data_size;
total_packets += ost->packets_written;
av_log(NULL, AV_LOG_VERBOSE, " Output stream #%d:%d (%s): ",
i, j, media_type_string(type));
if (ost->encoding_needed) {
av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames encoded",
ost->frames_encoded);
if (type == AVMEDIA_TYPE_AUDIO)
av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ost->samples_encoded);
av_log(NULL, AV_LOG_VERBOSE, "; ");
}
av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets muxed (%"PRIu64" bytes); ",
ost->packets_written, ost->data_size);
av_log(NULL, AV_LOG_VERBOSE, "\n");
}
av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) muxed\n",
total_packets, total_size);
}
} }
static void print_report(int is_last_report, int64_t timer_start) static void print_report(int is_last_report, int64_t timer_start)
...@@ -1087,6 +1166,9 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) ...@@ -1087,6 +1166,9 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
return ret; return ret;
} }
ist->samples_decoded += decoded_frame->nb_samples;
ist->frames_decoded++;
/* if the decoder provides a pts, use it instead of the last packet pts. /* if the decoder provides a pts, use it instead of the last packet pts.
the decoder could be delaying output by a packet or more. */ the decoder could be delaying output by a packet or more. */
if (decoded_frame->pts != AV_NOPTS_VALUE) if (decoded_frame->pts != AV_NOPTS_VALUE)
...@@ -1181,6 +1263,8 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) ...@@ -1181,6 +1263,8 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
return ret; return ret;
} }
ist->frames_decoded++;
if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) {
err = ist->hwaccel_retrieve_data(ist->st->codec, decoded_frame); err = ist->hwaccel_retrieve_data(ist->st->codec, decoded_frame);
if (err < 0) if (err < 0)
...@@ -1251,6 +1335,8 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output) ...@@ -1251,6 +1335,8 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
if (!*got_output) if (!*got_output)
return ret; return ret;
ist->frames_decoded++;
for (i = 0; i < nb_output_streams; i++) { for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i]; OutputStream *ost = output_streams[i];
...@@ -2232,7 +2318,10 @@ static int process_input(void) ...@@ -2232,7 +2318,10 @@ static int process_input(void)
goto discard_packet; goto discard_packet;
ist = input_streams[ifile->ist_index + pkt.stream_index]; ist = input_streams[ifile->ist_index + pkt.stream_index];
ist->data_size += pkt.size;
ist->nb_packets++; ist->nb_packets++;
if (ist->discard) if (ist->discard)
goto discard_packet; goto discard_packet;
......
...@@ -233,9 +233,6 @@ typedef struct InputStream { ...@@ -233,9 +233,6 @@ typedef struct InputStream {
AVDictionary *opts; AVDictionary *opts;
AVRational framerate; /* framerate forced with -r */ AVRational framerate; /* framerate forced with -r */
/* number of packets successfully read for this stream */
uint64_t nb_packets;
int resample_height; int resample_height;
int resample_width; int resample_width;
int resample_pix_fmt; int resample_pix_fmt;
...@@ -262,6 +259,15 @@ typedef struct InputStream { ...@@ -262,6 +259,15 @@ typedef struct InputStream {
int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame); int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame);
enum AVPixelFormat hwaccel_pix_fmt; enum AVPixelFormat hwaccel_pix_fmt;
enum AVPixelFormat hwaccel_retrieved_pix_fmt; enum AVPixelFormat hwaccel_retrieved_pix_fmt;
/* stats */
// combined size of all the packets read
uint64_t data_size;
/* number of packets successfully read for this stream */
uint64_t nb_packets;
// number of frames/samples retrieved from the decoder
uint64_t frames_decoded;
uint64_t samples_decoded;
} InputStream; } InputStream;
typedef struct InputFile { typedef struct InputFile {
...@@ -343,6 +349,11 @@ typedef struct OutputStream { ...@@ -343,6 +349,11 @@ typedef struct OutputStream {
/* stats */ /* stats */
// combined size of all the packets written // combined size of all the packets written
uint64_t data_size; uint64_t data_size;
// number of packets send to the muxer
uint64_t packets_written;
// number of frames/samples sent to the encoder
uint64_t frames_encoded;
uint64_t samples_encoded;
} OutputStream; } OutputStream;
typedef struct OutputFile { typedef struct OutputFile {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment