annotate base/test/TestOurRealTime.h @ 1288:5ef9b4d4bbdb 3.0-integration

Filter out Xing/LAME info frames, rather than letting them go to the mp3 decoder as if they were audio frames. Fixes the 1152-sample zero pad at start of some decoded mp3 files (distinct from decoder delay). The logic here is based on the madplay code.
author Chris Cannam
date Thu, 24 Nov 2016 13:32:04 +0000
parents b7b84ae5f0a7
children 980afe3f1a76
rev   line source
Chris@1262 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1262 2
Chris@1262 3 /*
Chris@1262 4 Sonic Visualiser
Chris@1262 5 An audio file viewer and annotation editor.
Chris@1262 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1262 7
Chris@1262 8 This program is free software; you can redistribute it and/or
Chris@1262 9 modify it under the terms of the GNU General Public License as
Chris@1262 10 published by the Free Software Foundation; either version 2 of the
Chris@1262 11 License, or (at your option) any later version. See the file
Chris@1262 12 COPYING included with this distribution for more information.
Chris@1262 13 */
Chris@1262 14
Chris@1262 15 #ifndef TEST_OUR_REALTIME_H
Chris@1262 16 #define TEST_OUR_REALTIME_H
Chris@1262 17
Chris@1262 18 #include <QObject>
Chris@1262 19 #include <QtTest>
Chris@1262 20 #include <QDir>
Chris@1262 21
Chris@1262 22 #include <iostream>
Chris@1262 23
Chris@1262 24 #include "../RealTime.h"
Chris@1262 25
Chris@1262 26 using namespace std;
Chris@1262 27
Chris@1262 28 #define ONE_MILLION 1000000
Chris@1262 29 #define ONE_BILLION 1000000000
Chris@1262 30
Chris@1262 31 class TestOurRealTime : public QObject
Chris@1262 32 {
Chris@1262 33 Q_OBJECT
Chris@1262 34
Chris@1262 35 void compareTexts(string s, const char *e) {
Chris@1262 36 QCOMPARE(QString(s.c_str()), QString(e));
Chris@1262 37 }
Chris@1262 38
Chris@1262 39 typedef sv_frame_t frame_type;
Chris@1262 40
Chris@1262 41 private slots:
Chris@1262 42
Chris@1262 43 void zero()
Chris@1262 44 {
Chris@1262 45 QCOMPARE(RealTime(0, 0), RealTime::zeroTime);
Chris@1262 46 QCOMPARE(RealTime(0, 0).sec, 0);
Chris@1262 47 QCOMPARE(RealTime(0, 0).nsec, 0);
Chris@1262 48 QCOMPARE(RealTime(0, 0).msec(), 0);
Chris@1262 49 QCOMPARE(RealTime(0, 0).usec(), 0);
Chris@1262 50 }
Chris@1262 51
Chris@1262 52 void ctor()
Chris@1262 53 {
Chris@1262 54 QCOMPARE(RealTime(0, 0), RealTime(0, 0));
Chris@1262 55
Chris@1262 56 // wraparounds
Chris@1262 57 QCOMPARE(RealTime(0, ONE_BILLION/2), RealTime(1, -ONE_BILLION/2));
Chris@1262 58 QCOMPARE(RealTime(0, -ONE_BILLION/2), RealTime(-1, ONE_BILLION/2));
Chris@1262 59
Chris@1262 60 QCOMPARE(RealTime(1, ONE_BILLION), RealTime(2, 0));
Chris@1262 61 QCOMPARE(RealTime(1, -ONE_BILLION), RealTime(0, 0));
Chris@1262 62 QCOMPARE(RealTime(-1, ONE_BILLION), RealTime(0, 0));
Chris@1262 63 QCOMPARE(RealTime(-1, -ONE_BILLION), RealTime(-2, 0));
Chris@1262 64
Chris@1268 65 QCOMPARE(RealTime(1, -ONE_BILLION-ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1268 66 QCOMPARE(RealTime(-1, ONE_BILLION+ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1268 67
Chris@1262 68 QCOMPARE(RealTime(2, -ONE_BILLION*2), RealTime(0, 0));
Chris@1262 69 QCOMPARE(RealTime(2, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1262 70
Chris@1262 71 QCOMPARE(RealTime(-2, ONE_BILLION*2), RealTime(0, 0));
Chris@1262 72 QCOMPARE(RealTime(-2, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1262 73
Chris@1262 74 QCOMPARE(RealTime(0, 1).sec, 0);
Chris@1262 75 QCOMPARE(RealTime(0, 1).nsec, 1);
Chris@1262 76 QCOMPARE(RealTime(0, -1).sec, 0);
Chris@1262 77 QCOMPARE(RealTime(0, -1).nsec, -1);
Chris@1262 78 QCOMPARE(RealTime(1, -1).sec, 0);
Chris@1262 79 QCOMPARE(RealTime(1, -1).nsec, ONE_BILLION-1);
Chris@1262 80 QCOMPARE(RealTime(-1, 1).sec, 0);
Chris@1262 81 QCOMPARE(RealTime(-1, 1).nsec, -ONE_BILLION+1);
Chris@1262 82 QCOMPARE(RealTime(-1, -1).sec, -1);
Chris@1262 83 QCOMPARE(RealTime(-1, -1).nsec, -1);
Chris@1262 84
Chris@1262 85 QCOMPARE(RealTime(2, -ONE_BILLION*2).sec, 0);
Chris@1262 86 QCOMPARE(RealTime(2, -ONE_BILLION*2).nsec, 0);
Chris@1262 87 QCOMPARE(RealTime(2, -ONE_BILLION/2).sec, 1);
Chris@1262 88 QCOMPARE(RealTime(2, -ONE_BILLION/2).nsec, ONE_BILLION/2);
Chris@1262 89
Chris@1262 90 QCOMPARE(RealTime(-2, ONE_BILLION*2).sec, 0);
Chris@1262 91 QCOMPARE(RealTime(-2, ONE_BILLION*2).nsec, 0);
Chris@1262 92 QCOMPARE(RealTime(-2, ONE_BILLION/2).sec, -1);
Chris@1262 93 QCOMPARE(RealTime(-2, ONE_BILLION/2).nsec, -ONE_BILLION/2);
Chris@1262 94 }
Chris@1262 95
Chris@1262 96 void fromSeconds()
Chris@1262 97 {
Chris@1262 98 QCOMPARE(RealTime::fromSeconds(0), RealTime(0, 0));
Chris@1262 99
Chris@1262 100 QCOMPARE(RealTime::fromSeconds(0.5).sec, 0);
Chris@1262 101 QCOMPARE(RealTime::fromSeconds(0.5).nsec, ONE_BILLION/2);
Chris@1262 102 QCOMPARE(RealTime::fromSeconds(0.5).usec(), ONE_MILLION/2);
Chris@1262 103 QCOMPARE(RealTime::fromSeconds(0.5).msec(), 500);
Chris@1262 104
Chris@1262 105 QCOMPARE(RealTime::fromSeconds(0.5), RealTime(0, ONE_BILLION/2));
Chris@1262 106 QCOMPARE(RealTime::fromSeconds(1), RealTime(1, 0));
Chris@1262 107 QCOMPARE(RealTime::fromSeconds(1.5), RealTime(1, ONE_BILLION/2));
Chris@1262 108
Chris@1262 109 QCOMPARE(RealTime::fromSeconds(-0.5).sec, 0);
Chris@1262 110 QCOMPARE(RealTime::fromSeconds(-0.5).nsec, -ONE_BILLION/2);
Chris@1262 111 QCOMPARE(RealTime::fromSeconds(-0.5).usec(), -ONE_MILLION/2);
Chris@1262 112 QCOMPARE(RealTime::fromSeconds(-0.5).msec(), -500);
Chris@1262 113
Chris@1262 114 QCOMPARE(RealTime::fromSeconds(-1.5).sec, -1);
Chris@1262 115 QCOMPARE(RealTime::fromSeconds(-1.5).nsec, -ONE_BILLION/2);
Chris@1262 116 QCOMPARE(RealTime::fromSeconds(-1.5).usec(), -ONE_MILLION/2);
Chris@1262 117 QCOMPARE(RealTime::fromSeconds(-1.5).msec(), -500);
Chris@1262 118
Chris@1262 119 QCOMPARE(RealTime::fromSeconds(-0.5), RealTime(0, -ONE_BILLION/2));
Chris@1262 120 QCOMPARE(RealTime::fromSeconds(-1), RealTime(-1, 0));
Chris@1262 121 QCOMPARE(RealTime::fromSeconds(-1.5), RealTime(-1, -ONE_BILLION/2));
Chris@1262 122 }
Chris@1262 123
Chris@1262 124 void fromMilliseconds()
Chris@1262 125 {
Chris@1262 126 QCOMPARE(RealTime::fromMilliseconds(0), RealTime(0, 0));
Chris@1262 127 QCOMPARE(RealTime::fromMilliseconds(500), RealTime(0, ONE_BILLION/2));
Chris@1262 128 QCOMPARE(RealTime::fromMilliseconds(1000), RealTime(1, 0));
Chris@1262 129 QCOMPARE(RealTime::fromMilliseconds(1500), RealTime(1, ONE_BILLION/2));
Chris@1262 130
Chris@1262 131 QCOMPARE(RealTime::fromMilliseconds(-0), RealTime(0, 0));
Chris@1262 132 QCOMPARE(RealTime::fromMilliseconds(-500), RealTime(0, -ONE_BILLION/2));
Chris@1262 133 QCOMPARE(RealTime::fromMilliseconds(-1000), RealTime(-1, 0));
Chris@1262 134 QCOMPARE(RealTime::fromMilliseconds(-1500), RealTime(-1, -ONE_BILLION/2));
Chris@1262 135 }
Chris@1262 136
Chris@1262 137 void fromTimeval()
Chris@1262 138 {
Chris@1262 139 struct timeval tv;
Chris@1262 140
Chris@1262 141 tv.tv_sec = 0; tv.tv_usec = 0;
Chris@1262 142 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, 0));
Chris@1262 143 tv.tv_sec = 0; tv.tv_usec = ONE_MILLION/2;
Chris@1262 144 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, ONE_BILLION/2));
Chris@1262 145 tv.tv_sec = 1; tv.tv_usec = 0;
Chris@1262 146 QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, 0));
Chris@1262 147 tv.tv_sec = 1; tv.tv_usec = ONE_MILLION/2;
Chris@1262 148 QCOMPARE(RealTime::fromTimeval(tv), RealTime(1, ONE_BILLION/2));
Chris@1262 149
Chris@1262 150 tv.tv_sec = 0; tv.tv_usec = -ONE_MILLION/2;
Chris@1262 151 QCOMPARE(RealTime::fromTimeval(tv), RealTime(0, -ONE_BILLION/2));
Chris@1262 152 tv.tv_sec = -1; tv.tv_usec = 0;
Chris@1262 153 QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, 0));
Chris@1262 154 tv.tv_sec = -1; tv.tv_usec = -ONE_MILLION/2;
Chris@1262 155 QCOMPARE(RealTime::fromTimeval(tv), RealTime(-1, -ONE_BILLION/2));
Chris@1262 156 }
Chris@1262 157
Chris@1262 158 void fromXsdDuration()
Chris@1262 159 {
Chris@1262 160 QCOMPARE(RealTime::fromXsdDuration("PT0"), RealTime::zeroTime);
Chris@1262 161 QCOMPARE(RealTime::fromXsdDuration("PT0S"), RealTime::zeroTime);
Chris@1262 162 QCOMPARE(RealTime::fromXsdDuration("PT10S"), RealTime(10, 0));
Chris@1262 163 QCOMPARE(RealTime::fromXsdDuration("PT10.5S"), RealTime(10, ONE_BILLION/2));
Chris@1262 164 QCOMPARE(RealTime::fromXsdDuration("PT1.5S").sec, 1);
Chris@1262 165 QCOMPARE(RealTime::fromXsdDuration("PT1.5S").msec(), 500);
Chris@1262 166 QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").sec, -1);
Chris@1262 167 QCOMPARE(RealTime::fromXsdDuration("-PT1.5S").msec(), -500);
Chris@1262 168 QCOMPARE(RealTime::fromXsdDuration("PT1M30.5S"), RealTime(90, ONE_BILLION/2));
Chris@1262 169 QCOMPARE(RealTime::fromXsdDuration("PT1H2M30.5S"), RealTime(3750, ONE_BILLION/2));
Chris@1262 170 }
Chris@1262 171
Chris@1262 172 void toDouble()
Chris@1262 173 {
Chris@1262 174 QCOMPARE(RealTime(0, 0).toDouble(), 0.0);
Chris@1262 175 QCOMPARE(RealTime(0, ONE_BILLION/2).toDouble(), 0.5);
Chris@1262 176 QCOMPARE(RealTime(1, 0).toDouble(), 1.0);
Chris@1262 177 QCOMPARE(RealTime(1, ONE_BILLION/2).toDouble(), 1.5);
Chris@1262 178
Chris@1262 179 QCOMPARE(RealTime(0, -ONE_BILLION/2).toDouble(), -0.5);
Chris@1262 180 QCOMPARE(RealTime(-1, 0).toDouble(), -1.0);
Chris@1262 181 QCOMPARE(RealTime(-1, -ONE_BILLION/2).toDouble(), -1.5);
Chris@1262 182 }
Chris@1262 183
Chris@1262 184 void assign()
Chris@1262 185 {
Chris@1262 186 RealTime r;
Chris@1262 187 r = RealTime(0, 0);
Chris@1262 188 QCOMPARE(r, RealTime::zeroTime);
Chris@1262 189 r = RealTime(0, ONE_BILLION/2);
Chris@1262 190 QCOMPARE(r.sec, 0);
Chris@1262 191 QCOMPARE(r.nsec, ONE_BILLION/2);
Chris@1262 192 r = RealTime(-1, -ONE_BILLION/2);
Chris@1262 193 QCOMPARE(r.sec, -1);
Chris@1262 194 QCOMPARE(r.nsec, -ONE_BILLION/2);
Chris@1262 195 }
Chris@1262 196
Chris@1262 197 void plus()
Chris@1262 198 {
Chris@1262 199 QCOMPARE(RealTime(0, 0) + RealTime(0, 0), RealTime(0, 0));
Chris@1262 200
Chris@1262 201 QCOMPARE(RealTime(0, 0) + RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1262 202 QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(0, ONE_BILLION/2), RealTime(1, 0));
Chris@1262 203 QCOMPARE(RealTime(1, 0) + RealTime(0, ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1262 204
Chris@1262 205 QCOMPARE(RealTime(0, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1262 206 QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(-1, 0));
Chris@1262 207 QCOMPARE(RealTime(-1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1262 208
Chris@1262 209 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1262 210 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
Chris@1262 211 QCOMPARE(RealTime(1, 0) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2) + RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1262 212
Chris@1262 213 QCOMPARE(RealTime(0, ONE_BILLION/2) + RealTime(-1, 0), RealTime(0, -ONE_BILLION/2));
Chris@1262 214 QCOMPARE(RealTime(0, -ONE_BILLION/2) + RealTime(1, 0), RealTime(0, ONE_BILLION/2));
Chris@1262 215 }
Chris@1262 216
Chris@1262 217 void minus()
Chris@1262 218 {
Chris@1262 219 QCOMPARE(RealTime(0, 0) - RealTime(0, 0), RealTime(0, 0));
Chris@1262 220
Chris@1262 221 QCOMPARE(RealTime(0, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1262 222 QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(0, ONE_BILLION/2), RealTime(0, 0));
Chris@1262 223 QCOMPARE(RealTime(1, 0) - RealTime(0, ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1262 224
Chris@1262 225 QCOMPARE(RealTime(0, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, ONE_BILLION/2));
Chris@1262 226 QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(0, 0));
Chris@1262 227 QCOMPARE(RealTime(-1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(0, -ONE_BILLION/2));
Chris@1262 228
Chris@1262 229 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1262 230 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, 0));
Chris@1262 231 QCOMPARE(RealTime(1, 0) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2) - RealTime(0, -ONE_BILLION/2), RealTime(2, ONE_BILLION/2));
Chris@1262 232
Chris@1262 233 QCOMPARE(RealTime(0, ONE_BILLION/2) - RealTime(-1, 0), RealTime(1, ONE_BILLION/2));
Chris@1262 234 QCOMPARE(RealTime(0, -ONE_BILLION/2) - RealTime(1, 0), RealTime(-1, -ONE_BILLION/2));
Chris@1262 235 }
Chris@1262 236
Chris@1262 237 void negate()
Chris@1262 238 {
Chris@1262 239 QCOMPARE(-RealTime(0, 0), RealTime(0, 0));
Chris@1262 240 QCOMPARE(-RealTime(1, 0), RealTime(-1, 0));
Chris@1262 241 QCOMPARE(-RealTime(1, ONE_BILLION/2), RealTime(-1, -ONE_BILLION/2));
Chris@1262 242 QCOMPARE(-RealTime(-1, -ONE_BILLION/2), RealTime(1, ONE_BILLION/2));
Chris@1262 243 }
Chris@1262 244
Chris@1262 245 void compare()
Chris@1262 246 {
Chris@1262 247 int sec, nsec;
Chris@1262 248 for (sec = -2; sec <= 2; sec += 2) {
Chris@1262 249 for (nsec = -1; nsec <= 1; nsec += 1) {
Chris@1262 250 QCOMPARE(RealTime(sec, nsec) < RealTime(sec, nsec), false);
Chris@1262 251 QCOMPARE(RealTime(sec, nsec) > RealTime(sec, nsec), false);
Chris@1262 252 QCOMPARE(RealTime(sec, nsec) == RealTime(sec, nsec), true);
Chris@1262 253 QCOMPARE(RealTime(sec, nsec) != RealTime(sec, nsec), false);
Chris@1262 254 QCOMPARE(RealTime(sec, nsec) <= RealTime(sec, nsec), true);
Chris@1262 255 QCOMPARE(RealTime(sec, nsec) >= RealTime(sec, nsec), true);
Chris@1262 256 }
Chris@1262 257 }
Chris@1262 258 RealTime prev(-3, 0);
Chris@1262 259 for (sec = -2; sec <= 2; sec += 2) {
Chris@1262 260 for (nsec = -1; nsec <= 1; nsec += 1) {
Chris@1262 261
Chris@1262 262 RealTime curr(sec, nsec);
Chris@1262 263
Chris@1262 264 QCOMPARE(prev < curr, true);
Chris@1262 265 QCOMPARE(prev > curr, false);
Chris@1262 266 QCOMPARE(prev == curr, false);
Chris@1262 267 QCOMPARE(prev != curr, true);
Chris@1262 268 QCOMPARE(prev <= curr, true);
Chris@1262 269 QCOMPARE(prev >= curr, false);
Chris@1262 270
Chris@1262 271 QCOMPARE(curr < prev, false);
Chris@1262 272 QCOMPARE(curr > prev, true);
Chris@1262 273 QCOMPARE(curr == prev, false);
Chris@1262 274 QCOMPARE(curr != prev, true);
Chris@1262 275 QCOMPARE(curr <= prev, false);
Chris@1262 276 QCOMPARE(curr >= prev, true);
Chris@1262 277
Chris@1262 278 prev = curr;
Chris@1262 279 }
Chris@1262 280 }
Chris@1262 281 }
Chris@1262 282
Chris@1262 283 void frame()
Chris@1262 284 {
Chris@1262 285 int frames[] = {
Chris@1262 286 0, 1, 2047, 2048, 6656,
Chris@1262 287 32767, 32768, 44100, 44101,
Chris@1262 288 999999999, 2000000000
Chris@1262 289 };
Chris@1262 290 int n = sizeof(frames)/sizeof(frames[0]);
Chris@1262 291
Chris@1262 292 int rates[] = {
Chris@1262 293 1, 2, 8000, 22050,
Chris@1262 294 44100, 44101, 192000, 2000000001
Chris@1262 295 };
Chris@1262 296 int m = sizeof(rates)/sizeof(rates[0]);
Chris@1262 297
Chris@1262 298 vector<vector<RealTime>> realTimes = {
Chris@1262 299 { { 0, 0 }, { 1, 0 }, { 2047, 0 }, { 2048, 0 },
Chris@1262 300 { 6656, 0 }, { 32767, 0 }, { 32768, 0 }, { 44100, 0 },
Chris@1262 301 { 44101, 0 }, { 999999999, 0 }, { 2000000000, 0 } },
Chris@1262 302 { { 0, 0 }, { 0, 500000000 }, { 1023, 500000000 }, { 1024, 0 },
Chris@1262 303 { 3328, 0 }, { 16383, 500000000 }, { 16384, 0 }, { 22050, 0 },
Chris@1262 304 { 22050, 500000000 }, { 499999999, 500000000 }, { 1000000000, 0 } },
Chris@1262 305 { { 0, 0 }, { 0, 125000 }, { 0, 255875000 }, { 0, 256000000 },
Chris@1262 306 { 0, 832000000 }, { 4, 95875000 }, { 4, 96000000 }, { 5, 512500000 },
Chris@1262 307 { 5, 512625000 }, { 124999, 999875000 }, { 250000, 0 } },
Chris@1262 308 { { 0, 0 }, { 0, 45351 }, { 0, 92834467 }, { 0, 92879819 },
Chris@1262 309 { 0, 301859410 }, { 1, 486031746 }, { 1, 486077098 }, { 2, 0 },
Chris@1262 310 { 2, 45351 }, { 45351, 473877551 }, { 90702, 947845805 } },
Chris@1262 311 { { 0, 0 }, { 0, 22676 }, { 0, 46417234 }, { 0, 46439909 },
Chris@1262 312 { 0, 150929705 }, { 0, 743015873 }, { 0, 743038549 }, { 1, 0 },
Chris@1262 313 { 1, 22676 }, { 22675, 736938776 }, { 45351, 473922902 } },
Chris@1262 314 { { 0, 0 }, { 0, 22675 }, { 0, 46416181 }, { 0, 46438856 },
Chris@1262 315 { 0, 150926283 }, { 0, 742999025 }, { 0, 743021700 }, { 0, 999977325 },
Chris@1262 316 { 1, 0 }, { 22675, 222761389 }, { 45350, 445568128 } },
Chris@1262 317 { { 0, 0 }, { 0, 5208 }, { 0, 10661458 }, { 0, 10666667 },
Chris@1262 318 { 0, 34666667 }, { 0, 170661458 }, { 0, 170666667 }, { 0, 229687500 },
Chris@1262 319 { 0, 229692708 }, { 5208, 333328125 }, { 10416, 666666667 } },
Chris@1262 320 { { 0, 0 }, { 0, 0 }, { 0, 1023 }, { 0, 1024 },
Chris@1262 321 { 0, 3328 }, { 0, 16383 }, { 0, 16384 }, { 0, 22050 },
Chris@1262 322 { 0, 22050 }, { 0, 499999999 }, { 1, 0 } }
Chris@1262 323 };
Chris@1262 324
Chris@1262 325 for (int i = 0; i < n; ++i) {
Chris@1262 326 frame_type frame = frames[i];
Chris@1262 327 for (int j = 0; j < m; ++j) {
Chris@1262 328 int rate = rates[j];
Chris@1262 329
Chris@1262 330 RealTime rt = RealTime::frame2RealTime(frame, rate);
Chris@1262 331 QCOMPARE(rt.sec, realTimes[j][i].sec);
Chris@1262 332 QCOMPARE(rt.nsec, realTimes[j][i].nsec);
Chris@1262 333
Chris@1262 334 frame_type conv = RealTime::realTime2Frame(rt, rate);
Chris@1262 335
Chris@1262 336 rt = RealTime::frame2RealTime(-frame, rate);
Chris@1262 337 frame_type negconv = RealTime::realTime2Frame(rt, rate);
Chris@1262 338
Chris@1262 339 if (rate > ONE_BILLION) {
Chris@1263 340 // We don't have enough precision in RealTime
Chris@1262 341 // for this absurd sample rate, so a round trip
Chris@1262 342 // conversion may round
Chris@1262 343 QVERIFY(abs(frame - conv) < 2);
Chris@1262 344 QVERIFY(abs(-frame - negconv) < 2);
Chris@1262 345 } else {
Chris@1262 346 QCOMPARE(conv, frame);
Chris@1262 347 QCOMPARE(negconv, -frame);
Chris@1262 348 }
Chris@1262 349 }
Chris@1262 350 }
Chris@1262 351 }
Chris@1262 352
Chris@1262 353 // Our own RealTime has toMSText, toFrameText, toSecText
Chris@1262 354
Chris@1262 355 void toText()
Chris@1262 356 {
Chris@1262 357 // we want to use QStrings, because then the Qt test library
Chris@1262 358 // will print out any conflicts. The compareTexts function
Chris@1262 359 // does this for us
Chris@1262 360
Chris@1262 361 int halfSec = ONE_BILLION/2; // nsec
Chris@1262 362
Chris@1262 363 RealTime rt = RealTime(0, 0);
Chris@1262 364 compareTexts(rt.toMSText(false, false), "0");
Chris@1262 365 compareTexts(rt.toMSText(true, false), "0.000");
Chris@1262 366 compareTexts(rt.toMSText(false, true), "0");
Chris@1262 367 compareTexts(rt.toMSText(true, true), "0.000");
Chris@1262 368 compareTexts(rt.toFrameText(24, false), "0:00");
Chris@1262 369 compareTexts(rt.toFrameText(24, true), "0:00");
Chris@1262 370 compareTexts(rt.toSecText(), "0s");
Chris@1262 371
Chris@1262 372 rt = RealTime(1, halfSec);
Chris@1262 373 compareTexts(rt.toMSText(false, false), "1.5");
Chris@1262 374 compareTexts(rt.toMSText(true, false), "1.500");
Chris@1262 375 compareTexts(rt.toMSText(false, true), "1.5");
Chris@1262 376 compareTexts(rt.toMSText(true, true), "1.500");
Chris@1262 377 compareTexts(rt.toFrameText(24, false), "1:12");
Chris@1262 378 compareTexts(rt.toFrameText(24, true), "1:12");
Chris@1262 379 compareTexts(rt.toFrameText(25, false), "1:12");
Chris@1262 380 compareTexts(rt.toFrameText(25, true), "1:12");
Chris@1262 381 compareTexts(rt.toSecText(), "1s");
Chris@1262 382
Chris@1262 383 rt = RealTime::fromSeconds(-1.5);
Chris@1262 384 compareTexts(rt.toMSText(false, false), "-1.5");
Chris@1262 385 compareTexts(rt.toMSText(true, false), "-1.500");
Chris@1262 386 compareTexts(rt.toMSText(false, true), "-1.5");
Chris@1262 387 compareTexts(rt.toMSText(true, true), "-1.500");
Chris@1262 388 compareTexts(rt.toFrameText(24, false), "-1:12");
Chris@1262 389 compareTexts(rt.toFrameText(24, true), "-1:12");
Chris@1262 390 compareTexts(rt.toSecText(), "-1s");
Chris@1262 391
Chris@1262 392 rt = RealTime(1, 1000);
Chris@1262 393 compareTexts(rt.toMSText(false, false), "1");
Chris@1262 394 compareTexts(rt.toFrameText(24, false), "1:00");
Chris@1262 395 compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000001");
Chris@1262 396 compareTexts(rt.toSecText(), "1s");
Chris@1262 397
Chris@1262 398 rt = RealTime(1, 100000);
Chris@1262 399 compareTexts(rt.toFrameText(ONE_MILLION, false), "1:000100");
Chris@1262 400 compareTexts(rt.toSecText(), "1s");
Chris@1262 401
Chris@1262 402 rt = RealTime::fromSeconds(60);
Chris@1262 403 compareTexts(rt.toMSText(false, false), "60");
Chris@1262 404 compareTexts(rt.toMSText(true, false), "60.000");
Chris@1262 405 compareTexts(rt.toMSText(false, true), "1:00");
Chris@1262 406 compareTexts(rt.toMSText(true, true), "1:00.000");
Chris@1262 407 compareTexts(rt.toFrameText(24, false), "60:00");
Chris@1262 408 compareTexts(rt.toFrameText(24, true), "1:00:00");
Chris@1262 409 compareTexts(rt.toSecText(), "1:00");
Chris@1262 410
Chris@1262 411 rt = RealTime::fromSeconds(61.05);
Chris@1262 412 compareTexts(rt.toMSText(false, false), "61.05");
Chris@1262 413 compareTexts(rt.toMSText(true, false), "61.050");
Chris@1262 414 compareTexts(rt.toMSText(false, true), "1:01.05");
Chris@1262 415 compareTexts(rt.toMSText(true, true), "1:01.050");
Chris@1262 416 compareTexts(rt.toFrameText(24, false), "61:01");
Chris@1262 417 compareTexts(rt.toFrameText(24, true), "1:01:01");
Chris@1262 418 compareTexts(rt.toSecText(), "1:01");
Chris@1262 419
Chris@1262 420 rt = RealTime::fromSeconds(601.05);
Chris@1262 421 compareTexts(rt.toMSText(false, false), "601.05");
Chris@1262 422 compareTexts(rt.toMSText(true, false), "601.050");
Chris@1262 423 compareTexts(rt.toMSText(false, true), "10:01.05");
Chris@1262 424 compareTexts(rt.toMSText(true, true), "10:01.050");
Chris@1262 425 compareTexts(rt.toFrameText(24, false), "601:01");
Chris@1262 426 compareTexts(rt.toFrameText(24, true), "10:01:01");
Chris@1262 427 compareTexts(rt.toSecText(), "10:01");
Chris@1262 428
Chris@1262 429 rt = RealTime::fromSeconds(3600);
Chris@1262 430 compareTexts(rt.toMSText(false, false), "3600");
Chris@1262 431 compareTexts(rt.toMSText(true, false), "3600.000");
Chris@1262 432 compareTexts(rt.toMSText(false, true), "1:00:00");
Chris@1262 433 compareTexts(rt.toMSText(true, true), "1:00:00.000");
Chris@1262 434 compareTexts(rt.toFrameText(24, false), "3600:00");
Chris@1262 435 compareTexts(rt.toFrameText(24, true), "1:00:00:00");
Chris@1262 436 compareTexts(rt.toSecText(), "1:00:00");
Chris@1262 437
Chris@1262 438 // For practical reasons our time display always rounds down
Chris@1262 439 rt = RealTime(3599, ONE_BILLION-1);
Chris@1262 440 compareTexts(rt.toMSText(false, false), "3599.999");
Chris@1262 441 compareTexts(rt.toMSText(true, false), "3599.999");
Chris@1262 442 compareTexts(rt.toMSText(false, true), "59:59.999");
Chris@1262 443 compareTexts(rt.toMSText(true, true), "59:59.999");
Chris@1262 444 compareTexts(rt.toFrameText(24, false), "3599:23");
Chris@1262 445 compareTexts(rt.toFrameText(24, true), "59:59:23");
Chris@1262 446 compareTexts(rt.toSecText(), "59:59");
Chris@1262 447
Chris@1262 448 rt = RealTime::fromSeconds(3600 * 4 + 60 * 5 + 3 + 0.01);
Chris@1262 449 compareTexts(rt.toMSText(false, false), "14703.01");
Chris@1262 450 compareTexts(rt.toMSText(true, false), "14703.010");
Chris@1262 451 compareTexts(rt.toMSText(false, true), "4:05:03.01");
Chris@1262 452 compareTexts(rt.toMSText(true, true), "4:05:03.010");
Chris@1262 453 compareTexts(rt.toFrameText(24, false), "14703:00");
Chris@1262 454 compareTexts(rt.toFrameText(24, true), "4:05:03:00");
Chris@1262 455 compareTexts(rt.toSecText(), "4:05:03");
Chris@1262 456
Chris@1262 457 rt = RealTime::fromSeconds(-(3600 * 4 + 60 * 5 + 3 + 0.01));
Chris@1262 458 compareTexts(rt.toMSText(false, false), "-14703.01");
Chris@1262 459 compareTexts(rt.toMSText(true, false), "-14703.010");
Chris@1262 460 compareTexts(rt.toMSText(false, true), "-4:05:03.01");
Chris@1262 461 compareTexts(rt.toMSText(true, true), "-4:05:03.010");
Chris@1262 462 compareTexts(rt.toFrameText(24, false), "-14703:00");
Chris@1262 463 compareTexts(rt.toFrameText(24, true), "-4:05:03:00");
Chris@1262 464 compareTexts(rt.toSecText(), "-4:05:03");
Chris@1262 465 }
Chris@1262 466 };
Chris@1262 467
Chris@1262 468 #endif
Chris@1262 469