blob: 5716fe323b390adb056f5e96850dfcbdbf74b3a9 [file] [log] [blame]
/*
* Copyright (c) 2024, 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.
*/
#ifndef CLI_PARAMETERS_MANAGER_H_
#define CLI_PARAMETERS_MANAGER_H_
#include <cstdint>
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "iamf/cli/audio_element_with_data.h"
#include "iamf/cli/parameter_block_with_data.h"
#include "iamf/obu/demixing_info_parameter_data.h"
#include "iamf/obu/demixing_param_definition.h"
#include "iamf/obu/param_definitions.h"
#include "iamf/obu/recon_gain_info_parameter_data.h"
#include "iamf/obu/types.h"
namespace iamf_tools {
/*!\brief Manages parameters and supports easy query.
*
* The class operates iteratively; holding one set of parameter blocks
* corresponding to the same frame (with the same start/end timestamps).
*
* For each frame:
* - Parameter blocks are added via `AddDemixingParameterBlock()` or
* `AddReconGainParameterBlock()`.
* - Parameter values can be queried via `GetDownMixingParameters()` or
* `GetReconGainInfoParameterData()`.
* - Caller (usually the audio frame generator) is responsible to tell this
* manager to advance to the next frame via `UpdateDemixingState()` or
* `UpdateReconGainState()`.
*/
class ParametersManager {
public:
/*!\brief Constructor.
*
* \param audio_elements Input Audio Element OBUs with data.
* \param parameter_blocks Input Parameter Block OBUs with data.
*/
ParametersManager(
const absl::flat_hash_map<DecodedUleb128, AudioElementWithData>&
audio_elements);
/*!\brief Initializes some internal data.
*
* \return `absl::OkStatus()` on success. A specific status on failure.
*/
absl::Status Initialize();
/*!\brief Checks if a `DemixingParamDefinition` exists for an audio element.
*
* \param audio_element_id ID of the audio element to query.
* \return True if a `DemixingParamDefinition` is available for the audio
* element queried.
*/
bool DemixingParamDefinitionAvailable(DecodedUleb128 audio_element_id);
/*!\brief Gets current down-mixing parameters for an audio element.
*
* \param audio_element_id ID of the audio element that the parameters are
* to be applied.
* \param down_mixing_params Output down mixing parameters.
* \return `absl::OkStatus()` on success. A specific status on failure.
*/
absl::Status GetDownMixingParameters(DecodedUleb128 audio_element_id,
DownMixingParams& down_mixing_params);
/*!\brief Gets current recon gain info parameter data for an audio element.
*
* \param audio_element_id ID of the audio element that the parameters are
* to be applied.
* \param num_layers Number of layers in the audio element.
* \param recon_gain_info_parameter_data Output recon gain info parameter
* data.
* \return `absl::OkStatus()` on success. A specific status on failure.
*/
absl::Status GetReconGainInfoParameterData(
DecodedUleb128 audio_element_id, int32_t num_layers,
ReconGainInfoParameterData& recon_gain_info_parameter_data);
/*!\brief Adds a new demixing parameter block.
*
* \param parameter_block Pointer to the new demixing parameter block to add.
*/
void AddDemixingParameterBlock(const ParameterBlockWithData* parameter_block);
/*!\brief Adds a new recon gain parameter block.
*
* \param parameter_block Pointer to the new recon gain parameter block to
* add.
*/
void AddReconGainParameterBlock(
const ParameterBlockWithData* parameter_block);
/*!\brief Updates the state of demixing parameters for an audio element.
*
* Also validates the timestamp is as expected.
*
* \param audio_element_id Audio Element ID whose corresponding demixing
* state are to be updated.
* \param expected_next_timestamp Expected timestamp of the upcoming set of
* demixing parameter blocks.
* \return `absl::OkStatus()` on success. A specific status on failure.
*/
absl::Status UpdateDemixingState(DecodedUleb128 audio_element_id,
InternalTimestamp expected_next_timestamp);
/*!\brief Updates the state of recon gain parameters for an audio element.
*
* Also validates the timestamp is as expected.
*
* \param audio_element_id Audio Element ID whose corresponding recon gain
* state are to be updated.
* \param expected_new_timestamp Expected timestamp of the upcoming set of
* recon gain parameter blocks.
* \return `absl::OkStatus()` on success. A specific status on failure.
*/
absl::Status UpdateReconGainState(DecodedUleb128 audio_element_id,
InternalTimestamp expected_next_timestamp);
private:
// State used when generating demixing parameters for an audio element.
struct DemixingState {
const DemixingParamDefinition* param_definition;
// `w_idx` for the frame just processed, i.e. `wIdx(k - 1)` in the Spec.
int previous_w_idx;
// `w_idx` used to process the current frame, i.e. `wIdx(k)` in the Spec.
int w_idx;
// Timestamp for the next frame to be processed.
InternalTimestamp next_timestamp;
// Update rule of the currently tracked demixing parameters, because the
// first frame needs some special treatment.
DemixingInfoParameterData::WIdxUpdateRule update_rule;
};
struct ReconGainState {
const ReconGainParamDefinition* param_definition;
// Timestamp for the next frame to be processed.
InternalTimestamp next_timestamp;
};
// Mapping from Audio Element ID to audio element data.
const absl::flat_hash_map<DecodedUleb128, AudioElementWithData>&
audio_elements_;
// Mapping from Parameter ID to demixing parameter blocks.
absl::flat_hash_map<DecodedUleb128, const ParameterBlockWithData*>
demixing_parameter_blocks_;
// Mapping from Parameter ID to recon gain parameter blocks.
absl::flat_hash_map<DecodedUleb128, const ParameterBlockWithData*>
recon_gain_parameter_blocks_;
// Mapping from Audio Element ID to the demixing state.
absl::flat_hash_map<DecodedUleb128, DemixingState> demixing_states_;
// Mapping from Audio Element ID to the recon gain state.
absl::flat_hash_map<DecodedUleb128, ReconGainState> recon_gain_states_;
};
} // namespace iamf_tools
#endif // CLI_PARAMETERS_MANAGER_H_