|  | /* | 
|  | * Copyright (c) 2018, Alliance for Open Media. All rights reserved. | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 2 Clause License and | 
|  | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
|  | * was not distributed with this source code in the LICENSE file, you can | 
|  | * obtain it at www.aomedia.org/license/software. 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. | 
|  | */ | 
|  |  | 
|  | /*!\file | 
|  | * \brief A table mapping from time to corresponding film grain parameters. | 
|  | * | 
|  | * In order to apply grain synthesis in the decoder, the film grain parameters | 
|  | * need to be signalled in the encoder. The film grain parameters are time | 
|  | * varying, and for two-pass encoding (and denoiser implementation flexibility) | 
|  | * it is common to denoise the video and do parameter estimation before encoding | 
|  | * the denoised video. | 
|  | * | 
|  | * The film grain table is used to provide this flexibility and is used as a | 
|  | * parameter that is passed to the encoder. | 
|  | * | 
|  | * Further, if regraining is to be done in say a single pass mode, or in two | 
|  | * pass within the encoder (before frames are added to the lookahead buffer), | 
|  | * this data structure can be used to keep track of on-the-fly estimated grain | 
|  | * parameters, that are then extracted from the table before the encoded frame | 
|  | * is written. | 
|  | */ | 
|  | #ifndef AOM_AOM_DSP_GRAIN_TABLE_H_ | 
|  | #define AOM_AOM_DSP_GRAIN_TABLE_H_ | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | #include "aom_dsp/grain_params.h" | 
|  | #include "aom/internal/aom_codec_internal.h" | 
|  |  | 
|  | typedef struct aom_film_grain_table_entry_t { | 
|  | aom_film_grain_t params; | 
|  | int64_t start_time; | 
|  | int64_t end_time; | 
|  | struct aom_film_grain_table_entry_t *next; | 
|  | } aom_film_grain_table_entry_t; | 
|  |  | 
|  | typedef struct { | 
|  | aom_film_grain_table_entry_t *head; | 
|  | aom_film_grain_table_entry_t *tail; | 
|  | } aom_film_grain_table_t; | 
|  |  | 
|  | /*!\brief Add a mapping from [time_stamp, end_time) to the given grain | 
|  | * parameters | 
|  | * | 
|  | * \param[in,out] table      The grain table | 
|  | * \param[in]     time_stamp The start time stamp | 
|  | * \param[in]     end_stamp  The end time_stamp | 
|  | * \param[in]     grain      The grain parameters | 
|  | */ | 
|  | void aom_film_grain_table_append(aom_film_grain_table_t *table, | 
|  | int64_t time_stamp, int64_t end_time, | 
|  | const aom_film_grain_t *grain); | 
|  |  | 
|  | /*!\brief Look-up (and optionally erase) the grain parameters for the given time | 
|  | * | 
|  | * \param[in]  table      The grain table | 
|  | * \param[in]  time_stamp The start time stamp | 
|  | * \param[in]  end_stamp  The end time_stamp | 
|  | * \param[in]  erase      Whether the time segment can be deleted | 
|  | * \param[out] grain      The output grain parameters | 
|  | */ | 
|  | int aom_film_grain_table_lookup(aom_film_grain_table_t *t, int64_t time_stamp, | 
|  | int64_t end_time, int erase, | 
|  | aom_film_grain_t *grain); | 
|  |  | 
|  | /*!\brief Reads the grain table from a file. | 
|  | * | 
|  | * \param[out]  table       The grain table | 
|  | * \param[in]   filename    The file to read from | 
|  | * \param[in]   error_info  Error info for tracking errors | 
|  | */ | 
|  | aom_codec_err_t aom_film_grain_table_read( | 
|  | aom_film_grain_table_t *table, const char *filename, | 
|  | struct aom_internal_error_info *error_info); | 
|  |  | 
|  | /*!\brief Writes the grain table from a file. | 
|  | * | 
|  | * \param[out]  table       The grain table | 
|  | * \param[in]   filename    The file to read from | 
|  | * \param[in]   error_info  Error info for tracking errors | 
|  | */ | 
|  | aom_codec_err_t aom_film_grain_table_write( | 
|  | const aom_film_grain_table_t *t, const char *filename, | 
|  | struct aom_internal_error_info *error_info); | 
|  |  | 
|  | void aom_film_grain_table_free(aom_film_grain_table_t *t); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif  // AOM_AOM_DSP_GRAIN_TABLE_H_ |