1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
/*
* 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_
|