summaryrefslogtreecommitdiffstats
path: root/third_party/aom/av1/encoder/thirdpass.h
blob: 8080c06cb6bb408ab20a798557a2e06e410a78bd (plain)
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_