blob: d50083c6d4893385851fc5dc73153d8cc84c7740 [file] [log] [blame]
/*
*
* Copyright 2019 Samsung Electronics S.LSI Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* @file VendorVideoAPI.cpp
* @author ByungGwan Kang (bk0917.kang@samsung.com)
* @version 1.0
* @history
* 2019.08.08 : Create
*/
//#define LOG_NDEBUG 0
#define LOG_TAG "VendorVideoAPI"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <log/log.h>
#include <VendorVideoAPI.h>
#ifdef __cplusplus
extern "C" {
#endif
int Exynos_parsing_user_data_registered_itu_t_t35 (
ExynosHdrDynamicInfo *dest,
void *src)
{
int bit_offset = 0;
int data = 0;
ExynosHdrDynamicInfo *pHdr10PlusInfo;
int windows = 0;
int targeted_system_display_actual_peak_luminance_flag = 0;
int num_rows_targeted_system_display_actual_peak_luminance = 0;
int num_cols_targeted_system_display_actual_peak_luminance = 0;
int mastering_display_actual_peak_luminance_flag = 0;
int num_rows_mastering_display_actual_peak_luminance = 0;
int color_saturation_mapping_flag = 0;
int num_cols_mastering_display_actual_peak_luminance = 0;
int extraBit, extraByte = 0;
int i, j, k, l;
if ((dest == NULL) || (src == NULL)) {
ALOGE("[%s] invalid parameters", __FUNCTION__);
return -1;
}
pHdr10PlusInfo = dest;
/* country_code : 8bit */
for (i = 0; i < 1; i++) {
for (j = 0; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << j));
}
}
bit_offset += 8;
pHdr10PlusInfo->data.country_code = data;
data = 0;
/* terminal_provider_code : 16bit */
for (i = 0; i < 2; i++) {
for (j = 0; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << j));
}
}
bit_offset += 16;
pHdr10PlusInfo->data.provider_code = data;
data = 0;
/* terminal_provider_oriented_code : 16bit */
for (i = 0; i < 2; i++) {
for (j = 0; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << j));
}
}
bit_offset += 16;
pHdr10PlusInfo->data.provider_oriented_code = data;
data = 0;
/* application_identifier : 8bit*/
for (i = 0; i < 1; i++) {
for (j = 0; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << j));
}
}
bit_offset += 8;
pHdr10PlusInfo->data.application_identifier = data;
data = 0;
/* application_version : 8bit*/
for (i = 0; i < 1; i++) {
for (j = 0; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << j));
}
}
bit_offset += 8;
pHdr10PlusInfo->data.application_version = data;
data = 0;
#ifdef USE_FULL_ST2094_40
/* num_windows : 2bit*/
for (i = 0; i < 1; i++) {
for (j = 0; j < 2; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
}
bit_offset += 2;
extraBit = (bit_offset % 8);
data = data >> (8 - extraBit);
pHdr10PlusInfo->data.num_windows = data;
data = 0;
if ((pHdr10PlusInfo->data.num_windows < 1) ||
(pHdr10PlusInfo->data.num_windows > 3)) {
ALOGW("[%s] num_windows(%d) is invalid", __FUNCTION__, pHdr10PlusInfo->data.num_windows);
return -1;
}
for (i = 1; i < pHdr10PlusInfo->data.num_windows; i++) {
/* window_upper_left_corner_x : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.window_upper_left_corner_x[i - 1] = data;
data = 0;
/* window_upper_left_corner_y : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.window_upper_left_corner_y[i - 1] = data;
data = 0;
/* window_lower_right_corner_x : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.window_lower_right_corner_x[i - 1] = data;
data = 0;
/* window_lower_right_corner_y : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.window_lower_right_corner_y[i - 1] = data;
data = 0;
/* center_of_ellipse_x : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.center_of_ellipse_x[i - 1] = data;
data = 0;
/* center_of_ellipse_y : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.center_of_ellipse_y[i - 1] = data;
data = 0;
/* rotation_angle : 8bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 1)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 8;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.rotation_angle[i - 1] = data;
data = 0;
/* semimajor_axis_internal_ellipse : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.semimajor_axis_internal_ellipse[i - 1] = data;
data = 0;
/* semimajor_axis_external_ellipse : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.semimajor_axis_external_ellipse[i - 1] = data;
data = 0;
/* semiminor_axis_external_ellipse : 16bit */
if (extraBit > 0)
extraByte = 1;
for (j = 0; j < 2 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 16;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.semiminor_axis_external_ellipse[i - 1] = data;
data = 0;
/* overlap_process_option : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.overlap_process_option[i - 1] = data;
data = 0;
}
/* targeted_system_display_maximum_luminance : 27bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (i = 0; i < 3 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if (i < 3 + extraByte - 1)
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 27;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.targeted_system_display_maximum_luminance = data;
data = 0;
if (pHdr10PlusInfo->data.targeted_system_display_maximum_luminance > 10000) {
ALOGW("[%s] targeted_system_display_maximum_luminance(%d) is invalid", __FUNCTION__, pHdr10PlusInfo->data.targeted_system_display_maximum_luminance);
return -1;
}
/* targeted_system_display_actual_peak_luminance_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance_flag = data;
targeted_system_display_actual_peak_luminance_flag = pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance_flag;
data = 0;
if (targeted_system_display_actual_peak_luminance_flag) {
/* num_rows_targeted_system_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_rows_targeted_system_display_actual_peak_luminance = data;
num_rows_targeted_system_display_actual_peak_luminance = pHdr10PlusInfo->data.num_rows_targeted_system_display_actual_peak_luminance;
data = 0;
if ((num_rows_targeted_system_display_actual_peak_luminance < 2) ||
(num_rows_targeted_system_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_rows_targeted_system_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_rows_targeted_system_display_actual_peak_luminance);
return -1;
}
/* num_cols_targeted_system_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_cols_targeted_system_display_actual_peak_luminance = data;
num_cols_targeted_system_display_actual_peak_luminance = pHdr10PlusInfo->data.num_cols_targeted_system_display_actual_peak_luminance;
data = 0;
if ((num_cols_targeted_system_display_actual_peak_luminance < 2) ||
(num_cols_targeted_system_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_cols_targeted_system_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_cols_targeted_system_display_actual_peak_luminance);
return -1;
}
ALOGD("[%s] num_cols_targeted_system_display_actual_peak_luminance: %d (bit_offset: %d)", __FUNCTION__, num_cols_targeted_system_display_actual_peak_luminance, bit_offset);
for (i = 0; i < num_rows_targeted_system_display_actual_peak_luminance; i++) {
for (j = 0; j < num_cols_targeted_system_display_actual_peak_luminance; j++) {
/* targeted_system_display_actual_peak_luminance : 4bit */
if (extraBit > 4)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if ((k < 1) && (extraByte > 0))
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance[i][j] = data;
data = 0;
}
}
}
for (i = 0; i < pHdr10PlusInfo->data.num_windows; i++) {
for (j = 0; j < 3; j++) {
/* maxscl : 17bit */
for (k = 0; k < 3; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 2)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 17;
extraBit = bit_offset % 8;
if (extraBit != 0)
data = data >> (8 - extraBit);
pHdr10PlusInfo->data.maxscl[i][j] = data;
data = 0;
}
/* average_maxrgb : 17bit */
for (j = 0; j < 3; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 17;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.average_maxrgb[i] = data;
data = 0;
/* num_distribution_maxrgb_percentiles : 4bit */
if (extraBit > 4)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if ((j < 1) && (extraByte > 0))
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_maxrgb_percentiles[i] = data;
data = 0;
for (j = 0; j < pHdr10PlusInfo->data.num_maxrgb_percentiles[i]; j++) {
/* distribution_maxrgb_percentages : 7bit */
if (extraBit > 1)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if ((k < 1) && (extraByte > 0))
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 7;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.maxrgb_percentages[i][j] = data;
data = 0;
/* distribution_maxrgb_percentiles : 17bit */
if (extraBit >= 0)
extraByte = 1;
for (k = 0; k < 2 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 2)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 17;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.maxrgb_percentiles[i][j] = data;
data = 0;
}
/* fraction_bright_pixels : 10bit*/
if (extraBit > 6)
extraByte = 2;
else if (extraBit <= 6)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 2)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 10;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.fraction_bright_pixels[i] = data;
data = 0;
}
/* mastering_display_actual_peak_luminance_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.mastering_display_actual_peak_luminance_flag = data;
mastering_display_actual_peak_luminance_flag = pHdr10PlusInfo->data.mastering_display_actual_peak_luminance_flag;
data = 0;
if (mastering_display_actual_peak_luminance_flag) {
/* num_rows_mastering_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_rows_mastering_display_actual_peak_luminance = data;
num_rows_mastering_display_actual_peak_luminance = pHdr10PlusInfo->data.num_rows_mastering_display_actual_peak_luminance;
data = 0;
if ((num_rows_mastering_display_actual_peak_luminance < 2) ||
(num_rows_mastering_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_rows_mastering_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_rows_mastering_display_actual_peak_luminance);
return -1;
}
/* num_cols_mastering_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_cols_mastering_display_actual_peak_luminance = data;
num_cols_mastering_display_actual_peak_luminance = data;
data = 0;
if ((num_cols_mastering_display_actual_peak_luminance < 2) ||
(num_cols_mastering_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_cols_mastering_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_cols_mastering_display_actual_peak_luminance);
return -1;
}
for (i = 0; i < num_rows_mastering_display_actual_peak_luminance; i++) {
for (j = 0; j < num_cols_mastering_display_actual_peak_luminance; j++) {
/* mastering_display_actual_peak_luminance : 4bit */
if (extraBit > 4)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if ((k < 1) && (extraByte > 0))
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.mastering_display_actual_peak_luminance[i][j] = data;
data = 0;
}
}
}
for (i = 0; i < pHdr10PlusInfo->data.num_windows; i++) {
/* tone_mapping_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = data >> (8 - extraBit);
pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag[i] = data;
data = 0;
if (pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag[i]) {
/* knee_point_x : 12bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 1 + extraByte - 1)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 12;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.knee_point_x[i] = data;
data = 0;
/* knee_point_y : 12bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 1 + extraByte - 1)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 12;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.knee_point_y[i] = data;
data = 0;
/* num_bezier_curve_anchors : 4bit */
if (extraBit > 4)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if ((j < 1) && (extraByte > 0))
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i] = data;
data = 0;
int max_bezier_curve_anchors = (pHdr10PlusInfo->data.application_version == 1)? 9:15;
if (pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i] > max_bezier_curve_anchors) {
ALOGW("[%s] num_bezier_curve_anchors[%d]: (%d) is invalid (<= max(%d))", __FUNCTION__, i, pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i], max_bezier_curve_anchors);
return -1;
}
for (j = 0; j < pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i]; j++) {
/* bezier_curve_anchors : 10bit */
if (extraBit > 6)
extraByte = 2;
else if (extraBit <= 6)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 1 + extraByte - 1)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 10;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.bezier_curve_anchors[i][j] = data;
data = 0;
}
}
/* color_saturation_mapping_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.color_saturation_mapping_flag[i] = data;
color_saturation_mapping_flag = pHdr10PlusInfo->data.color_saturation_mapping_flag[i];
data = 0;
if (color_saturation_mapping_flag) {
/* color_saturation_weight : 6bit */
if (extraBit > 3)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if ((j < 1) && (extraByte > 0))
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 6;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.color_saturation_weight[i] = data;
data = 0;
}
}
#else // USE_FULL_ST2094_40
/* Device does not support full ST2094_40 info for HDR10 plus
* So some infos will be omitted from data parsing or muxing.
* (Not parsed but just offset moved)
*/
/* num_windows : 2bit*/
for (i = 0; i < 1; i++) {
for (j = 0; j < 2; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
}
bit_offset += 2;
extraBit = (bit_offset % 8);
data = data >> (8 - extraBit);
windows = data;
data = 0;
if ((windows < 1) ||
(windows > 3)) {
ALOGW("[%s] windows(%d) is invalid", __FUNCTION__, windows);
return -1;
}
for (i = 1; i < windows; i++) {
/* window_upper_left_corner_x : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* window_upper_left_corner_y : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* window_lower_right_corner_x : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* window_lower_right_corner_y : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* center_of_ellipse_x : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* center_of_ellipse_y : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* rotation_angle : 8bit */
bit_offset += 8;
extraBit = bit_offset % 8;
/* semimajor_axis_internal_ellipse : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* semimajor_axis_external_ellipse : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* semiminor_axis_external_ellipse : 16bit */
bit_offset += 16;
extraBit = bit_offset % 8;
/* overlap_process_option : 1bit */
bit_offset += 1;
extraBit = bit_offset % 8;
}
/* targeted_system_display_maximum_luminance : 27bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (i = 0; i < 3 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if (i < 3 + extraByte - 1)
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 27;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.display_maximum_luminance = data;
data = 0;
if (pHdr10PlusInfo->data.display_maximum_luminance > 10000) {
ALOGW("[%s] display_maximum_luminance(%d) is invalid", __FUNCTION__, pHdr10PlusInfo->data.display_maximum_luminance);
return -1;
}
/* targeted_system_display_actual_peak_luminance_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
targeted_system_display_actual_peak_luminance_flag = data;
data = 0;
if (targeted_system_display_actual_peak_luminance_flag) {
/* num_rows_targeted_system_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
num_rows_targeted_system_display_actual_peak_luminance = data;
data = 0;
if ((num_rows_targeted_system_display_actual_peak_luminance < 2) ||
(num_rows_targeted_system_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_rows_targeted_system_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_rows_targeted_system_display_actual_peak_luminance);
return -1;
}
/* num_cols_targeted_system_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
num_cols_targeted_system_display_actual_peak_luminance = data;
data = 0;
if ((num_cols_targeted_system_display_actual_peak_luminance < 2) ||
(num_cols_targeted_system_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_cols_targeted_system_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_cols_targeted_system_display_actual_peak_luminance);
return -1;
}
for (i = 0; i < num_rows_targeted_system_display_actual_peak_luminance; i++) {
for (j = 0; j < num_cols_targeted_system_display_actual_peak_luminance; j++) {
/* targeted_system_display_actual_peak_luminance : 4bit */
bit_offset += 4;
extraBit = bit_offset % 8;
}
}
}
for (i = 0; i < windows; i++) {
for (j = 0; j < 3; j++) {
/* maxscl : 17bit */
for (k = 0; k < 3; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 2)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 17;
extraBit = bit_offset % 8;
if (extraBit != 0)
data = data >> (8 - extraBit);
pHdr10PlusInfo->data.maxscl[j] = data;
data = 0;
}
/* average_maxrgb : 17bit */
bit_offset += 17;
extraBit = bit_offset % 8;
/* num_distribution_maxrgb_percentiles : 4bit */
if (extraBit > 4)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if ((j < 1) && (extraByte > 0))
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.num_maxrgb_percentiles = data;
data = 0;
for (j = 0; j < pHdr10PlusInfo->data.num_maxrgb_percentiles; j++) {
/* distribution_maxrgb_percentages : 7bit */
if (extraBit > 1)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if ((k < 1) && (extraByte > 0))
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 7;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.maxrgb_percentages[j] = data;
data = 0;
/* distribution_maxrgb_percentiles : 17bit */
if (extraBit >= 0)
extraByte = 1;
for (k = 0; k < 2 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 2)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 17;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.maxrgb_percentiles[j] = data;
data = 0;
}
/* fraction_bright_pixels : 10bit*/
bit_offset += 10;
extraBit = bit_offset % 8;
}
/* mastering_display_actual_peak_luminance_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
mastering_display_actual_peak_luminance_flag = data;
data = 0;
if (mastering_display_actual_peak_luminance_flag) {
/* num_rows_mastering_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
num_rows_mastering_display_actual_peak_luminance = data;
data = 0;
if ((num_rows_mastering_display_actual_peak_luminance < 2) ||
(num_rows_mastering_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_rows_mastering_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_rows_mastering_display_actual_peak_luminance);
return -1;
}
/* num_cols_mastering_display_actual_peak_luminance : 5bit */
if (extraBit > 3)
extraByte = 1;
for (i = 0; i < 1 + extraByte; i++) {
for (j = extraBit; j < 8; j++) {
data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j)));
}
if ((i < 1) && (extraByte > 0))
data = data << 8;
extraBit += (j - extraBit);
extraBit %= 8;
}
bit_offset += 5;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
num_cols_mastering_display_actual_peak_luminance = data;
data = 0;
if ((num_cols_mastering_display_actual_peak_luminance < 2) ||
(num_cols_mastering_display_actual_peak_luminance > 25)) {
ALOGW("[%s] num_cols_mastering_display_actual_peak_luminance(%d) is invalid", __FUNCTION__, num_cols_mastering_display_actual_peak_luminance);
return -1;
}
for (i = 0; i < num_rows_mastering_display_actual_peak_luminance; i++) {
for (j = 0; j < num_cols_mastering_display_actual_peak_luminance; j++) {
/* mastering_display_actual_peak_luminance : 4bit */
bit_offset += 4;
extraBit = bit_offset % 8;
}
}
}
for (i = 0; i < windows; i++) {
/* tone_mapping_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraBit = bit_offset % 8;
data = data >> (8 - extraBit);
pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag = data;
data = 0;
if (pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag) {
/* knee_point_x : 12bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 1 + extraByte - 1)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 12;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.knee_point_x = data;
data = 0;
/* knee_point_y : 12bit */
if (extraBit > 5)
extraByte = 2;
else if (extraBit <= 5)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if (j < 1 + extraByte - 1)
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 12;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.knee_point_y = data;
data = 0;
/* num_bezier_curve_anchors : 4bit */
if (extraBit > 4)
extraByte = 1;
for (j = 0; j < 1 + extraByte; j++) {
for (k = extraBit; k < 8; k++) {
data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k)));
}
if ((j < 1) && (extraByte > 0))
data = data << 8;
extraBit += (k - extraBit);
extraBit %= 8;
}
bit_offset += 4;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors = data;
data = 0;
int max_bezier_curve_anchors = (pHdr10PlusInfo->data.application_version == 1)? 9:15;
if (pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors > max_bezier_curve_anchors) {
ALOGW("[%s] num_bezier_curve_anchors[%d]: (%d) is invalid (<= max(%d))", __FUNCTION__, i, pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors, max_bezier_curve_anchors);
return -1;
}
for (j = 0; j < pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors; j++) {
/* bezier_curve_anchors : 10bit */
if (extraBit > 6)
extraByte = 2;
else if (extraBit <= 6)
extraByte = 1;
for (k = 0; k < 1 + extraByte; k++) {
for (l = extraBit; l < 8; l++) {
data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l)));
}
if (k < 1 + extraByte - 1)
data = data << 8;
extraBit += (l - extraBit);
extraBit %= 8;
}
bit_offset += 10;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
pHdr10PlusInfo->data.tone_mapping.bezier_curve_anchors[j] = data;
data = 0;
}
}
/* color_saturation_mapping_flag : 1bit */
data |= (*((char *)src + (bit_offset / 8)) & (1 << (7 - extraBit)));
bit_offset += 1;
extraByte = 0;
extraBit = bit_offset % 8;
data = (extraBit != 0) ? (data >> (8 - extraBit)) : data;
color_saturation_mapping_flag = data;
data = 0;
if (color_saturation_mapping_flag) {
/* color_saturation_weight : 6bit */
bit_offset += 6;
extraBit = bit_offset % 8;
}
}
#endif // USE_FULL_ST2094_40
return 0;
}
int Exynos_dynamic_meta_to_itu_t_t35 (
ExynosHdrDynamicInfo *src,
char *dst)
{
ExynosHdrDynamicInfo *pHDRDynamicInfo = NULL;
char *pBlob = NULL;
int size = 0;
int bit_offset = 0;
int extraBit = 0;
int extraByte = 0;
int offset_limit = 0;
int buffer = 0;
int tempBuffer = 0;
int i, j, k, l;
if ((src == NULL) || (dst == NULL)) {
ALOGE("[%s] invalid parameters", __FUNCTION__);
return -1;
}
pHDRDynamicInfo = src;
pBlob = dst;
/* country_code: 8bit */
offset_limit = bit_offset + 8;
for (i = 0; i < 8; i++) {
*((char *)pBlob + (bit_offset / 8)) |=
(*((char *)&pHDRDynamicInfo->data.country_code) & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
/* terminal_provider_code: 16bit */
offset_limit = bit_offset + 16;
for (i = 0; i < 2; i++) {
for (j = 0; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |=
(*((char *)&pHDRDynamicInfo->data.provider_code + 1 - i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
}
extraBit = (bit_offset % 8);
/* terminal_provider_oriented_code: 16bit */
offset_limit = bit_offset + 16;
for (i = 0; i < 2; i++) {
for (j = 0; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |=
(*((char *)&pHDRDynamicInfo->data.provider_oriented_code + 1 - i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
}
extraBit = (bit_offset % 8);
/* application_identifier: 8bit */
offset_limit = bit_offset + 8;
for (i = 0; i < 8; i++) {
*((char *)pBlob + (bit_offset / 8)) |=
(*((char *)&pHDRDynamicInfo->data.application_identifier) & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
/* application_version: 8bit */
offset_limit = bit_offset + 8;
for (i = 0; i < 8; i++) {
*((char *)pBlob + (bit_offset / 8)) |=
(*((char *)&pHDRDynamicInfo->data.application_version) & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
#ifdef USE_FULL_ST2094_40
/* num_windows: 2bit */
offset_limit = bit_offset + 2;
tempBuffer = pHDRDynamicInfo->data.num_windows << (6 - extraBit);
for (i = 0; i < 2; i++) {
/* num_windows is always 1 now */
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&tempBuffer) & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
tempBuffer = 0;
for (i = 1; i < pHDRDynamicInfo->data.num_windows; i++) {
/* window_upper_left_corner_x: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.window_upper_left_corner_x[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* window_upper_left_corner_y: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.window_upper_left_corner_y[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* window_lower_right_corner_x: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.window_lower_right_corner_x[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* window_lower_right_corner_y: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.window_lower_right_corner_y[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* center_of_ellipse_x: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.center_of_ellipse_x[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* center_of_ellipse_y: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.center_of_ellipse_y[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* rotation_angle: 8bit */
offset_limit = bit_offset + 8;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.rotation_angle[i - 1];
tempBuffer = tempBuffer << (24 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (1 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* semimajor_axis_internal_ellipse: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.semimajor_axis_internal_ellipse[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* semimajor_axis_external_ellipse: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.semimajor_axis_external_ellipse[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* semiminor_axis_external_ellipse: 16bit */
offset_limit = bit_offset + 16;
if (extraBit > 0)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.semiminor_axis_external_ellipse[i - 1];
tempBuffer = tempBuffer << (16 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* overlap_process_option: 1bit */
}
/* targeted_system_display_maximum_luminance: 27bit */
offset_limit = bit_offset + 27;
tempBuffer = pHDRDynamicInfo->data.targeted_system_display_maximum_luminance;
tempBuffer = tempBuffer << (5 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < 4; i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
/* targeted_system_display_actual_peak_luminance_flag: 1bit */
if (pHDRDynamicInfo->data.targeted_system_display_actual_peak_luminance_flag) {
*((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit));
}
bit_offset += 1;
extraBit = (bit_offset % 8);
if (pHDRDynamicInfo->data.targeted_system_display_actual_peak_luminance_flag) {
/* num_rows_targeted_system_display_actual_peak_luminance: 5bit */
offset_limit = bit_offset + 5;
if (extraBit > 3)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.num_rows_targeted_system_display_actual_peak_luminance;
tempBuffer = tempBuffer << (27 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (1 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* num_cols_targeted_system_display_actual_peak_luminance: 5bit */
offset_limit = bit_offset + 5;
if (extraBit > 3)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.num_cols_targeted_system_display_actual_peak_luminance;
tempBuffer = tempBuffer << (27 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (1 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* targeted_system_display_actual_peak_luminance[row][col]: 4bit */
for (i = 0; i < pHDRDynamicInfo->data.num_rows_targeted_system_display_actual_peak_luminance; i++) {
for (j = 0; j < pHDRDynamicInfo->data.num_cols_targeted_system_display_actual_peak_luminance; j++) {
offset_limit = bit_offset + 4;
if (extraBit > 4)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.targeted_system_display_actual_peak_luminance[i][j];
tempBuffer = tempBuffer << (28 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < (1 + extraByte); k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
}
}
for (i = 0; i < pHDRDynamicInfo->data.num_windows; i++) {
/* maxscl: 17bit */
for (j = 0; j < 3; j++) {
offset_limit = bit_offset + 17;
tempBuffer = pHDRDynamicInfo->data.maxscl[i][j] << (15 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < 3; k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
}
/* average_maxrgb: 17bit */
offset_limit = bit_offset + 17;
tempBuffer = pHDRDynamicInfo->data.average_maxrgb[i] << (15 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < 3; j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
/* num_distribution_maxrgb_percentiles: 4bit */
offset_limit = bit_offset + 4;
tempBuffer = pHDRDynamicInfo->data.num_maxrgb_percentiles[i] << (4 - extraBit);
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&tempBuffer) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
tempBuffer = 0;
for (j = 0; j < pHDRDynamicInfo->data.num_maxrgb_percentiles[i]; j++) {
/* distribution_maxrgb_percentaged: 7bit */
offset_limit = bit_offset + 7;
if (extraBit > 1)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.maxrgb_percentages[i][j];
tempBuffer = tempBuffer << (25 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < (1 + extraByte); k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* distribution_maxrgb_percentiles: 17bit */
offset_limit = bit_offset + 17;
tempBuffer = pHDRDynamicInfo->data.maxrgb_percentiles[i][j] << (15 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < 3; k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
}
/* fraction_bright_pixels: 10bit */
if (extraBit > 6)
extraByte = 1;
offset_limit = bit_offset + 10;
tempBuffer = pHDRDynamicInfo->data.fraction_bright_pixels[i];
tempBuffer = tempBuffer << (22 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
/* mastering_display_actual_peak_luminance_flag: 1bit */
if (pHDRDynamicInfo->data.mastering_display_actual_peak_luminance_flag) {
*((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit));
}
bit_offset += 1;
extraBit = (bit_offset % 8);
if (pHDRDynamicInfo->data.mastering_display_actual_peak_luminance_flag) {
/* num_rows_mastering_display_actual_peak_luminance: 5bit */
offset_limit = bit_offset + 5;
if (extraBit > 3)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.num_rows_mastering_display_actual_peak_luminance;
tempBuffer = tempBuffer << (27 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (1 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* num_cols_mastering_display_actual_peak_luminance: 5bit */
offset_limit = bit_offset + 5;
if (extraBit > 3)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.num_cols_mastering_display_actual_peak_luminance;
tempBuffer = tempBuffer << (27 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (1 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* mastering_display_actual_peak_luminance[row][col]: 4bit */
for (i = 0; i < pHDRDynamicInfo->data.num_rows_mastering_display_actual_peak_luminance; i++) {
for (j = 0; j < pHDRDynamicInfo->data.num_cols_mastering_display_actual_peak_luminance; j++) {
offset_limit = bit_offset + 4;
if (extraBit > 4)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.mastering_display_actual_peak_luminance[i][j];
tempBuffer = tempBuffer << (28 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < (1 + extraByte); k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
}
}
for (i = 0; i < pHDRDynamicInfo->data.num_windows; i++) {
/* tone_mapping_flag: 1bit */
if (pHDRDynamicInfo->data.tone_mapping.tone_mapping_flag[i]) {
*((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit));
}
bit_offset += 1;
extraBit = (bit_offset % 8);
if (pHDRDynamicInfo->data.tone_mapping.tone_mapping_flag[i]) {
/* knee_point_x: 12bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 12;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_x[i];
tempBuffer = tempBuffer << (20 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* knee_point_y: 12bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 12;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_y[i];
tempBuffer = tempBuffer << (20 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* num_bezier_curve_anchors: 4bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 4;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors[i];
tempBuffer = tempBuffer << (28 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (1 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
for (j = 0; j < pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors[i]; j++) {
/* bezier_curve_anchors: 10bit */
if (extraBit > 6)
extraByte = 1;
offset_limit = bit_offset + 10;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.bezier_curve_anchors[i][j];
tempBuffer = tempBuffer << (22 - extraBit);
for (k = 0; k < 4; k++) {
memcpy((char *)&buffer + k, (char *)&tempBuffer + (3 - k), sizeof(char));
}
for (k = 0; k < (2 + extraByte); k++) {
for (l = extraBit; l < 8; l++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + k) & (1 << (7 - l)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
}
/* color_saturation_mapping_flag: 1bit */
if (pHDRDynamicInfo->data.color_saturation_mapping_flag[i]) {
*((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit));
}
bit_offset += 1;
extraBit = (bit_offset % 8);
if (pHDRDynamicInfo->data.color_saturation_mapping_flag[i]) {
/* color_saturation_weight: 6bit */
offset_limit = bit_offset + 5;
if (extraBit > 3)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.num_rows_targeted_system_display_actual_peak_luminance;
tempBuffer = tempBuffer << (27 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (1 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
}
#else // USE_FULL_ST2094_40
/* num_windows: 2bit */
offset_limit = bit_offset + 2;
for (i = 0; i < 2; i++) {
/* num_windows is always 1 now */
*((char *)pBlob + (bit_offset / 8)) |= ((char)0x40/* num_windows */ & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
for (i = 1; i < 1 /* num_windows */; i++) {
/* window_upper_left_corner_x: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* window_upper_left_corner_y: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* window_lower_right_corner_x: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* window_lower_right_corner_y: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* center_of_ellipse_x: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* center_of_ellipse_y: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* rotation_angle: 8bit */
bit_offset += 8;
extraBit = (bit_offset % 8);
/* semimajor_axis_internal_ellipse: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* semimajor_axis_external_ellipse: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* semiminor_axis_external_ellipse: 16bit */
bit_offset += 16;
extraBit = (bit_offset % 8);
/* overlap_process_option: 1bit */
bit_offset += 1;
extraBit = (bit_offset % 8);
}
/* targeted_system_display_maximum_luminance: 27bit */
offset_limit = bit_offset + 27;
tempBuffer = pHDRDynamicInfo->data.display_maximum_luminance << (5 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < 4; i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
/* targeted_system_display_actual_peak_luminance_flag: 1bit (always 0) */
bit_offset += 1;
extraBit = (bit_offset % 8);
/* NOTE: These info would not set because targeted_system_display_actual_peak_luminance_flag is always 0
* - num_rows_targeted_system_display_actual_peak_luminance: 5bit
* - num_cols_targeted_system_display_actual_peak_luminance: 5bit
* - targeted_system_display_actual_peak_luminance: 4bit
*/
/* maxscl: 17bit */
for (i = 0; i < 3; i++) {
offset_limit = bit_offset + 17;
tempBuffer = pHDRDynamicInfo->data.maxscl[i] << (15 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < 3; j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
}
/* average_maxrgb: 17bit */
bit_offset += 17;
extraBit = (bit_offset % 8);
/* num_distribution_maxrgb_percentiles: 4bit */
offset_limit = bit_offset + 4;
tempBuffer = pHDRDynamicInfo->data.num_maxrgb_percentiles << (4 - extraBit);
for (i = extraBit; i < 8; i++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&tempBuffer) & (1 << (7 - i)));
bit_offset++;
if (bit_offset == offset_limit)
break;
}
extraBit = (bit_offset % 8);
tempBuffer = 0;
for (i = 0; i < pHDRDynamicInfo->data.num_maxrgb_percentiles; i++) {
/* distribution_maxrgb_percentaged: 7bit */
offset_limit = bit_offset + 7;
if (extraBit > 1)
extraByte = 1;
tempBuffer = pHDRDynamicInfo->data.maxrgb_percentages[i];
tempBuffer = tempBuffer << (25 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (1 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* distribution_maxrgb_percentiles: 17bit */
offset_limit = bit_offset + 17;
tempBuffer = pHDRDynamicInfo->data.maxrgb_percentiles[i] << (15 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < 3; j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
}
/* fraction_bright_pixels: 10bit */
bit_offset += 10;
extraBit = (bit_offset % 8);
/* mastering_display_actual_peak_luminance_flag: 1bit */
bit_offset += 1;
extraBit = (bit_offset % 8);
/* NOTE: These infos would not be set because mastering_display_actual_peak_luminance_flag is always 0.
* - num_rows_mastering_display_actual_peak_luminance: 5bit
* - num_cols_mastering_display_actual_peak_luminance: 5bit
* - mastering_display_actual_peak_luminance: 4bit
*/
/* tone_mapping_flag: 1bit */
if (pHDRDynamicInfo->data.tone_mapping.tone_mapping_flag) {
*((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit));
}
bit_offset += 1;
extraBit = (bit_offset % 8);
if (pHDRDynamicInfo->data.tone_mapping.tone_mapping_flag) {
/* knee_point_x: 12bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 12;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_x;
tempBuffer = tempBuffer << (20 - extraBit);
for (i = 0; i < 4; i++) {
memcpy((char *)&buffer + i, (char *)&tempBuffer + (3 - i), sizeof(char));
}
for (i = 0; i < (2 + extraByte); i++) {
for (j = extraBit; j < 8; j++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + i) & (1 << (7 - j)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* knee_point_y: 12bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 12;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_y;
tempBuffer = tempBuffer << (20 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
/* num_bezier_curve_anchors: 4bit */
if (extraBit > 4)
extraByte = 1;
offset_limit = bit_offset + 4;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors;
tempBuffer = tempBuffer << (28 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (1 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
for (i = 0; i < pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors; i++) {
/* bezier_curve_anchors: 10bit */
if (extraBit > 6)
extraByte = 1;
offset_limit = bit_offset + 10;
tempBuffer = pHDRDynamicInfo->data.tone_mapping.bezier_curve_anchors[i];
tempBuffer = tempBuffer << (22 - extraBit);
for (j = 0; j < 4; j++) {
memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char));
}
for (j = 0; j < (2 + extraByte); j++) {
for (k = extraBit; k < 8; k++) {
*((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k)));
bit_offset++;
if (bit_offset == offset_limit) {
break;
}
}
extraBit = (bit_offset % 8);
}
buffer = 0;
tempBuffer = 0;
extraByte = 0;
}
}
/* color_saturation_mapping_flag: 1bit */
bit_offset += 1;
extraBit = (bit_offset % 8);
/* NOTE: This info would not be set because color_saturation_mapping_flag is always 0.
* - color_saturation_weight: 6bit
*/
#endif // USE_FULL_ST2094_40
if(extraBit > 0) {
size = (bit_offset / 8) + 1;
} else {
size = (bit_offset / 8);
}
return size;
}
#ifdef __cplusplus
}
#endif