| /* |
| * Copyright (c) 2021, 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. |
| */ |
| |
| #ifndef AOM_AV1_ENCODER_THIRDPASS_H_ |
| #define AOM_AV1_ENCODER_THIRDPASS_H_ |
| |
| #include "av1/common/enums.h" |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include "av1/encoder/firstpass.h" |
| #include "av1/encoder/ratectrl.h" |
| #include "av1/encoder/tpl_model.h" |
| |
| struct AV1_COMP; |
| |
| // TODO(bohanli): optimize this number |
| #define MAX_THIRD_PASS_BUF \ |
| (AOMMAX((2 * MAX_GF_INTERVAL + 1), MAX_STATIC_GF_GROUP_LENGTH)) |
| |
| // Struct to store useful information related to a GOP, in addition to what is |
| // available in the bitstream |
| typedef struct { |
| int gf_length; |
| int num_frames; |
| int use_arf; |
| } THIRD_PASS_GOP_INFO; |
| |
| #if CONFIG_BITRATE_ACCURACY |
| typedef struct TPL_INFO { |
| int gf_length; |
| int tpl_ready; |
| TplTxfmStats txfm_stats_list[MAX_LENGTH_TPL_FRAME_STATS]; |
| double qstep_ratio_ls[MAX_LENGTH_TPL_FRAME_STATS]; |
| FRAME_UPDATE_TYPE update_type_list[MAX_LENGTH_TPL_FRAME_STATS]; |
| } TPL_INFO; |
| #endif // CONFIG_BITRATE_ACCURACY |
| |
| typedef struct { |
| BLOCK_SIZE bsize; |
| PARTITION_TYPE partition; |
| int mi_row_start; |
| int mi_col_start; |
| int_mv mv[2]; |
| MV_REFERENCE_FRAME ref_frame[2]; |
| PREDICTION_MODE pred_mode; |
| } THIRD_PASS_MI_INFO; |
| |
| // Struct to store useful information about a frame for the third pass. |
| // The members are extracted from the decoder by function get_frame_info. |
| typedef struct { |
| int width; |
| int height; |
| int mi_stride; |
| int mi_rows; |
| int mi_cols; |
| int base_q_idx; |
| int is_show_existing_frame; |
| int is_show_frame; |
| int bits_allocated; |
| int actual_bits; |
| uint64_t sse; |
| double bpm_factor; |
| FRAME_TYPE frame_type; |
| unsigned int order_hint; |
| THIRD_PASS_MI_INFO *mi_info; |
| } THIRD_PASS_FRAME_INFO; |
| |
| typedef struct { |
| /* --- Input and decoding related members --- */ |
| // the input file |
| const char *input_file_name; |
| #if CONFIG_THREE_PASS |
| // input context |
| struct AvxInputContext *input_ctx; |
| #endif |
| // decoder codec context |
| aom_codec_ctx_t decoder; |
| // start of the frame in buf |
| const unsigned char *frame; |
| // end of the frame(s) in buf |
| const unsigned char *end_frame; |
| // whether we still have following frames in buf |
| int have_frame; |
| // pointer to buffer for the read frames |
| uint8_t *buf; |
| // size of data in buffer |
| size_t bytes_in_buffer; |
| // current buffer size |
| size_t buffer_size; |
| // error info pointer |
| struct aom_internal_error_info *err_info; |
| |
| int this_frame_bits; |
| |
| /* --- Members for third pass encoding --- */ |
| // Array to store info about each frame. |
| // frame_info[0] should point to the current frame. |
| THIRD_PASS_FRAME_INFO frame_info[MAX_THIRD_PASS_BUF]; |
| // number of frames available in frame_info |
| int frame_info_count; |
| // the end of the previous GOP (order hint) |
| int prev_gop_end; |
| THIRD_PASS_GOP_INFO gop_info; |
| } THIRD_PASS_DEC_CTX; |
| |
| void av1_init_thirdpass_ctx(AV1_COMMON *cm, THIRD_PASS_DEC_CTX **ctx, |
| const char *file); |
| void av1_free_thirdpass_ctx(THIRD_PASS_DEC_CTX *ctx); |
| |
| // Set the GOP structure from the twopass bitstream. |
| // TODO(bohanli): this is currently a skeleton and we only return the gop |
| // length. This function also saves all frame information in the array |
| // ctx->frame_info for this GOP. |
| void av1_set_gop_third_pass(THIRD_PASS_DEC_CTX *ctx); |
| |
| // Pop one frame out of the array ctx->frame_info. This function is used to make |
| // sure that frame_info[0] always corresponds to the current frame. |
| void av1_pop_third_pass_info(THIRD_PASS_DEC_CTX *ctx); |
| |
| void av1_open_second_pass_log(struct AV1_COMP *cpi, int is_read); |
| void av1_close_second_pass_log(struct AV1_COMP *cpi); |
| |
| // Write the current GOP information into the second pass log file. |
| void av1_write_second_pass_gop_info(struct AV1_COMP *cpi); |
| // Write the information of the frames in this GOP into the second pass log |
| // file. |
| void av1_write_second_pass_per_frame_info(struct AV1_COMP *cpi, int gf_index); |
| |
| // Read the next GOP information from the second pass log file. |
| void av1_read_second_pass_gop_info(FILE *second_pass_log_stream, |
| THIRD_PASS_GOP_INFO *gop_info, |
| struct aom_internal_error_info *error); |
| // read the information of the frames in next GOP from the second pass log file. |
| void av1_read_second_pass_per_frame_info(FILE *second_pass_log_stream, |
| THIRD_PASS_FRAME_INFO *frame_info_arr, |
| int frame_info_count, |
| struct aom_internal_error_info *error); |
| |
| int av1_check_use_arf(THIRD_PASS_DEC_CTX *ctx); |
| |
| // Calculate the ratio of third pass frame dimensions over second pass frame |
| // dimensions. Return them in ratio_h and ratio_w. |
| void av1_get_third_pass_ratio(THIRD_PASS_DEC_CTX *ctx, int fidx, int fheight, |
| int fwidth, double *ratio_h, double *ratio_w); |
| |
| // Get the pointer to a second pass mi info, where mi_row and mi_col are the mi |
| // location in the thirdpass frame. |
| THIRD_PASS_MI_INFO *av1_get_third_pass_mi(THIRD_PASS_DEC_CTX *ctx, int fidx, |
| int mi_row, int mi_col, |
| double ratio_h, double ratio_w); |
| |
| // Get the adjusted MVs of this_mi, associated with the reference frame. If no |
| // MV is found with the reference frame, INVALID_MV is returned. |
| int_mv av1_get_third_pass_adjusted_mv(THIRD_PASS_MI_INFO *this_mi, |
| double ratio_h, double ratio_w, |
| MV_REFERENCE_FRAME frame); |
| |
| // Get the adjusted block size of this_mi. |
| BLOCK_SIZE av1_get_third_pass_adjusted_blk_size(THIRD_PASS_MI_INFO *this_mi, |
| double ratio_h, double ratio_w); |
| |
| // Get the adjusted mi position in the third pass frame, of a given |
| // third_pass_mi. Location is returned in mi_row and mi_col. |
| void av1_third_pass_get_adjusted_mi(THIRD_PASS_MI_INFO *third_pass_mi, |
| double ratio_h, double ratio_w, int *mi_row, |
| int *mi_col); |
| |
| PARTITION_TYPE av1_third_pass_get_sb_part_type(THIRD_PASS_DEC_CTX *ctx, |
| THIRD_PASS_MI_INFO *this_mi); |
| |
| #if CONFIG_BITRATE_ACCURACY |
| |
| void av1_pack_tpl_info(TPL_INFO *tpl_info, const GF_GROUP *gf_group, |
| const TplParams *tpl_data); |
| |
| void av1_write_tpl_info(const TPL_INFO *tpl_info, FILE *log_stream, |
| struct aom_internal_error_info *error); |
| |
| void av1_read_tpl_info(TPL_INFO *tpl_info, FILE *log_stream, |
| struct aom_internal_error_info *error); |
| |
| #endif // CONFIG_BITRATE_ACCURACY |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // AOM_AV1_ENCODER_THIRDPASS_H_ |