Tag Parser  6.2.1
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
overall.cpp
Go to the documentation of this file.
1 #include "../mediafileinfo.h"
2 #include "../tag.h"
3 #include "../abstracttrack.h"
4 #include "../mp4/mp4ids.h"
5 #include "../mpegaudio/mpegaudioframe.h"
6 #include "../matroska/matroskacontainer.h"
7 #include "../id3/id3v1tag.h"
8 #include "../id3/id3v2tag.h"
9 #include "../mp4/mp4tag.h"
10 #include "../vorbis/vorbiscomment.h"
11 
12 #include <c++utilities/conversion/binaryconversion.h>
13 #include <c++utilities/conversion/stringconversion.h>
14 #include <c++utilities/tests/testutils.h>
15 
16 #include <cppunit/extensions/HelperMacros.h>
17 #include <cppunit/TestFixture.h>
18 
19 #include <fstream>
20 #include <sstream>
21 #include <iostream>
22 #include <queue>
23 #include <cstring>
24 #include <cstdio>
25 
26 using namespace std;
27 using namespace ConversionUtilities;
28 using namespace Media;
29 
30 using namespace CPPUNIT_NS;
31 
32 enum class TagStatus
33 {
34  Original,
36  Removed
37 };
38 
43 class OverallTests : public TestFixture
44 {
45  CPPUNIT_TEST_SUITE(OverallTests);
46  CPPUNIT_TEST(testMp4Parsing);
47  CPPUNIT_TEST(testMp3Parsing);
48  CPPUNIT_TEST(testOggParsing);
49  CPPUNIT_TEST(testFlacParsing);
50  CPPUNIT_TEST(testMkvParsing);
51 #ifdef PLATFORM_UNIX
52  CPPUNIT_TEST(testMp4Making);
53  CPPUNIT_TEST(testMp3Making);
54  CPPUNIT_TEST(testOggMaking);
55  CPPUNIT_TEST(testFlacMaking);
56  CPPUNIT_TEST(testMkvMaking);
57 #endif
58  CPPUNIT_TEST_SUITE_END();
59 
60 public:
61  void setUp();
62  void tearDown();
63 
64  void parseFile(const string &path, void (OverallTests::* checkRoutine)(void));
65  void makeFile(const string &path, void (OverallTests::* modifyRoutine)(void), void (OverallTests::* checkRoutine)(void));
66 
67  void checkMkvTestfile1();
68  void checkMkvTestfile2();
69  void checkMkvTestfile3();
70  void checkMkvTestfile4();
71  void checkMkvTestfile5();
72  void checkMkvTestfile6();
73  void checkMkvTestfile7();
74  void checkMkvTestfile8();
75  void checkMkvTestMetaData();
76  void checkMkvPaddingConstraints();
77 
78  void checkMp4Testfile1();
79  void checkMp4Testfile2();
80  void checkMp4Testfile3();
81  void checkMp4Testfile4();
82  void checkMp4Testfile5();
83  void checkMp4TestMetaData();
84  void checkMp4PaddingConstraints();
85 
86  void checkMp3Testfile1();
87  void checkMp3TestMetaData();
88  void checkMp3PaddingConstraints();
89 
90  void checkOggTestfile1();
91  void checkOggTestfile2();
92  void checkOggTestMetaData();
93 
94  void checkFlacTestfile1();
95  void checkFlacTestfile2();
96 
97  void setMkvTestMetaData();
98  void setMp4TestMetaData();
99  void setMp3TestMetaData();
100  void setOggTestMetaData();
101  void removeAllTags();
102 
103  void testMkvParsing();
104  void testMp4Parsing();
105  void testMp3Parsing();
106  void testOggParsing();
107  void testFlacParsing();
108 #ifdef PLATFORM_UNIX
109  void testMkvMaking();
110  void testMp4Making();
111  void testMp3Making();
112  void testOggMaking();
113  void testFlacMaking();
114 #endif
115 
116 private:
117  MediaFileInfo m_fileInfo;
118  TagValue m_testTitle;
119  TagValue m_testComment;
120  TagValue m_testAlbum;
121  TagValue m_testPartNumber;
122  TagValue m_testTotalParts;
123  TagValue m_testPosition;
124  queue<TagValue> m_preservedMetaData;
125  TagStatus m_tagStatus;
126  uint16 m_mode;
127 };
128 
130 
135 {
136  m_testTitle.assignText("some title", TagTextEncoding::Utf8);
137  m_testComment.assignText("some cómment", TagTextEncoding::Utf8);
138  m_testAlbum.assignText("some album", TagTextEncoding::Utf8);
139  m_testPartNumber.assignInteger(41);
140  m_testTotalParts.assignInteger(61);
141  m_testPosition.assignPosition(PositionInSet(41, 61));
142 }
143 
145 {}
146 
150 void OverallTests::parseFile(const string &path, void (OverallTests::* checkRoutine)(void))
151 {
152  // print current file
153  cerr << "- testing " << path << endl;
154  // ensure file is open and everything is parsed
155  m_fileInfo.setPath(path);
156  m_fileInfo.reopen(true);
157  m_fileInfo.parseEverything();
158  // invoke testroutine to check whether parsing results are correct
159  (this->*checkRoutine)();
160  m_fileInfo.close();
161 }
162 
167 void OverallTests::makeFile(const string &path, void (OverallTests::*modifyRoutine)(void), void (OverallTests::*checkRoutine)(void))
168 {
169  // print current file
170  cerr << "- testing " << path << endl;
171  // ensure file is open and everything is parsed
172  m_fileInfo.setPath(path);
173  m_fileInfo.reopen(true);
174  m_fileInfo.parseEverything();
175  // invoke testroutine to do and apply changes
176  (this->*modifyRoutine)();
177  // apply changes and ensure that the previous parsing results are cleared
178  m_fileInfo.applyChanges();
179  m_fileInfo.clearParsingResults();
180  // reparse the file and invoke testroutine to check whether changings have been applied correctly
181  m_fileInfo.parseEverything();
182  (this->*checkRoutine)();
183  // invoke suitable testroutine to check padding constraints
184  switch(m_fileInfo.containerFormat()) {
185  case ContainerFormat::Matroska:
186  checkMkvPaddingConstraints();
187  break;
189  checkMp4PaddingConstraints();
190  break;
193  checkMp3PaddingConstraints();
194  break;
195  default:
196  ;
197  }
198  // close and remove file and backup files
199  m_fileInfo.close();
200  remove(path.c_str());
201  remove((path + ".bak").c_str());
202 }
203 
208 {
209  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
210  const auto tracks = m_fileInfo.tracks();
211  CPPUNIT_ASSERT(tracks.size() == 2);
212  for(const auto &track : tracks) {
213  switch(track->id()) {
214  case 2422994868:
215  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
216  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::MicrosoftMpeg4);
217  break;
218  case 3653291187:
219  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
220  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Mpeg1Audio);
221  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
222  break;
223  default:
224  CPPUNIT_FAIL("unknown track ID");
225  }
226  }
227  const auto tags = m_fileInfo.tags();
228  switch(m_tagStatus) {
229  case TagStatus::Original:
230  CPPUNIT_ASSERT(tags.size() == 1);
231  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Big Buck Bunny - test 1");
232  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
233  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock");
234  CPPUNIT_ASSERT(tags.front()->value(KnownField::Year).toString() == "2010");
235  break;
237  checkMkvTestMetaData();
238  break;
239  case TagStatus::Removed:
240  CPPUNIT_ASSERT(tags.size() == 0);
241  }
242 }
243 
248 {
249  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
250  const auto tracks = m_fileInfo.tracks();
251  CPPUNIT_ASSERT(tracks.size() == 2);
252  for(const auto &track : tracks) {
253  switch(track->id()) {
254  case 1863976627:
255  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
256  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
257  CPPUNIT_ASSERT(track->displaySize() == Size(1354, 576));
258  break;
259  case 3134325680:
260  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
261  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
262  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
263  break;
264  default:
265  CPPUNIT_FAIL("unknown track ID");
266  }
267  }
268  const auto tags = m_fileInfo.tags();
269  switch(m_tagStatus) {
270  case TagStatus::Original:
271  CPPUNIT_ASSERT(tags.size() == 1);
272  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Elephant Dream - test 2");
273  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
274  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC");
275  break;
277  checkMkvTestMetaData();
278  break;
279  case TagStatus::Removed:
280  CPPUNIT_ASSERT(tags.size() == 0);
281  }
282 }
283 
288 {
289  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
290  const auto tracks = m_fileInfo.tracks();
291  CPPUNIT_ASSERT(tracks.size() == 2);
292  for(const auto &track : tracks) {
293  switch(track->id()) {
294  case 3927961528:
295  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
296  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
297  CPPUNIT_ASSERT(track->displaySize() == Size(1024, 576));
298  break;
299  case 3391885737:
300  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
301  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Mpeg1Audio);
302  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
303  break;
304  default:
305  CPPUNIT_FAIL("unknown track ID");
306  }
307  }
308  const auto tags = m_fileInfo.tags();
309  switch(m_tagStatus) {
310  case TagStatus::Original:
311  CPPUNIT_ASSERT(tags.size() == 1);
312  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Elephant Dream - test 3");
313  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
314  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 3, header stripping on the video track and no SimpleBlock");
315  break;
317  checkMkvTestMetaData();
318  break;
319  case TagStatus::Removed:
320  CPPUNIT_ASSERT(tags.size() == 0);
321  }
322 }
323 
328 {
329  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
330  // this file is messed up, it should contain tags but it doesn't
331  const auto tracks = m_fileInfo.tracks();
332  CPPUNIT_ASSERT(tracks.size() == 2);
333  for(const auto &track : tracks) {
334  switch(track->id()) {
335  case 1368622492:
336  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
337  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
338  CPPUNIT_ASSERT(track->displaySize() == Size(1280, 720));
339  break;
340  case 3171450505:
341  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
342  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
343  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
344  CPPUNIT_ASSERT(track->channelCount() == 2);
345  break;
346  default:
347  CPPUNIT_FAIL("unknown track ID");
348  }
349  }
350  const auto tags = m_fileInfo.tags();
351  switch(m_tagStatus) {
352  case TagStatus::Original:
353  case TagStatus::Removed:
354  CPPUNIT_ASSERT(tags.size() == 0);
355  break;
357  checkMkvTestMetaData();
358  break;
359  }
360 }
361 
366 {
367  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
368  const auto tracks = m_fileInfo.tracks();
369  CPPUNIT_ASSERT(tracks.size() == 11);
370  for(const auto &track : tracks) {
371  switch(track->id()) {
372  case 1258329745:
373  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
374  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
375  CPPUNIT_ASSERT(track->displaySize() == Size(1024, 576));
376  break;
377  case 3452711582:
378  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
379  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
380  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
381  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
382  break;
383  case 3554194305:
384  CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
385  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TextSubtitle);
386  CPPUNIT_ASSERT(track->language() == "ger");
387  break;
388  default:
389  ;
390  }
391  }
392  const auto tags = m_fileInfo.tags();
393  switch(m_tagStatus) {
394  case TagStatus::Original:
395  CPPUNIT_ASSERT(tags.size() == 1);
396  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Big Buck Bunny - test 8");
397  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
398  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 8, secondary audio commentary track, misc subtitle tracks");
399  break;
401  checkMkvTestMetaData();
402  break;
403  case TagStatus::Removed:
404  CPPUNIT_ASSERT(tags.size() == 0);
405  }
406 }
407 
412 {
413  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
414  const auto tracks = m_fileInfo.tracks();
415  CPPUNIT_ASSERT(tracks.size() == 2);
416  for(const auto &track : tracks) {
417  switch(track->id()) {
418  case 2422994868:
419  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
420  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::MicrosoftMpeg4);
421  CPPUNIT_ASSERT(track->pixelSize() == Size(854, 480));
422  break;
423  case 3653291187:
424  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
425  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Mpeg1Audio);
426  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
427  CPPUNIT_ASSERT(track->channelConfig() == static_cast<byte>(MpegChannelMode::Stereo));
428  break;
429  default:
430  CPPUNIT_FAIL("unknown track ID");
431  }
432  }
433  const auto tags = m_fileInfo.tags();
434  switch(m_tagStatus) {
435  case TagStatus::Original:
436  CPPUNIT_ASSERT(tags.size() == 1);
437  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Big Buck Bunny - test 6");
438  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
439  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 6, random length to code the size of Clusters and Blocks, no Cues for seeking");
440  break;
442  checkMkvTestMetaData();
443  break;
444  case TagStatus::Removed:
445  CPPUNIT_ASSERT(tags.size() == 0);
446  }
447 }
448 
453 {
454  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
455  const auto tracks = m_fileInfo.tracks();
456  CPPUNIT_ASSERT(tracks.size() == 2);
457  for(const auto &track : tracks) {
458  switch(track->id()) {
459  case 568001708:
460  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
461  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
462  CPPUNIT_ASSERT(track->pixelSize() == Size(1024, 576));
463  CPPUNIT_ASSERT(!strcmp(track->chromaFormat(), "YUV 4:2:0"));
464  break;
465  case 2088735154:
466  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
467  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
468  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
469  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
470  break;
471  default:
472  CPPUNIT_FAIL("unknown track ID");
473  }
474  }
475  const auto tags = m_fileInfo.tags();
476  switch(m_tagStatus) {
477  case TagStatus::Original:
478  CPPUNIT_ASSERT(tags.size() == 1);
479  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Big Buck Bunny - test 7");
480  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
481  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 7, junk elements are present at the beggining or end of clusters, the parser should skip it. There is also a damaged element at 451418");
482  break;
484  checkMkvTestMetaData();
485  break;
486  case TagStatus::Removed:
487  CPPUNIT_ASSERT(tags.size() == 0);
488  }
489 }
490 
495 {
496  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Matroska);
497  const auto tracks = m_fileInfo.tracks();
498  CPPUNIT_ASSERT(tracks.size() == 2);
499  for(const auto &track : tracks) {
500  switch(track->id()) {
501  case 568001708:
502  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
503  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
504  CPPUNIT_ASSERT(track->pixelSize() == Size(1024, 576));
505  CPPUNIT_ASSERT(!strcmp(track->chromaFormat(), "YUV 4:2:0"));
506  break;
507  case 2088735154:
508  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
509  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
510  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
511  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
512  break;
513  default:
514  CPPUNIT_FAIL("unknown track ID");
515  }
516  }
517  const auto tags = m_fileInfo.tags();
518  switch(m_tagStatus) {
519  case TagStatus::Original:
520  CPPUNIT_ASSERT(tags.size() == 1);
521  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Big Buck Bunny - test 8");
522  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
523  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == "Matroska Validation File 8, audio missing between timecodes 6.019s and 6.360s");
524  break;
526  checkMkvTestMetaData();
527  break;
528  case TagStatus::Removed:
529  CPPUNIT_ASSERT(tags.size() == 0);
530  }
531 }
532 
537 {
538  // check tags
539  const auto tags = m_fileInfo.tags();
540  const auto tracks = m_fileInfo.tracks();
541  CPPUNIT_ASSERT(tags.size() == 2);
542  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == m_testTitle.toString());
543  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).isEmpty());
544  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).toString() == m_testComment.toString());
545  CPPUNIT_ASSERT(tags[1]->target().level() == 30);
546  CPPUNIT_ASSERT(tags[1]->target().tracks().at(0) == tracks.at(0)->id());
547  CPPUNIT_ASSERT(tags[1]->value(KnownField::Album).toString() == m_testAlbum.toString());
548  CPPUNIT_ASSERT(tags[1]->value(KnownField::PartNumber).toInteger() == m_testPartNumber.toInteger());
549  CPPUNIT_ASSERT(tags[1]->value(KnownField::TotalParts).toInteger() == m_testTotalParts.toInteger());
550 
551  // check attachments
552  const auto attachments = m_fileInfo.attachments();
553  CPPUNIT_ASSERT(attachments.size() == 1);
554  CPPUNIT_ASSERT(attachments[0]->mimeType() == "image/png");
555  CPPUNIT_ASSERT(attachments[0]->name() == "cover.jpg");
556  CPPUNIT_ASSERT(attachments[0]->data() != nullptr);
557  CPPUNIT_ASSERT(attachments[0]->data()->size() == 11964);
558  // TODO: validate actual data
559 }
560 
565 {
566  if((m_mode & 0x8) && (m_mode & 0x1)) {
567  CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
568  } else if(m_mode & 0x8) {
569  CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
570  CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
571  // TODO: check tag/index position and rewriting behaviour
572  }
573 }
574 
579 {
580  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
581  const auto tracks = m_fileInfo.tracks();
582  CPPUNIT_ASSERT(tracks.size() == 1);
583  for(const auto &track : tracks) {
584  switch(track->id()) {
585  case 1:
586  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
587  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
588  CPPUNIT_ASSERT(track->creationTime().year() == 2012);
589  CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
590  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
591  break;
592  default:
593  CPPUNIT_FAIL("unknown track ID");
594  }
595  }
596  const auto tags = m_fileInfo.tags();
597  switch(m_tagStatus) {
598  case TagStatus::Original:
599  CPPUNIT_ASSERT(tags.size() == 1);
600  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Danse Macabre, Op.40");
601  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Saint-Saëns");
602  CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Classical");
603  CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
604  CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet().position() == 10);
605  break;
607  checkMp4TestMetaData();
608  break;
609  case TagStatus::Removed:
610  CPPUNIT_ASSERT(tags.size() == 0);
611  }
612 }
613 
618 {
619  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
620  const auto tracks = m_fileInfo.tracks();
621  CPPUNIT_ASSERT(tracks.size() == 5);
622  for(const auto &track : tracks) {
623  switch(track->id()) {
624  case 1:
625  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
626  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
627  CPPUNIT_ASSERT(track->format().sub == SubFormats::AvcHighProfile);
628  CPPUNIT_ASSERT(track->version() == 4);
629  CPPUNIT_ASSERT(track->creationTime().year() == 2013);
630  CPPUNIT_ASSERT(track->pixelSize() == Size(1920, 750));
631  break;
632  case 2:
633  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
634  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
635  CPPUNIT_ASSERT(track->format().sub == SubFormats::AacMpeg4LowComplexityProfile);
636  CPPUNIT_ASSERT(!(track->format().extension & ExtensionFormats::SpectralBandReplication));
637  CPPUNIT_ASSERT(!(track->format().extension & ExtensionFormats::ParametricStereo));
638  CPPUNIT_ASSERT(track->language() == "eng");
639  CPPUNIT_ASSERT(track->creationTime().year() == 2013);
640  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
641  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
642  break;
643  case 3:
644  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
645  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Ac3);
646  CPPUNIT_ASSERT(track->language() == "eng");
647  CPPUNIT_ASSERT(track->creationTime().year() == 2013);
648  break;
649  case 4:
650  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
651  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
652  CPPUNIT_ASSERT(track->language() == "eng");
653  CPPUNIT_ASSERT(track->creationTime().year() == 2013);
654  break;
655  case 6:
656  CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
657  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
658  CPPUNIT_ASSERT(track->creationTime().year() == 2013);
659  break;
660  default:
661  CPPUNIT_FAIL("unknown track ID");
662  }
663  }
664  const auto tags = m_fileInfo.tags();
665  switch(m_tagStatus) {
666  case TagStatus::Original:
667  CPPUNIT_ASSERT(tags.size() == 0);
668  break;
670  checkMp4TestMetaData();
671  break;
672  case TagStatus::Removed:
673  CPPUNIT_ASSERT(tags.size() == 0);
674  }
675 }
676 
681 {
682  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
683  CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "dash");
684  const auto tracks = m_fileInfo.tracks();
685  CPPUNIT_ASSERT(tracks.size() == 1);
686  for(const auto &track : tracks) {
687  switch(track->id()) {
688  case 1:
689  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
690  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
691  CPPUNIT_ASSERT(track->format().sub == SubFormats::AvcMainProfile);
692  CPPUNIT_ASSERT(track->version() == 3.1);
693  CPPUNIT_ASSERT(track->creationTime().year() == 2014);
694  CPPUNIT_ASSERT(track->pixelSize() == Size(854, 480));
695  CPPUNIT_ASSERT(!strcmp(track->chromaFormat(), "YUV 4:2:0"));
696  break;
697  default:
698  CPPUNIT_FAIL("unknown track ID");
699  }
700  }
701  const auto tags = m_fileInfo.tags();
702  switch(m_tagStatus) {
703  case TagStatus::Original:
704  CPPUNIT_ASSERT(tags.size() == 0);
705  break;
707  checkMp4TestMetaData();
708  break;
709  case TagStatus::Removed:
710  CPPUNIT_ASSERT(tags.size() == 0);
711  }
712 }
713 
718 {
719  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
720  CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "M4A ");
721  const auto tracks = m_fileInfo.tracks();
722  CPPUNIT_ASSERT(tracks.size() == 1);
723  for(const auto &track : tracks) {
724  switch(track->id()) {
725  case 1:
726  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
727  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Alac);
728  CPPUNIT_ASSERT(track->creationTime().year() == 2008);
729  CPPUNIT_ASSERT(track->channelCount() == 2);
730  CPPUNIT_ASSERT(track->bitsPerSample() == 16);
731  break;
732  default:
733  CPPUNIT_FAIL("unknown track ID");
734  }
735  }
736  const auto tags = m_fileInfo.tags();
737  switch(m_tagStatus) {
738  case TagStatus::Original:
739  CPPUNIT_ASSERT(tags.size() == 1);
740  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Sad Song");
741  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Oasis");
742  CPPUNIT_ASSERT(tags.front()->value(KnownField::Album).toString() == "Don't Go Away (Apple Lossless)");
743  CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Alternative & Punk");
744  CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "iTunes v7.5.0.20");
745  CPPUNIT_ASSERT(tags.front()->value(KnownField::Year).toString() == "1998");
746  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).isEmpty());
747  CPPUNIT_ASSERT(tags.front()->value(KnownField::Cover).dataSize() == 0x58f3);
748  CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
749  CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet() == PositionInSet(3, 4));
750  CPPUNIT_ASSERT(tags.front()->value(KnownField::DiskPosition).toPositionInSet() == PositionInSet(1, 1));
751  break;
753  checkMp4TestMetaData();
754  break;
755  case TagStatus::Removed:
756  CPPUNIT_ASSERT(tags.size() == 0);
757  }
758 }
759 
764 {
765  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
766  CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "mp42");
767  const auto tracks = m_fileInfo.tracks();
768  CPPUNIT_ASSERT(tracks.size() == 1);
769  for(const auto &track : tracks) {
770  switch(track->id()) {
771  case 1:
772  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
773  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
774  CPPUNIT_ASSERT(track->format().sub == SubFormats::AacMpeg4LowComplexityProfile);
775  CPPUNIT_ASSERT(track->format().extension & ExtensionFormats::SpectralBandReplication);
776  CPPUNIT_ASSERT(track->format().extension & ExtensionFormats::ParametricStereo);
777  CPPUNIT_ASSERT(track->creationTime().year() == 2014);
778  CPPUNIT_ASSERT(track->channelCount() == 2);
779  CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontCenter);
780  CPPUNIT_ASSERT(track->extensionChannelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
781  CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
782  CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
783  CPPUNIT_ASSERT(track->bitsPerSample() == 16);
784  break;
785  default:
786  CPPUNIT_FAIL("unknown track ID");
787  }
788  }
789  const auto tags = m_fileInfo.tags();
790  switch(m_tagStatus) {
791  case TagStatus::Original:
792  CPPUNIT_ASSERT(tags.size() == 0);
793  break;
795  checkMp4TestMetaData();
796  break;
797  case TagStatus::Removed:
798  CPPUNIT_ASSERT(tags.size() == 0);
799  }
800 }
801 
806 {
807  // check whether a tag is assigned
808  const auto tags = m_fileInfo.tags();
809  Mp4Tag *tag = m_fileInfo.mp4Tag();
810  CPPUNIT_ASSERT(tags.size() == 1);
811  CPPUNIT_ASSERT(tag != nullptr);
812 
813  // check test meta data
814  CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
815  CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
816  CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
817  CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
818  CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition) == m_testPosition);
819  CPPUNIT_ASSERT(tag->value(KnownField::DiskPosition) == m_testPosition);
820  // TODO: check more fields
821  m_preservedMetaData.pop();
822 }
823 
828 {
829  if((m_mode & 0x4) && (m_mode & 0x1)) {
830  CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
831  } else if(m_mode & 0x4) {
832  CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
833  CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
834  // TODO: check tag position and rewriting behaviour
835  }
836 }
837 
842 {
843  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::MpegAudioFrames);
844  const auto tracks = m_fileInfo.tracks();
845  CPPUNIT_ASSERT(tracks.size() == 1);
846  for(const auto &track : tracks) {
847  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
848  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Mpeg1Audio);
849  CPPUNIT_ASSERT(track->format().sub == SubFormats::Mpeg1Layer3);
850  CPPUNIT_ASSERT(track->channelCount() == 2);
851  CPPUNIT_ASSERT(track->channelConfig() == static_cast<byte>(MpegChannelMode::JointStereo));
852  CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
853  CPPUNIT_ASSERT(track->duration().seconds() == 3);
854  }
855  const auto tags = m_fileInfo.tags();
856  switch(m_tagStatus) {
857  case TagStatus::Original:
858  CPPUNIT_ASSERT(m_fileInfo.id3v1Tag());
859  CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().size() == 1);
860  CPPUNIT_ASSERT(tags.size() == 2);
861  for(const auto &tag : tags) {
862  CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition).toPositionInSet().position() == 4);
863  CPPUNIT_ASSERT(tag->value(KnownField::Year).toString() == "1984");
864  switch(tag->type()) {
865  case TagType::Id3v1Tag:
866  CPPUNIT_ASSERT(tag->value(KnownField::Title).toString() == "Cohesion");
867  CPPUNIT_ASSERT(tag->value(KnownField::Artist).toString() == "Minutemen");
868  CPPUNIT_ASSERT(tag->value(KnownField::Album).toString() == "Double Nickels On The Dime");
869  CPPUNIT_ASSERT(tag->value(KnownField::Genre).toString() == "Punk Rock");
870  CPPUNIT_ASSERT(tag->value(KnownField::Comment).toString() == "ExactAudioCopy v0.95b4");
871  break;
872  case TagType::Id3v2Tag:
873  CPPUNIT_ASSERT(tag->value(KnownField::Title).dataEncoding() == TagTextEncoding::Utf16LittleEndian);
874  CPPUNIT_ASSERT(tag->value(KnownField::Title).toWString() == u"Cohesion");
875  CPPUNIT_ASSERT(tag->value(KnownField::Title).toString(TagTextEncoding::Utf8) == "Cohesion");
876  CPPUNIT_ASSERT(tag->value(KnownField::Artist).toWString() == u"Minutemen");
877  CPPUNIT_ASSERT(tag->value(KnownField::Artist).toString(TagTextEncoding::Utf8) == "Minutemen");
878  CPPUNIT_ASSERT(tag->value(KnownField::Album).toWString() == u"Double Nickels On The Dime");
879  CPPUNIT_ASSERT(tag->value(KnownField::Album).toString(TagTextEncoding::Utf8) == "Double Nickels On The Dime");
880  CPPUNIT_ASSERT(tag->value(KnownField::Genre).toWString() == u"Punk Rock");
881  CPPUNIT_ASSERT(tag->value(KnownField::Genre).toString(TagTextEncoding::Utf8) == "Punk Rock");
882  CPPUNIT_ASSERT(tag->value(KnownField::Comment).toWString() == u"ExactAudioCopy v0.95b4");
883  CPPUNIT_ASSERT(tag->value(KnownField::Comment).toString(TagTextEncoding::Utf8) == "ExactAudioCopy v0.95b4");
884  CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition).toPositionInSet().total() == 43);
885  CPPUNIT_ASSERT(tag->value(KnownField::Length).toTimeSpan().isNull());
886  CPPUNIT_ASSERT(tag->value(KnownField::Lyricist).isEmpty());
887  break;
888  default:
889  ;
890  }
891  }
892  break;
894  checkMp3TestMetaData();
895  break;
896  case TagStatus::Removed:
897  CPPUNIT_ASSERT(tags.size() == 0);
898  }
899 
900 }
901 
906 {
907  // check whether tags are assigned according to the current test mode
908  Id3v1Tag *id3v1Tag = nullptr;
909  Id3v2Tag *id3v2Tag = nullptr;
910  if(m_mode & 0x2) {
911  CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
912  CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
913  } else if(m_mode & 0x8) {
914  CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
915  CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().empty());
916  } else {
917  CPPUNIT_ASSERT(!m_fileInfo.id3v1Tag());
918  CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
919  }
920 
921  // check common test meta data
922  for(Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
923  if(tag) {
924  CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
925  CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
926  CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
927  CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
928  // TODO: check more fields
929  m_preservedMetaData.pop();
930  }
931  }
932  // test ID3v1 specific test meta data
933  if(id3v1Tag) {
934  CPPUNIT_ASSERT(id3v1Tag->value(KnownField::TrackPosition).toPositionInSet().position() == m_testPosition.toPositionInSet().position());
935  }
936  // test ID3v2 specific test meta data
937  if(id3v2Tag) {
938  CPPUNIT_ASSERT(id3v2Tag->value(KnownField::TrackPosition) == m_testPosition);
939  CPPUNIT_ASSERT(id3v2Tag->value(KnownField::DiskPosition) == m_testPosition);
940  }
941 }
942 
947 {
948  if(!(m_mode & 0x8)) {
949  if((m_mode & 0x4) && (m_mode & 0x1)) {
950  CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
951  } else if((m_mode & 0x4)) {
952  CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
953  CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
954  }
955  } else {
956  // adding padding is not possible if no ID3v2 tag is present
957  }
958  // TODO: check rewriting behaviour
959 }
960 
965 {
966  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
967  const auto tracks = m_fileInfo.tracks();
968  CPPUNIT_ASSERT(tracks.size() == 2);
969  for(const auto &track : tracks) {
970  switch(track->id()) {
971  case 897658443:
972  CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
973  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
974  break;
975  case 1755441791:
976  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
977  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
978  CPPUNIT_ASSERT(track->channelCount() == 2);
979  CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
980  CPPUNIT_ASSERT(track->duration().minutes() == 4);
981  break;
982  default:
983  CPPUNIT_FAIL("unknown track ID");
984  }
985  }
986  const auto tags = m_fileInfo.tags();
987  switch(m_tagStatus) {
988  case TagStatus::Original:
989  CPPUNIT_ASSERT(tags.size() == 1);
990  CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "ffmpeg2theora 0.13");
991  // Theora tags are currently not supported and hence only the Vorbis comment is
992  // taken into account here
993  break;
995  checkOggTestMetaData();
996  break;
997  case TagStatus::Removed:
998  CPPUNIT_ASSERT(tags.size() == 0);
999  }
1000 }
1001 
1006 {
1007  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
1008  const auto tracks = m_fileInfo.tracks();
1009  CPPUNIT_ASSERT(tracks.size() == 1);
1010  for(const auto &track : tracks) {
1011  switch(track->id()) {
1012  case 1375632254:
1013  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
1014  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Opus);
1015  CPPUNIT_ASSERT(track->channelCount() == 2);
1016  CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
1017  CPPUNIT_ASSERT(track->duration().minutes() == 1);
1018  break;
1019  default:
1020  CPPUNIT_FAIL("unknown track ID");
1021  }
1022  }
1023  const auto tags = m_fileInfo.tags();
1024  switch(m_tagStatus) {
1025  case TagStatus::Original:
1026  CPPUNIT_ASSERT(tags.size() == 1);
1027  CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "opusenc from opus-tools 0.1.6");
1028  break;
1030  checkOggTestMetaData();
1031  break;
1032  case TagStatus::Removed:
1033  CPPUNIT_ASSERT(tags.size() == 0);
1034  }
1035 }
1036 
1041 {
1042  // check whether a tag is assigned
1043  const auto tags = m_fileInfo.tags();
1044  VorbisComment *tag = m_fileInfo.vorbisComment();
1045  CPPUNIT_ASSERT(tags.size() == 1);
1046  CPPUNIT_ASSERT(tag != nullptr);
1047 
1048  // check test meta data
1049  CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
1050  CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
1051  CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
1052  CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
1053  CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition) == m_testPosition);
1054  CPPUNIT_ASSERT(tag->value(KnownField::DiskPosition) == m_testPosition);
1055  // TODO: check more fields
1056  m_preservedMetaData.pop();
1057 }
1058 
1064 {
1065  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Flac);
1066  const auto tracks = m_fileInfo.tracks();
1067  CPPUNIT_ASSERT(tracks.size() == 1);
1068  for(const auto &track : tracks) {
1069  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
1070  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Flac);
1071  CPPUNIT_ASSERT(track->channelCount() == 2);
1072  CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
1073  CPPUNIT_ASSERT(track->bitsPerSample() == 16);
1074  CPPUNIT_ASSERT(track->duration().minutes() == 4);
1075  }
1076  const auto tags = m_fileInfo.tags();
1077  switch(m_tagStatus) {
1078  case TagStatus::Original:
1079  // ffmpeg is able to set some tags from the original file (mtx-test-data/alac/othertest-itunes.m4a)
1080  CPPUNIT_ASSERT(tags.size() == 1);
1081  CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Sad Song");
1082  CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Oasis");
1083  CPPUNIT_ASSERT(tags.front()->value(KnownField::Album).toString() == "Don't Go Away (Apple Lossless)");
1084  CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Alternative & Punk");
1085  CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "Lavf57.25.100");
1086  CPPUNIT_ASSERT(tags.front()->value(KnownField::Year).toString() == "1998");
1087  CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).isEmpty());
1088  //CPPUNIT_ASSERT(tags.front()->value(KnownField::Cover).dataSize() == 0x58f3);
1089  //CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
1090  CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet() == PositionInSet(3, 4));
1091  CPPUNIT_ASSERT(tags.front()->value(KnownField::DiskPosition).toPositionInSet() == PositionInSet(1, 1));
1092  break;
1094  checkOggTestMetaData();
1095  break;
1096  case TagStatus::Removed:
1097  CPPUNIT_ASSERT(tags.size() == 0);
1098  }
1099 }
1100 
1106 {
1107  CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
1108  const auto tracks = m_fileInfo.tracks();
1109  CPPUNIT_ASSERT(tracks.size() == 1);
1110  for(const auto &track : tracks) {
1111  CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
1112  CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Flac);
1113  CPPUNIT_ASSERT(track->channelCount() == 2);
1114  CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
1115  CPPUNIT_ASSERT(track->bitsPerSample() == 16);
1116  CPPUNIT_ASSERT(track->duration().minutes() == 4);
1117  }
1118  const auto tags = m_fileInfo.tags();
1119  switch(m_tagStatus) {
1120  case TagStatus::Original:
1121  CPPUNIT_ASSERT(tags.size() == 1);
1122  break;
1124  checkOggTestMetaData();
1125  break;
1126  case TagStatus::Removed:
1127  CPPUNIT_ASSERT(tags.size() == 0);
1128  }
1129 }
1130 
1135 {
1136  // change the present tag
1137  if(!m_fileInfo.container()->tagCount()) {
1138  // test4.mkv has no tag, so one must be created first
1139  m_fileInfo.container()->createTag(TagTarget(50));
1140  }
1141  Tag *firstTag = m_fileInfo.tags().at(0);
1142  firstTag->setValue(KnownField::Title, m_testTitle);
1143  firstTag->setValue(KnownField::Comment, m_testComment);
1144  // add an additional tag targeting the first track
1145  TagTarget::IdContainerType trackIds;
1146  trackIds.emplace_back(m_fileInfo.tracks().at(0)->id());
1147  if(Tag *newTag = m_fileInfo.container()->createTag(TagTarget(30, trackIds))) {
1148  newTag->setValue(KnownField::Album, m_testAlbum);
1149  newTag->setValue(KnownField::PartNumber, m_testPartNumber);
1150  newTag->setValue(KnownField::TotalParts, m_testTotalParts);
1151  } else {
1152  CPPUNIT_FAIL("can not create tag");
1153  }
1154  // assign an attachment
1155  if(AbstractAttachment *attachment = m_fileInfo.container()->createAttachment()) {
1156  attachment->setFile(TestUtilities::testFilePath("matroska_wave1/logo3_256x256.png"));
1157  attachment->setMimeType("image/png");
1158  attachment->setName("cover.jpg");
1159  } else {
1160  CPPUNIT_FAIL("can not create attachment");
1161  }
1162 }
1163 
1165 {
1166  // ensure a tag exists
1167  Tag *tag = m_fileInfo.container()->createTag();
1168 
1169  // assign test meta data
1170  tag->setValue(KnownField::Title, m_testTitle);
1171  tag->setValue(KnownField::Comment, m_testComment);
1172  tag->setValue(KnownField::Album, m_testAlbum);
1173  m_preservedMetaData.push(tag->value(KnownField::Artist));
1174  tag->setValue(KnownField::TrackPosition, m_testPosition);
1175  tag->setValue(KnownField::DiskPosition, m_testPosition);
1176  // TODO: set more fields
1177 }
1178 
1180 {
1181  // ensure tags are assigned according to the current test mode
1182  Id3v1Tag *id3v1Tag = nullptr;
1183  Id3v2Tag *id3v2Tag = nullptr;
1184  if(m_mode & 0x2) {
1185  id3v1Tag = m_fileInfo.createId3v1Tag();
1186  id3v2Tag = m_fileInfo.createId3v2Tag();
1187  } else if(m_mode & 0x8) {
1188  id3v1Tag = m_fileInfo.createId3v1Tag();
1189  m_fileInfo.removeAllId3v2Tags();
1190  } else {
1191  m_fileInfo.removeId3v1Tag();
1192  id3v2Tag = m_fileInfo.createId3v2Tag();
1193  }
1194 
1195  // assign some test meta data
1196  for(Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
1197  if(tag) {
1198  tag->setValue(KnownField::Title, m_testTitle);
1199  tag->setValue(KnownField::Comment, m_testComment);
1200  tag->setValue(KnownField::Album, m_testAlbum);
1201  m_preservedMetaData.push(tag->value(KnownField::Artist));
1202  tag->setValue(KnownField::TrackPosition, m_testPosition);
1203  tag->setValue(KnownField::DiskPosition, m_testPosition);
1204  // TODO: set more fields
1205  }
1206  }
1207 }
1208 
1210 {
1211  // ensure a tag exists
1212  VorbisComment *tag = m_fileInfo.createVorbisComment();
1213 
1214  // assign test meta data
1215  tag->setValue(KnownField::Title, m_testTitle);
1216  tag->setValue(KnownField::Comment, m_testComment);
1217  tag->setValue(KnownField::Album, m_testAlbum);
1218  m_preservedMetaData.push(tag->value(KnownField::Artist));
1219  tag->setValue(KnownField::TrackPosition, m_testPosition);
1220  tag->setValue(KnownField::DiskPosition, m_testPosition);
1221  // TODO: set more fields
1222 }
1223 
1228 {
1229  m_fileInfo.removeAllTags();
1230 }
1231 
1236 {
1237  cerr << endl << "Matroska parser" << endl;
1238  m_fileInfo.setForceFullParse(false);
1239  m_tagStatus = TagStatus::Original;
1240  parseFile(TestUtilities::testFilePath("matroska_wave1/test1.mkv"), &OverallTests::checkMkvTestfile1);
1241  parseFile(TestUtilities::testFilePath("matroska_wave1/test2.mkv"), &OverallTests::checkMkvTestfile2);
1242  parseFile(TestUtilities::testFilePath("matroska_wave1/test3.mkv"), &OverallTests::checkMkvTestfile3);
1243  parseFile(TestUtilities::testFilePath("matroska_wave1/test4.mkv"), &OverallTests::checkMkvTestfile4);
1244  parseFile(TestUtilities::testFilePath("matroska_wave1/test5.mkv"), &OverallTests::checkMkvTestfile5);
1245  parseFile(TestUtilities::testFilePath("matroska_wave1/test6.mkv"), &OverallTests::checkMkvTestfile6);
1246  parseFile(TestUtilities::testFilePath("matroska_wave1/test7.mkv"), &OverallTests::checkMkvTestfile7);
1247  parseFile(TestUtilities::testFilePath("matroska_wave1/test8.mkv"), &OverallTests::checkMkvTestfile8);
1248 }
1249 
1250 #ifdef PLATFORM_UNIX
1251 
1255 void OverallTests::testMkvMaking()
1256 {
1257  // full parse is required to determine padding
1258  m_fileInfo.setForceFullParse(true);
1259 
1260  // do the test under different conditions
1261  for(m_mode = 0; m_mode != 0x100; ++m_mode) {
1262  // setup test conditions
1263  m_fileInfo.setForceRewrite(m_mode & 0x1);
1264  if(m_mode & 0x2) {
1265  m_fileInfo.setTagPosition(ElementPosition::Keep);
1266  } else {
1267  m_fileInfo.setTagPosition(m_mode & 0x40 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1268  }
1269  if(m_mode & 0x4) {
1270  if(m_mode & 0x80) {
1271  continue;
1272  }
1273  m_fileInfo.setIndexPosition(ElementPosition::Keep);
1274  } else {
1275  m_fileInfo.setIndexPosition(m_mode & 0x80 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1276  }
1277  m_fileInfo.setPreferredPadding(m_mode & 0x8 ? 4096 : 0);
1278  m_fileInfo.setMinPadding(m_mode & 0x8 ? 1024 : 0);
1279  m_fileInfo.setMaxPadding(m_mode & 0x8 ? (4096 + 1024) : static_cast<size_t>(-1));
1280  m_fileInfo.setForceTagPosition(m_mode & 0x10);
1281  m_fileInfo.setForceIndexPosition(m_mode & 0x20);
1282 
1283  // print test conditions
1284  list<string> testConditions;
1285  if(m_mode & 0x1) {
1286  testConditions.emplace_back("forcing rewrite");
1287  }
1288  if(m_mode & 0x2) {
1289  if(m_mode & 0x40) {
1290  testConditions.emplace_back("removing tag");
1291  } else {
1292  testConditions.emplace_back("keeping tag position");
1293  }
1294  } else if(m_mode & 0x40) {
1295  testConditions.emplace_back("tags before data");
1296  } else {
1297  testConditions.emplace_back("tags after data");
1298  }
1299  if(m_mode & 0x8) {
1300  testConditions.emplace_back("keeping index position");
1301  } else if(m_mode & 0x80) {
1302  testConditions.emplace_back("index before data");
1303  } else {
1304  testConditions.emplace_back("index after data");
1305  }
1306  if(m_mode & 0x8) {
1307  testConditions.emplace_back("padding constraints");
1308  }
1309  if(m_mode & 0x10) {
1310  testConditions.emplace_back("forcing tag position");
1311  }
1312  if(m_mode & 0x20) {
1313  testConditions.emplace_back("forcing index position");
1314  }
1315  cerr << endl << "Matroska maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
1316 
1317  // do actual tests
1318  bool remove = (m_mode & 0x40) && (m_mode & 0x2);
1319  m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
1320  void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setMkvTestMetaData;
1321  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test1.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile1);
1322  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test2.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile2);
1323  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test3.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile3);
1324  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test4.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile4);
1325  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test5.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile5);
1326  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test6.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile6);
1327  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test7.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile7);
1328  makeFile(TestUtilities::workingCopyPath("matroska_wave1/test8.mkv"), modifyRoutine, &OverallTests::checkMkvTestfile8);
1329  }
1330 }
1331 #endif
1332 
1337 {
1338  cerr << endl << "MP4 parser" << endl;
1339  m_fileInfo.setForceFullParse(false);
1340  m_tagStatus = TagStatus::Original;
1341  parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), &OverallTests::checkMp4Testfile1);
1342  parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), &OverallTests::checkMp4Testfile2);
1343  parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), &OverallTests::checkMp4Testfile3);
1344  parseFile(TestUtilities::testFilePath("mtx-test-data/alac/othertest-itunes.m4a"), &OverallTests::checkMp4Testfile4);
1345  parseFile(TestUtilities::testFilePath("mtx-test-data/aac/he-aacv2-ps.m4a"), &OverallTests::checkMp4Testfile5);
1346 }
1347 
1348 #ifdef PLATFORM_UNIX
1349 
1353 void OverallTests::testMp4Making()
1354 {
1355  // full parse is required to determine padding
1356  m_fileInfo.setForceFullParse(true);
1357 
1358  // do the test under different conditions
1359  for(m_mode = 0; m_mode != 0x20; ++m_mode) {
1360  // setup test conditions
1361  m_fileInfo.setForceRewrite(m_mode & 0x1);
1362  if(m_mode & 0x2) {
1363  m_fileInfo.setTagPosition(ElementPosition::Keep);
1364  } else {
1365  m_fileInfo.setTagPosition(m_mode & 0x10 ? ElementPosition::BeforeData : ElementPosition::AfterData);
1366  }
1367  m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
1368  m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
1369  m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
1370  m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
1371  m_fileInfo.setForceTagPosition(m_mode & 0x8);
1372  m_fileInfo.setForceIndexPosition(m_mode & 0x8);
1373 
1374  // print test conditions
1375  list<string> testConditions;
1376  if(m_mode & 0x1) {
1377  testConditions.emplace_back("forcing rewrite");
1378  }
1379  if(m_mode & 0x2) {
1380  if(m_mode & 0x10) {
1381  testConditions.emplace_back("removing tag");
1382  } else {
1383  testConditions.emplace_back("keeping tag position");
1384  }
1385  } else if(m_mode & 0x10) {
1386  testConditions.emplace_back("tags before data");
1387  } else {
1388  testConditions.emplace_back("tags after data");
1389  }
1390  if(m_mode & 0x4) {
1391  testConditions.emplace_back("padding constraints");
1392  }
1393  if(m_mode & 0x8) {
1394  testConditions.emplace_back("forcing tag position");
1395  }
1396  cerr << endl << "MP4 maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
1397 
1398  // do actual tests
1399  bool remove = (m_mode & 0x10) && (m_mode & 0x2);
1400  m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
1401  void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setMp4TestMetaData;
1402  makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile1);
1403  makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile2);
1404  makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile3);
1405  makeFile(TestUtilities::workingCopyPath("mtx-test-data/alac/othertest-itunes.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile4);
1406  makeFile(TestUtilities::workingCopyPath("mtx-test-data/aac/he-aacv2-ps.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile5);
1407  }
1408 }
1409 #endif
1410 
1415 {
1416  cerr << endl << "MP3 parser" << endl;
1417  m_fileInfo.setForceFullParse(false);
1418  m_tagStatus = TagStatus::Original;
1419  parseFile(TestUtilities::testFilePath("mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), &OverallTests::checkMp3Testfile1);
1420 }
1421 
1422 #ifdef PLATFORM_UNIX
1423 
1427 void OverallTests::testMp3Making()
1428 {
1429  // full parse is required to determine padding
1430  m_fileInfo.setForceFullParse(true);
1431 
1432  // do the test under different conditions
1433  for(m_mode = 0; m_mode != 0x10; ++m_mode) {
1434  // setup test conditions
1435  m_fileInfo.setForceRewrite(m_mode & 0x1);
1436  m_fileInfo.setTagPosition(ElementPosition::Keep);
1437  m_fileInfo.setIndexPosition(ElementPosition::Keep);
1438  m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
1439  m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
1440  m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
1441  m_fileInfo.setForceTagPosition(false);
1442  m_fileInfo.setForceIndexPosition(false);
1443 
1444  // print test conditions
1445  list<string> testConditions;
1446  if(m_mode & 0x1) {
1447  testConditions.emplace_back("forcing rewrite");
1448  }
1449  if(m_mode & 0x2) {
1450  if(m_mode & 0x8) {
1451  testConditions.emplace_back("removing tag");
1452  } else {
1453  testConditions.emplace_back("ID3v1 and ID3v2");
1454  }
1455  } else if(m_mode & 0x8) {
1456  testConditions.emplace_back("ID3v1 only");
1457  } else {
1458  testConditions.emplace_back("ID3v2 only");
1459  }
1460  if(m_mode & 0x4) {
1461  testConditions.emplace_back("padding constraints");
1462  }
1463  cerr << endl << "MP3 maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
1464 
1465  // do actual tests
1466  bool remove = (m_mode & 0x10) && (m_mode & 0x2);
1467  m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
1468  void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setMp3TestMetaData;
1469  makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), modifyRoutine, &OverallTests::checkMp3Testfile1);
1470  }
1471 }
1472 #endif
1473 
1479 {
1480  cerr << endl << "OGG parser" << endl;
1481  m_fileInfo.setForceFullParse(false);
1482  m_tagStatus = TagStatus::Original;
1483  parseFile(TestUtilities::testFilePath("mtx-test-data/ogg/qt4dance_medium.ogg"), &OverallTests::checkOggTestfile1);
1484  parseFile(TestUtilities::testFilePath("mtx-test-data/opus/v-opus.ogg"), &OverallTests::checkOggTestfile2);
1485 }
1486 
1487 #ifdef PLATFORM_UNIX
1488 
1494 void OverallTests::testOggMaking()
1495 {
1496  // full parse is required to determine padding
1497  m_fileInfo.setForceFullParse(true);
1498 
1499  // do the test under different conditions
1500  for(m_mode = 0; m_mode != 0x2; ++m_mode) {
1501  // no need to setup test conditions because the Ogg maker
1502  // doesn't take those settings into account (currently)
1503 
1504  // print test conditions
1505  list<string> testConditions;
1506  if(m_mode & 0x1) {
1507  testConditions.emplace_back("removing tag");
1508  } else {
1509  testConditions.emplace_back("modifying tag");
1510  }
1511  cerr << endl << "OGG maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
1512 
1513  // do actual tests
1514  bool remove = m_mode & 0x1;
1515  m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
1516  void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
1517  makeFile(TestUtilities::workingCopyPath("mtx-test-data/ogg/qt4dance_medium.ogg"), modifyRoutine, &OverallTests::checkOggTestfile1);
1518  makeFile(TestUtilities::workingCopyPath("mtx-test-data/opus/v-opus.ogg"), modifyRoutine, &OverallTests::checkOggTestfile2);
1519  }
1520 }
1521 #endif
1522 
1527 {
1528  cerr << endl << "FLAC parser" << endl;
1529  m_fileInfo.setForceFullParse(false);
1530  m_tagStatus = TagStatus::Original;
1531  parseFile(TestUtilities::testFilePath("flac/test.flac"), &OverallTests::checkFlacTestfile1);
1532  parseFile(TestUtilities::testFilePath("flac/test.ogg"), &OverallTests::checkFlacTestfile2);
1533 }
1534 
1535 #ifdef PLATFORM_UNIX
1536 
1540 void OverallTests::testFlacMaking()
1541 {
1542  // full parse is required to determine padding
1543  m_fileInfo.setForceFullParse(true);
1544 
1545  // do the test under different conditions
1546  for(m_mode = 0; m_mode != 0x2; ++m_mode) {
1547  // TODO: setup test conditions
1548 
1549  // print test conditions
1550  list<string> testConditions;
1551  if(m_mode & 0x1) {
1552  testConditions.emplace_back("removing tag");
1553  } else {
1554  testConditions.emplace_back("modifying tag");
1555  }
1556  cerr << endl << "FLAC maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
1557 
1558  // do actual tests
1559  bool remove = m_mode & 0x1;
1560  m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
1561  void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
1562  makeFile(TestUtilities::workingCopyPath("flac/test.flac"), modifyRoutine, &OverallTests::checkFlacTestfile1);
1563  makeFile(TestUtilities::workingCopyPath("flac/test.ogg"), modifyRoutine, &OverallTests::checkFlacTestfile2);
1564  }
1565 }
1566 #endif
std::vector< IdType > IdContainerType
Definition: tagtarget.h:35
void checkMp3TestMetaData()
Checks whether test meta data for MP3 files has been applied correctly.
Definition: overall.cpp:905
The TagValue class wraps values of different types.
Definition: tagvalue.h:63
void checkOggTestfile2()
Checks "mtx-test-data/opus/v-opus.ogg".
Definition: overall.cpp:1005
void makeFile(const string &path, void(OverallTests::*modifyRoutine)(void), void(OverallTests::*checkRoutine)(void))
Parses the specified file, modifies it using the specified modify routine, parses the file again and ...
Definition: overall.cpp:167
Implementation of Media::Tag for Vorbis comments.
Definition: vorbiscomment.h:15
void checkMp3PaddingConstraints()
Checks whether padding constraints are met.
Definition: overall.cpp:946
The Size class defines the size of a two-dimensional object using integer point precision.
Definition: size.h:16
void removeAllTags()
Removes all tags.
Definition: overall.cpp:1227
void checkMp4PaddingConstraints()
Checks whether padding constraints are met.
Definition: overall.cpp:827
void testFlacParsing()
Tests the FLAC parser via MediaFileInfo.
Definition: overall.cpp:1526
void tearDown()
Definition: overall.cpp:144
void checkMp4Testfile3()
Checks "mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4".
Definition: overall.cpp:680
void setOggTestMetaData()
Definition: overall.cpp:1209
STL namespace.
void checkMp4Testfile2()
Checks "mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4".
Definition: overall.cpp:617
void checkOggTestfile1()
Checks "mtx-test-data/ogg/qt4dance_medium.ogg".
Definition: overall.cpp:964
void checkMkvTestfile3()
Checks "matroska_wave1/test3.mkv".
Definition: overall.cpp:287
void checkMkvTestMetaData()
Checks whether test meta data for Matroska files has been applied correctly.
Definition: overall.cpp:536
void checkMp4Testfile5()
Checks "mtx-test-data/aac/he-aacv2-ps.m4a".
Definition: overall.cpp:763
void checkMkvTestfile6()
Checks "matroska_wave1/test6.mkv".
Definition: overall.cpp:411
The PositionInSet class describes the position of an element in a set which consists of a certain num...
Definition: positioninset.h:20
void checkFlacTestfile2()
Checks "flac/test.ogg" (converted from "flac/test.flac" via ffmpeg).
Definition: overall.cpp:1105
void checkMkvTestfile7()
Checks "matroska_wave1/test7.mkv".
Definition: overall.cpp:452
const TagValue & value(KnownField field) const
Returns the value of the specified field.
The AbstractAttachment class parses and stores attachment information.
void checkMkvTestfile2()
Checks "matroska_wave1/test2.mkv".
Definition: overall.cpp:247
void checkMkvPaddingConstraints()
Checks whether padding constraints are met.
Definition: overall.cpp:564
void checkOggTestMetaData()
Checks whether test meta data for OGG files has been applied correctly.
Definition: overall.cpp:1040
bool setValue(const typename Id3v2Frame::identifierType &id, const TagValue &value)
Definition: id3v2tag.cpp:155
Implementation of Media::Tag for the MP4 container.
Definition: mp4tag.h:90
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
Definition: overall.cpp:43
void testOggParsing()
Tests the Ogg parser via MediaFileInfo.
Definition: overall.cpp:1478
void checkMp3Testfile1()
Checks "mtx-test-data/mp3/id3-tag-and-xing-header.mp3".
Definition: overall.cpp:841
void setMp3TestMetaData()
Definition: overall.cpp:1179
The Tag class is used to store, read and write tag information.
Definition: tag.h:98
void checkMkvTestfile1()
Checks "matroska_wave1/test1.mkv".
Definition: overall.cpp:207
const TagValue & value(KnownField value) const
Returns the value of the specified field.
Definition: mp4tag.cpp:58
void checkMp4TestMetaData()
Checks whether test meta data for MP4 files has been applied correctly.
Definition: overall.cpp:805
bool setValue(KnownField field, const TagValue &value)
Assigns the given value to the specified field.
void checkMp4Testfile4()
Checks "mtx-test-data/mp4/alac/othertest-itunes.m4a".
Definition: overall.cpp:717
Implementation of Media::Tag for ID3v2 tags.
Definition: id3v2tag.h:55
void setMp4TestMetaData()
Definition: overall.cpp:1164
Implementation of Media::Tag for ID3v1 tags.
Definition: id3v1tag.h:9
PositionInSet toPositionInSet() const
Converts the value of the current TagValue object to its equivalent PositionInSet representation...
Definition: tagvalue.cpp:227
The MediaFileInfo class allows to read and write tag information providing a container/tag format ind...
Definition: mediafileinfo.h:52
void parseFile(const string &path, void(OverallTests::*checkRoutine)(void))
Parses the specified file and tests the results using the specified check routine.
Definition: overall.cpp:150
TagStatus
Definition: overall.cpp:32
void testMkvParsing()
Tests the Matroska parser via MediaFileInfo.
Definition: overall.cpp:1235
void testMp3Parsing()
Tests the MP3 parser via MediaFileInfo.
Definition: overall.cpp:1414
void checkMkvTestfile8()
Checks "matroska_wave1/test8.mkv".
Definition: overall.cpp:494
void checkMkvTestfile5()
Checks "matroska_wave1/test5.mkv".
Definition: overall.cpp:365
const TagValue & value(const typename Id3v2Frame::identifierType &id) const
Definition: id3v2tag.cpp:150
void checkMkvTestfile4()
Checks "matroska_wave1/test4.mkv".
Definition: overall.cpp:327
void checkMp4Testfile1()
Checks "mtx-test-data/mp4/10-DanseMacabreOp.40.m4a".
Definition: overall.cpp:578
void testMp4Parsing()
Tests the MP4 parser via MediaFileInfo.
Definition: overall.cpp:1336
virtual bool setValue(KnownField field, const TagValue &value)=0
Assigns the given value to the specified field.
The TagTarget class specifies the target of a tag.
Definition: tagtarget.h:31
Contains all classes and functions of the TagInfo library.
Definition: exceptions.h:9
void setMkvTestMetaData()
Creates a tag targeting the first track with some test meta data.
Definition: overall.cpp:1134
void setUp()
Creates some test meta data.
Definition: overall.cpp:134
constexpr int32 position() const
Returns the element position of the current instance.
Definition: positioninset.h:75
const TagValue & value(KnownField value) const
Returns the value of the specified field.
Definition: id3v1tag.cpp:139
virtual const TagValue & value(KnownField field) const =0
Returns the value of the specified field.
CPPUNIT_TEST_SUITE_REGISTRATION(OverallTests)
void checkFlacTestfile1()
Checks "flac/test.flac" (converted from "mtx-test-data/alac/othertest-itunes.m4a" via ffmpeg)...
Definition: overall.cpp:1063