4 #include "../abstracttrack.h" 5 #include "../mp4/mp4ids.h" 6 #include "../mp4/mp4tag.h" 23 void OverallTests::checkMp4Testfile1()
26 const auto tracks = m_fileInfo.tracks();
27 CPPUNIT_ASSERT(tracks.size() == 1);
28 for(
const auto &track : tracks) {
33 CPPUNIT_ASSERT(track->creationTime().year() == 2012);
34 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
38 CPPUNIT_FAIL(
"unknown track ID");
41 const auto tags = m_fileInfo.tags();
44 CPPUNIT_ASSERT(tags.size() == 1);
45 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Title).toString() ==
"Danse Macabre, Op.40");
48 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Encoder).toString() ==
"qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
52 checkMp4TestMetaData();
55 CPPUNIT_ASSERT(tags.size() == 0);
62 void OverallTests::checkMp4Testfile2()
65 const auto tracks = m_fileInfo.tracks();
66 CPPUNIT_ASSERT(tracks.size() == 5);
67 for(
const auto &track : tracks) {
73 CPPUNIT_ASSERT(track->version() == 4);
74 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
75 CPPUNIT_ASSERT(track->pixelSize() ==
Size(1920, 750));
83 CPPUNIT_ASSERT(track->language() ==
"eng");
84 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
85 CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
91 CPPUNIT_ASSERT(track->language() ==
"eng");
92 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
96 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
97 CPPUNIT_ASSERT(track->language() ==
"eng");
98 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
101 CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
102 CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
103 CPPUNIT_ASSERT(track->creationTime().year() == 2013);
106 CPPUNIT_FAIL(
"unknown track ID");
109 const auto tags = m_fileInfo.tags();
110 switch(m_tagStatus) {
112 CPPUNIT_ASSERT(tags.size() == 0);
115 checkMp4TestMetaData();
118 CPPUNIT_ASSERT(tags.size() == 0);
125 void OverallTests::checkMp4Testfile3()
128 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"dash");
129 const auto tracks = m_fileInfo.tracks();
130 CPPUNIT_ASSERT(tracks.size() == 1);
131 for(
const auto &track : tracks) {
132 switch(track->id()) {
137 CPPUNIT_ASSERT(track->version() == 3.1);
138 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
139 CPPUNIT_ASSERT(track->pixelSize() ==
Size(854, 480));
140 CPPUNIT_ASSERT(!strcmp(track->chromaFormat(),
"YUV 4:2:0"));
143 CPPUNIT_FAIL(
"unknown track ID");
146 const auto tags = m_fileInfo.tags();
147 switch(m_tagStatus) {
149 CPPUNIT_ASSERT(tags.size() == 0);
152 checkMp4TestMetaData();
155 CPPUNIT_ASSERT(tags.size() == 0);
162 void OverallTests::checkMp4Testfile4()
165 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"M4A ");
166 const auto tracks = m_fileInfo.tracks();
167 CPPUNIT_ASSERT(tracks.size() == 1);
168 for(
const auto &track : tracks) {
169 switch(track->id()) {
173 CPPUNIT_ASSERT(track->creationTime().year() == 2008);
174 CPPUNIT_ASSERT(track->channelCount() == 2);
175 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
178 CPPUNIT_FAIL(
"unknown track ID");
181 const auto tags = m_fileInfo.tags();
182 switch(m_tagStatus) {
184 CPPUNIT_ASSERT(tags.size() == 1);
187 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Album).toString() ==
"Don't Go Away (Apple Lossless)");
188 CPPUNIT_ASSERT(tags.front()->value(
KnownField::Genre).toString() ==
"Alternative & Punk");
193 CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(
KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
198 checkMp4TestMetaData();
201 CPPUNIT_ASSERT(tags.size() == 0);
208 void OverallTests::checkMp4Testfile5()
211 CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() ==
"mp42");
212 const auto tracks = m_fileInfo.tracks();
213 CPPUNIT_ASSERT(tracks.size() == 1);
214 for(
const auto &track : tracks) {
215 switch(track->id()) {
222 CPPUNIT_ASSERT(track->creationTime().year() == 2014);
223 CPPUNIT_ASSERT(track->channelCount() == 2);
226 CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
227 CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
228 CPPUNIT_ASSERT(track->bitsPerSample() == 16);
231 CPPUNIT_FAIL(
"unknown track ID");
234 const auto tags = m_fileInfo.tags();
235 switch(m_tagStatus) {
237 CPPUNIT_ASSERT(tags.size() == 0);
240 checkMp4TestMetaData();
243 CPPUNIT_ASSERT(tags.size() == 0);
250 void OverallTests::checkMp4TestMetaData()
253 const auto tags = m_fileInfo.tags();
254 Mp4Tag *tag = m_fileInfo.mp4Tag();
255 CPPUNIT_ASSERT(tags.size() == 1);
256 CPPUNIT_ASSERT(tag !=
nullptr);
267 m_preservedMetaData.pop();
273 void OverallTests::checkMp4Constraints()
277 CPPUNIT_ASSERT(m_fileInfo.container());
280 CPPUNIT_ASSERT_EQUAL(4096ul, m_fileInfo.paddingSize());
282 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
283 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
285 if(!(m_mode &
RemoveTag) && (m_fileInfo.container()->documentType() !=
"dash") && ((m_mode & ForceRewring) || (m_mode &
ForceTagPos))) {
286 CPPUNIT_ASSERT_EQUAL(m_expectedTagPos, m_fileInfo.container()->determineTagPosition());
291 void OverallTests::setMp4TestMetaData()
294 Tag *tag = m_fileInfo.container()->createTag();
311 cerr << endl <<
"MP4 parser" << endl;
312 m_fileInfo.setForceFullParse(
false);
314 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), &OverallTests::checkMp4Testfile1);
315 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), &OverallTests::checkMp4Testfile2);
316 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), &OverallTests::checkMp4Testfile3);
317 parseFile(TestUtilities::testFilePath(
"mtx-test-data/alac/othertest-itunes.m4a"), &OverallTests::checkMp4Testfile4);
318 parseFile(TestUtilities::testFilePath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), &OverallTests::checkMp4Testfile5);
326 void OverallTests::testMp4Making()
329 m_fileInfo.setForceFullParse(
true);
332 for(m_mode = 0; m_mode != 0x20; ++m_mode) {
339 m_fileInfo.setTagPosition(ElementPosition::Keep);
341 m_fileInfo.setTagPosition(m_mode &
TagsBeforeData ? ElementPosition::BeforeData : ElementPosition::AfterData);
343 m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
345 m_fileInfo.setMinPadding(m_mode & PaddingConstraints ? 1024 : 0);
346 m_fileInfo.setMaxPadding(m_mode & PaddingConstraints ? (4096 + 1024) : static_cast<size_t>(-1));
347 m_fileInfo.setForceTagPosition(m_mode &
ForceTagPos);
348 m_fileInfo.setForceIndexPosition(m_mode & ForceTagPos);
351 list<string> testConditions;
352 if(m_mode & ForceRewring) {
353 testConditions.emplace_back(
"forcing rewrite");
355 if(m_mode & KeepTagPos) {
357 testConditions.emplace_back(
"removing tag");
359 testConditions.emplace_back(
"keeping tag position");
362 testConditions.emplace_back(
"tags before data");
364 testConditions.emplace_back(
"tags after data");
366 if(m_mode & PaddingConstraints) {
367 testConditions.emplace_back(
"padding constraints");
369 if(m_mode & ForceTagPos) {
370 testConditions.emplace_back(
"forcing tag position");
372 cerr << endl <<
"MP4 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
376 void (
OverallTests::*modifyRoutine)(void) = (m_mode &
RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setMp4TestMetaData;
377 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile1);
378 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile2);
379 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile3);
380 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/alac/othertest-itunes.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile4);
381 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/aac/he-aacv2-ps.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile5);
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testMp4Parsing()
Tests the MP4 parser via MediaFileInfo.