From a25abb75e007fdf2e4483dfb9d822a6fc6240133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= Date: Fri, 27 Feb 2026 09:32:08 +0100 Subject: [PATCH] Move T35 parsing code to its own parser --- Project/CMake/CMakeLists.txt | 1 + Project/GNU/Library/Makefile.am | 1 + Project/GNU/Library/configure.ac | 3 + Project/MSVC2022/Library/MediaInfoLib.vcxproj | 2 + .../Library/MediaInfoLib.vcxproj.filters | 6 + Project/MSVC2026/Library/MediaInfoLib.vcxproj | 2 + .../Library/MediaInfoLib.vcxproj.filters | 6 + Project/Qt/MediaInfoLib.pro | 2 + Source/MediaInfo/Audio/File_Flac.h | 1 - Source/MediaInfo/Audio/File_Iamf.h | 1 - Source/MediaInfo/File__Analyze.h | 12 +- Source/MediaInfo/File__Analyze_MinimizeSize.h | 10 +- Source/MediaInfo/Image/File_Jpeg.h | 1 - Source/MediaInfo/Image/File_Png.cpp | 1 - Source/MediaInfo/Image/File_Png.h | 1 - Source/MediaInfo/Multiple/File_Ivf.h | 1 - Source/MediaInfo/Multiple/File_Mk.cpp | 291 +------ Source/MediaInfo/Multiple/File_Mk.h | 22 +- Source/MediaInfo/Multiple/File_Mpeg4.h | 1 - Source/MediaInfo/Multiple/File_MpegTs.cpp | 1 - Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp | 1 - .../Multiple/File_Ogg_SubElement.cpp | 1 - Source/MediaInfo/Multiple/File_T35.cpp | 798 ++++++++++++++++++ Source/MediaInfo/Multiple/File_T35.h | 110 +++ Source/MediaInfo/Setup.h | 3 + Source/MediaInfo/Tag/File_Exif.cpp | 1 - Source/MediaInfo/Tag/File_Exif.h | 1 - Source/MediaInfo/Video/File_Av1.cpp | 222 +---- Source/MediaInfo/Video/File_Av1.h | 34 +- Source/MediaInfo/Video/File_Av2.cpp | 60 +- Source/MediaInfo/Video/File_Av2.h | 29 +- Source/MediaInfo/Video/File_Avc.cpp | 336 +++----- Source/MediaInfo/Video/File_Avc.h | 35 +- Source/MediaInfo/Video/File_Hevc.cpp | 649 ++------------ Source/MediaInfo/Video/File_Hevc.h | 45 +- 35 files changed, 1270 insertions(+), 1421 deletions(-) create mode 100644 Source/MediaInfo/Multiple/File_T35.cpp create mode 100644 Source/MediaInfo/Multiple/File_T35.h diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt index dfd3687290..3b44ce8b09 100644 --- a/Project/CMake/CMakeLists.txt +++ b/Project/CMake/CMakeLists.txt @@ -289,6 +289,7 @@ set(MediaInfoLib_SRCS ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_SequenceInfo.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_Skm.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_Swf.cpp + ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_T35.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_Umf.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_Vbi.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Multiple/File_Wm.cpp diff --git a/Project/GNU/Library/Makefile.am b/Project/GNU/Library/Makefile.am index e6abcd92ae..a1cb3bdcd8 100644 --- a/Project/GNU/Library/Makefile.am +++ b/Project/GNU/Library/Makefile.am @@ -175,6 +175,7 @@ lib@MediaInfoLib_LibName@_la_SOURCES = \ ../../../Source/MediaInfo/Multiple/File_SequenceInfo.cpp \ ../../../Source/MediaInfo/Multiple/File_Skm.cpp \ ../../../Source/MediaInfo/Multiple/File_Swf.cpp \ + ../../../Source/MediaInfo/Multiple/File_T35.cpp \ ../../../Source/MediaInfo/Multiple/File_Umf.cpp \ ../../../Source/MediaInfo/Multiple/File_Vbi.cpp \ ../../../Source/MediaInfo/Multiple/File_Wm.cpp \ diff --git a/Project/GNU/Library/configure.ac b/Project/GNU/Library/configure.ac index fb7137024e..7b0d359f4b 100644 --- a/Project/GNU/Library/configure.ac +++ b/Project/GNU/Library/configure.ac @@ -165,6 +165,7 @@ AC_ARG_ENABLE(riff, AC_HELP_STRING([--disable-riff], [Disable Multiple - R AC_ARG_ENABLE(rm, AC_HELP_STRING([--disable-rm], [Disable Multiple - Real Media]), MediaInfoRm=$enableval, MediaInfoRm=depend) AC_ARG_ENABLE(skm, AC_HELP_STRING([--disable-skm], [Disable Multiple - SKM]), MediaInfoSkm=$enableval, MediaInfoSkm=depend) AC_ARG_ENABLE(swf, AC_HELP_STRING([--disable-swf], [Disable Multiple - Shockwave]), MediaInfoSwf=$enableval, MediaInfoSwf=depend) +AC_ARG_ENABLE(t35, AC_HELP_STRING([--disable-t35], [Disable Multiple - ITU-T T35]), MediaInfoT35=$enableval, MediaInfoT35=depend) AC_ARG_ENABLE(tsp, AC_HELP_STRING([--disable-tsp], [Disable Multiple - TSP]), MediaInfoTsp=$enableval, MediaInfoTsp=depend) AC_ARG_ENABLE(wm, AC_HELP_STRING([--disable-wm], [Disable Multiple - Windows Media (ASF, WMV, WMA)]), MediaInfoWm=$enableval, MediaInfoWm=depend) AC_ARG_ENABLE(apetag, AC_HELP_STRING([--disable-apetag], [Disable Tag - ApeTag]), MediaInfoApeTag=$enableval, MediaInfoApeTag=depend) @@ -345,6 +346,7 @@ if test "$MediaInfoRiff" = "no"; then AC_DEFINE(MEDIAINFO_RIFF_NO) fi; if if test "$MediaInfoRm" = "no"; then AC_DEFINE(MEDIAINFO_RM_NO) fi; if test "$MediaInfoRm" = "yes"; then AC_DEFINE(MEDIAINFO_RM_YES) fi if test "$MediaInfoSkm" = "no"; then AC_DEFINE(MEDIAINFO_SKM_NO) fi; if test "$MediaInfoSkm" = "yes"; then AC_DEFINE(MEDIAINFO_SKM_YES) fi if test "$MediaInfoSwf" = "no"; then AC_DEFINE(MEDIAINFO_SWF_NO) fi; if test "$MediaInfoSwf" = "yes"; then AC_DEFINE(MEDIAINFO_SWF_YES) fi +if test "$MediaInfoT35" = "no"; then AC_DEFINE(MEDIAINFO_T35_NO) fi; if test "$MediaInfot35" = "yes"; then AC_DEFINE(MEDIAINFO_T35_YES) fi if test "$MediaInfoTsp" = "no"; then AC_DEFINE(MEDIAINFO_TSP_NO) fi; if test "$MediaInfoTsp" = "yes"; then AC_DEFINE(MEDIAINFO_TSP_YES) fi if test "$MediaInfoWm" = "no"; then AC_DEFINE(MEDIAINFO_WM_NO) fi; if test "$MediaInfoWm" = "yes"; then AC_DEFINE(MEDIAINFO_WM_YES) fi if test "$MediaInfoApeTag" = "no"; then AC_DEFINE(MEDIAINFO_APETAG_NO) fi; if test "$MediaInfoApeTag" = "yes"; then AC_DEFINE(MEDIAINFO_APETAG_YES) fi @@ -1121,6 +1123,7 @@ Mcho "Riff " "$MediaInfoRiff" Mcho "Rm " "$MediaInfoRm" Mcho "Skm " "$MediaInfoSkm" Mcho "Swf " "$MediaInfoSwf" +Mcho "T35 " "$MediaInfot35" Mcho "Tsp " "$MediaInfoTsp" Mcho "Wm " "$MediaInfoWm" Mcho "ApeTag " "$MediaInfoApeTag" diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj b/Project/MSVC2022/Library/MediaInfoLib.vcxproj index f3aa19f505..bdc7134284 100644 --- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj +++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj @@ -454,6 +454,7 @@ + @@ -830,6 +831,7 @@ + diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters index 8d0be67880..dba82f6dbb 100644 --- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters +++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters @@ -890,6 +890,9 @@ Source Files\Video + + Source Files\Multiple + @@ -1672,5 +1675,8 @@ Header Files\Video + + Header Files\Multiple + \ No newline at end of file diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj b/Project/MSVC2026/Library/MediaInfoLib.vcxproj index a9f54989e6..ddf2d38d7a 100644 --- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj +++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj @@ -454,6 +454,7 @@ + @@ -830,6 +831,7 @@ + diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters index 1711604313..b99d091b64 100644 --- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters +++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters @@ -890,6 +890,9 @@ Source Files\Video + + Source Files\Multiple + @@ -1672,5 +1675,8 @@ Header Files\Video + + Header Files\Multiple + \ No newline at end of file diff --git a/Project/Qt/MediaInfoLib.pro b/Project/Qt/MediaInfoLib.pro index 3accf1f567..27ec3b2b5b 100644 --- a/Project/Qt/MediaInfoLib.pro +++ b/Project/Qt/MediaInfoLib.pro @@ -195,6 +195,7 @@ HEADERS += \ ../../Source/MediaInfo/Multiple/File_SequenceInfo.h \ ../../Source/MediaInfo/Multiple/File_Skm.h \ ../../Source/MediaInfo/Multiple/File_Swf.h \ + ../../Source/MediaInfo/Multiple/File_T35.h \ ../../Source/MediaInfo/Multiple/File_Umf.h \ ../../Source/MediaInfo/Multiple/File_Vbi.h \ ../../Source/MediaInfo/Multiple/File_Wm.h \ @@ -446,6 +447,7 @@ SOURCES += \ ../../Source/MediaInfo/Multiple/File_SequenceInfo.cpp \ ../../Source/MediaInfo/Multiple/File_Skm.cpp \ ../../Source/MediaInfo/Multiple/File_Swf.cpp \ + ../../Source/MediaInfo/Multiple/File_T35.cpp \ ../../Source/MediaInfo/Multiple/File_Umf.cpp \ ../../Source/MediaInfo/Multiple/File_Vbi.cpp \ ../../Source/MediaInfo/Multiple/File_Wm.cpp \ diff --git a/Source/MediaInfo/Audio/File_Flac.h b/Source/MediaInfo/Audio/File_Flac.h index 5180eecddd..250cc5f16d 100644 --- a/Source/MediaInfo/Audio/File_Flac.h +++ b/Source/MediaInfo/Audio/File_Flac.h @@ -17,7 +17,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/Tag/File__Tags.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Audio/File_Iamf.h b/Source/MediaInfo/Audio/File_Iamf.h index 32e417729c..7dae2d71fe 100644 --- a/Source/MediaInfo/Audio/File_Iamf.h +++ b/Source/MediaInfo/Audio/File_Iamf.h @@ -17,7 +17,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/File__Analyze.h b/Source/MediaInfo/File__Analyze.h index f9c47d83f5..8554a90de4 100644 --- a/Source/MediaInfo/File__Analyze.h +++ b/Source/MediaInfo/File__Analyze.h @@ -23,6 +23,7 @@ #include #endif //MEDIAINFO_AES #include "MediaInfo/HashWrapper.h" +#include //--------------------------------------------------------------------------- namespace MediaInfoLib @@ -918,8 +919,14 @@ public : #if defined(MEDIAINFO_AV1_YES) || defined(MEDIAINFO_AVC_YES) || defined(MEDIAINFO_HEVC_YES) || defined(MEDIAINFO_MPEG4_YES) || defined(MEDIAINFO_MK_YES) || defined(MEDIAINFO_MXF_YES) || defined(MEDIAINFO_MPEGTS_YES) struct mastering_metadata_2086 { - int16u Primaries[8]; - int32u Luminance[2]; + int16u Primaries[8]{}; + int32u Luminance[2]{}; + + bool operator==(const mastering_metadata_2086& o) const + { + return !std::memcmp(Primaries, o.Primaries, sizeof(Primaries)) && !std::memcmp(Luminance, o.Luminance, sizeof(Luminance)) ; + } + bool operator!=(const mastering_metadata_2086& o) const { return !(*this == o); } }; void Get_MasteringDisplayColorVolume(Ztring &MasteringDisplay_ColorPrimaries, Ztring &MasteringDisplay_Luminance, mastering_metadata_2086 &Meta, bool FromAV1=false); #endif @@ -1825,4 +1832,5 @@ public : } \ } \ + #endif diff --git a/Source/MediaInfo/File__Analyze_MinimizeSize.h b/Source/MediaInfo/File__Analyze_MinimizeSize.h index 2ba6b3287f..556bd5820f 100644 --- a/Source/MediaInfo/File__Analyze_MinimizeSize.h +++ b/Source/MediaInfo/File__Analyze_MinimizeSize.h @@ -786,8 +786,14 @@ public : #if defined(MEDIAINFO_AV1_YES) || defined(MEDIAINFO_AVC_YES) || defined(MEDIAINFO_HEVC_YES) || defined(MEDIAINFO_MPEG4_YES) || defined(MEDIAINFO_MATROSKA_YES) || defined(MEDIAINFO_MXF_YES) || defined(MEDIAINFO_MPEGTS_YES) struct mastering_metadata_2086 { - int16u Primaries[8]; - int32u Luminance[2]; + int16u Primaries[8]{}; + int32u Luminance[2]{}; + + bool operator==(const mastering_metadata_2086& o) const + { + return !std::memcmp(Primaries, o.Primaries, sizeof(Primaries)) && !std::memcmp(Luminance, o.Luminance, sizeof(Luminance)); + } + bool operator!=(const mastering_metadata_2086& o) const { return !(*this == o); } }; void Get_MasteringDisplayColorVolume(Ztring &MasteringDisplay_ColorPrimaries, Ztring &MasteringDisplay_Luminance, mastering_metadata_2086 &Meta, bool FromAV1=false); #endif diff --git a/Source/MediaInfo/Image/File_Jpeg.h b/Source/MediaInfo/Image/File_Jpeg.h index ead70e3593..92339ff736 100644 --- a/Source/MediaInfo/Image/File_Jpeg.h +++ b/Source/MediaInfo/Image/File_Jpeg.h @@ -17,7 +17,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Image/File_Png.cpp b/Source/MediaInfo/Image/File_Png.cpp index be848d54e4..8b8e0d6d1f 100644 --- a/Source/MediaInfo/Image/File_Png.cpp +++ b/Source/MediaInfo/Image/File_Png.cpp @@ -54,7 +54,6 @@ #include "MediaInfo/Tag/File_Xmp.h" #endif #include -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Image/File_Png.h b/Source/MediaInfo/Image/File_Png.h index ee04a91b40..00bcef7712 100644 --- a/Source/MediaInfo/Image/File_Png.h +++ b/Source/MediaInfo/Image/File_Png.h @@ -18,7 +18,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" #include "MediaInfo/TimeCode.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Multiple/File_Ivf.h b/Source/MediaInfo/Multiple/File_Ivf.h index 4fdfc93668..dbde8437b6 100644 --- a/Source/MediaInfo/Multiple/File_Ivf.h +++ b/Source/MediaInfo/Multiple/File_Ivf.h @@ -19,7 +19,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Multiple/File_Mk.cpp b/Source/MediaInfo/Multiple/File_Mk.cpp index d89ab22a28..79bf653838 100644 --- a/Source/MediaInfo/Multiple/File_Mk.cpp +++ b/Source/MediaInfo/Multiple/File_Mk.cpp @@ -31,6 +31,9 @@ #if defined(MEDIAINFO_RM_YES) #include "MediaInfo/Multiple/File_Rm.h" #endif +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #if defined(MEDIAINFO_MPEG4V_YES) #include "MediaInfo/Video/File_Mpeg4v.h" #endif @@ -1183,71 +1186,19 @@ void File_Mk::Streams_Finish() Fill(Stream_Video, StreamPos_Last, Video_FrameRate_Mode, IsVfr?"VFR":"CFR"); - //MasteringDisplay - Ztring& MasteringDisplay_ColorPrimaries=HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_SmpteSt2086]; - Ztring& MasteringDisplay_Luminance=HDR[Video_MasteringDisplay_Luminance][HdrFormat_SmpteSt2086]; - Get_MasteringDisplayColorVolume(MasteringDisplay_ColorPrimaries, MasteringDisplay_Luminance, Temp->second.MasteringMetadata); - if (!MasteringDisplay_ColorPrimaries.empty() || !MasteringDisplay_Luminance.empty()) - { - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt2086]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SMPTE ST 2086"); - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt2086]="HDR10"; - } - } - //Merge info about different HDR formats - auto HDR_Format=HDR.find(Video_HDR_Format); - if (HDR_Format!=HDR.end()) - { - bitset HDR_Present; - size_t HDR_FirstFormatPos=(size_t)-1; - for (size_t i=0; isecond[i].empty()) - { - if (HDR_FirstFormatPos==(size_t)-1) - HDR_FirstFormatPos=i; - HDR_Present[i]=true; - } - bool LegacyStreamDisplay=MediaInfoLib::Config.LegacyStreamDisplay_Get(); - for (const auto& HDR_Item: HDR) - { - size_t i=HDR_FirstFormatPos; - size_t HDR_FirstFieldNonEmpty=(size_t)-1; - if (HDR_Item.first>Video_HDR_Format_Compatibility) - { - for (; i= HdrFormat_SmpteSt2086) - break; - if (!HDR_Present[i]) - continue; - Value.push_back(HDR_Item.second[i]); - } - auto Value_Flat = Value.Read(); - if (!Value.empty() && Value_Flat.size() > (Value.size() - 1) * 3) - Fill(Stream_Video, 0, HDR_Item.first, Value.Read()); - } - } + #if defined(MEDIAINFO_T35_YES) + if (!T35_Parser && Temp->second.MasteringMetadata != mastering_metadata_2086()) { + T35_Parser.reset(new File_T35()); + Open_Buffer_Init(T35_Parser.get()); } + if (T35_Parser) { + ((File_T35*)T35_Parser.get())->MasteringMetadata = &Temp->second.MasteringMetadata; + T35_Parser->StreamSource = IsContainer; + T35_Parser->Finish(); + Merge(*T35_Parser, Stream_Video, 0, StreamPos_Last); + } + #endif } //Delay @@ -5429,215 +5380,17 @@ void File_Mk::CRC32_Check () //*************************************************************************** //--------------------------------------------------------------------------- -// SEI - 4 void File_Mk::sei_message_user_data_registered_itu_t_t35() { - Element_Info1("user_data_registered_itu_t_t35"); - - int8u itu_t_t35_country_code; - Get_B1(itu_t_t35_country_code, "itu_t_t35_country_code"); - - switch (itu_t_t35_country_code) - { - case 0xB5: sei_message_user_data_registered_itu_t_t35_B5(); break; // USA - case 0x26: sei_message_user_data_registered_itu_t_t35_26(); break; // China - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA -void File_Mk::sei_message_user_data_registered_itu_t_t35_B5() -{ - int16u itu_t_t35_terminal_provider_code; - Get_B2 (itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); - - switch (itu_t_t35_terminal_provider_code) - { - case 0x003C: sei_message_user_data_registered_itu_t_t35_B5_003C(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C -void File_Mk::sei_message_user_data_registered_itu_t_t35_B5_003C() -{ - int16u itu_t_t35_terminal_provider_oriented_code; - Get_B2 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x0001: sei_message_user_data_registered_itu_t_t35_B5_003C_0001(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C - 0001 -void File_Mk::sei_message_user_data_registered_itu_t_t35_B5_003C_0001() -{ - int8u application_identifier; - Get_B1 (application_identifier, "application_identifier"); - - switch (application_identifier) - { - case 0x04: sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C - 0001 - SMPTE ST 2094-40 (HDR10+) -void File_Mk::sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04() -{ - Element_Info1("SMPTE ST 2094 App 4"); - - int8u application_version{}; - bool IsHDRplus{ false }, tone_mapping_flag{}; - Get_SMPTE_ST_2094_40(application_version, IsHDRplus, tone_mapping_flag); - - FILLING_BEGIN(); - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209440]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SMPTE ST 2094 App 4"); - HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209440].From_Number(application_version); - if (IsHDRplus) - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt209440]=tone_mapping_flag?__T("HDR10+ Profile B"):__T("HDR10+ Profile A"); - } - FILLING_END(); -} - - -//--------------------------------------------------------------------------- -// SEI - 4 - China -void File_Mk::sei_message_user_data_registered_itu_t_t35_26() -{ - int16u itu_t_t35_terminal_provider_code; - Get_B2(itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); - - //HDR Vivid terminal provide code 0x0004, terminal provide oriented code 0x0005 , 0x0005 indicates HDR Vivid version 1 - switch (itu_t_t35_terminal_provider_code) - { - case 0x0004: sei_message_user_data_registered_itu_t_t35_26_0004(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - China similar to sei_message_user_data_registered_itu_t_t35_B5_003C() -void File_Mk::sei_message_user_data_registered_itu_t_t35_26_0004() -{ - int16u itu_t_t35_terminal_provider_oriented_code; - Get_B2(itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - //HDR Vivid terminal provide code 0x0004, terminal provide oriented code 0x0005 - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x0005: sei_message_user_data_registered_itu_t_t35_26_0004_0005(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - China - 0004 -void File_Mk::sei_message_user_data_registered_itu_t_t35_26_0004_0005() -{ - //Parsing - Element_Info1("T/UWA 005 (HDR Vivid)"); - int16u targeted_system_display_maximum_luminance_Max = 0; - int8u system_start_code; - bool color_saturation_mapping_enable_flag; - Get_B1(system_start_code, "system_start_code"); - if (system_start_code != 0x01) - { - Skip_XX(Element_Size, "Unknown"); - return; - } - BS_Begin(); - //int8u num_windows=1; - //for (int8u w=0; w hdr; - hdr HDR; void sei_message_user_data_registered_itu_t_t35(); - void sei_message_user_data_registered_itu_t_t35_B5(); - void sei_message_user_data_registered_itu_t_t35_B5_003C(); - void sei_message_user_data_registered_itu_t_t35_B5_003C_0001(); - void sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04(); - - void sei_message_user_data_registered_itu_t_t35_26(); - void sei_message_user_data_registered_itu_t_t35_26_0004(); - void sei_message_user_data_registered_itu_t_t35_26_0004_0005(); + + #if defined(MEDIAINFO_T35_YES) + std::unique_ptr T35_Parser{}; + #endif struct stream { diff --git a/Source/MediaInfo/Multiple/File_Mpeg4.h b/Source/MediaInfo/Multiple/File_Mpeg4.h index 7336607cf5..24b6af3681 100644 --- a/Source/MediaInfo/Multiple/File_Mpeg4.h +++ b/Source/MediaInfo/Multiple/File_Mpeg4.h @@ -14,7 +14,6 @@ #include "MediaInfo/File__HasReferences.h" #include "MediaInfo/MediaInfo_Internal.h" #include "MediaInfo/Multiple/File_Mpeg4_Descriptors.h" -#include class File_MpegPs; //--------------------------------------------------------------------------- diff --git a/Source/MediaInfo/Multiple/File_MpegTs.cpp b/Source/MediaInfo/Multiple/File_MpegTs.cpp index 74c9b32b61..9ce3f1aa84 100644 --- a/Source/MediaInfo/Multiple/File_MpegTs.cpp +++ b/Source/MediaInfo/Multiple/File_MpegTs.cpp @@ -30,7 +30,6 @@ #if defined(MEDIAINFO_REFERENCES_YES) #include "ZenLib/File.h" #endif //defined(MEDIAINFO_REFERENCES_YES) -#include #include #if MEDIAINFO_EVENTS #include "MediaInfo/MediaInfo_Config_MediaInfo.h" diff --git a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp index 77c8d296eb..e7b8d8aff1 100644 --- a/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp +++ b/Source/MediaInfo/Multiple/File_Mpeg_Psi.cpp @@ -29,7 +29,6 @@ #if defined(MEDIAINFO_DIRECTORY_YES) #include "ZenLib/Dir.h" #endif //defined(MEDIAINFO_DIRECTORY_YES) -#include #include using namespace std; //--------------------------------------------------------------------------- diff --git a/Source/MediaInfo/Multiple/File_Ogg_SubElement.cpp b/Source/MediaInfo/Multiple/File_Ogg_SubElement.cpp index 72dd6cce51..dedda84e4b 100644 --- a/Source/MediaInfo/Multiple/File_Ogg_SubElement.cpp +++ b/Source/MediaInfo/Multiple/File_Ogg_SubElement.cpp @@ -27,7 +27,6 @@ #include "ZenLib/BitStream.h" #include "ZenLib/Utils.h" #include -#include #if defined(MEDIAINFO_DIRAC_YES) #include "MediaInfo/Video/File_Dirac.h" #endif diff --git a/Source/MediaInfo/Multiple/File_T35.cpp b/Source/MediaInfo/Multiple/File_T35.cpp new file mode 100644 index 0000000000..2b694022c9 --- /dev/null +++ b/Source/MediaInfo/Multiple/File_T35.cpp @@ -0,0 +1,798 @@ +/* Copyright (c) MediaArea.net SARL. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the License.html file in the root of the source tree. + */ + +//--------------------------------------------------------------------------- +// Pre-compilation +#include "MediaInfo/PreComp.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/Setup.h" +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#if defined(MEDIAINFO_T35_YES) +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/Multiple/File_T35.h" +#if defined(MEDIAINFO_DTVCCTRANSPORT_YES) +#include "MediaInfo/Text/File_DtvccTransport.h" +#endif //defined(MEDIAINFO_DTVCCTRANSPORT_YES) +#if defined(MEDIAINFO_AFDBARDATA_YES) +#include "MediaInfo/Video/File_AfdBarData.h" +#endif //defined(MEDIAINFO_AFDBARDATA_YES) +#include +#define FMT_UNICODE 0 +#include "ThirdParty/fmt/format.h" +using namespace std; +//--------------------------------------------------------------------------- + +namespace MediaInfoLib +{ + +//*************************************************************************** +// Constructor/Destructor +//*************************************************************************** + +//--------------------------------------------------------------------------- +File_T35::File_T35(source Source) +: Source(Source) +{ + //Config + StreamSource=IsStream; +} + +//*************************************************************************** +// Streams management +//*************************************************************************** + +//--------------------------------------------------------------------------- +void File_T35::Streams_Fill() +{ + //MasteringDisplay + if (MasteringMetadata) { + Ztring& MasteringDisplay_ColorPrimaries = HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_SmpteSt2086]; + Ztring& MasteringDisplay_Luminance = HDR[Video_MasteringDisplay_Luminance][HdrFormat_SmpteSt2086]; + Get_MasteringDisplayColorVolume(MasteringDisplay_ColorPrimaries, MasteringDisplay_Luminance, *MasteringMetadata); + if (!MasteringDisplay_ColorPrimaries.empty() || !MasteringDisplay_Luminance.empty()) { + auto& HDR_Format = HDR[Video_HDR_Format][HdrFormat_SmpteSt2086]; + if (HDR_Format.empty()) { + HDR_Format = __T("SMPTE ST 2086"); + HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt2086] = "HDR10"; + } + } + } + + auto HDR_Format = HDR.find(Video_HDR_Format); + if (HDR_Format != HDR.end()) { + if (!Count_Get(Stream_Video)) { + Stream_Prepare(Stream_Video); + } + bitset HDR_Present; + size_t HDR_FirstFormatPos = (size_t)-1; + for (size_t i = 0; i < HdrFormat_Max; i++) { + if (!HDR_Format->second[i].empty()) { + if (HDR_FirstFormatPos == (size_t)-1) + HDR_FirstFormatPos = i; + HDR_Present[i] = true; + } + } + bool LegacyStreamDisplay = MediaInfoLib::Config.LegacyStreamDisplay_Get(); + for (const auto& HDR_Item : HDR) + { + size_t i = HDR_FirstFormatPos; + size_t HDR_FirstFieldNonEmpty = (size_t)-1; + if (HDR_Item.first > Video_HDR_Format_Compatibility) { + for (; i < HdrFormat_Max; i++) { + if (!HDR_Present[i]) { + continue; + } + if (HDR_FirstFieldNonEmpty == (size_t)-1 && !HDR_Item.second[i].empty()) { + HDR_FirstFieldNonEmpty = i; + } + if (!HDR_Item.second[i].empty() && HDR_Item.second[i] != HDR_Item.second[HDR_FirstFieldNonEmpty]) { + break; + } + } + } + if (i == HdrFormat_Max && HDR_FirstFieldNonEmpty != (size_t)-1) { + Fill(Stream_Video, 0, HDR_Item.first, HDR_Item.second[HDR_FirstFieldNonEmpty]); + } + else { + ZtringList Value; + Value.Separator_Set(0, __T(" / ")); + if (i != HdrFormat_Max) { + for (i = HDR_FirstFormatPos; i < HdrFormat_Max; i++) { + if (!LegacyStreamDisplay && HDR_FirstFormatPos != HdrFormat_SmpteSt2086 && i >= HdrFormat_SmpteSt2086) { + break; + } + if (!HDR_Present[i]) { + continue; + } + Value.push_back(HDR_Item.second[i]); + } + } + auto Value_Flat = Value.Read(); + if (!Value.empty() && Value_Flat.size() > (Value.size() - 1) * 3) { + Fill(Stream_Video, 0, HDR_Item.first, Value.Read()); + } + } + } + } + if (!EtsiTS103433.empty()) { + Fill(Stream_Video, 0, "EtsiTS103433", EtsiTS103433); + Fill_SetOptions(Stream_Video, 0, "EtsiTS103433", "N NTN"); + } + if (!maximum_content_light_level.empty() || !maximum_frame_average_light_level.empty()) { + if (!Count_Get(Stream_Video)) { + Stream_Prepare(Stream_Video); + } + if (!maximum_content_light_level.empty()) { + Fill(Stream_Video, 0, Video_MaxCLL, maximum_content_light_level); + } + if (!maximum_frame_average_light_level.empty()) { + Fill(Stream_Video, 0, Video_MaxFALL, maximum_frame_average_light_level); + } + } +} + +//*************************************************************************** +// Buffer - Global +//*************************************************************************** + +//--------------------------------------------------------------------------- +void File_T35::Read_Buffer_Init() +{ + Accept(); +} + +//--------------------------------------------------------------------------- +void File_T35::Read_Buffer_Continue() +{ + #define CASE(x) case style::x: ##x(); break; + switch (Style) { + CASE(itu_t_t35) + CASE(mastering_display_colour_volume) + CASE(light_level) + } + #undef CASE + + Skip_XX(Element_Size - Element_Offset, "(Unknown)"); +} + +//--------------------------------------------------------------------------- +void File_T35::itu_t_t35() +{ + int8u itu_t_t35_country_code; + Get_B1 (itu_t_t35_country_code, "itu_t_t35_country_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_##x(); break; + switch (itu_t_t35_country_code) { + CASE(26, "China") + CASE(B5, "USA") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// T35 - China +void File_T35::itu_t_t35_26() +{ + int16u itu_t_t35_terminal_provider_code; + Get_B2 (itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_26_##x(); break; + switch (itu_t_t35_terminal_provider_code) { + CASE(0004, "UWA") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// T35 - China - UWA +void File_T35::itu_t_t35_26_0004() +{ + int16u itu_t_t35_terminal_provider_oriented_code; + Get_B2 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_26_0004_##x(); break; + switch (itu_t_t35_terminal_provider_oriented_code) { + CASE(0005, "TUWA 005 (HDR Vivid)") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// T35 - China - UWA - TUWA 005 (HDR Vivid) +void File_T35::itu_t_t35_26_0004_0005() +{ + int16u targeted_system_display_maximum_luminance_Max=0; + int8u system_start_code; + bool color_saturation_mapping_enable_flag; + Get_B1 (system_start_code, "system_start_code"); + if (system_start_code!=0x01) { + return; + } + BS_Begin(); + //int8u num_windows=1; + //for (int8u w=0; w(tone_mapping_param_enable_num); i++) + { + Element_Begin1("tone_mapping_param"); + int16u targeted_system_display_maximum_luminance_pq; + bool base_enable_flag, ThreeSpline_enable_flag; + Get_S2 (12, targeted_system_display_maximum_luminance_pq, "targeted_system_display_maximum_luminance_pq"); + if (targeted_system_display_maximum_luminance_Max < targeted_system_display_maximum_luminance_pq) { + targeted_system_display_maximum_luminance_Max = targeted_system_display_maximum_luminance_pq; + } + Get_SB ( base_enable_flag, "base_enable_flag"); + if (base_enable_flag) + { + Skip_S2(14, "base_param_m_p"); + Skip_S1( 6, "base_param_m_m"); + Skip_S2(10, "base_param_m_a"); + Skip_S2(10, "base_param_m_b"); + Skip_S1( 6, "base_param_m_n"); + Skip_S1( 2, "base_param_K1"); + Skip_S1( 2, "base_param_K2"); + Skip_S1( 4, "base_param_K3"); + Skip_S1( 3, "base_param_Delta_enable_mode"); + Skip_S1( 7, "base_param_enable_Delta"); + } + Get_SB (ThreeSpline_enable_flag, "3Spline_enable_flag"); + if (ThreeSpline_enable_flag) + { + bool ThreeSpline_enable_num; + Get_SB ( ThreeSpline_enable_num, "3Spline_enable_num"); + for (auto j = 0; j <= static_cast(ThreeSpline_enable_num); j++) + { + Element_Begin1("3Spline"); + int8u ThreeSpline_TH_enable_mode; + Get_S1 (2, ThreeSpline_TH_enable_mode, "3Spline_TH_enable_mode"); + switch (ThreeSpline_TH_enable_mode) { + case 0: + case 2: + Skip_S1(8, "3Spline_TH_enable_MB"); + break; + } + Skip_S2(12, "3Spline_TH_enable"); + Skip_S2(10, "3Spline_TH_enable_Delta1"); + Skip_S2(10, "3Spline_TH_enable_Delta2"); + Skip_S1( 8, "3Spline_enable_Strength"); + Element_End0(); + } + } + Element_End0(); + } + } + Get_SB (color_saturation_mapping_enable_flag, "color_saturation_mapping_enable_flag"); + if (color_saturation_mapping_enable_flag) + { + int8u color_saturation_enable_num; + Get_S1 (3, color_saturation_enable_num, "color_saturation_enable_num"); + for (int i = 0; i < color_saturation_enable_num; i++) { + Skip_S1(8, "color_saturation_enable_gain"); + } + } + } + BS_End(); + + FILLING_BEGIN(); + auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_HdrVivid]; + if (HDR_Format.empty()) + { + HDR_Format=__T("HDR Vivid"); + HDR[Video_HDR_Format_Version][HdrFormat_HdrVivid] = Ztring().From_UTF8(fmt::to_string(system_start_code)); + } + FILLING_END(); +} + +//--------------------------------------------------------------------------- +// USA +void File_T35::itu_t_t35_B5() +{ + int16u itu_t_t35_terminal_provider_code; + Get_B2 (itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_##x(); break; + switch (itu_t_t35_terminal_provider_code) { + CASE(0031, "ATSC") + CASE(003A, "ETSI") + CASE(003B, "Dolby") + CASE(003C, "Samsung Electronics America") + CASE(5890, "AOMedia") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - ATSC +void File_T35::itu_t_t35_B5_0031() +{ + int32u identifier; + Get_B4 (identifier, "identifier"); + #define CASE(x,z,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_0031_##z(); break; + switch (identifier) { + CASE(44544731, DTG1, "Digital TV Group Active Format Description") + CASE(47413934, GA94, "General Instrument 94") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - ATSC - DTG1 +void File_T35::itu_t_t35_B5_0031_DTG1() +{ + File_AfdBarData DTG1_Parser; + DTG1_Parser.aspect_ratio_FromContainer = aspect_ratio_FromContainer; + Open_Buffer_Init(&DTG1_Parser); + DTG1_Parser.Format=File_AfdBarData::Format_A53_4_DTG1; + Open_Buffer_Continue(&DTG1_Parser); + Merge(DTG1_Parser, Stream_Video, 0, 0); +} + +//--------------------------------------------------------------------------- +// USA - ATSC - GA94 +void File_T35::itu_t_t35_B5_0031_GA94() +{ + int8u user_data_type_code; + Get_B1(user_data_type_code, "user_data_type_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_0031_GA94_##x(); break; + switch (user_data_type_code) { + //CASE(03, "EIA 708"); + CASE(06, "Bar data"); + CASE(09, "SMPTE ST 2094-10 (SMPTE ST 2094 App 1)"); + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - ATSC - GA94 - Bar data +void File_T35::itu_t_t35_B5_0031_GA94_06() +{ + bool top_bar_flag, bottom_bar_flag, left_bar_flag, right_bar_flag; + BS_Begin(); + Get_SB (top_bar_flag, "top_bar_flag"); + Get_SB (bottom_bar_flag, "bottom_bar_flag"); + Get_SB (left_bar_flag, "left_bar_flag"); + Get_SB (right_bar_flag, "right_bar_flag"); + Mark_1_NoTrustError(); + Mark_1_NoTrustError(); + Mark_1_NoTrustError(); + Mark_1_NoTrustError(); + BS_End(); + if (top_bar_flag) + { + Mark_1(); + Mark_1(); + Skip_S2(14, "line_number_end_of_top_bar"); + } + if (bottom_bar_flag) + { + Mark_1(); + Mark_1(); + Skip_S2(14, "line_number_start_of_bottom_bar"); + } + if (left_bar_flag) + { + Mark_1(); + Mark_1(); + Skip_S2(14, "pixel_number_end_of_left_bar"); + } + if (right_bar_flag) + { + Mark_1(); + Mark_1(); + Skip_S2(14, "pixel_number_start_of_right_bar"); + } + Mark_1(); + Mark_1(); + Mark_1(); + Mark_1(); + Mark_1(); + Mark_1(); + Mark_1(); + Mark_1(); + BS_End(); + + if (Element_Size-Element_Offset) + Skip_XX(Element_Size-Element_Offset, "additional_bar_data"); +} + +//--------------------------------------------------------------------------- +// USA - ATSC - GA94 - SMPTE ST 2094-10 +static const char* Smpte209410_BlockNames[]= +{ + nullptr, + "Content Range", + "Trim Pass", + nullptr, + nullptr, + "Active Area", +}; +static const auto Smpte209410_BlockNames_Size=sizeof(Smpte209410_BlockNames)/sizeof(decltype(*Smpte209410_BlockNames)); +void File_T35::itu_t_t35_B5_0031_GA94_09() +{ + int32u app_identifier, app_version; + bool metadata_refresh_flag; + vector ext_block_level_List; + BS_Begin(); + Get_UE(app_identifier, "app_identifier"); + if (app_identifier!=1) + return; + Get_UE (app_version, "app_version"); + if (!app_version) + { + Get_SB(metadata_refresh_flag, "metadata_refresh_flag"); + if (metadata_refresh_flag) + { + int32u num_ext_blocks; + Get_UE (num_ext_blocks, "num_ext_blocks"); + if (num_ext_blocks) + { + auto Align=Data_BS_Remain()%8; + if (Align) + Skip_BS(Align, "dm_alignment_zero_bits"); + for (int32u i=0; iData_BS_Remain()) + { + Element_End0(); + Trusted_IsNot("Coherency"); + break; + } + ext_block_length*=8; + if (ext_block_length>Data_BS_Remain()) + { + Element_End0(); + Trusted_IsNot("Coherency"); + break; + } + auto End=Data_BS_Remain()-ext_block_length; + ext_block_level_List.push_back(ext_block_level); + switch (ext_block_level) { + case 1: + Skip_S2(12, "min_PQ"); + Skip_S2(12, "max_PQ"); + Skip_S2(12, "avg_PQ"); + break; + case 2: + Skip_S2(12, "target_max_PQ"); + Skip_S2(12, "trim_slope"); + Skip_S2(12, "trim_offset"); + Skip_S2(12, "trim_power"); + Skip_S2(12, "trim_chroma_weight"); + Skip_S2(12, "trim_saturation_gain"); + Skip_S1( 3, "ms_weight"); + break; + case 3: + Skip_S2(12, "min_PQ_offset"); + Skip_S2(12, "max_PQ_offset"); + Skip_S2(12, "avg_PQ_offset"); + break; + case 4: + Skip_S2(12, "TF_PQ_mean"); + Skip_S2(12, "TF_PQ_stdev"); + break; + case 5: + Skip_S2(13, "active_area_left_offset"); + Skip_S2(13, "active_area_right_offset"); + Skip_S2(13, "active_area_top_offset"); + Skip_S2(13, "active_area_bottom_offset"); + break; + } + if (Data_BS_Remain() > End) { + auto Align = Data_BS_Remain() - End; + if (Align) + Skip_BS(Align, Align >= 8 ? "(Unknown)" : "dm_alignment_zero_bits"); + } + Element_End0(); + } + } + } + auto Align = Data_BS_Remain() % 8; + if (Align) + Skip_BS(Align, Align >= 8 ? "(Unknown)" : "dm_alignment_zero_bits"); + BS_End(); + } + + auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209410]; + if (HDR_Format.empty()) + { + HDR_Format=__T("SMPTE ST 2094-10"); + FILLING_BEGIN(); + HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209410].From_Number(app_version); + FILLING_END(); + } + if (!Trusted_Get()) + { + Fill(Stream_Video, 0, "ConformanceErrors", "Yes", Unlimited, true, true); + Fill(Stream_Video, 0, "ConformanceErrors SMPTE_ST_2049_CVT", "Yes", Unlimited, true, true); + Fill(Stream_Video, 0, "ConformanceErrors SMPTE_ST_2049_CVT Coherency", "Bitstream parsing ran out of data to read before the end of the syntax was reached, most probably the bitstream is malformed", Unlimited, true, true); + } +} + +//--------------------------------------------------------------------------- +// USA - ETSI +void File_T35::itu_t_t35_B5_003A() +{ + int8u itu_t_t35_terminal_provider_oriented_code; + Get_B1 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_003A_##x(); break; + switch (itu_t_t35_terminal_provider_oriented_code) { + CASE(00, "ETSI 103-433-1 (SL-HDR) message") + CASE(02, "ETSI 103-433-1 (SL-HDR) information") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - ETSI - ETSI 103-433-1 (SL-HDR) message +void File_T35::itu_t_t35_B5_003A_00() +{ + Element_Begin1("sl_hdr_info"); + BS_Begin(); + int8u sl_hdr_mode_value_minus1, sl_hdr_spec_major_version_idc, sl_hdr_spec_minor_version_idc; + bool sl_hdr_cancel_flag; + Get_S1 (4, sl_hdr_mode_value_minus1, "sl_hdr_mode_value_minus1"); + Get_S1 (4, sl_hdr_spec_major_version_idc, "sl_hdr_spec_major_version_idc"); + Get_S1 (7, sl_hdr_spec_minor_version_idc, "sl_hdr_spec_minor_version_idc"); + Get_SB (sl_hdr_cancel_flag, "sl_hdr_cancel_flag"); + if (sl_hdr_cancel_flag) { + BS_End(); + + FILLING_BEGIN() + auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_EtsiTs103433]; + HDR_Format.clear(); + EtsiTS103433.clear(); + FILLING_END(); + } + else { + int8u sl_hdr_payload_mode; + int8u k_coefficient_value[3]; + mastering_metadata_2086 Meta; + bool coded_picture_info_present_flag, target_picture_info_present_flag, src_mdcv_info_present_flag; + Skip_SB( "sl_hdr_persistence_flag"); + Get_SB (coded_picture_info_present_flag, "coded_picture_info_present_flag"); + Get_SB (target_picture_info_present_flag, "target_picture_info_present_flag"); + Get_SB (src_mdcv_info_present_flag, "src_mdcv_info_present_flag"); + Skip_SB( "sl_hdr_extension_present_flag"); + Get_S1 (3, sl_hdr_payload_mode, "sl_hdr_payload_mode"); + BS_End(); + if (coded_picture_info_present_flag) { + Skip_B1( "coded_picture_primaries"); + Skip_B2( "coded_picture_max_luminance"); + Skip_B2( "coded_picture_min_luminance"); + } + if (target_picture_info_present_flag) { + Skip_B1( "target_picture_primaries"); + Skip_B2( "target_picture_max_luminance"); + Skip_B2( "target_picture_min_luminance"); + } + if (src_mdcv_info_present_flag) { + int16u max, min; + for (auto i = 0; i < 3; i++) { + Get_B2 (Meta.Primaries[i*2 ], "src_mdcv_primaries_x"); + Get_B2 (Meta.Primaries[i*2+1], "src_mdcv_primaries_y"); + } + Get_B2 (Meta.Primaries[3*2 ], "src_mdcv_ref_white_x"); + Get_B2 (Meta.Primaries[3*2+1], "src_mdcv_ref_white_y"); + Get_B2 (max, "src_mdcv_max_mastering_luminance"); + Get_B2 (min, "src_mdcv_min_mastering_luminance"); + Meta.Luminance[0]=min; + Meta.Luminance[1]=((int32u)max)*10000; + } + for (auto i = 0; i < 4; i++) { + Skip_B2( "matrix_coefficient_value"); + } + for (auto i = 0; i < 2; i++) { + Skip_B2( "chroma_to_luma_injection"); + } + for (auto i = 0; i < 3; i++) { + Get_B1 (k_coefficient_value[i], "k_coefficient_value"); + } + Skip_BS(Data_BS_Remain(), "(Not parsed)"); + + FILLING_BEGIN() + auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_EtsiTs103433]; + if (HDR_Format.empty()) { + HDR_Format=__T("SL-HDR")+Ztring().From_Number(sl_hdr_mode_value_minus1+1); + HDR[Video_HDR_Format_Version][HdrFormat_EtsiTs103433]=Ztring().From_Number(sl_hdr_spec_major_version_idc)+__T('.')+Ztring().From_Number(sl_hdr_spec_minor_version_idc); + Get_MasteringDisplayColorVolume(HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_EtsiTs103433], HDR[Video_MasteringDisplay_Luminance][HdrFormat_EtsiTs103433], Meta); + auto& HDR_Format_Settings=HDR[Video_HDR_Format_Settings][HdrFormat_EtsiTs103433]; + if (sl_hdr_payload_mode<2) + HDR_Format_Settings=sl_hdr_payload_mode?__T("Table-based"):__T("Parameter-based"); + else + HDR_Format_Settings=__T("Payload Mode ") + Ztring().From_Number(sl_hdr_payload_mode); + if (!sl_hdr_mode_value_minus1) + HDR_Format_Settings+=k_coefficient_value[0]==0 && k_coefficient_value[1]==0 && k_coefficient_value[2]==0?__T(", non-constant"):__T(", constant"); + + EtsiTS103433 = __T("SL-HDR") + Ztring().From_Number(sl_hdr_mode_value_minus1 + 1); + if (!sl_hdr_mode_value_minus1) + EtsiTS103433 += k_coefficient_value[0] == 0 && k_coefficient_value[1] == 0 && k_coefficient_value[2] == 0 ? __T(" NCL") : __T(" CL"); + EtsiTS103433 += __T(" specVersion=") + Ztring().From_Number(sl_hdr_spec_major_version_idc) + __T(".") + Ztring().From_Number(sl_hdr_spec_minor_version_idc); + EtsiTS103433 += __T(" payloadMode=") + Ztring().From_Number(sl_hdr_payload_mode); + } + FILLING_END(); + } + Element_End0(); +} + +//--------------------------------------------------------------------------- +// USA - ETSI - ETSI 103-433-1 (SL-HDR) information +void File_T35::itu_t_t35_B5_003A_02() +{ + int8u ts_103_433_spec_version; + BS_Begin(); + Get_S1 (4, ts_103_433_spec_version, "ts_103_433_spec_version"); + switch (ts_103_433_spec_version) { + case 0: + Skip_S1(4, "ts_103_433_payload_mode"); + break; + case 1: + Skip_S1(3, "sl_hdr_mode_support"); + break; + default: + Skip_BS(Data_BS_Remain(), "(Unknown)"); + } + BS_End(); +} + +//--------------------------------------------------------------------------- +// USA - Dolby +void File_T35::itu_t_t35_B5_003B() +{ + int32u itu_t_t35_terminal_provider_oriented_code; + Get_B4 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_003B_##x(); break; + switch (itu_t_t35_terminal_provider_oriented_code) { + CASE(00000800, "EMDF") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - Dolby - EMDF +void File_T35::itu_t_t35_B5_003B_00000800() +{ +} + +//--------------------------------------------------------------------------- +// USA - Samsung Electronics America +void File_T35::itu_t_t35_B5_003C() +{ + int16u itu_t_t35_terminal_provider_oriented_code; + Get_B2 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_003C_##x(); break; + switch (itu_t_t35_terminal_provider_oriented_code) { + CASE(0001, "SMPTE ST 2094") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - Samsung Electronics America - SMPTE ST 2094 +void File_T35::itu_t_t35_B5_003C_0001() +{ + int8u application_identifier; + Get_B1 (application_identifier, "application_identifier"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_003C_0001_##x(); break; + switch (application_identifier) { + CASE(04, "SMPTE ST 2094-40 (SMPTE ST 2094 App 4)") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - Samsung Electronics America - SMPTE ST 2094 - SMPTE ST 2094-40 (SMPTE ST 2094 App 4) +void File_T35::itu_t_t35_B5_003C_0001_04() +{ + int8u application_version{}; + bool IsHDRplus{ false }, tone_mapping_flag{}; + Get_SMPTE_ST_2094_40(application_version, IsHDRplus, tone_mapping_flag); + + FILLING_BEGIN(); + auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209440]; + if (HDR_Format.empty()) + { + HDR_Format=__T("SMPTE ST 2094 App 4"); + HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209440].From_Number(application_version); + if (IsHDRplus) + HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt209440]=tone_mapping_flag?__T("HDR10+ Profile B"):__T("HDR10+ Profile A"); + } + FILLING_END(); +} + +//--------------------------------------------------------------------------- +// USA - AOMedia +void File_T35::itu_t_t35_B5_5890() +{ + int8u itu_t_t35_terminal_provider_oriented_code; + Get_B1 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); + + #define CASE(x,y) case 0x##x: Param_Info1(y); Element_Info1(y); itu_t_t35_B5_5890_##x(); break; + switch (itu_t_t35_terminal_provider_oriented_code) { + CASE(01, "AFGS1 (AOMedia Film Grain Synthesis 1)") + } + #undef CASE +} + +//--------------------------------------------------------------------------- +// USA - AOMedia - AFGS1 (AOMedia Film Grain Synthesis 1) +void File_T35::itu_t_t35_B5_5890_01() +{ + Element_Begin1("av1_film_grain_param_sets"); + BS_Begin(); + bool afgs1_enable_flag; + Get_SB(afgs1_enable_flag, "afgs1_enable_flag"); + if (!afgs1_enable_flag) { + BS_End(); + return; + } + Skip_S1(4, "reserved_4bits"); + Skip_S1(3, "num_film_grain_sets_minus1"); + Skip_BS(Data_BS_Remain(), "(Not parsed)"); + BS_End(); + Element_End0(); +} + +//--------------------------------------------------------------------------- +void File_T35::mastering_display_colour_volume() +{ + Element_Info1("mastering_display_colour_volume"); + + auto& HDR_Format = HDR[Video_HDR_Format][HdrFormat_SmpteSt2086]; + if (HDR_Format.empty()) + { + HDR_Format = __T("SMPTE ST 2086"); + HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt2086] = "HDR10"; + } + Get_MasteringDisplayColorVolume(HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_SmpteSt2086], HDR[Video_MasteringDisplay_Luminance][HdrFormat_SmpteSt2086], Source == source::aomedia); +} + +//--------------------------------------------------------------------------- +void File_T35::light_level() +{ + Element_Info1("light_level"); + + Get_LightLevel(maximum_content_light_level, maximum_frame_average_light_level); +} + +} //NameSpace + +#endif diff --git a/Source/MediaInfo/Multiple/File_T35.h b/Source/MediaInfo/Multiple/File_T35.h new file mode 100644 index 0000000000..da1a7f67b4 --- /dev/null +++ b/Source/MediaInfo/Multiple/File_T35.h @@ -0,0 +1,110 @@ +/* Copyright (c) MediaArea.net SARL. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the License.html file in the root of the source tree. + */ + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// Information about ITU-T T35 +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//--------------------------------------------------------------------------- +#ifndef MediaInfo_File_T35H +#define MediaInfo_File_T35H +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/File__Analyze.h" +//--------------------------------------------------------------------------- + +namespace MediaInfoLib +{ + +//*************************************************************************** +// Class File_Sami +//*************************************************************************** + +class File_T35 : public File__Analyze +{ +public: + // In + enum class style { + itu_t_t35, + mastering_display_colour_volume, + light_level, + }; + mastering_metadata_2086* MasteringMetadata{}; + style Style{}; + int8u aspect_ratio_FromContainer{ (int8u)-1 }; + + //Text + #if defined(MEDIAINFO_DTVCCTRANSPORT_YES) + // File__Analyze* GA94_03_Parser; + // bool GA94_03_IsPresent; + #endif //defined(MEDIAINFO_DTVCCTRANSPORT_YES) + + // Out + enum hdr_format { + HdrFormat_SmpteSt209410, + HdrFormat_SmpteSt209440, + HdrFormat_EtsiTs103433, + HdrFormat_HdrVivid, + HdrFormat_SmpteSt2086, + HdrFormat_Max, + }; + typedef std::map hdr; + hdr HDR; + Ztring EtsiTS103433; + + //Constructor/Destructor + enum class source { + iso, + aomedia, + }; + File_T35(source Source = source::iso); + +private : + //Streams management + void Streams_Fill(); + + //Buffer - Global + void Read_Buffer_Init(); + void Read_Buffer_Continue(); + + //Elements + void itu_t_t35(); + void itu_t_t35_26(); + void itu_t_t35_26_0004(); + void itu_t_t35_26_0004_0005(); + void itu_t_t35_B5(); + void itu_t_t35_B5_0031(); + void itu_t_t35_B5_0031_DTG1(); + void itu_t_t35_B5_0031_GA94(); + //void itu_t_t35_B5_0031_GA94_03(); + //void itu_t_t35_B5_0031_GA94_03_Delayed(int32u seq_parameter_set_id); + void itu_t_t35_B5_0031_GA94_06(); + void itu_t_t35_B5_0031_GA94_09(); + void itu_t_t35_B5_003A(); + void itu_t_t35_B5_003A_00(); + void itu_t_t35_B5_003A_02(); + void itu_t_t35_B5_003B(); + void itu_t_t35_B5_003B_00000800(); + void itu_t_t35_B5_003C(); + void itu_t_t35_B5_003C_0001(); + void itu_t_t35_B5_003C_0001_04(); + void itu_t_t35_B5_5890(); + void itu_t_t35_B5_5890_01(); + void mastering_display_colour_volume(); + void light_level(); + + // Temp + Ztring maximum_content_light_level; + Ztring maximum_frame_average_light_level; + source Source; +}; + +} //NameSpace + +#endif diff --git a/Source/MediaInfo/Setup.h b/Source/MediaInfo/Setup.h index 03964af346..be2565f862 100644 --- a/Source/MediaInfo/Setup.h +++ b/Source/MediaInfo/Setup.h @@ -594,6 +594,9 @@ #if !defined(MEDIAINFO_MULTI_NO) && !defined(MEDIAINFO_SWF_NO) && !defined(MEDIAINFO_SWF_YES) #define MEDIAINFO_SWF_YES #endif +#if !defined(MEDIAINFO_MULTI_NO) && !defined(MEDIAINFO_T35_NO) && !defined(MEDIAINFO_T35_YES) + #define MEDIAINFO_T35_YES +#endif #if !defined(MEDIAINFO_MULTI_NO) && !defined(MEDIAINFO_TSP_NO) && !defined(MEDIAINFO_TSP_YES) #define MEDIAINFO_TSP_YES #endif diff --git a/Source/MediaInfo/Tag/File_Exif.cpp b/Source/MediaInfo/Tag/File_Exif.cpp index f644b1aafc..8f95f83bd9 100644 --- a/Source/MediaInfo/Tag/File_Exif.cpp +++ b/Source/MediaInfo/Tag/File_Exif.cpp @@ -39,7 +39,6 @@ #include "MediaInfo/Tag/File_Iim.h" #endif #include -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Tag/File_Exif.h b/Source/MediaInfo/Tag/File_Exif.h index 15cfb68489..65031caea6 100644 --- a/Source/MediaInfo/Tag/File_Exif.h +++ b/Source/MediaInfo/Tag/File_Exif.h @@ -17,7 +17,6 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" -#include //--------------------------------------------------------------------------- namespace MediaInfoLib diff --git a/Source/MediaInfo/Video/File_Av1.cpp b/Source/MediaInfo/Video/File_Av1.cpp index b297d93d1a..f180f01eee 100644 --- a/Source/MediaInfo/Video/File_Av1.cpp +++ b/Source/MediaInfo/Video/File_Av1.cpp @@ -195,61 +195,12 @@ void File_Av1::Streams_Finish() } //Merge info about different HDR formats - auto HDR_Format = HDR.find(Video_HDR_Format); - if (HDR_Format != HDR.end()) - { - std::bitset HDR_Present; - size_t HDR_FirstFormatPos = (size_t)-1; - for (size_t i = 0; i < HdrFormat_Max; ++i) - if (!HDR_Format->second[i].empty()) - { - if (HDR_FirstFormatPos == (size_t)-1) - HDR_FirstFormatPos = i; - HDR_Present[i] = true; - } - bool LegacyStreamDisplay = MediaInfoLib::Config.LegacyStreamDisplay_Get(); - for (const auto& HDR_Item : HDR) - { - size_t i = HDR_FirstFormatPos; - size_t HDR_FirstFieldNonEmpty = (size_t)-1; - if (HDR_Item.first > Video_HDR_Format_Compatibility) - { - for (; i < HdrFormat_Max; ++i) - { - if (!HDR_Present[i]) - continue; - if (HDR_FirstFieldNonEmpty == (size_t)-1 && !HDR_Item.second[i].empty()) - HDR_FirstFieldNonEmpty = i; - if (!HDR_Item.second[i].empty() && HDR_FirstFieldNonEmpty < HdrFormat_Max && HDR_Item.second[i] != HDR_Item.second[HDR_FirstFieldNonEmpty]) - break; - } - } - if (i == HdrFormat_Max && HDR_FirstFieldNonEmpty != (size_t)-1) - Fill(Stream_Video, 0, HDR_Item.first, HDR_Item.second[HDR_FirstFieldNonEmpty]); - else - { - ZtringList Value; - Value.Separator_Set(0, __T(" / ")); - if (i != HdrFormat_Max) - for (i = HDR_FirstFormatPos; i < HdrFormat_Max; ++i) - { - if (!LegacyStreamDisplay && HDR_FirstFormatPos != HdrFormat_SmpteSt2086 && i >= HdrFormat_SmpteSt2086) - break; - if (!HDR_Present[i]) - continue; - Value.push_back(HDR_Item.second[i]); - } - auto Value_Flat = Value.Read(); - if (!Value.empty() && Value_Flat.size() > (Value.size() - 1) * 3) - Fill(Stream_Video, 0, HDR_Item.first, Value.Read()); - } - } + #if defined(MEDIAINFO_T35_YES) + if (T35_Parser) { + T35_Parser->Finish(); + Merge(*T35_Parser, Stream_Video, 0, 0); } - - if (!maximum_content_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxCLL, maximum_content_light_level); - if (!maximum_frame_average_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxFALL, maximum_frame_average_light_level); + #endif } //*************************************************************************** @@ -705,6 +656,7 @@ void File_Av1::metadata() int64u metadata_type; Get_leb128 (metadata_type, "metadata_type"); Param_Info1(Av1_metadata_type(static_cast(metadata_type))); + Element_Info1(Av1_metadata_type(static_cast(metadata_type))); switch (metadata_type) { @@ -717,139 +669,6 @@ void File_Av1::metadata() } } -//--------------------------------------------------------------------------- -void File_Av1::metadata_hdr_cll() -{ - //Parsing - Get_LightLevel(maximum_content_light_level, maximum_frame_average_light_level); - - BS_Begin(); - trailing_bits(); - BS_End(); -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_hdr_mdcv() -{ - //Parsing - auto& HDR_Format = HDR[Video_HDR_Format][HdrFormat_SmpteSt2086]; - if (HDR_Format.empty()) - { - HDR_Format = __T("SMPTE ST 2086"); - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt2086] = "HDR10"; - } - Get_MasteringDisplayColorVolume(HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_SmpteSt2086], HDR[Video_MasteringDisplay_Luminance][HdrFormat_SmpteSt2086], true); - - BS_Begin(); - trailing_bits(); - BS_End(); -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35() -{ - //Parsing - int8u itu_t_t35_country_code; - Get_B1(itu_t_t35_country_code, "itu_t_t35_country_code"); - if (itu_t_t35_country_code == 0xFF) - Skip_B1( "itu_t_t35_country_code_extension_byte"); - - switch (itu_t_t35_country_code) - { - case 0xB5: Param_Info1("United States"); metadata_itu_t_t35_B5(); break; - } -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5() -{ - int16u itu_t_t35_terminal_provider_code; - Get_B2(itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); - - switch (itu_t_t35_terminal_provider_code) - { - case 0x003C: Param_Info1("Samsung Electronics America"); metadata_itu_t_t35_B5_003C(); break; - case 0x5890: Param_Info1("AOMedia"); metadata_itu_t_t35_B5_5890(); break; - } -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5_003C() -{ - int16u itu_t_t35_terminal_provider_oriented_code; - Get_B2(itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x0001: metadata_itu_t_t35_B5_003C_0001(); break; - } -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5_003C_0001() -{ - int8u application_identifier; - Get_B1(application_identifier, "application_identifier"); - - switch (application_identifier) - { - case 0x04: metadata_itu_t_t35_B5_003C_0001_04(); break; - } -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5_003C_0001_04() -{ - Element_Info1("SMPTE ST 2094 App 4"); - - int8u application_version{}; - bool IsHDRplus{ false }, tone_mapping_flag{}; - Get_SMPTE_ST_2094_40(application_version, IsHDRplus, tone_mapping_flag); - - FILLING_BEGIN(); - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209440]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SMPTE ST 2094 App 4"); - HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209440].From_Number(application_version); - if (IsHDRplus) - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt209440]=tone_mapping_flag?__T("HDR10+ Profile B"):__T("HDR10+ Profile A"); - } - FILLING_END(); -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5_5890() -{ - int8u itu_t_t35_terminal_provider_oriented_code; - Get_B1(itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x01: metadata_itu_t_t35_B5_5890_01(); break; - } -} - -//--------------------------------------------------------------------------- -void File_Av1::metadata_itu_t_t35_B5_5890_01() -{ - Element_Info1("AOMedia Film Grain Synthesis 1 (AFGS1)"); - - Element_Begin1("av1_film_grain_param_sets"); - BS_Begin(); - bool afgs1_enable_flag; - Get_SB(afgs1_enable_flag, "afgs1_enable_flag"); - if (!afgs1_enable_flag) { - BS_End(); - return; - } - Skip_S1(4, "reserved_4bits"); - Skip_S1(3, "num_film_grain_sets_minus1"); - BS_End(); - Skip_XX(Element_Size - Element_Offset, "(Not parsed)"); - Element_End0(); -} - //--------------------------------------------------------------------------- void File_Av1::metadata_scalability() { @@ -869,7 +688,6 @@ void File_Av1::metadata_scalability() //--------------------------------------------------------------------------- void File_Av1::scalability_structure() { - Element_Begin1("scalability_structure"); BS_Begin(); int8u spatial_layers_cnt_minus_1; bool spatial_layer_dimensions_present_flag, spatial_layer_description_present_flag, temporal_group_description_present_flag; @@ -918,7 +736,6 @@ void File_Av1::scalability_structure() } Element_End0(); } - Element_End0(); } //--------------------------------------------------------------------------- @@ -1118,6 +935,33 @@ void File_Av1::Get_leb128(int64u& Info, const char* Name) Info=0; } +//--------------------------------------------------------------------------- +#if defined(MEDIAINFO_T35_YES) +void File_Av1::T35(File_T35::style Style) +{ + auto Element_Size_Save = Element_Size; + const int8u* Buffer2 = Buffer + Buffer_Offset; + while (Element_Size && !Buffer2[Element_Size - 1]) + --Element_Size; + if (!Element_Size || Buffer2[Element_Size - 1] != 0x80) { + Trusted_IsNot("Invalid trailing byte"); + Element_Size = Element_Size_Save; + return; + } + --Element_Size; + + if (!T35_Parser) { + T35_Parser.reset(new File_T35(File_T35::source::aomedia)); + Open_Buffer_Init(T35_Parser.get()); + } + ((File_T35*)T35_Parser.get())->Style = Style; + Open_Buffer_Continue(T35_Parser.get()); + + Element_Size = Element_Size_Save; + Element_Offset = Element_Size; +} +#endif + //--------------------------------------------------------------------------- } //NameSpace diff --git a/Source/MediaInfo/Video/File_Av1.h b/Source/MediaInfo/Video/File_Av1.h index 19e7fd774d..b2b3675cb6 100644 --- a/Source/MediaInfo/Video/File_Av1.h +++ b/Source/MediaInfo/Video/File_Av1.h @@ -11,6 +11,9 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #include "MediaInfo/File__Duplicate.h" #include #include @@ -52,6 +55,9 @@ private : void Data_Parse(); //Elements + #if !defined(MEDIAINFO_T35_YES) + #define T35(x) { Skip_XX(Element_Size - Element_Offset, "(Not parsed)"); } + #endif void trailing_bits(); void sequence_header(); void temporal_delimiter(); @@ -59,15 +65,9 @@ private : void frame_header_uncompressed_header(); void tile_group(); void metadata(); - void metadata_hdr_cll(); - void metadata_hdr_mdcv(); - void metadata_itu_t_t35(); - void metadata_itu_t_t35_B5(); - void metadata_itu_t_t35_B5_003C(); - void metadata_itu_t_t35_B5_003C_0001(); - void metadata_itu_t_t35_B5_003C_0001_04(); - void metadata_itu_t_t35_B5_5890(); - void metadata_itu_t_t35_B5_5890_01(); + void metadata_hdr_cll() { T35(File_T35::style::light_level); } + void metadata_hdr_mdcv() { T35(File_T35::style::mastering_display_colour_volume); } + void metadata_itu_t_t35() { T35(File_T35::style::itu_t_t35); } void metadata_scalability(); void scalability_structure(); void metadata_timecode(); @@ -75,26 +75,22 @@ private : void padding(); //Temp - Ztring maximum_content_light_level; - Ztring maximum_frame_average_light_level; bool sequence_header_Parsed{}; bool SeenFrameHeader{}; bool reduced_still_picture_header{}; bool show_existing_frame{}; string GOP; - enum hdr_format - { - HdrFormat_SmpteSt209440, - HdrFormat_SmpteSt2086, - HdrFormat_Max, - }; - typedef std::map hdr; - hdr HDR; std::set scalability_structure_seen; + #if defined(MEDIAINFO_T35_YES) + std::unique_ptr T35_Parser{}; + #endif //Helpers std::string GOP_Detect(std::string PictureTypes); void Get_leb128(int64u& Info, const char* Name); + #if defined(MEDIAINFO_T35_YES) + void T35(File_T35::style Style); + #endif }; } //NameSpace diff --git a/Source/MediaInfo/Video/File_Av2.cpp b/Source/MediaInfo/Video/File_Av2.cpp index b6fd05d229..21eb2db65b 100644 --- a/Source/MediaInfo/Video/File_Av2.cpp +++ b/Source/MediaInfo/Video/File_Av2.cpp @@ -217,6 +217,14 @@ void File_Av2::Streams_Fill() Fill(Stream_Video, 0, Video_matrix_coefficients, Mpegv_matrix_coefficients(MatrixCoefficients)); Fill(Stream_Video, 0, Video_colour_range, Avc_video_full_range[FullRange]); } + + //Merge info about different HDR formats + #if defined(MEDIAINFO_T35_YES) + if (T35_Parser) { + T35_Parser->Finish(); + Merge(*T35_Parser, Stream_Video, 0, 0); + } + #endif } //--------------------------------------------------------------------------- @@ -1145,45 +1153,6 @@ void File_Av2::metadata_group_obu() FILLING_END(); } -//--------------------------------------------------------------------------- -void File_Av2::metadata_itu_t_t35() -{ - Element_Begin1("metadata_itu_t_t35"); - - // TODO: Use ITUT T35 parser - Skip_XX(Element_Size, "Data"); - - Element_End0(); -} - -//--------------------------------------------------------------------------- -void File_Av2::metadata_hdr_cll() -{ - Element_Begin1("metadata_hdr_cll"); - - //Parsing - Get_LightLevel(maximum_content_light_level, maximum_frame_average_light_level); - - Element_End0(); -} - -//--------------------------------------------------------------------------- -void File_Av2::metadata_hdr_mdcv() -{ - Element_Begin1("metadata_hdr_mdcv"); - - //Parsing - auto& HDR_Format = HDR[Video_HDR_Format][HdrFormat_SmpteSt2086]; - if (HDR_Format.empty()) - { - HDR_Format = __T("SMPTE ST 2086"); - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt2086] = "HDR10"; - } - Get_MasteringDisplayColorVolume(HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_SmpteSt2086], HDR[Video_MasteringDisplay_Luminance][HdrFormat_SmpteSt2086], true); - - Element_End0(); -} - //--------------------------------------------------------------------------- void File_Av2::metadata_timecode() { @@ -1668,6 +1637,19 @@ void File_Av2::Get_rg(int8u n, int64u& Info, const char* Name) Trusted_IsNot("Size is wrong"); // bitstream conformance fail } +//--------------------------------------------------------------------------- +#if defined(MEDIAINFO_T35_YES) +void File_Av2::T35(File_T35::style Style) +{ + if (!T35_Parser) { + T35_Parser.reset(new File_T35(File_T35::source::aomedia)); + Open_Buffer_Init(T35_Parser.get()); + } + ((File_T35*)T35_Parser.get())->Style = Style; + Open_Buffer_Continue(T35_Parser.get()); +} +#endif + //--------------------------------------------------------------------------- } //NameSpace diff --git a/Source/MediaInfo/Video/File_Av2.h b/Source/MediaInfo/Video/File_Av2.h index e5f7238b22..35bb665411 100644 --- a/Source/MediaInfo/Video/File_Av2.h +++ b/Source/MediaInfo/Video/File_Av2.h @@ -12,6 +12,9 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" #include "MediaInfo/File__Duplicate.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #include //--------------------------------------------------------------------------- @@ -48,6 +51,9 @@ private : void Data_Parse() override; //Elements + #if !defined(MEDIAINFO_T35_YES) + #define T35(x) { Skip_XX(Element_Size - Element_Offset, "(Not parsed)"); } + #endif void obu_extension_data(int64u sz); void trailing_bits(int64u nbBits); void byte_alignment(); @@ -75,9 +81,9 @@ private : void metadata_unit(int64u metadata_type, int64u payload_size); void metadata_short_obu(); void metadata_group_obu(); - void metadata_itu_t_t35(); - void metadata_hdr_cll(); - void metadata_hdr_mdcv(); + void metadata_itu_t_t35() { T35(File_T35::style::itu_t_t35); } + void metadata_hdr_cll() { T35(File_T35::style::light_level); } + void metadata_hdr_mdcv() { T35(File_T35::style::mastering_display_colour_volume); } void metadata_timecode(); void metadata_banding_hints(); void metadata_icc_profile(); @@ -111,16 +117,10 @@ private : int8u TransferCharacteristics{ 2 }; int8u MatrixCoefficients{ 2 }; int32u chroma_format_idc{}; - Ztring maximum_content_light_level; - Ztring maximum_frame_average_light_level; - enum hdr_format - { - HdrFormat_SmpteSt209440, - HdrFormat_SmpteSt2086, - HdrFormat_Max, - }; - typedef std::map hdr; - hdr HDR; + + #if defined(MEDIAINFO_T35_YES) + std::unique_ptr T35_Parser{}; + #endif //Helpers void Get_leb128(int64u& Info, const char* Name); @@ -131,6 +131,9 @@ private : void Get_ns(int8u n, int64u& Info, const char* Name); void Skip_ns(int8u n, const char* Name); void Get_rg(int8u n, int64u& Info, const char* Name); + #if defined(MEDIAINFO_T35_YES) + void T35(File_T35::style Style); + #endif }; } //NameSpace diff --git a/Source/MediaInfo/Video/File_Avc.cpp b/Source/MediaInfo/Video/File_Avc.cpp index f9a645cf33..650833b806 100644 --- a/Source/MediaInfo/Video/File_Avc.cpp +++ b/Source/MediaInfo/Video/File_Avc.cpp @@ -291,6 +291,9 @@ size_t Avc_profile_level_Indexes(const string& ProfileLevelS) // Note: 1-based, //--------------------------------------------------------------------------- #include "MediaInfo/Video/File_Avc.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #if defined(MEDIAINFO_AFDBARDATA_YES) #include "MediaInfo/Video/File_AfdBarData.h" #endif //defined(MEDIAINFO_AFDBARDATA_YES) @@ -600,6 +603,57 @@ namespace AVC_Intra_Headers }; +//--------------------------------------------------------------------------- +static constexpr const char* Avc_SEI_Names[] = +{ + "buffering_period", + "pic_timing", + "pan_scan_rect", + "filler_payload", + "user_data_registered_itu_t_t35", + "user_data_unregistered", + "recovery_point", + "dec_ref_pic_marking_repetition", + "spare_pic", + "scene_info", + "sub_seq_info", + "sub_seq_layer_characteristics", + "sub_seq_characteristics", + "full_frame_freeze", + "full_frame_freeze_release", + "full_frame_snapshot", + "progressive_refinement_segment_start", + "progressive_refinement_segment_end", + "motion_constrained_slice_group_set", + "film_grain_characteristics", + "deblocking_filter_display_preference", + "stereo_video_info", + "post_filter_hint", + "tone_mapping_info", + "scalability_info", + "sub_pic_scalable_layer", + "non_required_layer_rep", + "priority_layer_info", + "layers_not_present", + "layer_dependency_change", + "scalable_nesting", + "base_layer_temporal_hrd", + "quality_layer_integrity_check", + "redundant_pic_property", + "tl0_dep_rep_index", + "tl_switching_point", + "parallel_decoding_info", + "mvc_scalable_nesting", + "view_scalability_info", + "multiview_scene_info", + "multiview_acquisition_info", + "non_required_view_component", + "view_dependency_change", + "operation_points_not_present", + "base_view_temporal_hrd", +}; +extern const auto Avc_SEI_Names_Size = sizeof(Avc_SEI_Names) / sizeof(*Avc_SEI_Names); + //--------------------------------------------------------------------------- // Some DV Metadata info: http://www.freepatentsonline.com/20050076039.pdf static const char* MDPM(int8u ID) @@ -1189,58 +1243,13 @@ void File_Avc::Streams_Fill(std::vector::iterator seq if (MaxSlicesCount>1) Fill(Stream_Video, 0, Video_Format_Settings_SliceCount, MaxSlicesCount); - hdr::iterator EtsiTs103433 = HDR.find(HdrFormat_EtsiTs103433); - if (EtsiTs103433 != HDR.end()) - { - for (std::map::iterator Item = EtsiTs103433->second.begin(); Item != EtsiTs103433->second.end(); ++Item) - { - Fill(Stream_Video, 0, Item->first, Item->second); - } + //Merge info about different HDR formats + #if defined(MEDIAINFO_T35_YES) + if (T35_Parser) { + T35_Parser->Finish(); + Merge(*T35_Parser, Stream_Video, 0, 0); } - hdr::iterator SmpteSt209440 = HDR.find(HdrFormat_SmpteSt209440); - if (SmpteSt209440 != HDR.end()) - { - for (std::map::iterator Item = SmpteSt209440->second.begin(); Item != SmpteSt209440->second.end(); ++Item) - { - switch (Item->first) - { - case Video_MasteringDisplay_ColorPrimaries: - case Video_MasteringDisplay_Luminance: - if (Retrieve_Const(Stream_Video, 0, Item->first) == Item->second) - break; - [[fallthrough]]; - default: - Fill(Stream_Video, 0, Item->first, Item->second); - } - } - } - hdr::iterator SmpteSt2086 = HDR.find(HdrFormat_SmpteSt2086); - if (SmpteSt2086 != HDR.end()) - { - for (std::map::iterator Item = SmpteSt2086->second.begin(); Item != SmpteSt2086->second.end(); ++Item) - { - bool Ignore; - switch (Item->first) - { - case Video_HDR_Format: - Ignore = !Retrieve_Const(Stream_Video, 0, Item->first).empty(); - break; - case Video_MasteringDisplay_ColorPrimaries: - case Video_MasteringDisplay_Luminance: - Ignore = Retrieve_Const(Stream_Video, 0, Item->first) == Item->second; - break; - default: - Ignore = false; - } - if (!Ignore) - Fill(Stream_Video, 0, Item->first, Item->second); - } - } - - if (!maximum_content_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxCLL, maximum_content_light_level); - if (!maximum_frame_average_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxFALL, maximum_frame_average_light_level); + #endif } //--------------------------------------------------------------------------- @@ -3053,17 +3062,26 @@ void File_Avc::sei() { Element_Name("sei"); - //Parsing + auto Element_Size_Save = Element_Size; + const int8u* Buffer2 = Buffer + Buffer_Offset; + while (Element_Size && !Buffer2[Element_Size - 1]) + --Element_Size; + if (!Element_Size || Buffer2[Element_Size - 1] != 0x80) { + Trusted_IsNot("Invalid trailing byte"); + Element_Size = Element_Size_Save; + return; + } + --Element_Size; + int32u seq_parameter_set_id=(int32u)-1; - while(Element_Offset+1Element_Size) @@ -3271,94 +3290,49 @@ void File_Avc::sei_message_user_data_registered_itu_t_t35() { Element_Info1("user_data_registered_itu_t_t35"); - //Parsing - int8u itu_t_t35_country_code; - Get_B1 (itu_t_t35_country_code, "itu_t_t35_country_code"); - if (itu_t_t35_country_code==0xFF) - Skip_B1( "itu_t_t35_country_code_extension_byte"); - if (itu_t_t35_country_code!=0xB5 || Element_Offset+2>=Element_Size) - { - if (Element_Size-Element_Offset) - Skip_XX(Element_Size-Element_Offset, "Unknown"); - return; - } - - //United-States - int16u id; - Get_B2 (id, "id?"); - if (id!=0x0031 || Element_Offset+4>=Element_Size) - { - if (Element_Size-Element_Offset) - Skip_XX(Element_Size-Element_Offset, "Unknown"); - return; + int64u Probe; + Peek_B8(Probe); + if (Probe == 0xB500314741393403) { // Temporary, it is not supported by the T35 parser + Skip_B1( "itu_t_t35_country_code"); + Skip_B2( "itu_t_t35_terminal_provider_code"); + Skip_C4( "identifier"); + Skip_B1( "user_data_type_code"); + sei_message_user_data_registered_itu_t_t35_GA94_03(); } - - int32u Identifier; - Peek_B4(Identifier); - switch (Identifier) - { - case 0x44544731 : sei_message_user_data_registered_itu_t_t35_DTG1(); return; - case 0x47413934 : sei_message_user_data_registered_itu_t_t35_GA94(); return; - default : if (Element_Size-Element_Offset) - Skip_XX(Element_Size-Element_Offset, "Unknown"); + else { + #if defined(MEDIAINFO_T35_YES) + if (!T35_Parser) { + T35_Parser.reset(new File_T35()); + Open_Buffer_Init(T35_Parser.get()); } -} - -//--------------------------------------------------------------------------- -// SEI - 5 - DTG1 -void File_Avc::sei_message_user_data_registered_itu_t_t35_DTG1() -{ - Element_Info1("Active Format Description"); - //Parsing - Skip_C4( "afd_identifier"); - if (Element_Offsetvui_parameters && seq_parameter_set_Item->vui_parameters->sar_width && seq_parameter_set_Item->vui_parameters->sar_height) { - if (seq_parameter_set_Item && seq_parameter_set_Item->vui_parameters && seq_parameter_set_Item->vui_parameters->sar_width && seq_parameter_set_Item->vui_parameters->sar_height) + //TODO: avoid duplicated code + int32u Width = (seq_parameter_set_Item->pic_width_in_mbs_minus1 + 1) * 16; + int32u Height = (seq_parameter_set_Item->pic_height_in_map_units_minus1 + 1) * 16 * (2 - seq_parameter_set_Item->frame_mbs_only_flag); + int8u chromaArrayType = seq_parameter_set_Item->ChromaArrayType(); + if (chromaArrayType >= 4) + chromaArrayType = 0; + int32u CropUnitX = Avc_SubWidthC[chromaArrayType]; + int32u CropUnitY = Avc_SubHeightC[chromaArrayType] * (2 - seq_parameter_set_Item->frame_mbs_only_flag); + Width -= (seq_parameter_set_Item->frame_crop_left_offset + seq_parameter_set_Item->frame_crop_right_offset) * CropUnitX; + Height -= (seq_parameter_set_Item->frame_crop_top_offset + seq_parameter_set_Item->frame_crop_bottom_offset) * CropUnitY; + if (Height) { - //TODO: avoid duplicated code - int32u Width =(seq_parameter_set_Item->pic_width_in_mbs_minus1 +1)*16; - int32u Height=(seq_parameter_set_Item->pic_height_in_map_units_minus1+1)*16*(2-seq_parameter_set_Item->frame_mbs_only_flag); - int8u chromaArrayType = seq_parameter_set_Item->ChromaArrayType(); - if (chromaArrayType >= 4) - chromaArrayType = 0; - int32u CropUnitX=Avc_SubWidthC [chromaArrayType]; - int32u CropUnitY=Avc_SubHeightC[chromaArrayType]*(2-seq_parameter_set_Item->frame_mbs_only_flag); - Width -=(seq_parameter_set_Item->frame_crop_left_offset+seq_parameter_set_Item->frame_crop_right_offset )*CropUnitX; - Height-=(seq_parameter_set_Item->frame_crop_top_offset +seq_parameter_set_Item->frame_crop_bottom_offset)*CropUnitY; - if (Height) - { - auto PixelAspectRatio=((float32)seq_parameter_set_Item->vui_parameters->sar_width) / seq_parameter_set_Item->vui_parameters->sar_height; - auto DAR=Width*PixelAspectRatio/Height; - if (DAR>=4.0/3.0*0.95 && DAR<4.0/3.0*1.05) DTG1_Parser.aspect_ratio_FromContainer=0; //4/3 - if (DAR>=16.0/9.0*0.95 && DAR<16.0/9.0*1.05) DTG1_Parser.aspect_ratio_FromContainer=1; //16/9 - } + auto PixelAspectRatio = ((float32)seq_parameter_set_Item->vui_parameters->sar_width) / seq_parameter_set_Item->vui_parameters->sar_height; + auto DAR = Width * PixelAspectRatio / Height; + if (DAR >= 4.0 / 3.0 * 0.95 && DAR < 4.0 / 3.0 * 1.05) ((File_T35*)T35_Parser.get())->aspect_ratio_FromContainer = 0; //4/3 + if (DAR >= 16.0 / 9.0 * 0.95 && DAR < 16.0 / 9.0 * 1.05) ((File_T35*)T35_Parser.get())->aspect_ratio_FromContainer = 1; //16/9 } } - Open_Buffer_Init(&DTG1_Parser); - DTG1_Parser.Format=File_AfdBarData::Format_A53_4_DTG1; - Open_Buffer_Continue(&DTG1_Parser, Buffer+Buffer_Offset+(size_t)Element_Offset, Element_Size-Element_Offset); - Merge(DTG1_Parser, Stream_Video, 0, 0); - Element_Offset=Element_Size; } -} -//--------------------------------------------------------------------------- -// SEI - 5 - GA94 -void File_Avc::sei_message_user_data_registered_itu_t_t35_GA94() -{ - //Parsing - int8u user_data_type_code; - Skip_B4( "GA94_identifier"); - Get_B1 (user_data_type_code, "user_data_type_code"); - switch (user_data_type_code) - { - case 0x03 : sei_message_user_data_registered_itu_t_t35_GA94_03(); break; - case 0x06 : sei_message_user_data_registered_itu_t_t35_GA94_06(); break; - default : Skip_XX(Element_Size-Element_Offset, "GA94_reserved_user_data"); + ((File_T35*)T35_Parser.get())->Style = File_T35::style::itu_t_t35; + Open_Buffer_Continue(T35_Parser.get()); + #endif } } @@ -3472,62 +3446,6 @@ void File_Avc::sei_message_user_data_registered_itu_t_t35_GA94_03_Delayed(int32u } } -//--------------------------------------------------------------------------- -// SEI - 5 - GA94 - 0x03 -void File_Avc::sei_message_user_data_registered_itu_t_t35_GA94_06() -{ - Element_Info1("Bar data"); - - //Parsing - bool top_bar_flag, bottom_bar_flag, left_bar_flag, right_bar_flag; - BS_Begin(); - Get_SB (top_bar_flag, "top_bar_flag"); - Get_SB (bottom_bar_flag, "bottom_bar_flag"); - Get_SB (left_bar_flag, "left_bar_flag"); - Get_SB (right_bar_flag, "right_bar_flag"); - Mark_1_NoTrustError(); - Mark_1_NoTrustError(); - Mark_1_NoTrustError(); - Mark_1_NoTrustError(); - BS_End(); - if (top_bar_flag) - { - Mark_1(); - Mark_1(); - Skip_S2(14, "line_number_end_of_top_bar"); - } - if (bottom_bar_flag) - { - Mark_1(); - Mark_1(); - Skip_S2(14, "line_number_start_of_bottom_bar"); - } - if (left_bar_flag) - { - Mark_1(); - Mark_1(); - Skip_S2(14, "pixel_number_end_of_left_bar"); - } - if (right_bar_flag) - { - Mark_1(); - Mark_1(); - Skip_S2(14, "pixel_number_start_of_right_bar"); - } - Mark_1(); - Mark_1(); - Mark_1(); - Mark_1(); - Mark_1(); - Mark_1(); - Mark_1(); - Mark_1(); - BS_End(); - - if (Element_Size-Element_Offset) - Skip_XX(Element_Size-Element_Offset, "additional_bar_data"); -} - //--------------------------------------------------------------------------- // SEI - 5 void File_Avc::sei_message_user_data_unregistered(int32u payloadSize) @@ -3874,29 +3792,6 @@ void File_Avc::consumer_camera_2() BS_End(); } -//--------------------------------------------------------------------------- -void File_Avc::sei_message_mastering_display_colour_volume() -{ - Element_Info1("mastering_display_colour_volume"); - - std::map& SmpteSt2086 = HDR[HdrFormat_SmpteSt2086]; - Ztring& HDR_Format = SmpteSt2086[Video_HDR_Format]; - if (HDR_Format.empty()) - { - HDR_Format = __T("SMPTE ST 2086"); - SmpteSt2086[Video_HDR_Format_Compatibility] = "HDR10"; - } - Get_MasteringDisplayColorVolume(SmpteSt2086[Video_MasteringDisplay_ColorPrimaries], SmpteSt2086[Video_MasteringDisplay_Luminance]); -} -//--------------------------------------------------------------------------- -void File_Avc::sei_message_light_level() -{ - Element_Info1("light_level"); - - //Parsing - Get_LightLevel(maximum_content_light_level, maximum_frame_average_light_level); -} - //--------------------------------------------------------------------------- // SEI - 6 void File_Avc::sei_message_recovery_point() @@ -5059,6 +4954,19 @@ std::string File_Avc::ScanOrder_Detect (std::string ScanOrders) return string(); } +//--------------------------------------------------------------------------- +#if defined(MEDIAINFO_T35_YES) +void File_Avc::T35(File_T35::style Style) +{ + if (!T35_Parser) { + T35_Parser.reset(new File_T35()); + Open_Buffer_Init(T35_Parser.get()); + } + ((File_T35*)T35_Parser.get())->Style = Style; + Open_Buffer_Continue(T35_Parser.get()); +} +#endif + } //NameSpace #endif //MEDIAINFO_AVC_YES diff --git a/Source/MediaInfo/Video/File_Avc.h b/Source/MediaInfo/Video/File_Avc.h index b8b7ff5e4c..e5cc45af5b 100644 --- a/Source/MediaInfo/Video/File_Avc.h +++ b/Source/MediaInfo/Video/File_Avc.h @@ -12,6 +12,9 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" #include "MediaInfo/File__Duplicate.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #include "MediaInfo/TimeCode.h" #include #include @@ -392,6 +395,9 @@ private : void Option_Manage (); //Elements + #if !defined(MEDIAINFO_T35_YES) + #define T35(x) { Skip_XX(Element_Size - Element_Offset, "(Not parsed)"); } + #endif void slice_layer_without_partitioning_IDR(); void slice_layer_without_partitioning_non_IDR(); void slice_header(); @@ -404,32 +410,14 @@ private : void sei_message_buffering_period_xxl(seq_parameter_set_struct::vui_parameters_struct::xxl* xxl); void sei_message_pic_timing(int32u payloadSize, int32u seq_parameter_set_id); void sei_message_user_data_registered_itu_t_t35(); - void sei_message_user_data_registered_itu_t_t35_DTG1(); - void sei_message_user_data_registered_itu_t_t35_GA94(); void sei_message_user_data_registered_itu_t_t35_GA94_03(); void sei_message_user_data_registered_itu_t_t35_GA94_03_Delayed(int32u seq_parameter_set_id); - void sei_message_user_data_registered_itu_t_t35_GA94_06(); void sei_message_user_data_unregistered(int32u payloadSize); void sei_message_user_data_unregistered_x264(int32u payloadSize); void sei_message_user_data_unregistered_bluray(int32u payloadSize); void sei_message_user_data_unregistered_bluray_MDPM(int32u payloadSize); - void sei_message_mastering_display_colour_volume(); - void sei_message_light_level(); - - enum hdr_format - { - HdrFormat_EtsiTs103433, - HdrFormat_SmpteSt209440, - HdrFormat_SmpteSt2086, - }; - - typedef std::map > hdr; - - hdr HDR; - - - Ztring maximum_content_light_level; - Ztring maximum_frame_average_light_level; + void sei_message_mastering_display_colour_volume() { T35(File_T35::style::mastering_display_colour_volume); } + void sei_message_light_level() { T35(File_T35::style::light_level); } void consumer_camera_1(); void consumer_camera_2(); @@ -512,6 +500,10 @@ private : size_t TemporalReferences_Offset_pic_order_cnt_lsb_Last; int64s TemporalReferences_pic_order_cnt_Min; + #if defined(MEDIAINFO_T35_YES) + std::unique_ptr T35_Parser{}; + #endif + //Text #if defined(MEDIAINFO_DTVCCTRANSPORT_YES) File__Analyze* GA94_03_Parser; @@ -579,6 +571,9 @@ private : //Helpers string GOP_Detect (string PictureTypes); string ScanOrder_Detect (string ScanOrders); + #if defined(MEDIAINFO_T35_YES) + void T35(File_T35::style Style); + #endif #if MEDIAINFO_DUPLICATE bool File__Duplicate_Set (const Ztring &Value); //Fill a new File__Duplicate value diff --git a/Source/MediaInfo/Video/File_Hevc.cpp b/Source/MediaInfo/Video/File_Hevc.cpp index bed76176bf..1d6ae8d38f 100644 --- a/Source/MediaInfo/Video/File_Hevc.cpp +++ b/Source/MediaInfo/Video/File_Hevc.cpp @@ -67,6 +67,9 @@ extern const char* Hevc_profile_idc(int32u profile_idc) //--------------------------------------------------------------------------- #include "MediaInfo/Video/File_Hevc.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #if defined(MEDIAINFO_AFDBARDATA_YES) #include "MediaInfo/Video/File_AfdBarData.h" #endif //defined(MEDIAINFO_AFDBARDATA_YES) @@ -299,65 +302,12 @@ void File_Hevc::Streams_Fill() Fill(Stream_Video, 0, Video_Encoded_Library_Settings, Encoded_Library_Settings); //Merge info about different HDR formats - auto HDR_Format=HDR.find(Video_HDR_Format); - if (HDR_Format!=HDR.end()) - { - bitset HDR_Present; - size_t HDR_FirstFormatPos=(size_t)-1; - for (size_t i=0; isecond[i].empty()) - { - if (HDR_FirstFormatPos==(size_t)-1) - HDR_FirstFormatPos=i; - HDR_Present[i]=true; - } - bool LegacyStreamDisplay=MediaInfoLib::Config.LegacyStreamDisplay_Get(); - for (const auto& HDR_Item: HDR) - { - size_t i=HDR_FirstFormatPos; - size_t HDR_FirstFieldNonEmpty=(size_t)-1; - if (HDR_Item.first>Video_HDR_Format_Compatibility) - { - for (; i=HdrFormat_SmpteSt2086) - break; - if (!HDR_Present[i]) - continue; - Value.push_back(HDR_Item.second[i]); - } - auto Value_Flat = Value.Read(); - if (!Value.empty() && Value_Flat.size() > (Value.size() - 1) * 3) - Fill(Stream_Video, 0, HDR_Item.first, Value.Read()); - } - } + #if defined(MEDIAINFO_T35_YES) + if (T35_Parser) { + T35_Parser->Finish(); + Merge(*T35_Parser, Stream_Video, 0, 0); } - if (!EtsiTS103433.empty()) - { - Fill(Stream_Video, 0, "EtsiTS103433", EtsiTS103433); - Fill_SetOptions(Stream_Video, 0, "EtsiTS103433", "N NTN"); - } - if (!maximum_content_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxCLL, maximum_content_light_level); - if (!maximum_frame_average_light_level.empty()) - Fill(Stream_Video, 0, Video_MaxFALL, maximum_frame_average_light_level); + #endif if (chroma_sample_loc_type_top_field != (int32u)-1) { Fill(Stream_Video, 0, "ChromaSubsampling_Position", __T("Type ") + Ztring::ToZtring(chroma_sample_loc_type_top_field)); @@ -2699,102 +2649,50 @@ void File_Hevc::sei_message_user_data_registered_itu_t_t35() { Element_Info1("user_data_registered_itu_t_t35"); - int8u itu_t_t35_country_code; - Get_B1(itu_t_t35_country_code, "itu_t_t35_country_code"); - - switch (itu_t_t35_country_code) - { - case 0xB5: sei_message_user_data_registered_itu_t_t35_B5(); break; // USA - case 0x26: sei_message_user_data_registered_itu_t_t35_26(); break; // China - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5() -{ - int16u itu_t_t35_terminal_provider_code; - Get_B2 (itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); - - switch (itu_t_t35_terminal_provider_code) - { - case 0x0031: sei_message_user_data_registered_itu_t_t35_B5_0031(); break; - case 0x003A: sei_message_user_data_registered_itu_t_t35_B5_003A(); break; - case 0x003C: sei_message_user_data_registered_itu_t_t35_B5_003C(); break; + int64u Probe; + Peek_B8(Probe); + if (Probe == 0xB500314741393403) { // Temporary, it is not supported by the T35 parser + Skip_B1( "itu_t_t35_country_code"); + Skip_B2( "itu_t_t35_terminal_provider_code"); + Skip_C4( "identifier"); + Skip_B1( "user_data_type_code"); + sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_03(); } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 0031 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_0031() -{ - int32u Identifier; - Peek_B4(Identifier); - switch (Identifier) - { - case 0x44544731 : sei_message_user_data_registered_itu_t_t35_B5_0031_DTG1(); return; - case 0x47413934 : sei_message_user_data_registered_itu_t_t35_B5_0031_GA94(); return; - default : if (Element_Size-Element_Offset) - Skip_XX(Element_Size-Element_Offset, "Unknown"); + else { + #if defined(MEDIAINFO_T35_YES) + if (!T35_Parser) { + T35_Parser.reset(new File_T35()); + Open_Buffer_Init(T35_Parser.get()); } -} -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 0031 - DTG1 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_0031_DTG1() -{ - Element_Info1("Active Format Description"); - - //Parsing - Skip_C4( "afd_identifier"); - if (Element_Offsetvui_parameters && seq_parameter_set_Item->vui_parameters->sar_width && seq_parameter_set_Item->vui_parameters->sar_height) { - if (seq_parameter_set_Item && seq_parameter_set_Item->vui_parameters && seq_parameter_set_Item->vui_parameters->sar_width && seq_parameter_set_Item->vui_parameters->sar_height) + //TODO: avoid duplicated code + int32u Width = seq_parameter_set_Item->pic_width_in_luma_samples; + int32u Height = seq_parameter_set_Item->pic_height_in_luma_samples; + int8u chromaArrayType = seq_parameter_set_Item->ChromaArrayType(); + if (chromaArrayType >= 4) + chromaArrayType = 0; + int32u CropUnitX = Hevc_SubWidthC[chromaArrayType]; + int32u CropUnitY = Hevc_SubHeightC[chromaArrayType]; + Width -= (seq_parameter_set_Item->conf_win_left_offset + seq_parameter_set_Item->conf_win_right_offset) * CropUnitX; + Height -= (seq_parameter_set_Item->conf_win_top_offset + seq_parameter_set_Item->conf_win_bottom_offset) * CropUnitY; + if (Height) { - //TODO: avoid duplicated code - int32u Width = seq_parameter_set_Item->pic_width_in_luma_samples; - int32u Height= seq_parameter_set_Item->pic_height_in_luma_samples; - int8u chromaArrayType = seq_parameter_set_Item->ChromaArrayType(); - if (chromaArrayType >= 4) - chromaArrayType = 0; - int32u CropUnitX=Hevc_SubWidthC [chromaArrayType]; - int32u CropUnitY=Hevc_SubHeightC[chromaArrayType]; - Width -=(seq_parameter_set_Item->conf_win_left_offset+seq_parameter_set_Item->conf_win_right_offset)*CropUnitX; - Height-=(seq_parameter_set_Item->conf_win_top_offset +seq_parameter_set_Item->conf_win_bottom_offset)*CropUnitY; - if (Height) - { - float32 PixelAspectRatio=((float32)seq_parameter_set_Item->vui_parameters->sar_width) / seq_parameter_set_Item->vui_parameters->sar_height; - auto DAR=Width*PixelAspectRatio/Height; - if (DAR>=4.0/3.0*0.95 && DAR<4.0/3.0*1.05) DTG1_Parser.aspect_ratio_FromContainer=0; //4/3 - if (DAR>=16.0/9.0*0.95 && DAR<16.0/9.0*1.05) DTG1_Parser.aspect_ratio_FromContainer=1; //16/9 - } - break; + float32 PixelAspectRatio = ((float32)seq_parameter_set_Item->vui_parameters->sar_width) / seq_parameter_set_Item->vui_parameters->sar_height; + auto DAR = Width * PixelAspectRatio / Height; + if (DAR >= 4.0 / 3.0 * 0.95 && DAR < 4.0 / 3.0 * 1.05) ((File_T35*)T35_Parser.get())->aspect_ratio_FromContainer = 0; //4/3 + if (DAR >= 16.0 / 9.0 * 0.95 && DAR < 16.0 / 9.0 * 1.05) ((File_T35*)T35_Parser.get())->aspect_ratio_FromContainer = 1; //16/9 } + break; } - Open_Buffer_Init(&DTG1_Parser); - DTG1_Parser.Format=File_AfdBarData::Format_A53_4_DTG1; - Open_Buffer_Continue(&DTG1_Parser, Buffer+Buffer_Offset+(size_t)Element_Offset, Element_Size-Element_Offset); - Merge(DTG1_Parser, Stream_Video, 0, 0); - Element_Offset=Element_Size; } -} -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 0031 - GA94 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_0031_GA94() -{ - //Parsing - int8u user_data_type_code; - Skip_B4("GA94_identifier"); - Get_B1(user_data_type_code, "user_data_type_code"); - switch (user_data_type_code) - { - case 0x03: sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_03(); break; - case 0x09: sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_09(); break; - default: Skip_XX(Element_Size - Element_Offset, "GA94_reserved_user_data"); + ((File_T35*)T35_Parser.get())->Style = File_T35::style::itu_t_t35; + Open_Buffer_Continue(T35_Parser.get()); + #endif } } @@ -2909,433 +2807,6 @@ void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_03_Delay } } -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 0031 - GA94 - 09 - SMPTE ST 2094-10 -static const char* Smpte209410_BlockNames[]= -{ - nullptr, - "Content Range", - "Trim Pass", - nullptr, - nullptr, - "Active Area", -}; -static const auto Smpte209410_BlockNames_Size=sizeof(Smpte209410_BlockNames)/sizeof(decltype(*Smpte209410_BlockNames)); -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_09() -{ - Element_Info1("SMPTE ST 2094-10"); - int32u app_identifier, app_version; - bool metadata_refresh_flag; - vector ext_block_level_List; - BS_Begin(); - Get_UE(app_identifier, "app_identifier"); - if (app_identifier!=1) - return; - Get_UE (app_version, "app_version"); - if (!app_version) - { - Get_SB(metadata_refresh_flag, "metadata_refresh_flag"); - if (metadata_refresh_flag) - { - int32u num_ext_blocks; - Get_UE (num_ext_blocks, "num_ext_blocks"); - if (num_ext_blocks) - { - auto Align=Data_BS_Remain()%8; - if (Align) - Skip_BS(Align, "dm_alignment_zero_bits"); - for (int32u i=0; iData_BS_Remain()) - { - Element_End0(); - Trusted_IsNot("Coherency"); - break; - } - ext_block_length*=8; - if (ext_block_length>Data_BS_Remain()) - { - Element_End0(); - Trusted_IsNot("Coherency"); - break; - } - auto End=Data_BS_Remain()-ext_block_length; - ext_block_level_List.push_back(ext_block_level); - switch (ext_block_level) - { - case 1: - Skip_S2(12, "min_PQ"); - Skip_S2(12, "max_PQ"); - Skip_S2(12, "avg_PQ"); - break; - case 2: - Skip_S2(12, "target_max_PQ"); - Skip_S2(12, "trim_slope"); - Skip_S2(12, "trim_offset"); - Skip_S2(12, "trim_power"); - Skip_S2(12, "trim_chroma_weight"); - Skip_S2(12, "trim_saturation_gain"); - Skip_S1( 3, "ms_weight"); - break; - case 3: - Skip_S2(12, "min_PQ_offset"); - Skip_S2(12, "max_PQ_offset"); - Skip_S2(12, "avg_PQ_offset"); - break; - case 4: - Skip_S2(12, "TF_PQ_mean"); - Skip_S2(12, "TF_PQ_stdev"); - break; - case 5: - Skip_S2(13, "active_area_left_offset"); - Skip_S2(13, "active_area_right_offset"); - Skip_S2(13, "active_area_top_offset"); - Skip_S2(13, "active_area_bottom_offset"); - break; - } - if (Data_BS_Remain()>End) - { - auto Align=Data_BS_Remain()-End; - if (Align) - Skip_BS(Align, Align>=8?"(Unknown)":"dm_alignment_zero_bits"); - } - Element_End0(); - } - } - } - auto Align=Data_BS_Remain()%8; - if (Align) - Skip_BS(Align, Align>=8?"(Unknown)":"dm_alignment_zero_bits"); - BS_End(); - } - - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209410]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SMPTE ST 2094-10"); - FILLING_BEGIN(); - HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209410].From_Number(app_version); - FILLING_END(); - } - if (!Trusted_Get()) - { - Fill(Stream_Video, 0, "ConformanceErrors", 1, 10, true); - Fill(Stream_Video, 0, "ConformanceErrors SMPTE_ST_2049_CVT", 1, 10, true); - Fill(Stream_Video, 0, "ConformanceErrors SMPTE_ST_2049_CVT Coherency", "Bitstream parsing ran out of data to read before the end of the syntax was reached, most probably the bitstream is malformed", Unlimited, true, true); - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003A -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003A() -{ - int8u itu_t_t35_terminal_provider_oriented_code; - Get_B1 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x00: sei_message_user_data_registered_itu_t_t35_B5_003A_00(); break; - case 0x02: sei_message_user_data_registered_itu_t_t35_B5_003A_02(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003A - ETSI 103-433-1 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003A_00() -{ - Element_Info1("SL-HDR message"); - BS_Begin(); - int8u sl_hdr_mode_value_minus1, sl_hdr_spec_major_version_idc, sl_hdr_spec_minor_version_idc; - bool sl_hdr_cancel_flag; - Get_S1 (4, sl_hdr_mode_value_minus1, "sl_hdr_mode_value_minus1"); - Get_S1 (4, sl_hdr_spec_major_version_idc, "sl_hdr_spec_major_version_idc"); - Get_S1 (7, sl_hdr_spec_minor_version_idc, "sl_hdr_spec_minor_version_idc"); - Get_SB (sl_hdr_cancel_flag, "sl_hdr_cancel_flag"); - int8u sl_hdr_payload_mode; - int8u k_coefficient_value[3]; - if (!sl_hdr_cancel_flag) - { - mastering_metadata_2086 Meta; - bool coded_picture_info_present_flag, target_picture_info_present_flag, src_mdcv_info_present_flag; - Skip_SB( "sl_hdr_persistence_flag"); - Get_SB (coded_picture_info_present_flag, "coded_picture_info_present_flag"); - Get_SB (target_picture_info_present_flag, "target_picture_info_present_flag"); - Get_SB (src_mdcv_info_present_flag, "src_mdcv_info_present_flag"); - Skip_SB( "sl_hdr_extension_present_flag"); - Get_S1 (3, sl_hdr_payload_mode, "sl_hdr_payload_mode"); - BS_End(); - if (coded_picture_info_present_flag) - { - Skip_B1( "coded_picture_primaries"); - Skip_B2( "coded_picture_max_luminance"); - Skip_B2( "coded_picture_min_luminance"); - } - if (target_picture_info_present_flag) - { - Skip_B1( "target_picture_primaries"); - Skip_B2( "target_picture_max_luminance"); - Skip_B2( "target_picture_min_luminance"); - } - if (src_mdcv_info_present_flag) - { - int16u max, min; - for (int8u i = 0; i < 3; i++) - { - Get_B2 (Meta.Primaries[i*2 ], "src_mdcv_primaries_x"); - Get_B2 (Meta.Primaries[i*2+1], "src_mdcv_primaries_y"); - } - Get_B2 (Meta.Primaries[3*2 ], "src_mdcv_ref_white_x"); - Get_B2 (Meta.Primaries[3*2+1], "src_mdcv_ref_white_y"); - Get_B2 (max, "src_mdcv_max_mastering_luminance"); - Get_B2 (min, "src_mdcv_min_mastering_luminance"); - Meta.Luminance[0]=min; - Meta.Luminance[1]=((int32u)max)*10000; - } - for (int8u i = 0; i < 4; i++) - Skip_B2( "matrix_coefficient_value"); - for (int8u i = 0; i < 2; i++) - Skip_B2( "chroma_to_luma_injection"); - for (int8u i = 0; i < 3; i++) - Get_B1 (k_coefficient_value[i], "k_coefficient_value"); - - FILLING_BEGIN() - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_EtsiTs103433]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SL-HDR")+Ztring().From_Number(sl_hdr_mode_value_minus1+1); - HDR[Video_HDR_Format_Version][HdrFormat_EtsiTs103433]=Ztring().From_Number(sl_hdr_spec_major_version_idc)+__T('.')+Ztring().From_Number(sl_hdr_spec_minor_version_idc); - Get_MasteringDisplayColorVolume(HDR[Video_MasteringDisplay_ColorPrimaries][HdrFormat_EtsiTs103433], HDR[Video_MasteringDisplay_Luminance][HdrFormat_EtsiTs103433], Meta); - auto& HDR_Format_Settings=HDR[Video_HDR_Format_Settings][HdrFormat_EtsiTs103433]; - if (sl_hdr_payload_mode<2) - HDR_Format_Settings=sl_hdr_payload_mode?__T("Table-based"):__T("Parameter-based"); - else - HDR_Format_Settings=__T("Payload Mode ") + Ztring().From_Number(sl_hdr_payload_mode); - if (!sl_hdr_mode_value_minus1) - HDR_Format_Settings+=k_coefficient_value[0]==0 && k_coefficient_value[1]==0 && k_coefficient_value[2]==0?__T(", non-constant"):__T(", constant"); - - EtsiTS103433 = __T("SL-HDR") + Ztring().From_Number(sl_hdr_mode_value_minus1 + 1); - if (!sl_hdr_mode_value_minus1) - EtsiTS103433 += k_coefficient_value[0] == 0 && k_coefficient_value[1] == 0 && k_coefficient_value[2] == 0 ? __T(" NCL") : __T(" CL"); - EtsiTS103433 += __T(" specVersion=") + Ztring().From_Number(sl_hdr_spec_major_version_idc) + __T(".") + Ztring().From_Number(sl_hdr_spec_minor_version_idc); - EtsiTS103433 += __T(" payloadMode=") + Ztring().From_Number(sl_hdr_payload_mode); - } - FILLING_END(); - } - else - BS_End(); -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003A - ETSI 103-433 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003A_02() -{ - Element_Info1("SL-HDR information"); - int8u ts_103_433_spec_version; - BS_Begin(); - Get_S1 (4, ts_103_433_spec_version, "ts_103_433_spec_version"); - if (ts_103_433_spec_version==0) - { - Skip_S1 (4, "ts_103_433_payload_mode"); - } - else if (ts_103_433_spec_version==1) - { - Skip_S1 (3, "sl_hdr_mode_support"); - } - else - Skip_S1 (Data_BS_Remain(), "Unknown"); - BS_End(); -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003C() -{ - int16u itu_t_t35_terminal_provider_oriented_code; - Get_B2 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x0001: sei_message_user_data_registered_itu_t_t35_B5_003C_0001(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C - 0001 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003C_0001() -{ - int8u application_identifier; - Get_B1 (application_identifier, "application_identifier"); - - switch (application_identifier) - { - case 0x04: sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - USA - 003C - 0001 - SMPTE ST 2094-40 (HDR10+) -void File_Hevc::sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04() -{ - Element_Info1("SMPTE ST 2094 App 4"); - - int8u application_version{}; - bool IsHDRplus{ false }, tone_mapping_flag{}; - Get_SMPTE_ST_2094_40(application_version, IsHDRplus, tone_mapping_flag); - - FILLING_BEGIN(); - auto& HDR_Format=HDR[Video_HDR_Format][HdrFormat_SmpteSt209440]; - if (HDR_Format.empty()) - { - HDR_Format=__T("SMPTE ST 2094 App 4"); - HDR[Video_HDR_Format_Version][HdrFormat_SmpteSt209440].From_Number(application_version); - if (IsHDRplus) - HDR[Video_HDR_Format_Compatibility][HdrFormat_SmpteSt209440]=tone_mapping_flag?__T("HDR10+ Profile B"):__T("HDR10+ Profile A"); - } - FILLING_END(); -} - -//--------------------------------------------------------------------------- -// SEI - 4 - China -void File_Hevc::sei_message_user_data_registered_itu_t_t35_26() -{ - int16u itu_t_t35_terminal_provider_code; - Get_B2 (itu_t_t35_terminal_provider_code, "itu_t_t35_terminal_provider_code"); - - //HDR Vivid terminal provide code 0x0004, terminal provide oriented code 0x0005 , 0x0005 indicates HDR Vivid version 1 - switch (itu_t_t35_terminal_provider_code) - { - case 0x0004: sei_message_user_data_registered_itu_t_t35_26_0004(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - China similar to sei_message_user_data_registered_itu_t_t35_B5_003C() -void File_Hevc::sei_message_user_data_registered_itu_t_t35_26_0004() -{ - int16u itu_t_t35_terminal_provider_oriented_code; - Get_B2 (itu_t_t35_terminal_provider_oriented_code, "itu_t_t35_terminal_provider_oriented_code"); - //HDR Vivid terminal provide code 0x0004, terminal provide oriented code 0x0005 - switch (itu_t_t35_terminal_provider_oriented_code) - { - case 0x0005: sei_message_user_data_registered_itu_t_t35_26_0004_0005(); break; - } -} - -//--------------------------------------------------------------------------- -// SEI - 4 - China - 0004 -void File_Hevc::sei_message_user_data_registered_itu_t_t35_26_0004_0005() -{ - //Parsing - Element_Info1("T/UWA 005 (HDR Vivid)"); - int16u targeted_system_display_maximum_luminance_Max=0; - int8u system_start_code; - bool color_saturation_mapping_enable_flag; - Get_B1(system_start_code, "system_start_code"); - if (system_start_code!=0x01) - { - Skip_XX(Element_Size, "Unknown"); - return; - } - BS_Begin(); - //int8u num_windows=1; - //for (int8u w=0; wStyle = Style; + Open_Buffer_Continue(T35_Parser.get()); +} +#endif + } //NameSpace #endif //MEDIAINFO_HEVC_YES diff --git a/Source/MediaInfo/Video/File_Hevc.h b/Source/MediaInfo/Video/File_Hevc.h index e2477f90d6..ad62d96783 100644 --- a/Source/MediaInfo/Video/File_Hevc.h +++ b/Source/MediaInfo/Video/File_Hevc.h @@ -11,6 +11,9 @@ //--------------------------------------------------------------------------- #include "MediaInfo/File__Analyze.h" +#if defined(MEDIAINFO_T35_YES) + #include "MediaInfo/Multiple/File_T35.h" +#endif #include "MediaInfo/TimeCode.h" //--------------------------------------------------------------------------- @@ -369,6 +372,9 @@ private : void Data_Parse(); //Elements + #if !defined(MEDIAINFO_T35_YES) + #define T35(x) { Skip_XX(Element_Size - Element_Offset, "(Not parsed)"); } + #endif void slice_segment_layer(); void video_parameter_set(); void video_parameter_sets_creating_data(int8u vps_video_parameter_set_id, const vector& profile_tier_level_info_layers, int8u vps_max_sub_layers_minus1, const vector& view_id_val); @@ -384,22 +390,8 @@ private : void sei_message_buffering_period_xxl(seq_parameter_set_struct::vui_parameters_struct::xxl_common* xxL_Common, bool irap_cpb_params_present_flag, seq_parameter_set_struct::vui_parameters_struct::xxl* xxl); void sei_message_pic_timing(int32u &seq_parameter_set_id, int32u payloadSize); void sei_message_user_data_registered_itu_t_t35(); - void sei_message_user_data_registered_itu_t_t35_B5(); - void sei_message_user_data_registered_itu_t_t35_B5_0031(); - void sei_message_user_data_registered_itu_t_t35_B5_0031_DTG1(); - void sei_message_user_data_registered_itu_t_t35_B5_0031_GA94(); void sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_03(); void sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_03_Delayed(int32u seq_parameter_set_id); - void sei_message_user_data_registered_itu_t_t35_B5_0031_GA94_09(); - void sei_message_user_data_registered_itu_t_t35_B5_003A(); - void sei_message_user_data_registered_itu_t_t35_B5_003A_00(); - void sei_message_user_data_registered_itu_t_t35_B5_003A_02(); - void sei_message_user_data_registered_itu_t_t35_B5_003C(); - void sei_message_user_data_registered_itu_t_t35_B5_003C_0001(); - void sei_message_user_data_registered_itu_t_t35_B5_003C_0001_04(); - void sei_message_user_data_registered_itu_t_t35_26(); - void sei_message_user_data_registered_itu_t_t35_26_0004(); - void sei_message_user_data_registered_itu_t_t35_26_0004_0005(); void sei_message_user_data_unregistered(int32u payloadSize); void sei_message_user_data_unregistered_Ateme(int32u payloadSize); void sei_message_user_data_unregistered_x265(int32u payloadSize); @@ -407,8 +399,8 @@ private : void sei_message_active_parameter_sets(); void sei_time_code(); void sei_message_decoded_picture_hash(int32u payloadSize); - void sei_message_mastering_display_colour_volume(); - void sei_message_light_level(); + void sei_message_mastering_display_colour_volume() { T35(File_T35::style::mastering_display_colour_volume); } + void sei_message_light_level() { T35(File_T35::style::light_level); } void sei_alternative_transfer_characteristics(); void sei_ambient_viewing_environment(); void three_dimensional_reference_displays_info(int32u payloadSize); @@ -471,6 +463,10 @@ private : int64s TemporalReferences_pic_order_cnt_Min; int64u pic_order_cnt_DTS_Ref; + #if defined(MEDIAINFO_T35_YES) + std::unique_ptr T35_Parser{}; + #endif + //Text #if defined(MEDIAINFO_DTVCCTRANSPORT_YES) File__Analyze* GA94_03_Parser; @@ -504,25 +500,11 @@ private : Ztring Encoded_Library_Version; Ztring Encoded_Library_Date; Ztring Encoded_Library_Settings; - enum hdr_format - { - HdrFormat_SmpteSt209410, - HdrFormat_SmpteSt209440, - HdrFormat_EtsiTs103433, - HdrFormat_HdrVivid, - HdrFormat_SmpteSt2086, - HdrFormat_Max, - }; - typedef std::map hdr; - hdr HDR; - Ztring EtsiTS103433; int32u chroma_format_idc{}; int32u slice_pic_parameter_set_id{}; int32u slice_type{}; int32u chroma_sample_loc_type_top_field{}; int32u chroma_sample_loc_type_bottom_field{}; - Ztring maximum_content_light_level; - Ztring maximum_frame_average_light_level; int8u nuh_layer_id{}; int8u preferred_transfer_characteristics{}; float64 ambient_viewing_environment_illuminance{}; @@ -530,6 +512,9 @@ private : Ztring ambient_viewing_environment_chromaticity; bool RapPicFlag{}; bool first_slice_segment_in_pic_flag{}; + #if defined(MEDIAINFO_T35_YES) + void T35(File_T35::style Style); + #endif }; } //NameSpace