blob: bd29f13602ba98dfe89e6002c67ddd5891cd469d [file] [log] [blame]
kjellander@webrtc.org35a17562011-10-06 06:44:54 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
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
11#include "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
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000020Stats::Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000021
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000022Stats::~Stats() {}
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000023
24bool LessForEncodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
25 return s1.encode_time_in_us < s2.encode_time_in_us;
26}
27
28bool LessForDecodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
29 return s1.decode_time_in_us < s2.decode_time_in_us;
30}
31
32bool LessForEncodedSize(const FrameStatistic& s1, const FrameStatistic& s2) {
33 return s1.encoded_frame_length_in_bytes < s2.encoded_frame_length_in_bytes;
34}
35
36bool LessForBitRate(const FrameStatistic& s1, const FrameStatistic& s2) {
37 return s1.bit_rate_in_kbps < s2.bit_rate_in_kbps;
38}
39
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000040FrameStatistic& Stats::NewFrame(int frame_number) {
41 assert(frame_number >= 0);
42 FrameStatistic stat;
43 stat.frame_number = frame_number;
44 stats_.push_back(stat);
45 return stats_[frame_number];
46}
47
48void Stats::PrintSummary() {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000049 printf("Processing summary:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000050 if (stats_.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000051 printf("No frame statistics have been logged yet.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000052 return;
53 }
54
55 // Calculate min, max, average and total encoding time
56 int total_encoding_time_in_us = 0;
57 int total_decoding_time_in_us = 0;
58 int total_encoded_frames_lengths = 0;
59 int total_encoded_key_frames_lengths = 0;
60 int total_encoded_nonkey_frames_lengths = 0;
61 int nbr_keyframes = 0;
62 int nbr_nonkeyframes = 0;
63
64 for (FrameStatisticsIterator it = stats_.begin();
65 it != stats_.end(); ++it) {
66 total_encoding_time_in_us += it->encode_time_in_us;
67 total_decoding_time_in_us += it->decode_time_in_us;
68 total_encoded_frames_lengths += it->encoded_frame_length_in_bytes;
69 if (it->frame_type == webrtc::kKeyFrame) {
70 total_encoded_key_frames_lengths += it->encoded_frame_length_in_bytes;
71 nbr_keyframes++;
72 } else {
73 total_encoded_nonkey_frames_lengths += it->encoded_frame_length_in_bytes;
74 nbr_nonkeyframes++;
75 }
76 }
77
78 FrameStatisticsIterator frame;
79
80 // ENCODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000081 printf("Encoding time:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000082 frame = min_element(stats_.begin(),
83 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000084 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000085 frame->encode_time_in_us, frame->frame_number);
86
87 frame = max_element(stats_.begin(),
88 stats_.end(), LessForEncodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000089 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000090 frame->encode_time_in_us, frame->frame_number);
91
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000092 printf(" Average : %7d us\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000093 total_encoding_time_in_us / stats_.size());
94
95 // DECODING
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +000096 printf("Decoding time:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +000097 // only consider frames that were successfully decoded (packet loss may cause
98 // failures)
99 std::vector<FrameStatistic> decoded_frames;
100 for (std::vector<FrameStatistic>::iterator it = stats_.begin();
101 it != stats_.end(); ++it) {
102 if (it->decoding_successful) {
103 decoded_frames.push_back(*it);
104 }
105 }
106 if (decoded_frames.size() == 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000107 printf("No successfully decoded frames exist in this statistics.\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000108 } else {
109 frame = min_element(decoded_frames.begin(),
110 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000111 printf(" Min : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000112 frame->decode_time_in_us, frame->frame_number);
113
114 frame = max_element(decoded_frames.begin(),
115 decoded_frames.end(), LessForDecodeTime);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000116 printf(" Max : %7d us (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000117 frame->decode_time_in_us, frame->frame_number);
118
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000119 printf(" Average : %7d us\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000120 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.org35a17562011-10-06 06:44:54 +0000122 (stats_.size() - decoded_frames.size()));
123 }
124
125 // SIZE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000126 printf("Frame sizes:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000127 frame = min_element(stats_.begin(),
128 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000129 printf(" Min : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000130 frame->encoded_frame_length_in_bytes, frame->frame_number);
131
132 frame = max_element(stats_.begin(),
133 stats_.end(), LessForEncodedSize);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000134 printf(" Max : %7d bytes (frame %d)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000135 frame->encoded_frame_length_in_bytes, frame->frame_number);
136
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000137 printf(" Average : %7d bytes\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000138 total_encoded_frames_lengths / stats_.size());
139 if (nbr_keyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000140 printf(" Average key frame size : %7d bytes (%d keyframes)\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000141 total_encoded_key_frames_lengths / nbr_keyframes,
142 nbr_keyframes);
143 }
144 if (nbr_nonkeyframes > 0) {
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000145 printf(" Average non-key frame size: %7d bytes (%d frames)\n",
146 total_encoded_nonkey_frames_lengths / nbr_nonkeyframes,
147 nbr_nonkeyframes);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000148 }
149
150 // BIT RATE
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000151 printf("Bit rates:\n");
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000152 frame = min_element(stats_.begin(),
153 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000154 printf(" Min bit rate: %7d kbps (frame %d)\n",
155 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000156
157 frame = max_element(stats_.begin(),
158 stats_.end(), LessForBitRate);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000159 printf(" Max bit rate: %7d kbps (frame %d)\n",
160 frame->bit_rate_in_kbps, frame->frame_number);
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000161
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000162 printf("\n");
163 printf("Total encoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000164 total_encoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000165 printf("Total decoding time : %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000166 total_decoding_time_in_us / 1000);
kjellander@webrtc.org5b97b122011-12-08 07:42:18 +0000167 printf("Total processing time: %7d ms.\n",
kjellander@webrtc.org35a17562011-10-06 06:44:54 +0000168 (total_encoding_time_in_us + total_decoding_time_in_us) / 1000);
169}
170
171} // namespace test
172} // namespace webrtc