From 373e732b6ab90049bc5f4fb8a112ee92a097fa68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= Date: Sun, 2 Oct 2022 17:37:14 +0200 Subject: + Errors & ConformanceChecks replaced by ConformanceErrors, update --- Source/MediaInfo/MediaInfo_Config_Automatic.cpp | 2 +- Source/Resource/Text/MediaInfo/Summary.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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%)] -- cgit v1.2.3 From 194add5070360fc30f3eb8e89958858f69065cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= Date: Sun, 2 Oct 2022 17:37:39 +0200 Subject: + Conformance checks refactoring --- Source/MediaInfo/Audio/File_Adm.cpp | 67 ++++++++++++++++++++++-------------- Source/MediaInfo/Audio/File_Usac.cpp | 25 +++++++++++--- 2 files changed, 61 insertions(+), 31 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; tItems[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"); } -- cgit v1.2.3