Skip to content

Commit e3114e9

Browse files
committed
refactored code for clarificatin
Signed-off-by: [email protected] <[email protected]>
1 parent 1567ac5 commit e3114e9

File tree

4 files changed

+174
-171
lines changed

4 files changed

+174
-171
lines changed

app/CMakeLists.txt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,6 @@ include_directories(${CMAKE_BINARY_DIR}/include)
33
set(EXE_ENC oapv_app_enc)
44
set(EXE_DEC oapv_app_dec)
55

6-
if(CMAKE_C_BYTE_ORDER STREQUAL "BIG_ENDIAN")
7-
set(WORDS_BIGENDIAN TRUE)
8-
message(STATUS "Platform is Big Endian")
9-
elseif(CMAKE_C_BYTE_ORDER STREQUAL "LITTLE_ENDIAN")
10-
set(WORDS_BIGENDIAN FALSE)
11-
message(STATUS "Platform is Little Endian")
12-
else()
13-
set(WORDS_BIGENDIAN FALSE)
14-
message(WARNING "Endianness could not be determined, assuming Little Endian")
15-
endif()
16-
176
file(GLOB SRC_ENC "oapv_app_enc.c")
187
file(GLOB INC_ENC "*.h")
198
file(GLOB SRC_DEC "oapv_app_dec.c")
@@ -48,11 +37,6 @@ elseif(UNIX OR MINGW)
4837
target_link_libraries(${EXE_DEC} m)
4938
endif()
5039

51-
if(WORDS_BIGENDIAN)
52-
target_compile_definitions(${EXE_ENC} PRIVATE HAVE_BIGENDIAN ANY)
53-
target_compile_definitions(${EXE_DEC} PRIVATE HAVE_BIGENDIAN ANY)
54-
endif()
55-
5640
# Install rules
5741
#
5842
# Install executable to <prefix>/bin

app/oapv_app_enc.c

Lines changed: 61 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -33,46 +33,18 @@
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-
4642
typedef 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

943864
int 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

Comments
 (0)