added tests for overall MP3, MP4 and OGG parsing/making

This commit is contained in:
Martchus 2016-03-22 22:54:04 +01:00
parent b8e8dcd778
commit 0395e2c487
1 changed files with 707 additions and 5 deletions

View File

@ -4,7 +4,12 @@
#include "../mp4/mp4ids.h"
#include "../mpegaudio/mpegaudioframe.h"
#include "../matroska/matroskacontainer.h"
#include "../id3/id3v1tag.h"
#include "../id3/id3v2tag.h"
#include "../mp4/mp4tag.h"
#include "../vorbis/vorbiscomment.h"
#include <c++utilities/conversion/binaryconversion.h>
#include <c++utilities/conversion/stringconversion.h>
#include <c++utilities/tests/testutils.h>
@ -14,6 +19,7 @@
#include <fstream>
#include <sstream>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
@ -60,7 +66,26 @@ public:
void checkMkvTestMetaData();
void checkMkvPaddingConstraints();
void checkMp4Testfile1();
void checkMp4Testfile2();
void checkMp4Testfile3();
void checkMp4Testfile4();
void checkMp4Testfile5();
void checkMp4TestMetaData();
void checkMp4PaddingConstraints();
void checkMp3Testfile1();
void checkMp3TestMetaData();
void checkMp3PaddingConstraints();
void checkOggTestfile1();
void checkOggTestfile2();
void checkOggTestMetaData();
void setMkvTestMetaData();
void setMp4TestMetaData();
void setMp3TestMetaData();
void setOggTestMetaData();
void removeAllTags();
void testMkvParsing();
@ -79,6 +104,8 @@ private:
TagValue m_testAlbum;
TagValue m_testPartNumber;
TagValue m_testTotalParts;
TagValue m_testPosition;
queue<TagValue> m_preservedMetaData;
TagStatus m_tagStatus;
uint16 m_mode;
};
@ -95,6 +122,7 @@ void OverallTests::setUp()
m_testAlbum.assignText("some album", TagTextEncoding::Utf8);
m_testPartNumber.assignInteger(41);
m_testTotalParts.assignInteger(61);
m_testPosition.assignPosition(PositionInSet(41, 61));
}
void OverallTests::tearDown()
@ -141,6 +169,13 @@ void OverallTests::makeFile(const string &path, void (OverallTests::*modifyRouti
case ContainerFormat::Matroska:
checkMkvPaddingConstraints();
break;
case ContainerFormat::Mp4:
checkMp4PaddingConstraints();
break;
case ContainerFormat::MpegAudioFrames:
case ContainerFormat::Adts:
checkMp3PaddingConstraints();
break;
default:
;
}
@ -518,6 +553,483 @@ void OverallTests::checkMkvPaddingConstraints()
}
}
/*!
* \brief Checks "mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"
*/
void OverallTests::checkMp4Testfile1()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
switch(track->id()) {
case 1:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
CPPUNIT_ASSERT(track->creationTime().year() == 2012);
CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Danse Macabre, Op.40");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Saint-Saëns");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Classical");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "qaac 1.32, CoreAudioToolbox 7.9.7.3, AAC-LC Encoder, TVBR q63, Quality 96");
CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet().position() == 10);
break;
case TagStatus::TestMetaDataPresent:
checkMp4TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks "mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"
*/
void OverallTests::checkMp4Testfile2()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 5);
for(const auto &track : tracks) {
switch(track->id()) {
case 1:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
CPPUNIT_ASSERT(track->format().sub == SubFormats::AvcHighProfile);
CPPUNIT_ASSERT(track->version() == 4);
CPPUNIT_ASSERT(track->creationTime().year() == 2013);
CPPUNIT_ASSERT(track->pixelSize() == Size(1920, 750));
break;
case 2:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
CPPUNIT_ASSERT(track->format().sub == SubFormats::AacMpeg4LowComplexityProfile);
CPPUNIT_ASSERT(!(track->format().extension & ExtensionFormats::SpectralBandReplication));
CPPUNIT_ASSERT(!(track->format().extension & ExtensionFormats::ParametricStereo));
CPPUNIT_ASSERT(track->language() == "eng");
CPPUNIT_ASSERT(track->creationTime().year() == 2013);
CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
break;
case 3:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Ac3);
CPPUNIT_ASSERT(track->language() == "eng");
CPPUNIT_ASSERT(track->creationTime().year() == 2013);
break;
case 4:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::DtsHd);
CPPUNIT_ASSERT(track->language() == "eng");
CPPUNIT_ASSERT(track->creationTime().year() == 2013);
break;
case 6:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Text);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::TimedText);
CPPUNIT_ASSERT(track->creationTime().year() == 2013);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 0);
break;
case TagStatus::TestMetaDataPresent:
checkMp4TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks "mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"
*/
void OverallTests::checkMp4Testfile3()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "dash");
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
switch(track->id()) {
case 1:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Avc);
CPPUNIT_ASSERT(track->format().sub == SubFormats::AvcMainProfile);
CPPUNIT_ASSERT(track->version() == 3.1);
CPPUNIT_ASSERT(track->creationTime().year() == 2014);
CPPUNIT_ASSERT(track->pixelSize() == Size(854, 480));
CPPUNIT_ASSERT(!strcmp(track->chromaFormat(), "YUV 4:2:0"));
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 0);
break;
case TagStatus::TestMetaDataPresent:
checkMp4TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks "mtx-test-data/mp4/alac/othertest-itunes.m4a"
*/
void OverallTests::checkMp4Testfile4()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "M4A ");
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
switch(track->id()) {
case 1:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Alac);
CPPUNIT_ASSERT(track->creationTime().year() == 2008);
CPPUNIT_ASSERT(track->channelCount() == 2);
CPPUNIT_ASSERT(track->bitsPerSample() == 16);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Sad Song");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Oasis");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Album).toString() == "Don't Go Away (Apple Lossless)");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Alternative & Punk");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "iTunes v7.5.0.20");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Year).toString() == "1998");
CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).isEmpty());
CPPUNIT_ASSERT(tags.front()->value(KnownField::Cover).dataSize() == 0x58f3);
CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet() == PositionInSet(3, 4));
CPPUNIT_ASSERT(tags.front()->value(KnownField::DiskPosition).toPositionInSet() == PositionInSet(1, 1));
break;
case TagStatus::TestMetaDataPresent:
checkMp4TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks "mtx-test-data/aac/he-aacv2-ps.m4a"
*/
void OverallTests::checkMp4Testfile5()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Mp4);
CPPUNIT_ASSERT(m_fileInfo.container() && m_fileInfo.container()->documentType() == "mp42");
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
switch(track->id()) {
case 1:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Aac);
CPPUNIT_ASSERT(track->format().sub == SubFormats::AacMpeg4LowComplexityProfile);
CPPUNIT_ASSERT(track->format().extension & ExtensionFormats::SpectralBandReplication);
CPPUNIT_ASSERT(track->format().extension & ExtensionFormats::ParametricStereo);
CPPUNIT_ASSERT(track->creationTime().year() == 2014);
CPPUNIT_ASSERT(track->channelCount() == 2);
CPPUNIT_ASSERT(track->channelConfig() == Mpeg4ChannelConfigs::FrontCenter);
CPPUNIT_ASSERT(track->extensionChannelConfig() == Mpeg4ChannelConfigs::FrontLeftFrontRight);
CPPUNIT_ASSERT(track->samplingFrequency() == 24000);
CPPUNIT_ASSERT(track->extensionSamplingFrequency() == 48000);
CPPUNIT_ASSERT(track->bitsPerSample() == 16);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 0);
break;
case TagStatus::TestMetaDataPresent:
checkMp4TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks whether test meta data for MP4 files has been applied correctly.
*/
void OverallTests::checkMp4TestMetaData()
{
// check whether a tag is assigned
const auto tags = m_fileInfo.tags();
Mp4Tag *tag = m_fileInfo.mp4Tag();
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tag != nullptr);
// check test meta data
CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition) == m_testPosition);
CPPUNIT_ASSERT(tag->value(KnownField::DiskPosition) == m_testPosition);
// TODO: check more fields
m_preservedMetaData.pop();
}
/*!
* \brief Checks whether padding constraints are met.
*/
void OverallTests::checkMp4PaddingConstraints()
{
if((m_mode & 0x4) && (m_mode & 0x1)) {
CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
} else if(m_mode & 0x4) {
CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
// TODO: check tag position and rewriting behaviour
}
}
/*!
* \brief Checks "mtx-test-data/mp3/id3-tag-and-xing-header.mp3"
*/
void OverallTests::checkMp3Testfile1()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::MpegAudioFrames);
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Mpeg1Audio);
CPPUNIT_ASSERT(track->format().sub == SubFormats::Mpeg1Layer3);
CPPUNIT_ASSERT(track->channelCount() == 2);
CPPUNIT_ASSERT(track->channelConfig() == static_cast<byte>(MpegChannelMode::JointStereo));
CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
CPPUNIT_ASSERT(track->duration().seconds() == 3);
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(m_fileInfo.id3v1Tag());
CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().size() == 1);
CPPUNIT_ASSERT(tags.size() == 2);
for(const auto &tag : tags) {
CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition).toPositionInSet().position() == 4);
CPPUNIT_ASSERT(tag->value(KnownField::Year).toString() == "1984");
switch(tag->type()) {
case TagType::Id3v1Tag:
CPPUNIT_ASSERT(tag->value(KnownField::Title).toString() == "Cohesion");
CPPUNIT_ASSERT(tag->value(KnownField::Artist).toString() == "Minutemen");
CPPUNIT_ASSERT(tag->value(KnownField::Album).toString() == "Double Nickels On The Dime");
CPPUNIT_ASSERT(tag->value(KnownField::Genre).toString() == "Punk Rock");
CPPUNIT_ASSERT(tag->value(KnownField::Comment).toString() == "ExactAudioCopy v0.95b4");
break;
case TagType::Id3v2Tag:
CPPUNIT_ASSERT(tag->value(KnownField::Title).dataEncoding() == TagTextEncoding::Utf16LittleEndian);
CPPUNIT_ASSERT(tag->value(KnownField::Title).toWString() == u"Cohesion");
CPPUNIT_ASSERT(tag->value(KnownField::Artist).toWString() == u"Minutemen");
CPPUNIT_ASSERT(tag->value(KnownField::Album).toWString() == u"Double Nickels On The Dime");
CPPUNIT_ASSERT(tag->value(KnownField::Genre).toWString() == u"Punk Rock");
CPPUNIT_ASSERT(tag->value(KnownField::Comment).toWString() == u"ExactAudioCopy v0.95b4");
CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition).toPositionInSet().total() == 43);
CPPUNIT_ASSERT(tag->value(KnownField::Length).toTimeSpan().isNull());
CPPUNIT_ASSERT(tag->value(KnownField::Lyricist).isEmpty());
break;
default:
;
}
}
break;
case TagStatus::TestMetaDataPresent:
checkMp3TestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks whether test meta data for MP3 files has been applied correctly.
*/
void OverallTests::checkMp3TestMetaData()
{
// check whether tags are assigned according to the current test mode
Id3v1Tag *id3v1Tag = nullptr;
Id3v2Tag *id3v2Tag = nullptr;
if(m_mode & 0x2) {
CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
} else if(m_mode & 0x8) {
CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().empty());
} else {
CPPUNIT_ASSERT(!m_fileInfo.id3v1Tag());
CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
}
// check common test meta data
for(Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
if(tag) {
CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
// TODO: check more fields
m_preservedMetaData.pop();
}
}
// test ID3v1 specific test meta data
if(id3v1Tag) {
CPPUNIT_ASSERT(id3v1Tag->value(KnownField::TrackPosition).toPositionInSet().position() == m_testPosition.toPositionInSet().position());
}
// test ID3v2 specific test meta data
if(id3v2Tag) {
CPPUNIT_ASSERT(id3v2Tag->value(KnownField::TrackPosition) == m_testPosition);
CPPUNIT_ASSERT(id3v2Tag->value(KnownField::DiskPosition) == m_testPosition);
}
}
/*!
* \brief Checks whether padding constraints are met.
*/
void OverallTests::checkMp3PaddingConstraints()
{
if(!(m_mode & 0x8)) {
if((m_mode & 0x4) && (m_mode & 0x1)) {
CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
} else if((m_mode & 0x4)) {
CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
}
} else {
// adding padding is not possible if no ID3v2 tag is present
}
// TODO: check rewriting behaviour
}
/*!
* \brief Checks "mtx-test-data/ogg/qt4dance_medium.ogg"
*/
void OverallTests::checkOggTestfile1()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 2);
for(const auto &track : tracks) {
switch(track->id()) {
case 897658443:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Video);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Theora);
break;
case 1755441791:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Vorbis);
CPPUNIT_ASSERT(track->channelCount() == 2);
CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
CPPUNIT_ASSERT(track->duration().minutes() == 4);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
// Theora tags are currently not supported and hence only the Vorbis comment is
// taken into account here
break;
case TagStatus::TestMetaDataPresent:
checkOggTestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks "mtx-test-data/opus/v-opus.ogg"
*/
void OverallTests::checkOggTestfile2()
{
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
const auto tracks = m_fileInfo.tracks();
CPPUNIT_ASSERT(tracks.size() == 1);
for(const auto &track : tracks) {
switch(track->id()) {
case 1375632254:
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Opus);
CPPUNIT_ASSERT(track->channelCount() == 2);
CPPUNIT_ASSERT(track->samplingFrequency() == 48000);
CPPUNIT_ASSERT(track->duration().minutes() == 1);
break;
default:
CPPUNIT_FAIL("unknown track ID");
}
}
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
break;
case TagStatus::TestMetaDataPresent:
checkOggTestMetaData();
break;
case TagStatus::Removed:
CPPUNIT_ASSERT(tags.size() == 0);
}
}
/*!
* \brief Checks whether test meta data for OGG files has been applied correctly.
*/
void OverallTests::checkOggTestMetaData()
{
// check whether a tag is assigned
const auto tags = m_fileInfo.tags();
VorbisComment *tag = m_fileInfo.vorbisComment();
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tag != nullptr);
// check test meta data
CPPUNIT_ASSERT(tag->value(KnownField::Title) == m_testTitle);
CPPUNIT_ASSERT(tag->value(KnownField::Comment) == m_testComment);
CPPUNIT_ASSERT(tag->value(KnownField::Album) == m_testAlbum);
CPPUNIT_ASSERT(tag->value(KnownField::Artist) == m_preservedMetaData.front());
CPPUNIT_ASSERT(tag->value(KnownField::TrackPosition) == m_testPosition);
CPPUNIT_ASSERT(tag->value(KnownField::DiskPosition) == m_testPosition);
// TODO: check more fields
m_preservedMetaData.pop();
}
/*!
* \brief Creates a tag targeting the first track with some test meta data.
*/
@ -551,6 +1063,66 @@ void OverallTests::setMkvTestMetaData()
}
}
void OverallTests::setMp4TestMetaData()
{
// ensure a tag exists
Tag *tag = m_fileInfo.container()->createTag();
// assign test meta data
tag->setValue(KnownField::Title, m_testTitle);
tag->setValue(KnownField::Comment, m_testComment);
tag->setValue(KnownField::Album, m_testAlbum);
m_preservedMetaData.push(tag->value(KnownField::Artist));
tag->setValue(KnownField::TrackPosition, m_testPosition);
tag->setValue(KnownField::DiskPosition, m_testPosition);
// TODO: set more fields
}
void OverallTests::setMp3TestMetaData()
{
// ensure tags are assigned according to the current test mode
Id3v1Tag *id3v1Tag = nullptr;
Id3v2Tag *id3v2Tag = nullptr;
if(m_mode & 0x2) {
id3v1Tag = m_fileInfo.createId3v1Tag();
id3v2Tag = m_fileInfo.createId3v2Tag();
} else if(m_mode & 0x8) {
id3v1Tag = m_fileInfo.createId3v1Tag();
m_fileInfo.removeAllId3v2Tags();
} else {
m_fileInfo.removeId3v1Tag();
id3v2Tag = m_fileInfo.createId3v2Tag();
}
// assign some test meta data
for(Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
if(tag) {
tag->setValue(KnownField::Title, m_testTitle);
tag->setValue(KnownField::Comment, m_testComment);
tag->setValue(KnownField::Album, m_testAlbum);
m_preservedMetaData.push(tag->value(KnownField::Artist));
tag->setValue(KnownField::TrackPosition, m_testPosition);
tag->setValue(KnownField::DiskPosition, m_testPosition);
// TODO: set more fields
}
}
}
void OverallTests::setOggTestMetaData()
{
// ensure a tag exists
Tag *tag = m_fileInfo.container()->createTag();
// assign test meta data
tag->setValue(KnownField::Title, m_testTitle);
tag->setValue(KnownField::Comment, m_testComment);
tag->setValue(KnownField::Album, m_testAlbum);
m_preservedMetaData.push(tag->value(KnownField::Artist));
tag->setValue(KnownField::TrackPosition, m_testPosition);
tag->setValue(KnownField::DiskPosition, m_testPosition);
// TODO: set more fields
}
/*!
* \brief Removes all tags.
*/
@ -601,11 +1173,11 @@ void OverallTests::testMkvMaking()
}
m_fileInfo.setIndexPosition(ElementPosition::Keep);
} else {
m_fileInfo.setTagPosition(m_mode & 0x80 ? ElementPosition::BeforeData : ElementPosition::AfterData);
m_fileInfo.setIndexPosition(m_mode & 0x80 ? ElementPosition::BeforeData : ElementPosition::AfterData);
}
m_fileInfo.setPreferredPadding(m_mode & 0x8 ? 4096 : 0);
m_fileInfo.setMinPadding(m_mode & 0x8 ? 1024 : 0);
m_fileInfo.setMaxPadding(m_mode & 0x8 ? (4096 + 1024) : 0);
m_fileInfo.setMaxPadding(m_mode & 0x8 ? (4096 + 1024) : static_cast<size_t>(-1));
m_fileInfo.setForceTagPosition(m_mode & 0x10);
m_fileInfo.setForceIndexPosition(m_mode & 0x20);
@ -663,7 +1235,14 @@ void OverallTests::testMkvMaking()
*/
void OverallTests::testMp4Parsing()
{
cerr << endl << "MP4 parser" << endl;
m_fileInfo.setForceFullParse(false);
m_tagStatus = TagStatus::Original;
parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), &OverallTests::checkMp4Testfile1);
parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), &OverallTests::checkMp4Testfile2);
parseFile(TestUtilities::testFilePath("mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), &OverallTests::checkMp4Testfile3);
parseFile(TestUtilities::testFilePath("mtx-test-data/alac/othertest-itunes.m4a"), &OverallTests::checkMp4Testfile4);
parseFile(TestUtilities::testFilePath("mtx-test-data/aac/he-aacv2-ps.m4a"), &OverallTests::checkMp4Testfile5);
}
/*!
@ -672,7 +1251,59 @@ void OverallTests::testMp4Parsing()
*/
void OverallTests::testMp4Making()
{
// full parse is required to determine padding
m_fileInfo.setForceFullParse(true);
// do the test under different conditions
for(m_mode = 0; m_mode != 0x20; ++m_mode) {
// setup test conditions
m_fileInfo.setForceRewrite(m_mode & 0x1);
if(m_mode & 0x2) {
m_fileInfo.setTagPosition(ElementPosition::Keep);
} else {
m_fileInfo.setTagPosition(m_mode & 0x10 ? ElementPosition::BeforeData : ElementPosition::AfterData);
}
m_fileInfo.setIndexPosition(m_fileInfo.tagPosition());
m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
m_fileInfo.setForceTagPosition(m_mode & 0x8);
m_fileInfo.setForceIndexPosition(m_mode & 0x8);
// print test conditions
list<string> testConditions;
if(m_mode & 0x1) {
testConditions.emplace_back("forcing rewrite");
}
if(m_mode & 0x2) {
if(m_mode & 0x10) {
testConditions.emplace_back("removing tag");
} else {
testConditions.emplace_back("keeping tag position");
}
} else if(m_mode & 0x10) {
testConditions.emplace_back("tags before data");
} else {
testConditions.emplace_back("tags after data");
}
if(m_mode & 0x4) {
testConditions.emplace_back("padding constraints");
}
if(m_mode & 0x8) {
testConditions.emplace_back("forcing tag position");
}
cerr << endl << "MP4 maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
// do actual tests
bool remove = (m_mode & 0x10) && (m_mode & 0x2);
m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setMp4TestMetaData;
makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/10-DanseMacabreOp.40.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile1);
makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/1080p-DTS-HD-7.1.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile2);
makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp4/dash/dragon-age-inquisition-H1LkM6IVlm4-video.mp4"), modifyRoutine, &OverallTests::checkMp4Testfile3);
makeFile(TestUtilities::workingCopyPath("mtx-test-data/alac/othertest-itunes.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile4);
makeFile(TestUtilities::workingCopyPath("mtx-test-data/aac/he-aacv2-ps.m4a"), modifyRoutine, &OverallTests::checkMp4Testfile5);
}
}
/*!
@ -680,7 +1311,10 @@ void OverallTests::testMp4Making()
*/
void OverallTests::testMp3Parsing()
{
cerr << endl << "MP3 parser" << endl;
m_fileInfo.setForceFullParse(false);
m_tagStatus = TagStatus::Original;
parseFile(TestUtilities::testFilePath("mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), &OverallTests::checkMp3Testfile1);
}
/*!
@ -689,7 +1323,48 @@ void OverallTests::testMp3Parsing()
*/
void OverallTests::testMp3Making()
{
// full parse is required to determine padding
m_fileInfo.setForceFullParse(true);
// do the test under different conditions
for(m_mode = 0; m_mode != 0x10; ++m_mode) {
// setup test conditions
m_fileInfo.setForceRewrite(m_mode & 0x1);
m_fileInfo.setTagPosition(ElementPosition::Keep);
m_fileInfo.setIndexPosition(ElementPosition::Keep);
m_fileInfo.setPreferredPadding(m_mode & 0x4 ? 4096 : 0);
m_fileInfo.setMinPadding(m_mode & 0x4 ? 1024 : 0);
m_fileInfo.setMaxPadding(m_mode & 0x4 ? (4096 + 1024) : static_cast<size_t>(-1));
m_fileInfo.setForceTagPosition(false);
m_fileInfo.setForceIndexPosition(false);
// print test conditions
list<string> testConditions;
if(m_mode & 0x1) {
testConditions.emplace_back("forcing rewrite");
}
if(m_mode & 0x2) {
if(m_mode & 0x8) {
testConditions.emplace_back("removing tag");
} else {
testConditions.emplace_back("ID3v1 and ID3v2");
}
} else if(m_mode & 0x8) {
testConditions.emplace_back("ID3v1 only");
} else {
testConditions.emplace_back("ID3v2 only");
}
if(m_mode & 0x4) {
testConditions.emplace_back("padding constraints");
}
cerr << endl << "MP3 maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
// do actual tests
bool remove = (m_mode & 0x10) && (m_mode & 0x2);
m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setMp3TestMetaData;
makeFile(TestUtilities::workingCopyPath("mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), modifyRoutine, &OverallTests::checkMp3Testfile1);
}
}
/*!
@ -697,7 +1372,11 @@ void OverallTests::testMp3Making()
*/
void OverallTests::testOggParsing()
{
cerr << endl << "OGG parser" << endl;
m_fileInfo.setForceFullParse(false);
m_tagStatus = TagStatus::Original;
parseFile(TestUtilities::testFilePath("mtx-test-data/ogg/qt4dance_medium.ogg"), &OverallTests::checkOggTestfile1);
parseFile(TestUtilities::testFilePath("mtx-test-data/opus/v-opus.ogg"), &OverallTests::checkOggTestfile2);
}
/*!
@ -706,5 +1385,28 @@ void OverallTests::testOggParsing()
*/
void OverallTests::testOggMaking()
{
// full parse is required to determine padding
m_fileInfo.setForceFullParse(true);
// do the test under different conditions
for(m_mode = 0; m_mode != 0x2; ++m_mode) {
// no need to setup test conditions because the Ogg maker
// doesn't take those settings into account (currently)
// print test conditions
list<string> testConditions;
if(m_mode & 0x1) {
testConditions.emplace_back("removing tag");
} else {
testConditions.emplace_back("modifying tag");
}
cerr << endl << "OGG maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
// do actual tests
bool remove = m_mode & 0x1;
m_tagStatus = remove ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
void (OverallTests::*modifyRoutine)(void) = remove ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
makeFile(TestUtilities::workingCopyPath("mtx-test-data/ogg/qt4dance_medium.ogg"), modifyRoutine, &OverallTests::checkOggTestfile1);
makeFile(TestUtilities::workingCopyPath("mtx-test-data/opus/v-opus.ogg"), modifyRoutine, &OverallTests::checkOggTestfile2);
}
}