/* * Copyright (c) 2023, 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 www.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 * www.aomedia.org/license/patent. */ #include "iamf/cli/proto_conversion/proto_utils.h" #include #include #include #include #include #include "absl/log/log.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "iamf/cli/proto/obu_header.pb.h" #include "iamf/cli/proto/param_definitions.pb.h" #include "iamf/cli/proto/parameter_data.pb.h" #include "iamf/cli/proto_conversion/lookup_tables.h" #include "iamf/common/leb_generator.h" #include "iamf/common/utils/macros.h" #include "iamf/common/utils/map_utils.h" #include "iamf/common/utils/numeric_utils.h" #include "iamf/obu/demixing_info_parameter_data.h" #include "iamf/obu/obu_header.h" #include "iamf/obu/param_definitions.h" #include "iamf/obu/types.h" namespace iamf_tools { absl::Status CopyParamDefinition( const iamf_tools_cli_proto::ParamDefinition& input_param_definition, ParamDefinition& param_definition) { param_definition.parameter_id_ = input_param_definition.parameter_id(); param_definition.parameter_rate_ = input_param_definition.parameter_rate(); param_definition.param_definition_mode_ = input_param_definition.param_definition_mode(); RETURN_IF_NOT_OK(StaticCastIfInRange( "ParamDefinition.reserved", input_param_definition.reserved(), param_definition.reserved_)); param_definition.duration_ = input_param_definition.duration(); param_definition.constant_subblock_duration_ = input_param_definition.constant_subblock_duration(); if (input_param_definition.constant_subblock_duration() != 0) { // Nothing else to be done. Return. return absl::OkStatus(); } if (input_param_definition.num_subblocks() < input_param_definition.subblock_durations_size()) { return absl::InvalidArgumentError(absl::StrCat( "Expected at least ", input_param_definition.num_subblocks(), "subblock durations for parameter id = ", input_param_definition.parameter_id())); } param_definition.InitializeSubblockDurations( static_cast(input_param_definition.num_subblocks())); for (int i = 0; i < input_param_definition.num_subblocks(); ++i) { RETURN_IF_NOT_OK(param_definition.SetSubblockDuration( i, input_param_definition.subblock_durations(i))); } return absl::OkStatus(); } ObuHeader GetHeaderFromMetadata( const iamf_tools_cli_proto::ObuHeaderMetadata& input_obu_header) { std::vector extension_header_bytes( input_obu_header.extension_header_bytes().size()); std::transform(input_obu_header.extension_header_bytes().begin(), input_obu_header.extension_header_bytes().end(), extension_header_bytes.begin(), [](char c) { return static_cast(c); }); return ObuHeader{ .obu_redundant_copy = input_obu_header.obu_redundant_copy(), .obu_trimming_status_flag = input_obu_header.obu_trimming_status_flag(), .obu_extension_flag = input_obu_header.obu_extension_flag(), .num_samples_to_trim_at_end = input_obu_header.num_samples_to_trim_at_end(), .num_samples_to_trim_at_start = input_obu_header.num_samples_to_trim_at_start(), .extension_header_size = input_obu_header.extension_header_size(), .extension_header_bytes = extension_header_bytes}; } absl::Status CopyDemixingInfoParameterData( const iamf_tools_cli_proto::DemixingInfoParameterData& input_demixing_info_parameter_data, DemixingInfoParameterData& obu_demixing_param_data) { static const auto kProtoToInternalDMixPMode = BuildStaticMapFromPairs(LookupTables::kProtoAndInternalDMixPModes); RETURN_IF_NOT_OK(CopyFromMap(*kProtoToInternalDMixPMode, input_demixing_info_parameter_data.dmixp_mode(), "Internal version of proto `dmixp_mode`", obu_demixing_param_data.dmixp_mode)); RETURN_IF_NOT_OK(StaticCastIfInRange( "DemixingInfoParameterData.reserved", input_demixing_info_parameter_data.reserved(), obu_demixing_param_data.reserved)); return absl::OkStatus(); } absl::Status CopyDMixPMode(DemixingInfoParameterData::DMixPMode obu_dmixp_mode, iamf_tools_cli_proto::DMixPMode& dmixp_mode) { static const auto kInternalToProtoDMixPMode = BuildStaticMapFromInvertedPairs( LookupTables::kProtoAndInternalDMixPModes); return CopyFromMap(*kInternalToProtoDMixPMode, obu_dmixp_mode, "Proto version of internal `DMixPMode`", dmixp_mode); } std::unique_ptr CreateLebGenerator( const iamf_tools_cli_proto::Leb128Generator& user_config) { // Transform the enum and possibly `fixed_size` to call LebGenerator::Create. using enum iamf_tools_cli_proto::Leb128GeneratorMode; switch (user_config.mode()) { case GENERATE_LEB_MINIMUM: return LebGenerator::Create(LebGenerator::GenerationMode::kMinimum); case GENERATE_LEB_FIXED_SIZE: { int8_t fixed_size_int8; auto status = StaticCastIfInRange("user_metadata.leb_generator.fixed_size", user_config.fixed_size(), fixed_size_int8); if (!status.ok()) { LOG(ERROR) << status; return nullptr; } return LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, fixed_size_int8); } default: LOG(ERROR) << "Invalid generation mode: " << user_config.mode(); return nullptr; } } } // namespace iamf_tools