blob: 17a88aff11b6ed1fe977a1e19e79bfbc0bb832b5 [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
13#include <algorithm> // min_element, max_element
14#include <cassert>
15#include <cstdio>
16
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000017namespace webrtc {
18namespace test {
19
pbos@webrtc.org7f7162a2013-07-30 15:18:31 +000020FrameStatistic::FrameStatistic()
21 : encoding_successful(false),
22 decoding_successful(false),
23 encode_return_code(0),
24 decode_return_code(0),
25 encode_time_in_us(0),
26 decode_time_in_us(0),
27 frame_number(0),
28 packets_dropped(0),
29 total_packets(0),
30 bit_rate_in_kbps(0),
31 encoded_frame_length_in_bytes(0),
32 frame_type(kDeltaFrame) {}
33
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000034Stats::Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000035
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000036Stats::~Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000037
38bool LessForEncodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
39 return s1.encode_time_in_us < s2.encode_time_in_us;
40}
41
42bool LessForDecodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
43 return s1.decode_time_in_us < s2.decode_time_in_us;
44}
45
46bool LessForEncodedSize(const FrameStatistic& s1, const FrameStatistic& s2) {
47 return s1.encoded_frame_length_in_bytes < s2.encoded_frame_length_in_bytes;
48}
49
50bool LessForBitRate(const FrameStatistic& s1, const FrameStatistic& s2) {
51 return s1.bit_rate_in_kbps < s2.bit_rate_in_kbps;
52}
53
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000054FrameStatistic& Stats::NewFrame(int frame_number) {
55 assert(frame_number >= 0);
56 FrameStatistic stat;
57 stat.frame_number = frame_number;
58 stats_.push_back(stat);
59 return stats_[frame_number];
60}
61
62void Stats::PrintSummary() {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000063 printf("Processing summary:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000064 if (stats_.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000065 printf("No frame statistics have been logged yet.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000066 return;
67 }
68
69 // Calculate min, max, average and total encoding time
70 int total_encoding_time_in_us = 0;
71 int total_decoding_time_in_us = 0;
72 int total_encoded_frames_lengths = 0;
73 int total_encoded_key_frames_lengths = 0;
74 int total_encoded_nonkey_frames_lengths = 0;
75 int nbr_keyframes = 0;
76 int nbr_nonkeyframes = 0;
77
78 for (FrameStatisticsIterator it = stats_.begin();
79 it != stats_.end(); ++it) {
80 total_encoding_time_in_us += it->encode_time_in_us;
81 total_decoding_time_in_us += it->decode_time_in_us;
82 total_encoded_frames_lengths += it->encoded_frame_length_in_bytes;
83 if (it->frame_type == webrtc::kKeyFrame) {
84 total_encoded_key_frames_lengths += it->encoded_frame_length_in_bytes;
85 nbr_keyframes++;
86 } else {
87 total_encoded_nonkey_frames_lengths += it->encoded_frame_length_in_bytes;
88 nbr_nonkeyframes++;
89 }
90 }
91
92 FrameStatisticsIterator frame;
93
94 // ENCODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000095 printf("Encoding time:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +000096 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000097 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000098 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000099 frame->encode_time_in_us, frame->frame_number);
100
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000101 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000102 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000103 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000104 frame->encode_time_in_us, frame->frame_number);
105
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000106 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000107 static_cast<int>(total_encoding_time_in_us / stats_.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000108
109 // DECODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000110 printf("Decoding time:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000111 // only consider frames that were successfully decoded (packet loss may cause
112 // failures)
113 std::vector<FrameStatistic> decoded_frames;
114 for (std::vector<FrameStatistic>::iterator it = stats_.begin();
115 it != stats_.end(); ++it) {
116 if (it->decoding_successful) {
117 decoded_frames.push_back(*it);
118 }
119 }
120 if (decoded_frames.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000121 printf("No successfully decoded frames exist in this statistics.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000122 } else {
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000123 frame = std::min_element(decoded_frames.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000124 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000125 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000126 frame->decode_time_in_us, frame->frame_number);
127
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000128 frame = std::max_element(decoded_frames.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000129 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000130 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000131 frame->decode_time_in_us, frame->frame_number);
132
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000133 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000134 static_cast<int>(total_decoding_time_in_us / decoded_frames.size()));
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000135 printf(" Failures: %d frames failed to decode.\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000136 static_cast<int>(stats_.size() - decoded_frames.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000137 }
138
139 // SIZE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000140 printf("Frame sizes:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000141 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000142 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000143 printf(" Min : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000144 frame->encoded_frame_length_in_bytes, frame->frame_number);
145
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000146 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000147 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000148 printf(" Max : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000149 frame->encoded_frame_length_in_bytes, frame->frame_number);
150
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000151 printf(" Average : %7d bytes\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000152 static_cast<int>(total_encoded_frames_lengths / stats_.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000153 if (nbr_keyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000154 printf(" Average key frame size : %7d bytes (%d keyframes)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000155 total_encoded_key_frames_lengths / nbr_keyframes,
156 nbr_keyframes);
157 }
158 if (nbr_nonkeyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000159 printf(" Average non-key frame size: %7d bytes (%d frames)\n",
160 total_encoded_nonkey_frames_lengths / nbr_nonkeyframes,
161 nbr_nonkeyframes);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000162 }
163
164 // BIT RATE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000165 printf("Bit rates:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000166 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000167 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000168 printf(" Min bit rate: %7d kbps (frame %d)\n",
169 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000170
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000171 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000172 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000173 printf(" Max bit rate: %7d kbps (frame %d)\n",
174 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000175
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000176 printf("\n");
177 printf("Total encoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000178 total_encoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000179 printf("Total decoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000180 total_decoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000181 printf("Total processing time: %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000182 (total_encoding_time_in_us + total_decoding_time_in_us) / 1000);
183}
184
185} // namespace test
186} // namespace webrtc