Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MediaArea/MediaInfoLib.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérôme Martinez <jerome@mediaarea.net>2022-10-02 19:56:28 +0300
committerGitHub <noreply@github.com>2022-10-02 19:56:28 +0300
commit525def58939f492680741485ee7f5dff338e15ff (patch)
tree23e8fa41778d9a3212b6f08a740292f84174d630
parent2d173d42d99ab255e1761f26e8d265cef3d2cfee (diff)
parent194add5070360fc30f3eb8e89958858f69065cc7 (diff)
Merge pull request #1597 from JeromeMartinez/ConformanceErrors
Conformance checks refactoring
-rw-r--r--Source/MediaInfo/Audio/File_Adm.cpp67
-rw-r--r--Source/MediaInfo/Audio/File_Usac.cpp25
-rw-r--r--Source/MediaInfo/MediaInfo_Config_Automatic.cpp2
-rw-r--r--Source/Resource/Text/MediaInfo/Summary.csv2
4 files changed, 63 insertions, 33 deletions
diff --git a/Source/MediaInfo/Audio/File_Adm.cpp b/Source/MediaInfo/Audio/File_Adm.cpp
index 1b8e3aac8..630b8539a 100644
--- a/Source/MediaInfo/Audio/File_Adm.cpp
+++ b/Source/MediaInfo/Audio/File_Adm.cpp
@@ -498,15 +498,10 @@ static void Apply_SubStreams(File__Analyze& F, const string& P_And_LinkedTo, Ite
if (LinkedTo_Pos) {
auto Sub_Pos = P_And_LinkedTo.rfind(' ', LinkedTo_Pos - 1);
if (Sub_Pos != string::npos) {
- Message += '!';
- Message.append(P_And_LinkedTo, 0, Sub_Pos);
- while (!Message.empty() && isdigit(Message.back())) {
- Message.pop_back();
- }
- Message += '!';
+ Message += ":transportTrackFormat:audioTrack:audioTrackUIDRef:\"";
Message += ID;
- Message += " is referenced but is missing";
- Source.Errors[Error].push_back(Message);
+ Message += "\" is referenced but its description is missing";
+ Source.Errors[Warning].push_back(Message);
}
}
}
@@ -611,7 +606,7 @@ void file_adm_private::parse()
#define ELEMENT_MIDDLE(NAME) \
else if (!Items[item_audioProgramme].Items.empty() && &NAME##_Content == &Items[item_audioProgramme].Items.back()) { \
- NAME##_Content.Errors[Warning].push_back("Attribute \"" + tfsxml_decode(b) + "\" is out of specs"); \
+ NAME##_Content.Errors[Warning].push_back(":XmlAttributes:\"" + tfsxml_decode(b) + "\" is not part of specs"); \
} \
} \
if (!tfsxml_enter(&p)) \
@@ -624,7 +619,7 @@ void file_adm_private::parse()
#define ELEMENT_END(NAME) \
else if (!Items[item_audioProgramme].Items.empty() && &NAME##_Content == &Items[item_audioProgramme].Items.back()) { \
- NAME##_Content.Errors[Warning].push_back("Element \"" + tfsxml_decode(b) + "\" is out of specs"); \
+ NAME##_Content.Errors[Warning].push_back(":XmlElements:\"" + tfsxml_decode(b) + "\" is not part of specs"); \
} \
} \
} \
@@ -635,7 +630,13 @@ void file_adm_private::parse()
NAME##_Content.Strings[NAME##_##ATTR].assign(tfsxml_decode(v)); \
} \
- #define ATTRIBUTE_I(NAME,ATTR) \
+ #define ATTRIB_ID(NAME,ATTR) \
+ else if (!tfsxml_strcmp_charp(b, #ATTR)) { \
+ CheckErrors_Formating(this, tfsxml_decode(v), item_Info[item_##NAME], *this->Items[item_##NAME].Items.back().Errors, #NAME":"#ATTR); \
+ NAME##_Content.Strings[NAME##_##ATTR].assign(tfsxml_decode(v)); \
+ } \
+
+#define ATTRIBUTE_I(NAME,ATTR) \
else if (!tfsxml_strcmp_charp(b, #ATTR)) { \
} \
@@ -773,7 +774,7 @@ void file_adm_private::audioFormatExtended()
if (tfsxml_next(&p, &b))
break;
ELEMENT_START(audioProgramme)
- ATTRIBUTE(audioProgramme, audioProgrammeID)
+ ATTRIB_ID(audioProgramme, audioProgrammeID)
ATTRIBUTE(audioProgramme, audioProgrammeName)
ATTRIBUTE(audioProgramme, audioProgrammeLanguage)
ATTRIBUTE(audioProgramme, start)
@@ -844,7 +845,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioProgramme, alternativeValueSetIDRef)
ELEMENT_END(audioProgramme)
ELEMENT_START(audioContent)
- ATTRIBUTE(audioContent, audioContentID)
+ ATTRIB_ID(audioContent, audioContentID)
ATTRIBUTE(audioContent, audioContentName)
ATTRIBUTE(audioContent, audioContentLanguage)
ATTRIBUTE(audioContent, typeLabel)
@@ -960,7 +961,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioContent, dialogue)
ELEMENT_END(audioContent)
ELEMENT_START(audioObject)
- ATTRIBUTE(audioObject, audioObjectID)
+ ATTRIB_ID(audioObject, audioObjectID)
ATTRIBUTE(audioObject, audioObjectName)
ATTRIBUTE(audioObject, duration)
ATTRIBUTE(audioObject, startTime)
@@ -972,7 +973,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioObject, audioComplementaryObjectIDRef)
ELEMENT_END(audioObject)
ELEMENT_START(audioPackFormat)
- ATTRIBUTE(audioPackFormat, audioPackFormatID)
+ ATTRIB_ID(audioPackFormat, audioPackFormatID)
ATTRIBUTE(audioPackFormat, audioPackFormatName)
ATTRIBUTE(audioPackFormat, typeDefinition)
ATTRIBUTE(audioPackFormat, typeLabel)
@@ -980,7 +981,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioPackFormat, audioChannelFormatIDRef)
ELEMENT_END(audioPackFormat)
ELEMENT_START(audioChannelFormat)
- ATTRIBUTE(audioChannelFormat, audioChannelFormatID)
+ ATTRIB_ID(audioChannelFormat, audioChannelFormatID)
ATTRIBUTE(audioChannelFormat, audioChannelFormatName)
ATTRIBUTE(audioChannelFormat, typeDefinition)
ATTRIBUTE(audioChannelFormat, typeLabel)
@@ -992,7 +993,7 @@ void file_adm_private::audioFormatExtended()
if (false) {
}
else if (!tfsxml_strcmp_charp(b, "audioBlockFormatID")) {
- CheckErrors_Formating(this, tfsxml_decode(v), item_Info[item_audioBlockFormat], *this->Items[item_audioChannelFormat].Items.back().Errors, "BlockFormat");
+ CheckErrors_Formating(this, tfsxml_decode(v), item_Info[item_audioBlockFormat], *this->Items[item_audioChannelFormat].Items.back().Errors, "audioBlockFormat:audioBlockFormatID");
}
}
if (!tfsxml_enter(&p))
@@ -1035,7 +1036,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioTrackUID, audioTrackFormatIDRef)
ELEMENT_END(audioTrackUID)
ELEMENT_START(audioTrackFormat)
- ATTRIBUTE(audioTrackFormat, audioTrackFormatID)
+ ATTRIB_ID(audioTrackFormat, audioTrackFormatID)
ATTRIBUTE(audioTrackFormat, audioTrackFormatName)
ATTRIBUTE(audioTrackFormat, formatDefinition)
ATTRIBUTE(audioTrackFormat, typeDefinition)
@@ -1044,7 +1045,7 @@ void file_adm_private::audioFormatExtended()
ELEMENT(audioTrackFormat, audioStreamFormatIDRef)
ELEMENT_END(audioTrackFormat)
ELEMENT_START(audioStreamFormat)
- ATTRIBUTE(audioStreamFormat, audioStreamFormatID)
+ ATTRIB_ID(audioStreamFormat, audioStreamFormatID)
ATTRIBUTE(audioStreamFormat, audioStreamFormatName)
ATTRIBUTE(audioStreamFormat, formatDefinition)
ATTRIBUTE(audioStreamFormat, formatLabel)
@@ -1127,12 +1128,21 @@ static void FillErrors(file_adm_private* File_Adm_Private, const item Item, size
}
}
if (!Value.empty() && Value[0] == ':') {
- auto End = Value.find(':', 1);
- if (End != string::npos)
+ Field.clear();
+ auto End = Value.rfind(':');
+ if (End)
{
- Field += ' ';
+ if (!Field.empty())
+ Field += ' ';
Field += Value.substr(1, End - 1);
Value.erase(0, End + 1);
+ for (;;)
+ {
+ auto Next = Field.find(':');
+ if (Next == string::npos)
+ break;
+ Field[Next] = ' ';
+ }
}
}
Errors_Field[WarningError ? Error : k].push_back(Field);
@@ -1174,7 +1184,7 @@ static void CheckErrors_Formating(file_adm_private* File_Adm_Private, const stri
if (EndSize) {
End.append(EndSize, 'z');
}
- string Message = (Sub ? (':' + string(Sub) + ':') : string()) + ID;
+ string Message = (Sub ? (':' + string(Sub) + ':') : string()) + '"' + ID + '"';
Message += " is not a valid form (";
if (BeginSize) {
Message.append(ID_Start.ID_Begin, BeginSize);
@@ -1217,7 +1227,7 @@ static void CheckErrors_Formating(file_adm_private* File_Adm_Private, Items_Stru
static void CheckErrors(file_adm_private* File_Adm_Private)
{
for (size_t t=0; t<item_Max; t++) {
- CheckErrors_Formating(File_Adm_Private, File_Adm_Private->Items[t], item_Info[t]);
+ //CheckErrors_Formating(File_Adm_Private, File_Adm_Private->Items[t], item_Info[t]);
}
}
@@ -1552,8 +1562,13 @@ void File_Adm::Streams_Fill()
Fill(StreamKind_Last, StreamPos_Last, FieldPrefix.c_str(), Errors_Field[k].size());
FieldPrefix += ' ';
for (size_t i = 0; i < Errors_Field[k].size(); i++) {
- size_t Space = Errors_Field[k][i].find(' ');
- if (Space != string::npos) {
+ size_t Space = 0;
+ for (;;)
+ {
+ Space = Errors_Field[k][i].find(' ', Space + 1);
+ if (Space == string::npos) {
+ break;
+ }
const auto Field = FieldPrefix + Errors_Field[k][i].substr(0, Space);
const auto& Value = Retrieve_Const(StreamKind_Last, StreamPos_Last, Field.c_str());
if (Value.empty()) {
diff --git a/Source/MediaInfo/Audio/File_Usac.cpp b/Source/MediaInfo/Audio/File_Usac.cpp
index 3f8936a63..9bab5497c 100644
--- a/Source/MediaInfo/Audio/File_Usac.cpp
+++ b/Source/MediaInfo/Audio/File_Usac.cpp
@@ -107,7 +107,22 @@ void File_Usac::Streams_Finish_Conformance()
Fill(Stream_Audio, 0, "ConformanceErrors", ConformanceErrors.size());
for (const auto& ConformanceError : ConformanceErrors)
if (CheckIf(ConformanceError.Flags))
- Fill(Stream_Audio, 0, (string("ConformanceErrors") + ' ' + ConformanceError.Field).c_str(), ConformanceError.Value);
+ {
+ const char* FieldPrefix = "ConformanceErrors ";
+ size_t Space = 0;
+ for (;;) {
+ Space = ConformanceError.Field.find(' ', Space + 1);
+ if (Space == string::npos) {
+ break;
+ }
+ const auto Field = FieldPrefix + ConformanceError.Field.substr(0, Space);
+ const auto& Value = Retrieve_Const(StreamKind_Last, StreamPos_Last, Field.c_str());
+ if (Value.empty()) {
+ Fill(StreamKind_Last, StreamPos_Last, Field.c_str(), "Yes");
+ }
+ }
+ Fill(Stream_Audio, 0, (FieldPrefix + ConformanceError.Field).c_str(), ConformanceError.Value);
+ }
ConformanceErrors.clear();
}
@@ -253,25 +268,25 @@ void File_Usac::Fill_Loudness(const char* Prefix, bool NoConCh)
}
else if (!loudnessInfoSet_Present)
{
- Fill_Conformance(CheckFlags, "Loudness", "loudnessInfoSet is missing");
+ Fill_Conformance(CheckFlags, (string(ConformanceFlags[MpegH] ? "mpegh3daConfig" : "UsacConfig") + " loudnessInfoSet Coherency").c_str(), "Is missing");
Fill(Stream_Audio, 0, (FieldPrefix + "ConformanceCheck").c_str(), "Invalid: loudnessInfoSet is missing");
Fill(Stream_Audio, 0, "ConformanceCheck/Short", "Invalid: loudnessInfoSet missing");
}
else if (loudnessInfo_Data[0].empty())
{
- Fill_Conformance(CheckFlags, "Loudness", "loudnessInfoSet is empty");
+ Fill_Conformance(CheckFlags, (string(ConformanceFlags[MpegH] ? "mpegh3daConfig" : "UsacConfig") + " loudnessInfoSet loudnessInfoCount").c_str(), "Is 0");
Fill(Stream_Audio, 0, (FieldPrefix + "ConformanceCheck").c_str(), "Invalid: loudnessInfoSet is empty");
Fill(Stream_Audio, 0, "ConformanceCheck/Short", "Invalid: loudnessInfoSet empty");
}
else if (!DefaultIdPresent)
{
- Fill_Conformance(CheckFlags, "Loudness", "Default loudnessInfo is missing");
+ Fill_Conformance(CheckFlags, (string(ConformanceFlags[MpegH] ? "mpegh3daConfig" : "UsacConfig") + " loudnessInfoSet Coherency").c_str(), "Default loudnessInfo is missing");
Fill(Stream_Audio, 0, (FieldPrefix + "ConformanceCheck").c_str(), "Invalid: Default loudnessInfo is missing");
Fill(Stream_Audio, 0, "ConformanceCheck/Short", "Invalid: Default loudnessInfo missing");
}
else if (loudnessInfo_Data[0].begin()->second.Measurements.Values[1].empty() && loudnessInfo_Data[0].begin()->second.Measurements.Values[2].empty())
{
- Fill_Conformance(CheckFlags, "Loudness", "None of program loudness or anchor loudness is present in default loudnessInfo");
+ Fill_Conformance(CheckFlags, (string(ConformanceFlags[MpegH] ? "mpegh3daConfig" : "UsacConfig") + " loudnessInfoSet Coherency").c_str(), "None of program loudness or anchor loudness is present in default loudnessInfo");
Fill(Stream_Audio, 0, (FieldPrefix + "ConformanceCheck").c_str(), "Invalid: None of program loudness or anchor loudness is present in default loudnessInfo");
Fill(Stream_Audio, 0, "ConformanceCheck/Short", "Invalid: Default loudnessInfo incomplete");
}
diff --git a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
index 7b2c39c61..3d9e5e61f 100644
--- a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
+++ b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp
@@ -6676,7 +6676,7 @@ void MediaInfo_Config_Summary (ZtringListList &Info)
Info.Write(Ztring().From_UTF8(
"General;[%Format/String%][ (%Format_Profile%)][ (%Format_Commercial_IfAny%)]$if(%Format/String%,$: $)%FileSize/String%[, %Duration/String%]\n"
"Video;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%Width%*][%Height%][ (%DisplayAspectRatio/String%), ][$at$ %FrameRate/String%, ][%Format/String%][ (%CodecID/Hint%)][ (%Standard%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %HDR_Format_Commercial%]\n"
- "Audio;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%SamplingRate/String%, ][%BitDepth/String%, ][%Channel(s)_Original/String% / ][%Channel(s)/String%, ][%Format/String%][ (%CodecID/Hint%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %NumberOfProgrammes% programmes][, %NumberOfObjects% objects][, %NumberOfPresentations% presentations][, %NumberOfSubstreams% substreams][ (%AdmProfile_Format% ADM profile)]$if(%ConformanceErrors%, \\(%ConformanceErrors% conformance errors\\))$if(%ConformanceErrors%, \\(%ConformanceWarnings% conformance warnings\\))\n"
+ "Audio;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%SamplingRate/String%, ][%BitDepth/String%, ][%Channel(s)_Original/String% / ][%Channel(s)/String%, ][%Format/String%][ (%CodecID/Hint%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %NumberOfProgrammes% programmes][, %NumberOfObjects% objects][, %NumberOfPresentations% presentations][, %NumberOfSubstreams% substreams][ (%AdmProfile_Format% ADM profile)]$if(%ConformanceErrors%, \\(%ConformanceErrors% conformance errors\\))$if(%ConformanceWarnings%, \\(%ConformanceWarnings% conformance warnings\\))\n"
"Text;[%Language/String%, ][%Format/String%][ (%Format_Commercial_IfAny%)]$if(%MuxingMode%, \\(%MuxingMode%\\))\n"
"Image;[%Language/String%, ][%Width%*][%Height%][ (%DisplayAspectRatio/String%)][, %Format/String%]\n"
"Chapters;[%Language/String%, ]%Total% chapters[, %Format/String%][ (%Format_Commercial_IfAny%)]\n"
diff --git a/Source/Resource/Text/MediaInfo/Summary.csv b/Source/Resource/Text/MediaInfo/Summary.csv
index dd93ebea0..11a66d39a 100644
--- a/Source/Resource/Text/MediaInfo/Summary.csv
+++ b/Source/Resource/Text/MediaInfo/Summary.csv
@@ -1,6 +1,6 @@
General;[%Format/String%][ (%Format_Profile%)][ (%Format_Commercial_IfAny%)]$if(%Format/String%,$: $)%FileSize/String%[, %Duration/String%]
Video;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%Width%*][%Height%][ (%DisplayAspectRatio/String%), ][$at$ %FrameRate/String%, ][%Format/String%][ (%CodecID/Hint%)][ (%Standard%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %HDR_Format_Commercial%]
-Audio;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%SamplingRate/String%, ][%BitDepth/String%, ][%Channel(s)_Original/String% / ][%Channel(s)/String%, ][%Format/String%][ (%CodecID/Hint%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %NumberOfProgrammes% programmes][, %NumberOfObjects% objects][, %NumberOfPresentations% presentations][, %NumberOfSubstreams% substreams][ (%AdmProfile_Format% ADM profile)]$if(%ConformanceErrors%, \\(%ConformanceErrors% conformance errors\\))$if(%ConformanceErrors%, \\(%ConformanceWarnings% conformance warnings\\))
+Audio;[%Language/String%, ][%BitRate/String%$if(%BitRate_Nominal/String%, \\(%BitRate_Nominal/String%\\)), ][%SamplingRate/String%, ][%BitDepth/String%, ][%Channel(s)_Original/String% / ][%Channel(s)/String%, ][%Format/String%][ (%CodecID/Hint%)]$if(%MuxingMode%, \\(%MuxingMode%\\))$if(%Format_Version%, \\(%Format_Version%\\))$if(%Format_Profile%, \\(%Format_Profile%\\))$if(%Format_Settings%, \\(%Format_Settings%\\))[ (%Format_Commercial_IfAny%)][, %NumberOfProgrammes% programmes][, %NumberOfObjects% objects][, %NumberOfPresentations% presentations][, %NumberOfSubstreams% substreams][ (%AdmProfile_Format% ADM profile)]$if(%ConformanceErrors%, \\(%ConformanceErrors% conformance errors\\))$if(%ConformanceWarnings%, \\(%ConformanceWarnings% conformance warnings\\))
Text;[%Language/String%, ][%Format/String%][ (%Format_Commercial_IfAny%)]$if(%MuxingMode%, \\(%MuxingMode%\\))
Image;[%Language/String%, ][%Width%*][%Height%][ (%DisplayAspectRatio/String%)][, %Format/String%]
Chapters;[%Language/String%, ]%Total% chapters[, %Format/String%][ (%Format_Commercial_IfAny%)]