Skip to content

Commit 2ad0759

Browse files
committed
Refactor: Move HDR metadata preparation out of library
- Responsibility for HDR metadata preparation moved from the library to the application side - Used the liboapv metadata container API to pass the prepared metadata to the library Signed-off-by: Dawid Kozinski <[email protected]>
1 parent 7e9d0f7 commit 2ad0759

File tree

3 files changed

+117
-127
lines changed

3 files changed

+117
-127
lines changed

app/oapv_app_enc.c

Lines changed: 117 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
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+
4345
typedef enum _STATES {
4446
STATE_ENCODING,
4547
STATE_SKIPPING,
@@ -49,19 +51,25 @@ typedef enum _STATES {
4951
/* Mastering display colour volume metadata*/
5052
typedef struct md_mdcv md_mdcv_t;
5153
struct 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*/
6163
typedef struct md_cll md_cll_t;
6264
struct 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
}

inc/oapv.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -586,20 +586,6 @@ struct oapve_param {
586586
unsigned char transfer_characteristics;
587587
unsigned char matrix_coefficients;
588588
int full_range_flag;
589-
590-
/* mastering display color volume metadata metadata */
591-
int mdcv_flag;
592-
short unsigned int mdcv_primary_chromaticity_x[3];
593-
short unsigned int mdcv_primary_chromaticity_y[3];
594-
short unsigned int mdcv_white_point_chromaticity_x;
595-
short unsigned int mdcv_white_point_chromaticity_y;
596-
unsigned int mdcv_max_mastering_luminance;
597-
unsigned int mdcv_min_mastering_luminance;
598-
599-
/* content light level information metadata */
600-
int cll_flag;
601-
short unsigned int cll_max_cll;
602-
short unsigned int cll_max_fall;
603589
};
604590

605591
/*****************************************************************************

src/oapv_param.c

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,6 @@ int oapve_param_default(oapve_param_t *param)
6363
param->matrix_coefficients = 2; // unspecified matrix coefficients
6464
param->full_range_flag = 0; // limited range
6565

66-
// mastering display color volume metadata not set by the user
67-
param->mdcv_flag = 0;
68-
69-
// content light level information not set by the user
70-
param->cll_flag = 0;
71-
7266
return OAPV_OK;
7367
}
7468

@@ -154,52 +148,6 @@ static int get_q_matrix(const char *str, u8 q_matrix[OAPV_BLK_D])
154148
if(strlen(left)>0) return (ERR); \
155149
}
156150

157-
static int parse_master_display(const char* data_string, oapve_param_t *param) {
158-
if (data_string == NULL || param == NULL) {
159-
fprintf(stderr, "Error: Input pointer is NULL.\n");
160-
return -1;
161-
}
162-
163-
int assigned_fields = sscanf(data_string,
164-
"G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)",
165-
&param->mdcv_primary_chromaticity_x[2], &param->mdcv_primary_chromaticity_y[2], // G
166-
&param->mdcv_primary_chromaticity_x[1], &param->mdcv_primary_chromaticity_y[1], // B
167-
&param->mdcv_primary_chromaticity_x[0], &param->mdcv_primary_chromaticity_y[0], // R
168-
&param->mdcv_white_point_chromaticity_x, &param->mdcv_white_point_chromaticity_y, // White Point
169-
&param->mdcv_max_mastering_luminance, &param->mdcv_min_mastering_luminance // Luminance
170-
);
171-
172-
// Check if sscanf successfully assigned all expected fields (10 numerical values).
173-
const int expected_fields = 10;
174-
if (assigned_fields != expected_fields) {
175-
fprintf(stderr, "Parsing error: Expected %d fields, found %d.\n", expected_fields, assigned_fields);
176-
return OAPV_ERR_INVALID_ARGUMENT;
177-
}
178-
179-
return 0; // Success
180-
}
181-
182-
static int parse_max_cll(const char* data_string, oapve_param_t *param) {
183-
if (data_string == NULL || param == NULL) {
184-
fprintf(stderr, "Error: Input pointer is NULL.\n");
185-
return -1;
186-
}
187-
188-
int assigned_fields = sscanf(data_string,
189-
"%hu,%hu",
190-
&param->cll_max_cll, &param->cll_max_fall
191-
);
192-
193-
// Check if sscanf successfully assigned all expected fields (10 numerical values).
194-
const int expected_fields = 2;
195-
if (assigned_fields != expected_fields) {
196-
fprintf(stderr, "Parsing error: Expected %d fields, found %d.\n", expected_fields, assigned_fields);
197-
return OAPV_ERR_INVALID_ARGUMENT;
198-
}
199-
200-
return 0; // Success
201-
}
202-
203151
int oapve_param_parse(oapve_param_t *param, const char *name, const char *value)
204152
{
205153
u8 q_matrix[OAPV_BLK_D];
@@ -392,18 +340,6 @@ int oapve_param_parse(oapve_param_t *param, const char *name, const char *value
392340
param->full_range_flag = ti0;
393341
param->color_description_present_flag = 1;
394342
}
395-
NAME_CMP("master-display") { // mastering display color volume metadata
396-
if(parse_master_display(value, param)) {
397-
return OAPV_ERR_INVALID_ARGUMENT;
398-
}
399-
param->mdcv_flag = 1;
400-
}
401-
NAME_CMP("max-cll") { // maximum content light level
402-
if(parse_max_cll(value, param)) {
403-
return OAPV_ERR_INVALID_ARGUMENT;
404-
}
405-
param->cll_flag = 1;
406-
}
407343
else {
408344
return OAPV_ERR_INVALID_ARGUMENT;
409345
}

0 commit comments

Comments
 (0)