diff options
Diffstat (limited to 'videoapi/VendorVideoAPI.cpp')
-rw-r--r-- | videoapi/VendorVideoAPI.cpp | 927 |
1 files changed, 702 insertions, 225 deletions
diff --git a/videoapi/VendorVideoAPI.cpp b/videoapi/VendorVideoAPI.cpp index d186a04..e439051 100644 --- a/videoapi/VendorVideoAPI.cpp +++ b/videoapi/VendorVideoAPI.cpp @@ -27,12 +27,12 @@ #define LOG_TAG "VendorVideoAPI" /* Check data boundary before read it */ -#define CHECK_BOUNDARY(bit_offset, size) { \ - if ((bit_offset) > (size) * 8) { \ - ALOGE("[%s] read bit offset(%d) > total bits(%d)", \ - __func__, (bit_offset), (size) * 8); \ - return -1; \ - } \ +#define CHECK_BOUNDARY(bit_offset, size) { \ + if ((bit_offset) > (size) * 8) { \ + ALOGE("[%s][%d] read bit offset(%d) > total bits(%d)", \ + __func__, __LINE__, (bit_offset), (size) * 8); \ + return -1; \ + } \ } #include <stdio.h> @@ -141,12 +141,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( bit_offset += 2; extraBit = (bit_offset % 8); data = data >> (8 - extraBit); - //pHdr10PlusInfo->data.num_windows = data; - windows = data; + pHdr10PlusInfo->data.num_windows = data; data = 0; - - for (i = 1; i < windows; i++) { + for (i = 1; i < pHdr10PlusInfo->data.num_windows; i++) { CHECK_BOUNDARY(bit_offset + 16, size); /* window_upper_left_corner_x : 16bit */ if (extraBit > 0) @@ -157,7 +155,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -167,7 +165,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_left_corner_x[i] = data; + pHdr10PlusInfo->data.window_upper_left_corner_x[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -180,7 +178,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -190,11 +188,11 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_left_corner_y[i] = data; + pHdr10PlusInfo->data.window_upper_left_corner_y[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); - /* window_upper_right_corner_x : 16bit */ + /* window_lower_right_corner_x : 16bit */ if (extraBit > 0) extraByte = 1; @@ -203,7 +201,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -213,11 +211,11 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_right_corner_x[i] = data; + pHdr10PlusInfo->data.window_lower_right_corner_x[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); - /* window_upper_right_corner_y : 16bit */ + /* window_lower_right_corner_y : 16bit */ if (extraBit > 0) extraByte = 1; @@ -226,7 +224,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -236,7 +234,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_right_corner_y[i] = data; + pHdr10PlusInfo->data.window_lower_right_corner_y[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -249,7 +247,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -259,7 +257,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_right_corner_y[i] = data; + pHdr10PlusInfo->data.center_of_ellipse_x[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -272,7 +270,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -282,7 +280,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.window_upper_right_corner_y[i] = data; + pHdr10PlusInfo->data.center_of_ellipse_y[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 8, size); @@ -295,7 +293,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 1) + if (j < 1 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -305,7 +303,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.rotation_angle[i] = data; + pHdr10PlusInfo->data.rotation_angle[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -318,7 +316,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -328,7 +326,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.semimajor_axis_internal_ellipse[i] = data; + pHdr10PlusInfo->data.semimajor_axis_internal_ellipse[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -341,7 +339,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -351,7 +349,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.semimajor_axis_external_ellipse[i] = data; + pHdr10PlusInfo->data.semimajor_axis_external_ellipse[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 16, size); @@ -364,7 +362,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 2 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -374,7 +372,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.semiminor_axis_external_ellipse[i] = data; + pHdr10PlusInfo->data.semiminor_axis_external_ellipse[i - 1] = data; data = 0; CHECK_BOUNDARY(bit_offset + 1, size); @@ -385,7 +383,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.overlap_process_option[i] = data; + pHdr10PlusInfo->data.overlap_process_option[i - 1] = data; data = 0; } @@ -404,14 +402,14 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( if (i < 3 + extraByte - 1) data = data << 8; - extraBit += (k - extraBit); + 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; + pHdr10PlusInfo->data.targeted_system_display_maximum_luminance = data; data = 0; CHECK_BOUNDARY(bit_offset + 1, size); @@ -421,11 +419,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( bit_offset += 1; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance_flag = data; + pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance_flag = data; targeted_system_display_actual_peak_luminance_flag = data; data = 0; - if (targeted_system_display_actual_peak_luminance_flag) { CHECK_BOUNDARY(bit_offset + 5, size); /* num_rows_targeted_system_display_actual_peak_luminance : 5bit */ @@ -437,7 +434,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j))); } - if (i < 1) + if (i < 1 + extraByte - 1) data = data << 8; extraBit += (j - extraBit); @@ -447,7 +444,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.num_rows_targeted_system_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.num_rows_targeted_system_display_actual_peak_luminance = data; num_rows_targeted_system_display_actual_peak_luminance = data; data = 0; @@ -461,7 +458,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j))); } - if (i < 1) + if (i < 1 + extraByte - 1) data = data << 8; extraBit += (j - extraBit); @@ -471,15 +468,14 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.num_cols_targeted_system_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.num_cols_targeted_system_display_actual_peak_luminance = data; num_cols_targeted_system_display_actual_peak_luminance = data; data = 0; - 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++) { CHECK_BOUNDARY(bit_offset + 4, size); - /* mastering_display_actual_peak_luminance : 4bit */ + /* targeted_system_display_actual_peak_luminance : 4bit */ if (extraBit > 4) extraByte = 1; @@ -488,7 +484,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l))); } - if (k < 1) + if (k < 1 + extraByte - 1) data = data << 8; extraBit += (l - extraBit); @@ -498,13 +494,13 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.mastering_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.targeted_system_display_actual_peak_luminance[i][j] = data; data = 0; } } } - for (i = 0; i < windows; i++) { + for (i = 0; i < pHdr10PlusInfo->data.num_windows; i++) { for (j = 0; j < 3; j++) { CHECK_BOUNDARY(bit_offset + 17, size); /* maxscl : 17bit */ @@ -525,9 +521,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( if (extraBit != 0) data = data >> (8 - extraBit); - pHdr10PlusInfo->data.maxscl[j] = data; + pHdr10PlusInfo->data.maxscl[i][j] = data; data = 0; } + CHECK_BOUNDARY(bit_offset + 17, size); /* average_maxrgb : 17bit */ for (j = 0; j < 3; j++) { @@ -544,7 +541,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( bit_offset += 17; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.average_maxrgb = data; + pHdr10PlusInfo->data.average_maxrgb[i] = data; data = 0; CHECK_BOUNDARY(bit_offset + 4, size); @@ -557,10 +554,8 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (extraByte > 0) { - if (j < 1) - data = data << 8; - } + if (j < 1 + extraByte - 1) + data = data << 8; extraBit += (k - extraBit); extraBit %= 8; @@ -569,11 +564,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.num_maxrgb_percentiles = data; + pHdr10PlusInfo->data.num_maxrgb_percentiles[i] = data; data = 0; - - for (j = 0; j < pHdr10PlusInfo->data.num_maxrgb_percentiles; j++) { + for (j = 0; j < pHdr10PlusInfo->data.num_maxrgb_percentiles[i]; j++) { CHECK_BOUNDARY(bit_offset + 7, size); /* distribution_maxrgb_percentages : 7bit */ if (extraBit > 1) @@ -584,7 +578,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l))); } - if (k < 1) + if (k < 1 + extraByte - 1) data = data << 8; extraBit += (l - extraBit); @@ -594,7 +588,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.maxrgb_percentages[j] = data; + pHdr10PlusInfo->data.maxrgb_percentages[i][j] = data; data = 0; CHECK_BOUNDARY(bit_offset + 17, size); @@ -607,7 +601,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l))); } - if (k < 2) + if (k < 2 + extraByte - 1) data = data << 8; extraBit += (l - extraBit); @@ -617,7 +611,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.maxrgb_percentiles[j] = data; + pHdr10PlusInfo->data.maxrgb_percentiles[i][j] = data; data = 0; } @@ -633,7 +627,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + j) & (1 << (7 - k))); } - if (j < 2) + if (j < 1 + extraByte - 1) data = data << 8; extraBit += (k - extraBit); @@ -643,7 +637,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.fraction_bright_pixels = data; + pHdr10PlusInfo->data.fraction_bright_pixels[i] = data; data = 0; } @@ -654,11 +648,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( bit_offset += 1; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.mastering_display_actual_peak_luminance_flag = data; + pHdr10PlusInfo->data.mastering_display_actual_peak_luminance_flag = data; mastering_display_actual_peak_luminance_flag = data; data = 0; - if (mastering_display_actual_peak_luminance_flag) { CHECK_BOUNDARY(bit_offset + 5, size); /* num_rows_mastering_display_actual_peak_luminance : 5bit */ @@ -670,7 +663,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j))); } - if (i < 1) + if (i < 1 + extraByte - 1) data = data << 8; extraBit += (j - extraBit); @@ -680,7 +673,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.num_rows_mastering_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.num_rows_mastering_display_actual_peak_luminance = data; num_rows_mastering_display_actual_peak_luminance = data; data = 0; @@ -694,7 +687,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + i) & (1 << (7 - j))); } - if (i < 1) + if (i < 1 + extraByte - 1) data = data << 8; extraBit += (j - extraBit); @@ -704,11 +697,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.num_cols_mastering_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.num_cols_mastering_display_actual_peak_luminance = data; num_cols_mastering_display_actual_peak_luminance = data; data = 0; - for (i = 0; i < num_rows_mastering_display_actual_peak_luminance; i++) { for (j = 0; j < num_cols_mastering_display_actual_peak_luminance; j++) { CHECK_BOUNDARY(bit_offset + 4, size); @@ -721,7 +713,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( data |= (*((char *)src + (bit_offset / 8) + k) & (1 << (7 - l))); } - if (k < 1) + if (k < 1 + extraByte - 1) data = data << 8; extraBit += (l - extraBit); @@ -731,30 +723,29 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.mastering_display_actual_peak_luminance = data; + pHdr10PlusInfo->data.mastering_display_actual_peak_luminance[i][j] = data; data = 0; } } } - for (i = 0; i < windows; i++) { + for (i = 0; i < pHdr10PlusInfo->data.num_windows; i++) { CHECK_BOUNDARY(bit_offset + 1, size); /* 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 = (extraBit != 0) ? (data >> (8 - extraBit)) : data; + pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag[i] = data; data = 0; - - if (pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag) { + if (pHdr10PlusInfo->data.tone_mapping.tone_mapping_flag[i]) { CHECK_BOUNDARY(bit_offset + 12, size); /* knee_point_x : 12bit */ - if (extraBit > 5) + if (extraBit > 4) extraByte = 2; - else if (extraBit <= 5) + else if (extraBit <= 4) extraByte = 1; for (j = 0; j < 1 + extraByte; j++) { @@ -772,14 +763,14 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.tone_mapping.knee_point_x = data; + pHdr10PlusInfo->data.tone_mapping.knee_point_x[i] = data; data = 0; CHECK_BOUNDARY(bit_offset + 12, size); /* knee_point_y : 12bit */ - if (extraBit > 5) + if (extraBit > 4) extraByte = 2; - else if (extraBit <= 5) + else if (extraBit <= 4) extraByte = 1; for (j = 0; j < 1 + extraByte; j++) { @@ -797,7 +788,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.tone_mapping.knee_point_y = data; + pHdr10PlusInfo->data.tone_mapping.knee_point_y[i] = data; data = 0; CHECK_BOUNDARY(bit_offset + 4, size); @@ -820,11 +811,10 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors = data; + pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i] = data; data = 0; - - for (j = 0; j < pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors; j++) { + for (j = 0; j < pHdr10PlusInfo->data.tone_mapping.num_bezier_curve_anchors[i]; j++) { CHECK_BOUNDARY(bit_offset + 10, size); /* bezier_curve_anchors : 10bit */ if (extraBit > 6) @@ -847,7 +837,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - pHdr10PlusInfo->data.tone_mapping.bezier_curve_anchors[j] = data; + pHdr10PlusInfo->data.tone_mapping.bezier_curve_anchors[i][j] = data; data = 0; } } @@ -860,15 +850,13 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->data.color_saturation_mapping_flag = data; - color_saturation_mapping_flag = data; + pHdr10PlusInfo->data.color_saturation_mapping_flag[i] = data; data = 0; - - if (color_saturation_mapping_flag) { + if (pHdr10PlusInfo->data.color_saturation_mapping_flag[i]) { CHECK_BOUNDARY(bit_offset + 6, size); /* color_saturation_weight : 6bit */ - if (extraBit > 3) + if (extraBit > 2) extraByte = 1; for (j = 0; j < 1 + extraByte; j++) { @@ -886,7 +874,7 @@ int Exynos_parsing_user_data_registered_itu_t_t35 ( extraByte = 0; extraBit = bit_offset % 8; data = (extraBit != 0) ? (data >> (8 - extraBit)) : data; - //pHdr10PlusInfo->color_saturation_weight = data; + pHdr10PlusInfo->data.color_saturation_weight[i] = data; data = 0; } } @@ -910,7 +898,7 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( int buffer = 0; int tempBuffer = 0; - int i, j, k; + int i, j, k, l; if ((src == NULL) || (dst == NULL)) { ALOGE("[%s] invalid parameters", __FUNCTION__); @@ -931,6 +919,7 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( if (bit_offset == offset_limit) break; } + extraBit = (bit_offset % 8); /* terminal_provider_code: 16bit */ offset_limit = bit_offset + 16; @@ -945,6 +934,7 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( break; } } + extraBit = (bit_offset % 8); /* terminal_provider_oriented_code: 16bit */ offset_limit = bit_offset + 16; @@ -959,6 +949,7 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( break; } } + extraBit = (bit_offset % 8); /* application_identifier: 8bit */ offset_limit = bit_offset + 8; @@ -971,6 +962,7 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( if (bit_offset == offset_limit) break; } + extraBit = (bit_offset % 8); /* application_version: 8bit */ offset_limit = bit_offset + 8; @@ -983,62 +975,299 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( if (bit_offset == offset_limit) break; } + extraBit = (bit_offset % 8); /* 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)0x40/* num_windows */ & (1 << (7 - 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 = 1; i < 1 /* num_windows */; i++) { + for (i = 1; i < pHDRDynamicInfo->data.num_windows; i++) { /* window_upper_left_corner_x: 16bit */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + offset_limit = bit_offset + 16; - /* window_upper_right_corner_x: 16bit */ - bit_offset += 16; - extraBit = (bit_offset % 8); + if (extraBit > 0) + extraByte = 1; - /* window_upper_right_corner_y: 16bit */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 8; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ - bit_offset += 16; - extraBit = (bit_offset % 8); + 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 */ + if (pHDRDynamicInfo->data.overlap_process_option[i - 1]) { + *((char *)pBlob + (bit_offset / 8)) |= (1 << (7 - extraBit)); + } + bit_offset += 1; extraBit = (bit_offset % 8); } @@ -1046,7 +1275,8 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( /* targeted_system_display_maximum_luminance: 27bit */ offset_limit = bit_offset + 27; - tempBuffer = pHDRDynamicInfo->data.display_maximum_luminance << (5 - extraBit); + 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)); } @@ -1064,20 +1294,128 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( buffer = 0; tempBuffer = 0; - /* targeted_system_display_actual_peak_luminance_flag: 1bit (always 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); - /* 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 */ + 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; + } - /* maxscl: 17bit */ - for (i = 0; i < 3; i++) { + /* average_maxrgb: 17bit */ offset_limit = bit_offset + 17; - tempBuffer = pHDRDynamicInfo->data.maxscl[i] << (15 - extraBit); + tempBuffer = pHDRDynamicInfo->data.average_maxrgb[i] << (15 - extraBit); for (j = 0; j < 4; j++) { memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char)); } @@ -1094,37 +1432,14 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( } 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; + /* num_distribution_maxrgb_percentiles: 4bit */ + offset_limit = bit_offset + 4; - if (extraBit > 1) + if (extraBit > 4) extraByte = 1; - tempBuffer = pHDRDynamicInfo->data.maxrgb_percentages[i]; - tempBuffer = tempBuffer << (25 - extraBit); - + tempBuffer = pHDRDynamicInfo->data.num_maxrgb_percentiles[i] << (28 - extraBit); for (j = 0; j < 4; j++) { memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char)); } @@ -1134,9 +1449,8 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( *((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k))); bit_offset++; - if (bit_offset == offset_limit) { + if (bit_offset == offset_limit) break; - } } extraBit = (bit_offset % 8); } @@ -1144,16 +1458,70 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( tempBuffer = 0; extraByte = 0; - /* distribution_maxrgb_percentiles: 17bit */ - offset_limit = bit_offset + 17; + 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_percentiles[i] << (15 - extraBit); + 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 < 3; j++) { + 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++; @@ -1166,43 +1534,30 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( } buffer = 0; tempBuffer = 0; + extraByte = 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) { + 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.tone_mapping.tone_mapping_flag) { - /* knee_point_x: 12bit */ - if (extraBit > 4) - extraByte = 1; - - offset_limit = bit_offset + 12; + if (pHDRDynamicInfo->data.mastering_display_actual_peak_luminance_flag) { + /* num_rows_mastering_display_actual_peak_luminance: 5bit */ + offset_limit = bit_offset + 5; - tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_x; - tempBuffer = tempBuffer << (20 - extraBit); + 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 < (2 + extraByte); i++) { + 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++; @@ -1217,22 +1572,21 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( tempBuffer = 0; extraByte = 0; - /* knee_point_y: 12bit */ - if (extraBit > 4) - extraByte = 1; + /* num_cols_mastering_display_actual_peak_luminance: 5bit */ + offset_limit = bit_offset + 5; - offset_limit = bit_offset + 12; - - tempBuffer = pHDRDynamicInfo->data.tone_mapping.knee_point_y; - tempBuffer = tempBuffer << (20 - extraBit); + if (extraBit > 3) + extraByte = 1; - for (j = 0; j < 4; j++) { - memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char)); + 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 (j = 0; j < (2 + extraByte); j++) { - for (k = extraBit; k < 8; k++) { - *((char *)pBlob + (bit_offset / 8)) |= (*((char *)&buffer + j) & (1 << (7 - k))); + 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) { @@ -1245,44 +1599,82 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( tempBuffer = 0; extraByte = 0; - /* num_bezier_curve_anchors: 4bit */ - if (extraBit > 4) - extraByte = 1; - - offset_limit = bit_offset + 4; + /* 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; - tempBuffer = pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors; - tempBuffer = tempBuffer << (28 - extraBit); + if (extraBit > 4) + extraByte = 1; - for (j = 0; j < 4; j++) { - memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char)); - } + 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 (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++; + 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; + if (bit_offset == offset_limit) { + break; + } + } + extraBit = (bit_offset % 8); } + buffer = 0; + tempBuffer = 0; + extraByte = 0; } - 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); - for (i = 0; i < pHDRDynamicInfo->data.tone_mapping.num_bezier_curve_anchors; i++) { - /* bezier_curve_anchors: 10bit */ - if (extraBit > 6) + if (pHDRDynamicInfo->data.tone_mapping.tone_mapping_flag[i]) { + /* knee_point_x: 12bit */ + if (extraBit > 4) extraByte = 1; - offset_limit = bit_offset + 10; + 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; - tempBuffer = pHDRDynamicInfo->data.tone_mapping.bezier_curve_anchors[i]; - tempBuffer = tempBuffer << (22 - extraBit); + 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)); } @@ -1301,15 +1693,100 @@ int Exynos_dynamic_meta_to_itu_t_t35 ( 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 */ - bit_offset += 1; - extraBit = (bit_offset % 8); + /* 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 */ + if (extraBit > 2) + extraByte = 1; + + offset_limit = bit_offset + 6; + + tempBuffer = pHDRDynamicInfo->data.color_saturation_weight[i]; + tempBuffer = tempBuffer << (26 - extraBit); + for (j = 0; j < 4; j++) { + memcpy((char *)&buffer + j, (char *)&tempBuffer + (3 - j), sizeof(char)); + } - /* NOTE: This info would not be set because color_saturation_mapping_flag is always 0. - * - color_saturation_weight: 6bit */ + 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; + } + } if(extraBit > 0) { size = (bit_offset / 8) + 1; |