blob: f6605f902f07e282606a2d510f9f031b46a615bd [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 <assert.h>
14#include <stdio.h>
15
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000016#include <algorithm> // min_element, max_element
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000017
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000018namespace webrtc {
19namespace test {
20
pbos@webrtc.org7f7162a2013-07-30 15:18:31 +000021FrameStatistic::FrameStatistic()
22 : encoding_successful(false),
23 decoding_successful(false),
24 encode_return_code(0),
25 decode_return_code(0),
26 encode_time_in_us(0),
27 decode_time_in_us(0),
28 frame_number(0),
29 packets_dropped(0),
30 total_packets(0),
31 bit_rate_in_kbps(0),
32 encoded_frame_length_in_bytes(0),
33 frame_type(kDeltaFrame) {}
34
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000035Stats::Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000036
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000037Stats::~Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000038
39bool LessForEncodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
40 return s1.encode_time_in_us < s2.encode_time_in_us;
41}
42
43bool LessForDecodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
44 return s1.decode_time_in_us < s2.decode_time_in_us;
45}
46
47bool LessForEncodedSize(const FrameStatistic& s1, const FrameStatistic& s2) {
48 return s1.encoded_frame_length_in_bytes < s2.encoded_frame_length_in_bytes;
49}
50
51bool LessForBitRate(const FrameStatistic& s1, const FrameStatistic& s2) {
52 return s1.bit_rate_in_kbps < s2.bit_rate_in_kbps;
53}
54
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000055FrameStatistic& Stats::NewFrame(int frame_number) {
56 assert(frame_number >= 0);
57 FrameStatistic stat;
58 stat.frame_number = frame_number;
59 stats_.push_back(stat);
60 return stats_[frame_number];
61}
62
63void Stats::PrintSummary() {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000064 printf("Processing summary:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000065 if (stats_.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000066 printf("No frame statistics have been logged yet.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000067 return;
68 }
69
70 // Calculate min, max, average and total encoding time
71 int total_encoding_time_in_us = 0;
72 int total_decoding_time_in_us = 0;
73 int total_encoded_frames_lengths = 0;
74 int total_encoded_key_frames_lengths = 0;
75 int total_encoded_nonkey_frames_lengths = 0;
76 int nbr_keyframes = 0;
77 int nbr_nonkeyframes = 0;
78
79 for (FrameStatisticsIterator it = stats_.begin();
80 it != stats_.end(); ++it) {
81 total_encoding_time_in_us += it->encode_time_in_us;
82 total_decoding_time_in_us += it->decode_time_in_us;
83 total_encoded_frames_lengths += it->encoded_frame_length_in_bytes;
84 if (it->frame_type == webrtc::kKeyFrame) {
85 total_encoded_key_frames_lengths += it->encoded_frame_length_in_bytes;
86 nbr_keyframes++;
87 } else {
88 total_encoded_nonkey_frames_lengths += it->encoded_frame_length_in_bytes;
89 nbr_nonkeyframes++;
90 }
91 }
92
93 FrameStatisticsIterator frame;
94
95 // ENCODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000096 printf("Encoding time:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +000097 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000098 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000099 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000100 frame->encode_time_in_us, frame->frame_number);
101
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000102 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000103 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000104 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000105 frame->encode_time_in_us, frame->frame_number);
106
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000107 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000108 static_cast<int>(total_encoding_time_in_us / stats_.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000109
110 // DECODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000111 printf("Decoding time:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000112 // only consider frames that were successfully decoded (packet loss may cause
113 // failures)
114 std::vector<FrameStatistic> decoded_frames;
115 for (std::vector<FrameStatistic>::iterator it = stats_.begin();
116 it != stats_.end(); ++it) {
117 if (it->decoding_successful) {
118 decoded_frames.push_back(*it);
119 }
120 }
121 if (decoded_frames.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000122 printf("No successfully decoded frames exist in this statistics.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000123 } else {
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000124 frame = std::min_element(decoded_frames.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000125 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000126 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000127 frame->decode_time_in_us, frame->frame_number);
128
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000129 frame = std::max_element(decoded_frames.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000130 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000131 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000132 frame->decode_time_in_us, frame->frame_number);
133
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000134 printf(" Average : %7d us\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000135 static_cast<int>(total_decoding_time_in_us / decoded_frames.size()));
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000136 printf(" Failures: %d frames failed to decode.\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000137 static_cast<int>(stats_.size() - decoded_frames.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000138 }
139
140 // SIZE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000141 printf("Frame sizes:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000142 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000143 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000144 printf(" Min : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000145 frame->encoded_frame_length_in_bytes, frame->frame_number);
146
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000147 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000148 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000149 printf(" Max : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000150 frame->encoded_frame_length_in_bytes, frame->frame_number);
151
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000152 printf(" Average : %7d bytes\n",
kjellander@webrtc.org7de6e102011-12-08 08:39:13 +0000153 static_cast<int>(total_encoded_frames_lengths / stats_.size()));
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000154 if (nbr_keyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000155 printf(" Average key frame size : %7d bytes (%d keyframes)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000156 total_encoded_key_frames_lengths / nbr_keyframes,
157 nbr_keyframes);
158 }
159 if (nbr_nonkeyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000160 printf(" Average non-key frame size: %7d bytes (%d frames)\n",
161 total_encoded_nonkey_frames_lengths / nbr_nonkeyframes,
162 nbr_nonkeyframes);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000163 }
164
165 // BIT RATE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000166 printf("Bit rates:\n");
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000167 frame = std::min_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000168 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000169 printf(" Min bit rate: %7d kbps (frame %d)\n",
170 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000171
leozwang@webrtc.orgdb2de5b2012-03-05 19:53:24 +0000172 frame = std::max_element(stats_.begin(),
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000173 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000174 printf(" Max bit rate: %7d kbps (frame %d)\n",
175 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000176
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000177 printf("\n");
178 printf("Total encoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000179 total_encoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000180 printf("Total decoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000181 total_decoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000182 printf("Total processing time: %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000183 (total_encoding_time_in_us + total_decoding_time_in_us) / 1000);
184}
185
186} // namespace test
187} // namespace webrtc