blob: 943414ecfb53eba19350b138042c9b7fbf9206e2 [file] [log] [blame] [edit]
/*
* Copyright (c) 2025, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* aomedia.org/license/patent-license/.
*/
#include <assert.h>
#include "config/aom_config.h"
#include "config/aom_scale_rtcd.h"
#include "aom/aom_codec.h"
#include "aom_dsp/bitreader_buffer.h"
#include "aom_ports/mem_ops.h"
#include "av1/common/common.h"
#include "av1/common/obu_util.h"
#include "av1/common/timing.h"
#include "av1/decoder/decoder.h"
#include "av1/decoder/decodeframe.h"
#include "av1/decoder/obu.h"
#include "av1/common/av1_common_int.h"
#if CONFIG_CWG_F270_CI_OBU
static void av1_set_color_info(ContentInterpretation *ci_params) {
assert(ci_params->color_info.color_description_idc !=
AOM_COLOR_DESC_IDC_EXPLICIT);
switch (ci_params->color_info.color_description_idc) {
case AOM_COLOR_DESC_IDC_BT709SDR:
ci_params->color_info.color_primaries = AOM_CICP_CP_BT_709;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_BT_709;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_BT_470_B_G;
break;
case AOM_COLOR_DESC_IDC_BT2100PQ:
ci_params->color_info.color_primaries = AOM_CICP_CP_BT_2020;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_SMPTE_2084;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_BT_2020_NCL;
break;
case AOM_COLOR_DESC_IDC_BT2100HLG:
ci_params->color_info.color_primaries = AOM_CICP_CP_BT_2020;
ci_params->color_info.transfer_characteristics =
AOM_CICP_TC_BT_2020_10_BIT;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_BT_2020_NCL;
break;
case AOM_COLOR_DESC_IDC_SRGB:
ci_params->color_info.color_primaries = AOM_CICP_CP_BT_709;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_SRGB;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_IDENTITY;
break;
case AOM_COLOR_DESC_IDC_SRGBSYCC:
ci_params->color_info.color_primaries = AOM_CICP_CP_BT_709;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_SRGB;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_BT_470_B_G;
break;
default:
ci_params->color_info.color_primaries = AOM_CICP_CP_UNSPECIFIED;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_UNSPECIFIED;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_UNSPECIFIED;
break;
}
}
static int av1_set_sar_info(ContentInterpretation *ci_params) {
int supported_sample_aspect_ratio = 1;
switch (ci_params->sar_info.sar_aspect_ratio_idc) {
case AOM_SAR_IDC_UNSPECIFIED:
case AOM_SAR_IDC_255: break;
case AOM_SAR_IDC_1_TO_1:
ci_params->sar_info.sar_width = 1;
ci_params->sar_info.sar_height = 1;
break;
case AOM_SAR_IDC_12_TO_11:
ci_params->sar_info.sar_width = 12;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_10_TO_11:
ci_params->sar_info.sar_width = 10;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_16_TO_11:
ci_params->sar_info.sar_width = 16;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_40_TO_33:
ci_params->sar_info.sar_width = 40;
ci_params->sar_info.sar_height = 33;
break;
case AOM_SAR_IDC_24_TO_11:
ci_params->sar_info.sar_width = 24;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_20_TO_11:
ci_params->sar_info.sar_width = 20;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_32_TO_11:
ci_params->sar_info.sar_width = 32;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_80_TO_33:
ci_params->sar_info.sar_width = 80;
ci_params->sar_info.sar_height = 33;
break;
case AOM_SAR_IDC_18_TO_11:
ci_params->sar_info.sar_width = 18;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_15_TO_11:
ci_params->sar_info.sar_width = 15;
ci_params->sar_info.sar_height = 11;
break;
case AOM_SAR_IDC_64_TO_33:
ci_params->sar_info.sar_width = 64;
ci_params->sar_info.sar_height = 33;
break;
case AOM_SAR_IDC_160_TO_99:
ci_params->sar_info.sar_width = 160;
ci_params->sar_info.sar_height = 99;
break;
case AOM_SAR_IDC_4_TO_3:
ci_params->sar_info.sar_width = 4;
ci_params->sar_info.sar_height = 3;
break;
case AOM_SAR_IDC_3_TO_2:
ci_params->sar_info.sar_width = 3;
ci_params->sar_info.sar_height = 2;
break;
case AOM_SAR_IDC_2_TO_1:
ci_params->sar_info.sar_width = 2;
ci_params->sar_info.sar_height = 1;
break;
default: supported_sample_aspect_ratio = 0; break;
}
return supported_sample_aspect_ratio;
}
static INLINE void av1_read_color_info(struct ContentInterpretation *ci_params,
struct aom_read_bit_buffer *rb) {
ColorInfo *col_info = &ci_params->color_info;
col_info->color_description_idc = aom_rb_read_rice_golomb(rb, 2);
if (col_info->color_description_idc == AOM_COLOR_DESC_IDC_EXPLICIT) {
col_info->color_primaries = aom_rb_read_literal(rb, 8);
col_info->transfer_characteristics = aom_rb_read_literal(rb, 8);
col_info->matrix_coefficients = aom_rb_read_literal(rb, 8);
} else {
col_info->color_primaries = AOM_CICP_CP_UNSPECIFIED;
col_info->transfer_characteristics = AOM_CICP_TC_UNSPECIFIED;
col_info->matrix_coefficients = AOM_CICP_MC_UNSPECIFIED;
}
col_info->full_range_flag = aom_rb_read_bit(rb);
}
static INLINE void av1_read_sample_aspect_ratio_information(
struct ContentInterpretation *ci_params, struct aom_read_bit_buffer *rb) {
SarInfo *sar_info = &ci_params->sar_info;
sar_info->sar_aspect_ratio_idc = aom_rb_read_literal(rb, 8);
if (sar_info->sar_aspect_ratio_idc == AOM_SAR_IDC_255) {
sar_info->sar_width = aom_rb_read_uvlc(rb);
sar_info->sar_height = aom_rb_read_uvlc(rb);
}
}
// TODO: AVM issue #1129 - Check that all instances of a CI OBU in an embedded
// layer shall contain the same information.
uint32_t av1_read_content_interpretation_obu(struct AV1Decoder *pbi,
struct aom_read_bit_buffer *rb) {
AV1_COMMON *const cm = &pbi->common;
const uint32_t saved_bit_offset = rb->bit_offset;
cm->error.error_code = AOM_CODEC_OK;
assert(rb->error_handler);
ContentInterpretation *ci_params = &cm->ci_params;
ci_params->ci_scan_type_idc = aom_rb_read_literal(rb, 2);
ci_params->ci_color_description_present_flag = aom_rb_read_bit(rb);
ci_params->ci_chroma_sample_position_present_flag = aom_rb_read_bit(rb);
ci_params->ci_aspect_ratio_info_present_flag = aom_rb_read_bit(rb);
ci_params->ci_timing_info_present_flag = aom_rb_read_bit(rb);
ci_params->ci_extension_present_flag = aom_rb_read_bit(rb);
(void)aom_rb_read_bit(rb); // ci_reserved_1bit
if (ci_params->ci_color_description_present_flag) {
av1_read_color_info(ci_params, rb);
if (ci_params->color_info.color_description_idc !=
AOM_COLOR_DESC_IDC_EXPLICIT)
av1_set_color_info(ci_params);
} else {
ci_params->color_info.color_primaries = AOM_CICP_CP_UNSPECIFIED;
ci_params->color_info.matrix_coefficients = AOM_CICP_MC_UNSPECIFIED;
ci_params->color_info.transfer_characteristics = AOM_CICP_TC_UNSPECIFIED;
ci_params->color_info.full_range_flag = 0;
}
if (ci_params->ci_chroma_sample_position_present_flag) {
ci_params->ci_chroma_sample_position[0] = aom_rb_read_uvlc(rb);
if (ci_params->ci_scan_type_idc != 1)
ci_params->ci_chroma_sample_position[1] = aom_rb_read_uvlc(rb);
else
ci_params->ci_chroma_sample_position[1] =
ci_params->ci_chroma_sample_position[0];
} else {
ci_params->ci_chroma_sample_position[0] = AOM_CSP_UNSPECIFIED;
ci_params->ci_chroma_sample_position[1] = AOM_CSP_UNSPECIFIED;
}
if (ci_params->ci_aspect_ratio_info_present_flag) {
av1_read_sample_aspect_ratio_information(ci_params, rb);
if (!av1_set_sar_info(ci_params)) {
aom_internal_error(&cm->error, AOM_CODEC_UNSUP_BITSTREAM,
"Incorrect SAR values");
}
}
if (ci_params->ci_timing_info_present_flag)
av1_read_timing_info_header(&ci_params->timing_info, &cm->error, rb);
if (ci_params->ci_extension_present_flag) {
// TODO: issue #1111 - Add the extension mechanism
}
if (av1_check_trailing_bits(pbi, rb) != 0) {
// cm->error.error_code is already set.
return 0;
}
pbi->ci_params_received = 1;
return ((rb->bit_offset - saved_bit_offset + 7) >> 3);
}
#endif // CONFIG_CWG_F270_CI_OBU