blob: 173cd16fcbf09b987f59bac29923a1c8786b420c [file] [log] [blame]
kjellander@webrtc.org35a17562011-10-06 06:44:54 +00001/*
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
kjellander@webrtc.org35a17562011-10-06 06:44:54 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000010
pbos@webrtc.orga4407322013-07-16 12:32:05 +000011#include "webrtc/modules/video_coding/codecs/test/stats.h"
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000012
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000013#include <stdio.h>
14
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000015#include <algorithm> // min_element, max_element
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000016
kjellanderc8fa6922017-06-30 14:02:00 -070017#include "webrtc/rtc_base/checks.h"
18#include "webrtc/rtc_base/format_macros.h"
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000019
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000020namespace webrtc {
21namespace test {
asapersson68b91d72017-06-04 23:43:41 -070022namespace {
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000023bool LessForEncodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
philipelcce46fc2015-12-21 03:04:49 -080024 return s1.encode_time_in_us < s2.encode_time_in_us;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000025}
26
27bool LessForDecodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
philipelcce46fc2015-12-21 03:04:49 -080028 return s1.decode_time_in_us < s2.decode_time_in_us;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000029}
30
31bool LessForEncodedSize(const FrameStatistic& s1, const FrameStatistic& s2) {
philipelcce46fc2015-12-21 03:04:49 -080032 return s1.encoded_frame_length_in_bytes < s2.encoded_frame_length_in_bytes;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000033}
34
35bool LessForBitRate(const FrameStatistic& s1, const FrameStatistic& s2) {
philipelcce46fc2015-12-21 03:04:49 -080036 return s1.bit_rate_in_kbps < s2.bit_rate_in_kbps;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000037}
asapersson68b91d72017-06-04 23:43:41 -070038} // namespace
39
40Stats::Stats() {}
41
42Stats::~Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000043
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000044FrameStatistic& Stats::NewFrame(int frame_number) {
asapersson68b91d72017-06-04 23:43:41 -070045 RTC_DCHECK_GE(frame_number, 0);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000046 FrameStatistic stat;
47 stat.frame_number = frame_number;
48 stats_.push_back(stat);
49 return stats_[frame_number];
50}
51
52void Stats::PrintSummary() {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000053 printf("Processing summary:\n");
asapersson68b91d72017-06-04 23:43:41 -070054 if (stats_.empty()) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000055 printf("No frame statistics have been logged yet.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000056 return;
57 }
58
asapersson68b91d72017-06-04 23:43:41 -070059 // Calculate min, max, average and total encoding time.
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000060 int total_encoding_time_in_us = 0;
61 int total_decoding_time_in_us = 0;
asaperssonabc00802017-02-23 01:33:04 -080062 int total_qp = 0;
63 int total_qp_count = 0;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000064 size_t total_encoded_frames_lengths = 0;
65 size_t total_encoded_key_frames_lengths = 0;
66 size_t total_encoded_nonkey_frames_lengths = 0;
asapersson68b91d72017-06-04 23:43:41 -070067 size_t num_keyframes = 0;
68 size_t num_nonkeyframes = 0;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000069
asapersson68b91d72017-06-04 23:43:41 -070070 for (const FrameStatistic& stat : stats_) {
71 total_encoding_time_in_us += stat.encode_time_in_us;
72 total_decoding_time_in_us += stat.decode_time_in_us;
73 total_encoded_frames_lengths += stat.encoded_frame_length_in_bytes;
74 if (stat.frame_type == webrtc::kVideoFrameKey) {
75 total_encoded_key_frames_lengths += stat.encoded_frame_length_in_bytes;
76 ++num_keyframes;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000077 } else {
asapersson68b91d72017-06-04 23:43:41 -070078 total_encoded_nonkey_frames_lengths += stat.encoded_frame_length_in_bytes;
79 ++num_nonkeyframes;
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000080 }
asapersson68b91d72017-06-04 23:43:41 -070081 if (stat.qp >= 0) {
82 total_qp += stat.qp;
asaperssonabc00802017-02-23 01:33:04 -080083 ++total_qp_count;
84 }
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000085 }
86
asapersson68b91d72017-06-04 23:43:41 -070087 // Encoding stats.
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000088 printf("Encoding time:\n");
asapersson68b91d72017-06-04 23:43:41 -070089 FrameStatisticsIterator frame;
philipelcce46fc2015-12-21 03:04:49 -080090 frame = std::min_element(stats_.begin(), stats_.end(), LessForEncodeTime);
91 printf(" Min : %7d us (frame %d)\n", frame->encode_time_in_us,
92 frame->frame_number);
philipelcce46fc2015-12-21 03:04:49 -080093 frame = std::max_element(stats_.begin(), stats_.end(), LessForEncodeTime);
94 printf(" Max : %7d us (frame %d)\n", frame->encode_time_in_us,
95 frame->frame_number);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000096 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +000097 static_cast<int>(total_encoding_time_in_us / stats_.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000098
asapersson68b91d72017-06-04 23:43:41 -070099 // Decoding stats.
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000100 printf("Decoding time:\n");
asapersson68b91d72017-06-04 23:43:41 -0700101 // Only consider successfully decoded frames (packet loss may cause failures).
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000102 std::vector<FrameStatistic> decoded_frames;
asapersson68b91d72017-06-04 23:43:41 -0700103 for (const FrameStatistic& stat : stats_) {
104 if (stat.decoding_successful) {
105 decoded_frames.push_back(stat);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000106 }
107 }
asapersson68b91d72017-06-04 23:43:41 -0700108 if (decoded_frames.empty()) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000109 printf("No successfully decoded frames exist in this statistics.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000110 } else {
philipelcce46fc2015-12-21 03:04:49 -0800111 frame = std::min_element(decoded_frames.begin(), decoded_frames.end(),
112 LessForDecodeTime);
113 printf(" Min : %7d us (frame %d)\n", frame->decode_time_in_us,
114 frame->frame_number);
philipelcce46fc2015-12-21 03:04:49 -0800115 frame = std::max_element(decoded_frames.begin(), decoded_frames.end(),
116 LessForDecodeTime);
117 printf(" Max : %7d us (frame %d)\n", frame->decode_time_in_us,
118 frame->frame_number);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000119 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000120 static_cast<int>(total_decoding_time_in_us / decoded_frames.size()));
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000121 printf(" Failures: %d frames failed to decode.\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000122 static_cast<int>(stats_.size() - decoded_frames.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000123 }
124
asapersson68b91d72017-06-04 23:43:41 -0700125 // Frame size stats.
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000126 printf("Frame sizes:\n");
philipelcce46fc2015-12-21 03:04:49 -0800127 frame = std::min_element(stats_.begin(), stats_.end(), LessForEncodedSize);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000128 printf(" Min : %7" PRIuS " bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000129 frame->encoded_frame_length_in_bytes, frame->frame_number);
philipelcce46fc2015-12-21 03:04:49 -0800130 frame = std::max_element(stats_.begin(), stats_.end(), LessForEncodedSize);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000131 printf(" Max : %7" PRIuS " bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000132 frame->encoded_frame_length_in_bytes, frame->frame_number);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000133 printf(" Average : %7" PRIuS " bytes\n",
134 total_encoded_frames_lengths / stats_.size());
asapersson68b91d72017-06-04 23:43:41 -0700135 if (num_keyframes > 0) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000136 printf(" Average key frame size : %7" PRIuS " bytes (%" PRIuS
137 " keyframes)\n",
asapersson68b91d72017-06-04 23:43:41 -0700138 total_encoded_key_frames_lengths / num_keyframes, num_keyframes);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000139 }
asapersson68b91d72017-06-04 23:43:41 -0700140 if (num_nonkeyframes > 0) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000141 printf(" Average non-key frame size: %7" PRIuS " bytes (%" PRIuS
142 " frames)\n",
asapersson68b91d72017-06-04 23:43:41 -0700143 total_encoded_nonkey_frames_lengths / num_nonkeyframes,
144 num_nonkeyframes);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000145 }
146
asapersson68b91d72017-06-04 23:43:41 -0700147 // Bitrate stats.
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000148 printf("Bit rates:\n");
philipelcce46fc2015-12-21 03:04:49 -0800149 frame = std::min_element(stats_.begin(), stats_.end(), LessForBitRate);
150 printf(" Min bit rate: %7d kbps (frame %d)\n", frame->bit_rate_in_kbps,
151 frame->frame_number);
philipelcce46fc2015-12-21 03:04:49 -0800152 frame = std::max_element(stats_.begin(), stats_.end(), LessForBitRate);
153 printf(" Max bit rate: %7d kbps (frame %d)\n", frame->bit_rate_in_kbps,
154 frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000155
asaperssonabc00802017-02-23 01:33:04 -0800156 int avg_qp = (total_qp_count > 0) ? (total_qp / total_qp_count) : -1;
157 printf("Average QP: %d\n", avg_qp);
158
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000159 printf("\n");
philipelcce46fc2015-12-21 03:04:49 -0800160 printf("Total encoding time : %7d ms.\n", total_encoding_time_in_us / 1000);
161 printf("Total decoding time : %7d ms.\n", total_decoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000162 printf("Total processing time: %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000163 (total_encoding_time_in_us + total_decoding_time_in_us) / 1000);
164}
165
166} // namespace test
167} // namespace webrtc