4040#define FRM_IDX (0) // supports only 1-frame in an access unit
4141#define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color componets (upto 4:4:4:4)
4242
43+ #define MAX_METADATA_PAYLOADS (8)
44+
4345typedef enum _STATES {
4446 STATE_ENCODING ,
4547 STATE_SKIPPING ,
@@ -49,19 +51,25 @@ typedef enum _STATES {
4951/* Mastering display colour volume metadata*/
5052typedef struct md_mdcv md_mdcv_t ;
5153struct md_mdcv {
52- u16 primary_chromaticity_x [3 ];
53- u16 primary_chromaticity_y [3 ];
54- u16 white_point_chromaticity_x ;
55- u16 white_point_chromaticity_y ;
56- u32 max_mastering_luminance ;
57- u32 min_mastering_luminance ;
54+ u16 primary_chromaticity_x [3 ]; /* u(16) */
55+ u16 primary_chromaticity_y [3 ]; /* u(16) */
56+ u16 white_point_chromaticity_x ; /* u(16) */
57+ u16 white_point_chromaticity_y ; /* u(16) */
58+ u32 max_mastering_luminance ; /* u(32) */
59+ u32 min_mastering_luminance ; /* u(32) */
5860};
5961
6062/* Content light level information*/
6163typedef struct md_cll md_cll_t ;
6264struct md_cll {
63- u16 max_cll ;
64- u16 max_fall ;
65+ u16 max_cll ; /* u(16) */
66+ u16 max_fall ; /* u(16) */
67+ };
68+
69+ typedef struct metadata metadata_t ;
70+ struct metadata {
71+ uint32_t num_plds ;
72+ oapvm_payload_t payloads [MAX_METADATA_PAYLOADS ];
6573};
6674
6775// clang-format off
@@ -785,11 +793,95 @@ static int update_param(args_var_t *vars, oapve_param_t *param)
785793 UPDATE_A_PARAM_W_KEY_VAL (param , "tile-w" , vars -> tile_w );
786794 UPDATE_A_PARAM_W_KEY_VAL (param , "tile-h" , vars -> tile_h );
787795
788- UPDATE_A_PARAM_W_KEY_VAL (param , "tile-w" , vars -> tile_w );
789- UPDATE_A_PARAM_W_KEY_VAL (param , "tile-h" , vars -> tile_h );
796+ return 0 ;
797+ }
798+
799+ static int parse_master_display (const char * data_string , md_mdcv_t * mdcv ) {
800+ if (data_string == NULL || mdcv == NULL ) {
801+ fprintf (stderr , "Error: Input pointer is NULL.\n" );
802+ return -1 ;
803+ }
804+
805+ int assigned_fields = sscanf (data_string ,
806+ "G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)" ,
807+ & mdcv -> primary_chromaticity_x [2 ], & mdcv -> primary_chromaticity_y [2 ], // G
808+ & mdcv -> primary_chromaticity_x [1 ], & mdcv -> primary_chromaticity_y [1 ], // B
809+ & mdcv -> primary_chromaticity_x [0 ], & mdcv -> primary_chromaticity_y [0 ], // R
810+ & mdcv -> white_point_chromaticity_x , & mdcv -> white_point_chromaticity_y , // White Point
811+ & mdcv -> max_mastering_luminance , & mdcv -> min_mastering_luminance // Luminance
812+ );
813+
814+ // Check if sscanf successfully assigned all expected fields (10 numerical values).
815+ const int expected_fields = 10 ;
816+ if (assigned_fields != expected_fields ) {
817+ fprintf (stderr , "Parsing error: Expected %d fields, found %d.\n" , expected_fields , assigned_fields );
818+ return OAPV_ERR_INVALID_ARGUMENT ;
819+ }
820+
821+ return 0 ; // Success
822+ }
823+
824+ static int parse_max_cll (const char * data_string , md_cll_t * cll ) {
825+ if (data_string == NULL || cll == NULL ) {
826+ fprintf (stderr , "Error: Input pointer is NULL.\n" );
827+ return -1 ;
828+ }
829+
830+ int assigned_fields = sscanf (data_string ,
831+ "%hu,%hu" ,
832+ & cll -> max_cll , & cll -> max_fall
833+ );
834+
835+ // Check if sscanf successfully assigned all expected fields (10 numerical values).
836+ const int expected_fields = 2 ;
837+ if (assigned_fields != expected_fields ) {
838+ fprintf (stderr , "Parsing error: Expected %d fields, found %d.\n" , expected_fields , assigned_fields );
839+ return OAPV_ERR_INVALID_ARGUMENT ;
840+ }
841+
842+ return 0 ; // Success
843+ }
844+
845+ static int update_metadata (args_var_t * vars , metadata_t * metadata )
846+ {
847+ if (vars == NULL || metadata == NULL ) {
848+ fprintf (stderr , "Error: Input pointer is NULL.\n" );
849+ return -1 ;
850+ }
851+
852+ 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 )) {
857+ fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> master_display , "master-display" );
858+ return -1 ;
859+ }
860+
861+ metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
862+ 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 ;
865+
866+ metadata -> num_plds ++ ;
867+
868+ }
869+
870+ 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 )) {
874+ fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> max_cll , "max-cli" );
875+ return -1 ;
876+ }
877+
878+ metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
879+ 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 ;
790882
791- UPDATE_A_PARAM_W_KEY_VAL ( param , "master-display" , vars -> master_display ) ;
792- UPDATE_A_PARAM_W_KEY_VAL ( param , "max-cll" , vars -> max_cll );
883+ metadata -> num_plds ++ ;
884+ }
793885
794886 return 0 ;
795887}
@@ -826,6 +918,8 @@ int main(int argc, const char **argv)
826918 int cfmt ; // color format
827919 const int num_frames = MAX_NUM_FRMS ; // number of frames in an access unit
828920
921+ metadata_t metadata = {0 };
922+
829923 // print logo
830924 logv2 (" ____ ___ ___ _ __\n" );
831925 logv2 (" / __ \\___ ___ ___ / _ | / _ \\ | / / Encoder (v%s)\n" , oapv_version (NULL ));
@@ -1003,45 +1097,14 @@ int main(int argc, const char **argv)
10031097 ret = -1 ;
10041098 goto ERR ;
10051099 }
1006-
1007- if (param -> mdcv_flag ) {
1008- md_mdcv_t mdcv ;
1009-
1010- mdcv .primary_chromaticity_x [0 ] = param -> mdcv_primary_chromaticity_x [0 ];
1011- mdcv .primary_chromaticity_x [1 ] = param -> mdcv_primary_chromaticity_x [1 ];
1012- mdcv .primary_chromaticity_x [2 ] = param -> mdcv_primary_chromaticity_x [2 ];
1013-
1014- mdcv .primary_chromaticity_y [0 ] = param -> mdcv_primary_chromaticity_y [0 ];
1015- mdcv .primary_chromaticity_y [1 ] = param -> mdcv_primary_chromaticity_y [1 ];
1016- mdcv .primary_chromaticity_y [2 ] = param -> mdcv_primary_chromaticity_y [2 ];
10171100
1018- mdcv .white_point_chromaticity_x = param -> mdcv_white_point_chromaticity_x ;
1019- mdcv .white_point_chromaticity_y = param -> mdcv_white_point_chromaticity_y ;
1020-
1021- mdcv .min_mastering_luminance = param -> mdcv_min_mastering_luminance ;
1022- mdcv .max_mastering_luminance = param -> mdcv_max_mastering_luminance ;
1023-
1024- void * data = & mdcv ;
1025- size_t size = sizeof (md_mdcv_t );
1026- if (oapvm_set (mid , 1 , OAPV_METADATA_MDCV , data , size )) {
1027- logerr ("ERR: cannot set mastering display color metadata\n" );
1028- ret = -1 ;
1029- goto ERR ;
1030- }
1031- }
1101+ update_metadata (args_var , & metadata );
10321102
1033- if (param -> cll_flag ) {
1034- md_cll_t cll ;
1035- cll .max_cll = param -> cll_max_cll ;
1036- cll .max_fall = param -> cll_max_fall ;
1037-
1038- void * data = & cll ;
1039- size_t size = sizeof (md_cll_t );
1040- if (oapvm_set (mid , 1 , OAPV_METADATA_CLL , data , size )) {
1041- logerr ("ERR: cannot set content light level metadata\n" );
1042- ret = -1 ;
1043- goto ERR ;
1044- }
1103+ ret = oapvm_set_all (mid , metadata .payloads , metadata .num_plds );
1104+ if (OAPV_FAILED (ret )) {
1105+ logerr ("ERR: cannot set metadata\n" );
1106+ ret = -1 ;
1107+ goto ERR ;
10451108 }
10461109
10471110 if (set_extra_config (id , args_var , param )) {
@@ -1304,5 +1367,10 @@ int main(int argc, const char **argv)
13041367 if (args_var )
13051368 free (args_var );
13061369
1370+ for (int i = 0 ; i < metadata .num_plds ; i ++ ) {
1371+ free (metadata .payloads [i ].data );
1372+ metadata .payloads [i ].data = NULL ;
1373+ }
1374+
13071375 return ret ;
13081376}
0 commit comments