|  | /* | 
|  | * 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/. | 
|  | */ | 
|  |  | 
|  | #ifndef AOM_AV1_COMMON_BANDING_METADATA_H_ | 
|  | #define AOM_AV1_COMMON_BANDING_METADATA_H_ | 
|  |  | 
|  | #include "aom/aom_codec.h" | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | #if CONFIG_BAND_METADATA | 
|  |  | 
|  | #define MAX_BAND_COMPONENTS 3 | 
|  | #define MAX_BAND_UNITS_ROWS 32 | 
|  | #define MAX_BAND_UNITS_COLS 32 | 
|  |  | 
|  | /*!\brief Banding hints metadata structure */ | 
|  | typedef struct aom_banding_hints_metadata { | 
|  | uint8_t coding_banding_present_flag; | 
|  | uint8_t source_banding_present_flag; | 
|  |  | 
|  | // Optional banding hints information | 
|  | uint8_t banding_hints_flag; | 
|  | uint8_t three_color_components; | 
|  |  | 
|  | // Per-component banding information | 
|  | uint8_t banding_in_component_present_flag[MAX_BAND_COMPONENTS]; | 
|  | uint8_t max_band_width_minus4[MAX_BAND_COMPONENTS];  // 6 bits | 
|  | uint8_t max_band_step_minus1[MAX_BAND_COMPONENTS];   // 4 bits | 
|  |  | 
|  | // Band units information | 
|  | uint8_t band_units_information_present_flag; | 
|  | uint8_t num_band_units_rows_minus_1;  // 5 bits | 
|  | uint8_t num_band_units_cols_minus_1;  // 5 bits | 
|  | uint8_t varying_size_band_units_flag; | 
|  | uint8_t band_block_in_luma_samples;  // 3 bits | 
|  |  | 
|  | // Variable size band units | 
|  | uint8_t vert_size_in_band_blocks_minus1[MAX_BAND_UNITS_ROWS];  // 5 bits each | 
|  | uint8_t horz_size_in_band_blocks_minus1[MAX_BAND_UNITS_COLS];  // 5 bits each | 
|  |  | 
|  | // Per-tile banding flags | 
|  | uint8_t banding_in_band_unit_present_flag[MAX_BAND_UNITS_ROWS] | 
|  | [MAX_BAND_UNITS_COLS]; | 
|  | } aom_banding_hints_metadata_t; | 
|  |  | 
|  | /*!\brief Encode banding hints metadata to payload | 
|  | * | 
|  | * \param[in]     metadata        Banding hints metadata structure | 
|  | * \param[out]    payload         Output payload buffer | 
|  | * \param[in,out] payload_size    Input: buffer size, Output: actual payload | 
|  | * size | 
|  | * | 
|  | * \return 0 on success, -1 on error | 
|  | */ | 
|  | int aom_encode_banding_hints_metadata( | 
|  | const aom_banding_hints_metadata_t *metadata, uint8_t *payload, | 
|  | size_t *payload_size); | 
|  |  | 
|  | /*!\brief Decode banding hints metadata from payload | 
|  | * | 
|  | * \param[in]     payload         Input payload buffer | 
|  | * \param[in]     payload_size    Payload size | 
|  | * \param[out]    metadata        Decoded banding hints metadata structure | 
|  | * | 
|  | * \return 0 on success, -1 on error | 
|  | */ | 
|  | int aom_decode_banding_hints_metadata(const uint8_t *payload, | 
|  | size_t payload_size, | 
|  | aom_banding_hints_metadata_t *metadata); | 
|  |  | 
|  | /*!\brief Add banding hints metadata to an image | 
|  | * | 
|  | * \param[in,out] img               Image to add metadata to | 
|  | * \param[in]     banding_metadata  Banding hints metadata structure | 
|  | * \param[in]     insert_flag       When to insert the metadata | 
|  | * | 
|  | * \return 0 on success, -1 on error | 
|  | */ | 
|  | int aom_img_add_banding_hints_metadata( | 
|  | aom_image_t *img, const aom_banding_hints_metadata_t *banding_metadata, | 
|  | aom_metadata_insert_flags_t insert_flag); | 
|  |  | 
|  | // Forward declaration for encoder | 
|  | struct AV1_COMP; | 
|  |  | 
|  | /*!\brief Write banding hints metadata to bitstream | 
|  | * | 
|  | * \param[in]     cpi               Encoder context | 
|  | * \param[out]    dst               Output buffer | 
|  | * \param[in]     banding_metadata  Banding hints metadata structure | 
|  | * | 
|  | * \return Number of bytes written, 0 on error | 
|  | */ | 
|  | size_t av1_write_banding_hints_metadata( | 
|  | struct AV1_COMP *const cpi, uint8_t *dst, | 
|  | const aom_banding_hints_metadata_t *const banding_metadata); | 
|  |  | 
|  | #endif  // CONFIG_BAND_METADATA | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif  // AOM_AV1_COMMON_BANDING_METADATA_H_ |