4 #include "../abstracttrack.h" 5 #include "../mp4/mp4ids.h" 6 #include "../mp4/mp4tag.h" 7 #include "../mp4/mp4container.h" 24 void OverallTests::checkMp4Testfile1()
27 const auto tracks = m_fileInfo.tracks();
28 CPPUNIT_ASSERT(tracks.size() == 1);
29 for(
const auto &track : tracks) {
34 CPPUNIT_ASSERT_EQUAL(2012, track->creationTime().year());
35 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
39 CPPUNIT_FAIL(
"unknown track ID");
42 const auto tags = m_fileInfo.tags();
45 CPPUNIT_ASSERT(tags.size() == 1);
46 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Danse Macabre, Op.40");
49 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
53 checkMp4TestMetaData();
56 CPPUNIT_ASSERT(tags.size() == 0);
63 void OverallTests::checkMp4Testfile2()
66 const auto tracks = m_fileInfo.tracks();
67 CPPUNIT_ASSERT_EQUAL(5_st, tracks.size());
68 for(
const auto &track : tracks) {
74 CPPUNIT_ASSERT_EQUAL(4.0, track->version());
75 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
76 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
84 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
85 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
86 CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
92 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
93 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
97 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
98 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
99 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
102 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
103 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
104 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
107 CPPUNIT_FAIL(
"unknown track ID");
110 const auto tags = m_fileInfo.tags();
111 switch(m_tagStatus) {
113 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
116 checkMp4TestMetaData();
119 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
126 void OverallTests::checkMp4Testfile3()
129 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"dash");
130 const auto tracks = m_fileInfo.tracks();
131 CPPUNIT_ASSERT(tracks.size() == 1);
132 for(
const auto &track : tracks) {
133 switch(track->id()) {
138 CPPUNIT_ASSERT(track->version() == 3.1);
139 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
140 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
141 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
144 CPPUNIT_FAIL(
"unknown track ID");
147 const auto tags = m_fileInfo.tags();
148 switch(m_tagStatus) {
150 CPPUNIT_ASSERT(tags.size() == 0);
153 checkMp4TestMetaData();
156 CPPUNIT_ASSERT(tags.size() == 0);
163 void OverallTests::checkMp4Testfile4()
166 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"M4A ");
167 const auto tracks = m_fileInfo.tracks();
168 CPPUNIT_ASSERT(tracks.size() == 1);
169 for(
const auto &track : tracks) {
170 switch(track->id()) {
174 CPPUNIT_ASSERT(track->creationTime().year() == 2008);
175 CPPUNIT_ASSERT(track->channelCount() == 2);
176 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
179 CPPUNIT_FAIL(
"unknown track ID");
182 const auto tags = m_fileInfo.tags();
183 switch(m_tagStatus) {
185 CPPUNIT_ASSERT(tags.size() == 1);
188 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Album).toString() ==
"Don't Go Away (Apple Lossless)");
189 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Alternative & Punk");
194 CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(
KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
199 checkMp4TestMetaData();
202 CPPUNIT_ASSERT(tags.size() == 0);
209 void OverallTests::checkMp4Testfile5()
212 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"mp42");
213 const auto tracks = m_fileInfo.tracks();
214 CPPUNIT_ASSERT(tracks.size() == 1);
215 for(
const auto &track : tracks) {
216 switch(track->id()) {
223 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
224 CPPUNIT_ASSERT(track->channelCount() == 2);
227 CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
228 CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
229 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
232 CPPUNIT_FAIL(
"unknown track ID");
235 const auto tags = m_fileInfo.tags();
236 switch(m_tagStatus) {
238 CPPUNIT_ASSERT(tags.size() == 0);
241 checkMp4TestMetaData();
244 CPPUNIT_ASSERT(tags.size() == 0);
251 void OverallTests::checkMp4Testfile6()
254 const auto tracks = m_fileInfo.tracks();
256 CPPUNIT_ASSERT(tracks.size() == 4);
258 CPPUNIT_ASSERT(tracks.size() == 6);
260 bool track2Present =
false, track5Present =
false;
261 for(
const auto &track : tracks) {
262 switch(track->id()) {
267 CPPUNIT_ASSERT(track->version() == 4);
268 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
269 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
272 CPPUNIT_ASSERT(track2Present = !track2Present);
278 CPPUNIT_ASSERT_EQUAL(
"eng"s, track->language());
279 CPPUNIT_ASSERT_EQUAL(2013, track->creationTime().year());
280 CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
286 CPPUNIT_ASSERT(track->language() ==
"eng");
287 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
291 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
292 CPPUNIT_ASSERT(track->language() ==
"eng");
293 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
296 CPPUNIT_ASSERT(track5Present = !track5Present);
299 CPPUNIT_ASSERT_EQUAL(2012, track->creationTime().year());
300 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
304 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
305 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
306 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
309 CPPUNIT_FAIL(
"unknown track ID");
312 if(m_mode & Mp4TestFlags::RemoveTagOrTrack) {
313 CPPUNIT_ASSERT(!track2Present);
314 CPPUNIT_ASSERT(!track5Present);
316 CPPUNIT_ASSERT(track2Present);
317 CPPUNIT_ASSERT(track5Present);
320 CPPUNIT_ASSERT(m_fileInfo.tags().size() == 0);
326 void OverallTests::checkMp4TestMetaData()
329 const auto tags = m_fileInfo.tags();
330 Mp4Tag *tag = m_fileInfo.mp4Tag();
331 CPPUNIT_ASSERT(tags.size() == 1);
332 CPPUNIT_ASSERT(tag !=
nullptr);
343 m_preservedMetaData.pop();
349 void OverallTests::checkMp4Constraints()
353 CPPUNIT_ASSERT(m_fileInfo.container());
356 CPPUNIT_ASSERT_EQUAL(4096_st, m_fileInfo.paddingSize());
358 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
359 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
361 if(!(m_mode &
RemoveTagOrTrack) && (m_fileInfo.container()->documentType() !=
"dash") && ((m_mode & ForceRewring) || (m_mode &
ForceTagPos))) {
362 const ElementPosition currentTagPos = m_fileInfo.container()->determineTagPosition();
363 if(currentTagPos == ElementPosition::Keep) {
364 CPPUNIT_ASSERT_EQUAL(m_expectedTagPos, m_fileInfo.container()->determineIndexPosition());
373 void OverallTests::setMp4TestMetaData()
376 Tag *tag = m_fileInfo.container()->createTag();
391 void OverallTests::addMp4Track()
393 m_additionalFileInfo.setPath(TestUtilities::testFilePath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"));
394 m_additionalFileInfo.reopen(
true);
395 m_additionalFileInfo.parseContainerFormat();
396 m_additionalFileInfo.parseTracks();
399 const auto &tracks = m_additionalFileInfo.tracks();
400 CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
401 CPPUNIT_ASSERT_EQUAL(TrackType::Mp4Track, tracks[0]->type());
402 auto *track =
static_cast<Mp4Track *
>(tracks[0]);
403 CPPUNIT_ASSERT(static_cast<Mp4Container *>(m_additionalFileInfo.container())->removeTrack(track));
404 static_cast<Mp4Container *
>(m_fileInfo.container())->addTrack(track);
412 cerr << endl <<
"MP4 parser" << endl;
413 m_fileInfo.setForceFullParse(
false);
415 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), &OverallTests::checkMp4Testfile1);
416 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), &OverallTests::checkMp4Testfile2);
417 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), &OverallTests::checkMp4Testfile3);
418 parseFile(TestUtilities::testFilePath(
"mtx-test-data/alac/othertest-itunes.m4a"), &OverallTests::checkMp4Testfile4);
419 parseFile(TestUtilities::testFilePath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), &OverallTests::checkMp4Testfile5);
427 void OverallTests::testMp4Making()
430 m_fileInfo.setForceFullParse(
true);
433 for(m_mode = 0; m_mode != 0x20; ++m_mode) {
440 m_fileInfo.setTagPosition(ElementPosition::Keep);
442 m_fileInfo.setTagPosition(m_mode &
TagsBeforeData ? ElementPosition::BeforeData : ElementPosition::AfterData);
444 m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
446 m_fileInfo.setMinPadding(m_mode & PaddingConstraints ? 1024 : 0);
447 m_fileInfo.setMaxPadding(m_mode & PaddingConstraints ? (4096 + 1024) : static_cast<size_t>(-1));
448 m_fileInfo.setForceTagPosition(m_mode &
ForceTagPos);
449 m_fileInfo.setForceIndexPosition(m_mode & ForceTagPos);
452 list<string> testConditions;
453 if(m_mode & ForceRewring) {
454 testConditions.emplace_back(
"forcing rewrite");
456 if(m_mode & KeepTagPos) {
458 testConditions.emplace_back(
"removing tag");
460 testConditions.emplace_back(
"keeping tag position");
463 testConditions.emplace_back(
"tags before data");
465 testConditions.emplace_back(
"tags after data");
467 if(m_mode & PaddingConstraints) {
468 testConditions.emplace_back(
"padding constraints");
470 if(m_mode & ForceTagPos) {
471 testConditions.emplace_back(
"forcing tag position");
473 cerr << endl <<
"MP4 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
478 void (
OverallTests::*modifyRoutine)(void) = (m_mode &
RemoveTagOrTrack) ? &OverallTests::removeAllTags : &OverallTests::setMp4TestMetaData;
479 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile1);
480 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile2);
481 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile3);
482 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/alac/othertest-itunes.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile4);
483 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile5);
485 modifyRoutine = (m_mode &
RemoveTagOrTrack) ? &OverallTests::removeSecondTrack : &OverallTests::addMp4Track;
486 m_fileInfo.setTagPosition(ElementPosition::Keep);
487 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile6);
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testMp4Parsing()
Tests the MP4 parser via MediaFileInfo.