Skip to content

Commit 5b79915

Browse files
committed
Add metadata serialization with network byte order support
Signed-off-by: Dawid Kozinski <[email protected]>
1 parent 2ad0759 commit 5b79915

File tree

1 file changed

+77
-16
lines changed

1 file changed

+77
-16
lines changed

app/oapv_app_enc.c

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@
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+
845899
static 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

Comments
 (0)