@@ -39,6 +39,10 @@ extern const char* Mpegv_matrix_coefficients(int8u matrix_coefficients);
3939extern const char * Mpegv_matrix_coefficients_ColorSpace (int8u matrix_coefficients);
4040extern const char * Avc_video_full_range[];
4141
42+ const char * DV_content_type (int8u content_type);
43+ const char * DV_white_point (int8u white_point);
44+ const char * DV_intended_setting (int8u setting, bool off);
45+
4246// ---------------------------------------------------------------------------
4347const char * Av1_obu_type (int8u obu_type)
4448{
@@ -801,7 +805,51 @@ void File_Av1::metadata_itu_t_t35_B5_003B_00000800()
801805 Element_Begin1 (" emdf_payload_bytes" );
802806 switch (emdf_payload_id)
803807 {
804- case 256 : Get_DolbyVision_ReferenceProcessingUnit (DV_RPU_data); break ;
808+ case 256 : Get_DolbyVision_ReferenceProcessingUnit (DV_RPU_data);
809+ // Filling
810+ FILLING_BEGIN ();
811+ if (DV_RPU_data.active_area_left_offset || DV_RPU_data.active_area_right_offset || DV_RPU_data.active_area_top_offset || DV_RPU_data.active_area_bottom_offset ) {
812+ auto width = Retrieve (StreamKind_Last, StreamPos_Last, Video_Width).To_int16u ();
813+ auto height = Retrieve (StreamKind_Last, StreamPos_Last, Video_Height).To_int16u ();
814+ auto active_width = width - DV_RPU_data.active_area_left_offset - DV_RPU_data.active_area_right_offset ;
815+ auto active_height = height - DV_RPU_data.active_area_top_offset - DV_RPU_data.active_area_bottom_offset ;
816+ Fill (StreamKind_Last, StreamPos_Last, Video_Active_Width, active_width);
817+ Fill (StreamKind_Last, StreamPos_Last, Video_Active_Height, active_height);
818+ float32 PAR = Retrieve_Const (StreamKind_Last, StreamPos_Last, " PixelAspectRatio" ).To_float32 ();
819+ if (PAR)
820+ Fill (StreamKind_Last, StreamPos_Last, Video_Active_DisplayAspectRatio, ((float32)active_width) / active_height * PAR, 2 );
821+ }
822+ if (DV_RPU_data.max_display_mastering_luminance && DV_RPU_data.min_display_mastering_luminance ) {
823+ Ztring display_mastering_luminance = __T (" min: " ) + Ztring::ToZtring ((float64)DV_RPU_data.min_display_mastering_luminance / 10000 , 4 )
824+ + __T (" cd/m2, max: " ) + Ztring::ToZtring (DV_RPU_data.max_display_mastering_luminance , 0 )
825+ + __T (" cd/m2" );
826+ Fill (StreamKind_Last, StreamPos_Last, " MasteringDisplay_Luminance" , display_mastering_luminance); // crash at later calls if filled with enum
827+ }
828+ if (DV_RPU_data.max_content_light_level && DV_RPU_data.max_frame_average_light_level ) {
829+ // TODO
830+ }
831+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision" , " RPU Present" );
832+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision RPU_Profile" , DV_RPU_data.vdr_rpu_profile );
833+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Base_Layer" , (std::to_string (DV_RPU_data.bl_bit_depth ) + " bits" ).c_str ());
834+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Enhancement_Layer" , (std::to_string (DV_RPU_data.el_bit_depth ) + " bits" ).c_str ());
835+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision VDR" , (std::to_string (DV_RPU_data.vdr_bit_depth ) + " bits" ).c_str ());
836+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Base_Layer_Video_Range" , DV_RPU_data.BL_video_full_range_flag ? " Full" : " Limited" );
837+ if (DV_RPU_data.isMEL != (int8u)-1 ) Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Enhancement_Layer_Type" , DV_RPU_data.isMEL == 0 ? " Full (FEL)" : " Minimal (MEL)" );
838+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Mapping_version" , DV_RPU_data.CMv , 1 );
839+ if (DV_RPU_data.L11_present ) {
840+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata" , " Present" );
841+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Content_Type" , DV_content_type (DV_RPU_data.content_type ));
842+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata White_Point" , DV_white_point (DV_RPU_data.white_point ));
843+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Sharpness" , DV_intended_setting (DV_RPU_data.sharpness , true ));
844+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Noise_Reduction" , DV_intended_setting (DV_RPU_data.noise_reduction , true ));
845+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata MPEG_Noise_Reduction" , DV_intended_setting (DV_RPU_data.mpeg_noise_reduction , true ));
846+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Frame_Rate_Conversion" , DV_intended_setting (DV_RPU_data.frame_rate_conversion , true ));
847+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Brightness" , DV_intended_setting (DV_RPU_data.brightness , false ));
848+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Content_Type_Metadata Color" , DV_intended_setting (DV_RPU_data.color , false ));
849+ }
850+ Fill (StreamKind_Last, StreamPos_Last, " Dolby_Vision Deduced_Profile" , DV_RPU_data.profile_deduced );
851+ FILLING_END ();
852+ break ;
805853 default : Skip_BS (static_cast <size_t >(emdf_payload_size) * 8 , " (Unknown)" ); break ;
806854 }
807855 size_t RemainginBits=Data_BS_Remain ();
0 commit comments