3333#include "oapv_app_util.h"
3434#include "oapv_app_args.h"
3535#include "oapv_app_y4m.h"
36- #include "oapv_port.h"
37-
3836
3937#define MAX_BS_BUF (128 * 1024 * 1024)
4038#define MAX_NUM_FRMS (1) // supports only 1-frame in an access unit
4139#define FRM_IDX (0) // supports only 1-frame in an access unit
4240#define MAX_NUM_CC (OAPV_MAX_CC) // Max number of color componets (upto 4:4:4:4)
4341
44- #define MAX_METADATA_PAYLOADS (8)
45-
4642typedef enum _STATES {
4743 STATE_ENCODING ,
4844 STATE_SKIPPING ,
4945 STATE_STOP
5046} STATES ;
5147
52- /* Mastering display colour volume metadata*/
53- typedef struct md_mdcv md_mdcv_t ;
54- struct md_mdcv {
55- u16 primary_chromaticity_x [3 ]; /* u(16) */
56- u16 primary_chromaticity_y [3 ]; /* u(16) */
57- u16 white_point_chromaticity_x ; /* u(16) */
58- u16 white_point_chromaticity_y ; /* u(16) */
59- u32 max_mastering_luminance ; /* u(32) */
60- u32 min_mastering_luminance ; /* u(32) */
61- };
62-
63- /* Content light level information*/
64- typedef struct md_cll md_cll_t ;
65- struct md_cll {
66- u16 max_cll ; /* u(16) */
67- u16 max_fall ; /* u(16) */
68- };
69-
70- typedef struct metadata metadata_t ;
71- struct metadata {
72- uint32_t num_plds ;
73- oapvm_payload_t payloads [MAX_METADATA_PAYLOADS ];
74- };
75-
7648// clang-format off
7749
7850/* define various command line options as a table */
@@ -361,7 +333,7 @@ typedef struct args_var {
361333
362334 char master_display [512 ];
363335 char max_cll [64 ];
364-
336+
365337 oapve_param_t * param ;
366338} args_var_t ;
367339
@@ -797,14 +769,10 @@ static int update_param(args_var_t *vars, oapve_param_t *param)
797769 return 0 ;
798770}
799771
800- static int parse_master_display (const char * data_string , md_mdcv_t * mdcv ) {
801- if (data_string == NULL || mdcv == NULL ) {
802- fprintf (stderr , "Error: Input pointer is NULL.\n" );
803- return -1 ;
804- }
805-
772+ static int parse_master_display (const char * data_string , oapvm_payload_mdcv_t * mdcv )
773+ {
806774 int assigned_fields = sscanf (data_string ,
807- "G(%hu,%hu )B(%hu,%hu )R(%hu,%hu )WP(%hu,%hu )L(%u,%u )" ,
775+ "G(%u,%u )B(%u,%u )R(%u,%u )WP(%u,%u )L(%lu,%lu )" ,
808776 & mdcv -> primary_chromaticity_x [2 ], & mdcv -> primary_chromaticity_y [2 ], // G
809777 & mdcv -> primary_chromaticity_x [1 ], & mdcv -> primary_chromaticity_y [1 ], // B
810778 & mdcv -> primary_chromaticity_x [0 ], & mdcv -> primary_chromaticity_y [0 ], // R
@@ -815,129 +783,82 @@ static int parse_master_display(const char* data_string, md_mdcv_t *mdcv) {
815783 // Check if sscanf successfully assigned all expected fields (10 numerical values).
816784 const int expected_fields = 10 ;
817785 if (assigned_fields != expected_fields ) {
818- fprintf ( stderr , "Parsing error: Expected %d fields, found %d.\n" , expected_fields , assigned_fields );
819- return OAPV_ERR_INVALID_ARGUMENT ;
786+ logerr ( "Parsing error: master diplay color volume information" );
787+ return -1 ;
820788 }
821-
822789 return 0 ; // Success
823790}
824791
825- static int parse_max_cll (const char * data_string , md_cll_t * cll ) {
826- if (data_string == NULL || cll == NULL ) {
827- fprintf (stderr , "Error: Input pointer is NULL.\n" );
828- return -1 ;
829- }
830-
792+ static int parse_max_cll (const char * data_string , oapvm_payload_cll_t * cll )
793+ {
831794 int assigned_fields = sscanf (data_string ,
832- "%hu,%hu " ,
795+ "%u,%u " ,
833796 & cll -> max_cll , & cll -> max_fall
834797 );
835798
836799 // Check if sscanf successfully assigned all expected fields (10 numerical values).
837800 const int expected_fields = 2 ;
838801 if (assigned_fields != expected_fields ) {
839- fprintf ( stderr , "Parsing error: Expected %d fields, found %d.\n" , expected_fields , assigned_fields );
840- return OAPV_ERR_INVALID_ARGUMENT ;
802+ logerr ( "ERR: parsing error: content light level information" );
803+ return -1 ;
841804 }
842-
843805 return 0 ; // Success
844806}
845807
846- static void serialize_metadata_mdcv (const md_mdcv_t * mdcv , uint8_t * buffer ) {
847- int i ;
848- uint8_t * current_ptr = buffer ;
849- uint16_t beu16_val ;
850- uint32_t beu32_val ;
851-
852- for (i = 0 ; i < 3 ; i ++ ) {
853- beu16_val = ne2be16 (mdcv -> primary_chromaticity_x [i ]);
854- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
855- current_ptr += sizeof (uint16_t );
856-
857- beu16_val = ne2be16 (mdcv -> primary_chromaticity_y [i ]);
858- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
859- current_ptr += sizeof (uint16_t );
860- }
861-
862- beu16_val = ne2be16 (mdcv -> white_point_chromaticity_x );
863- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
864- current_ptr += sizeof (uint16_t );
865-
866- beu16_val = ne2be16 (mdcv -> white_point_chromaticity_y );
867- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
868- current_ptr += sizeof (uint16_t );
869-
870- beu32_val = ne2be32 (mdcv -> max_mastering_luminance );
871- memcpy (current_ptr , & beu32_val , sizeof (uint32_t ));
872- current_ptr += sizeof (uint32_t );
873-
874- beu32_val = ne2be32 (mdcv -> min_mastering_luminance );
875- memcpy (current_ptr , & beu32_val , sizeof (uint32_t ));
876- current_ptr += sizeof (uint32_t );
877- }
878-
879- static void serialize_metadata_cll (const md_cll_t * cll , uint8_t * buffer ) {
880- uint8_t * current_ptr = buffer ;
881- uint16_t beu16_val ;
882-
883- beu16_val = ne2be16 (cll -> max_cll );
884- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
885- current_ptr += sizeof (uint16_t );
808+ static int ready_for_metadata (args_var_t * vars , oapvm_t mid )
809+ {
810+ int ret , size ;
811+ oapvm_payload_mdcv_t mdcv ;
812+ oapvm_payload_cll_t cll ;
813+ int is_mdcv , is_cll ;
814+ unsigned char payload [64 ];
886815
887- beu16_val = ne2be16 (cll -> max_fall );
888- memcpy (current_ptr , & beu16_val , sizeof (uint16_t ));
889- current_ptr += sizeof (uint16_t );
890- }
816+ is_mdcv = (strlen (vars -> master_display ) > 0 )? 1 : 0 ;
817+ is_cll = (strlen (vars -> max_cll ) > 0 )? 1 : 0 ;
891818
892- static int update_metadata (args_var_t * vars , metadata_t * metadata )
893- {
894- if (vars == NULL || metadata == NULL ) {
895- fprintf (stderr , "Error: Input pointer is NULL.\n" );
896- return -1 ;
819+ if (!is_mdcv && !is_cll ) {
820+ // no need to ready metadata handler
821+ return 0 ;
897822 }
898823
899- if (strlen (vars -> master_display ) > 0 ) {
900- md_mdcv_t mdcv ;
901- size_t mdcv_buffer_size = 6 * sizeof (uint16_t ) + 2 * sizeof (uint16_t ) + 2 * sizeof (uint32_t );
902- uint8_t * mdcv_buffer = (uint8_t * )malloc (mdcv_buffer_size );
903-
824+ if (is_mdcv ) {
904825 if (parse_master_display (vars -> master_display , & mdcv )) {
905- fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> master_display , "master-display" );
906- return -1 ;
826+ logerr ("ERR: cannot parse master display information" );
827+ ret = -1 ;
828+ goto ERR ;
829+ }
830+ if (OAPV_FAILED (oapvm_write_mdcv (& mdcv , payload , & size ))) {
831+ logerr ("ERR: cannot get master display information bitstream" );
832+ ret = -1 ;
833+ goto ERR ;
834+ }
835+ if (OAPV_FAILED (oapvm_set (mid , 1 , OAPV_METADATA_MDCV , payload , size ))) {
836+ logerr ("ERR: cannot set master display information to handler" );
837+ ret = -1 ;
838+ goto ERR ;
907839 }
908-
909- serialize_metadata_mdcv (& mdcv , mdcv_buffer );
910-
911- metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
912- metadata -> payloads [metadata -> num_plds ].type = OAPV_METADATA_MDCV ;
913- metadata -> payloads [metadata -> num_plds ].size = mdcv_buffer_size ;
914- metadata -> payloads [metadata -> num_plds ].data = mdcv_buffer ;
915-
916- metadata -> num_plds ++ ;
917840 }
918841
919- if (strlen (vars -> max_cll ) > 0 ) {
920-
921- md_cll_t cll ;
922- size_t cll_buffer_size = 2 * sizeof (uint16_t );
923- uint8_t * cll_buffer = malloc (cll_buffer_size );
924-
842+ if (is_cll ) {
925843 if (parse_max_cll (vars -> max_cll , & cll )) {
926- fprintf (stderr , "input value (%s) of %s is invalid\n" , vars -> max_cll , "max-cli" );
927- return -1 ;
844+ logerr ("ERR: cannot parse contents light level information" );
845+ ret = -1 ;
846+ goto ERR ;
847+ }
848+ if (OAPV_FAILED (oapvm_write_cll (& cll , payload , & size ))) {
849+ logerr ("ERR: cannot get contents light level information bitstream" );
850+ ret = -1 ;
851+ goto ERR ;
852+ }
853+ if (OAPV_FAILED (oapvm_set (mid , 1 , OAPV_METADATA_CLL , payload , size ))) {
854+ logerr ("ERR: cannot set contents light level information to handler" );
855+ ret = -1 ;
856+ goto ERR ;
928857 }
929-
930- serialize_metadata_cll (& cll , cll_buffer );
931-
932- metadata -> payloads [metadata -> num_plds ].group_id = 1 ;
933- metadata -> payloads [metadata -> num_plds ].type = OAPV_METADATA_CLL ;
934- metadata -> payloads [metadata -> num_plds ].size = cll_buffer_size ;
935- metadata -> payloads [metadata -> num_plds ].data = cll_buffer ;
936-
937- metadata -> num_plds ++ ;
938858 }
939859
940- return 0 ;
860+ ERR :
861+ return ret ;
941862}
942863
943864int main (int argc , const char * * argv )
@@ -972,8 +893,6 @@ int main(int argc, const char **argv)
972893 int cfmt ; // color format
973894 const int num_frames = MAX_NUM_FRMS ; // number of frames in an access unit
974895
975- metadata_t metadata = {0 };
976-
977896 // print logo
978897 logv2 (" ____ ___ ___ _ __\n" );
979898 logv2 (" / __ \\___ ___ ___ / _ | / _ \\ | / / Encoder (v%s)\n" , oapv_version (NULL ));
@@ -1141,6 +1060,7 @@ int main(int argc, const char **argv)
11411060 id = oapve_create (& cdesc , & ret );
11421061 if (id == NULL ) {
11431062 logerr ("ERR: cannot create OAPV encoder\n" );
1063+ ret = -1 ;
11441064 goto ERR ;
11451065 }
11461066
@@ -1152,15 +1072,6 @@ int main(int argc, const char **argv)
11521072 goto ERR ;
11531073 }
11541074
1155- update_metadata (args_var , & metadata );
1156-
1157- ret = oapvm_set_all (mid , metadata .payloads , metadata .num_plds );
1158- if (OAPV_FAILED (ret )) {
1159- logerr ("ERR: cannot set metadata\n" );
1160- ret = -1 ;
1161- goto ERR ;
1162- }
1163-
11641075 if (set_extra_config (id , args_var , param )) {
11651076 logerr ("ERR: cannot set extra configurations\n" );
11661077 ret = -1 ;
@@ -1232,6 +1143,13 @@ int main(int argc, const char **argv)
12321143 ifrms .num_frms ++ ;
12331144 }
12341145
1146+ /* ready metadata if needs */
1147+ if (ready_for_metadata (args_var , mid )) {
1148+ logerr ("ERR: failed to ready metadata handler" );
1149+ ret = -1 ;
1150+ goto ERR ;
1151+ }
1152+
12351153 /* encode pictures *******************************************************/
12361154 while (args_var -> max_au == 0 || (au_cnt < args_var -> max_au )) {
12371155 for (int i = 0 ; i < num_frames ; i ++ ) {
@@ -1421,10 +1339,5 @@ int main(int argc, const char **argv)
14211339 if (args_var )
14221340 free (args_var );
14231341
1424- for (int i = 0 ; i < metadata .num_plds ; i ++ ) {
1425- free (metadata .payloads [i ].data );
1426- metadata .payloads [i ].data = NULL ;
1427- }
1428-
14291342 return ret ;
14301343}
0 commit comments