3535#include "oapv_app_y4m.h"
3636#include "oapv_port.h"
3737
38+ #if defined(_WIN64 ) || defined(_WIN32 )
39+ #include <winsock2.h>
40+ #pragma comment(lib, "ws2_32.lib")
41+ #else
42+ #include <arpa/inet.h>
43+ #endif
44+
3845#define MAX_BS_BUF (128 * 1024 * 1024)
3946#define MAX_NUM_FRMS (1) // supports only 1-frame in an access unit
4047#define FRM_IDX (0) // supports only 1-frame in an access unit
@@ -842,6 +849,53 @@ static int parse_max_cll(const char* data_string, md_cll_t *cll) {
842849 return 0 ; // Success
843850}
844851
852+ static void serialize_metadata_mdcv (const md_mdcv_t * mdcv , uint8_t * buffer ) {
853+ int i ;
854+ uint8_t * current_ptr = buffer ;
855+ uint16_t beu16_val ;
856+ uint32_t beu32_val ;
857+
858+ for (i = 0 ; i < 3 ; i ++ ) {
859+ // convert Host Byte Order na Network Byte Order (Big Endian).
860+ beu16_val = htons (mdcv -> primary_chromaticity_x [i ]);
861+ memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
862+ current_ptr += sizeof (uint16_t );
863+
864+ beu16_val = htons (mdcv -> primary_chromaticity_y [i ]);
865+ memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
866+ current_ptr += sizeof (uint16_t );
867+ }
868+
869+ beu16_val = htons (mdcv -> white_point_chromaticity_x );
870+ memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
871+ current_ptr += sizeof (uint16_t );
872+
873+ beu16_val = htons (mdcv -> white_point_chromaticity_y );
874+ memcpy (current_ptr , & beu32_val , sizeof (uint16_t ));
875+ current_ptr += sizeof (uint16_t );
876+
877+ beu32_val = htonl (mdcv -> max_mastering_luminance );
878+ memcpy (current_ptr , & beu32_val , sizeof (uint32_t ));
879+ current_ptr += sizeof (uint32_t );
880+
881+ beu32_val = htonl (mdcv -> min_mastering_luminance );
882+ memcpy (current_ptr , & beu32_val , sizeof (uint32_t ));
883+ current_ptr += sizeof (uint32_t );
884+ }
885+
886+ static void serialize_metadata_cll (const md_cll_t * cll , uint8_t * buffer ) {
887+ uint8_t * current_ptr = buffer ;
888+ uint16_t beu16_val ;
889+
890+ beu16_val = htons (cll -> max_cll );
891+ memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
892+ current_ptr += sizeof (uint16_t );
893+
894+ beu16_val = htons (cll -> max_fall );
895+ memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
896+ current_ptr += sizeof (uint16_t );
897+ }
898+
845899static int update_metadata (args_var_t * vars , metadata_t * metadata )
846900{
847901 if (vars == NULL || metadata == NULL ) {
@@ -850,35 +904,42 @@ static int update_metadata(args_var_t *vars, metadata_t *metadata)
850904 }
851905
852906 if (strlen (vars -> master_display ) > 0 ) {
853-
854- void * data = malloc (sizeof (md_mdcv_t ));
855-
856- if (parse_master_display (vars -> master_display , (md_mdcv_t * )data )) {
907+ md_mdcv_t mdcv ;
908+ size_t mdcv_buffer_size = 6 * sizeof (uint16_t ) + 2 * sizeof (uint16_t ) + 2 * sizeof (uint32_t );
909+ uint8_t * mdcv_buffer = (uint8_t * )malloc (mdcv_buffer_size );
910+
911+ if (parse_master_display (vars -> master_display , & mdcv )) {
857912 fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> master_display , "master-display" );
858913 return -1 ;
859914 }
860-
915+
916+ serialize_metadata_mdcv (& mdcv , mdcv_buffer );
917+
861918 metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
862919 metadata -> payloads [metadata -> num_plds ].type = OAPV_METADATA_MDCV ;
863- metadata -> payloads [metadata -> num_plds ].size = sizeof ( md_mdcv_t ) ;
864- metadata -> payloads [metadata -> num_plds ].data = data ;
920+ metadata -> payloads [metadata -> num_plds ].size = mdcv_buffer_size ;
921+ metadata -> payloads [metadata -> num_plds ].data = mdcv_buffer ;
865922
866923 metadata -> num_plds ++ ;
867-
868- }
869-
924+ }
925+
870926 if (strlen (vars -> max_cll ) > 0 ) {
871- void * data = malloc (sizeof (md_cll_t ));
872-
873- if (parse_max_cll (vars -> max_cll , (md_cll_t * )data )) {
927+
928+ md_cll_t cll ;
929+ size_t cll_buffer_size = 2 * sizeof (uint16_t );
930+ uint8_t * cll_buffer = malloc (cll_buffer_size );
931+
932+ if (parse_max_cll (vars -> max_cll , & cll )) {
874933 fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> max_cll , "max-cli" );
875934 return -1 ;
876935 }
877-
936+
937+ serialize_metadata_cll (& cll , cll_buffer );
938+
878939 metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
879940 metadata -> payloads [metadata -> num_plds ].type = OAPV_METADATA_CLL ;
880- metadata -> payloads [metadata -> num_plds ].size = sizeof ( md_cll_t ) ;
881- metadata -> payloads [metadata -> num_plds ].data = data ;
941+ metadata -> payloads [metadata -> num_plds ].size = cll_buffer_size ;
942+ metadata -> payloads [metadata -> num_plds ].data = cll_buffer ;
882943
883944 metadata -> num_plds ++ ;
884945 }
0 commit comments