Coverage Report

Created: 2026-04-01 07:49

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aom/av1/encoder/gop_structure.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2019, Alliance for Open Media. All rights reserved.
3
 *
4
 * This source code is subject to the terms of the BSD 2 Clause License and
5
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6
 * was not distributed with this source code in the LICENSE file, you can
7
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8
 * Media Patent License 1.0 was not distributed with this source code in the
9
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10
 */
11
12
#include <stdint.h>
13
14
#include "av1/common/blockd.h"
15
#include "config/aom_config.h"
16
#include "config/aom_scale_rtcd.h"
17
18
#include "aom/aom_codec.h"
19
#include "aom/aom_encoder.h"
20
#include "aom/aom_ext_ratectrl.h"
21
22
#include "av1/common/av1_common_int.h"
23
24
#include "av1/encoder/encoder.h"
25
#include "av1/encoder/av1_ext_ratectrl.h"
26
#include "av1/encoder/firstpass.h"
27
#include "av1/encoder/gop_structure.h"
28
#include "av1/encoder/pass2_strategy.h"
29
30
// This function sets gf_group->frame_parallel_level for LF_UPDATE frames based
31
// on the value of parallel_frame_count.
32
static void set_frame_parallel_level(int *frame_parallel_level,
33
                                     int *parallel_frame_count,
34
0
                                     int max_parallel_frames) {
35
0
  assert(*parallel_frame_count > 0);
36
  // parallel_frame_count > 1 indicates subsequent frame(s) in the current
37
  // parallel encode set.
38
0
  *frame_parallel_level = 1 + (*parallel_frame_count > 1);
39
  // Update the count of no. of parallel frames.
40
0
  (*parallel_frame_count)++;
41
0
  if (*parallel_frame_count > max_parallel_frames) *parallel_frame_count = 1;
42
0
}
43
44
// This function sets gf_group->src_offset based on frame_parallel_level.
45
// Outputs are gf_group->src_offset and first_frame_index
46
static void set_src_offset(GF_GROUP *const gf_group, int *first_frame_index,
47
0
                           int cur_frame_idx, int frame_ind) {
48
0
  if (gf_group->frame_parallel_level[frame_ind] > 0) {
49
0
    if (gf_group->frame_parallel_level[frame_ind] == 1) {
50
0
      *first_frame_index = cur_frame_idx;
51
0
    }
52
53
    // Obtain the offset of the frame at frame_ind in the lookahead queue by
54
    // subtracting the display order hints of the current frame from the display
55
    // order hint of the first frame in parallel encoding set (at
56
    // first_frame_index).
57
0
    gf_group->src_offset[frame_ind] =
58
0
        (cur_frame_idx + gf_group->arf_src_offset[frame_ind]) -
59
0
        *first_frame_index;
60
0
  }
61
0
}
62
63
// Sets the GF_GROUP params for LF_UPDATE frames.
64
static inline void set_params_for_leaf_frames(
65
    const TWO_PASS *twopass, const TWO_PASS_FRAME *twopass_frame,
66
    const PRIMARY_RATE_CONTROL *p_rc, FRAME_INFO *frame_info,
67
    GF_GROUP *const gf_group, int *cur_frame_idx, int *frame_ind,
68
    int *parallel_frame_count, int max_parallel_frames,
69
    int do_frame_parallel_encode, int *first_frame_index, int *cur_disp_index,
70
0
    int layer_depth, int start, int end, const bool scale_max_boost) {
71
0
  gf_group->update_type[*frame_ind] = LF_UPDATE;
72
0
  gf_group->arf_src_offset[*frame_ind] = 0;
73
0
  gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
74
0
  gf_group->layer_depth[*frame_ind] = MAX_ARF_LAYERS;
75
0
  gf_group->frame_type[*frame_ind] = INTER_FRAME;
76
0
  gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
77
0
  gf_group->max_layer_depth = AOMMAX(gf_group->max_layer_depth, layer_depth);
78
0
  gf_group->display_idx[*frame_ind] = (*cur_disp_index);
79
0
  gf_group->arf_boost[*frame_ind] =
80
0
      av1_calc_arf_boost(twopass, twopass_frame, p_rc, frame_info, start,
81
0
                         end - start, 0, NULL, NULL, 0, scale_max_boost);
82
0
  ++(*cur_disp_index);
83
84
  // Set the level of parallelism for the LF_UPDATE frame.
85
0
  if (do_frame_parallel_encode) {
86
0
    set_frame_parallel_level(&gf_group->frame_parallel_level[*frame_ind],
87
0
                             parallel_frame_count, max_parallel_frames);
88
    // Set LF_UPDATE frames as non-reference frames.
89
0
    gf_group->is_frame_non_ref[*frame_ind] = true;
90
0
  }
91
0
  set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
92
93
0
  ++(*frame_ind);
94
0
  ++(*cur_frame_idx);
95
0
}
96
97
// Sets the GF_GROUP params for INTNL_OVERLAY_UPDATE frames.
98
static inline void set_params_for_intnl_overlay_frames(
99
    GF_GROUP *const gf_group, int *cur_frame_idx, int *frame_ind,
100
0
    int *first_frame_index, int *cur_disp_index, int layer_depth) {
101
0
  gf_group->update_type[*frame_ind] = INTNL_OVERLAY_UPDATE;
102
0
  gf_group->arf_src_offset[*frame_ind] = 0;
103
0
  gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
104
0
  gf_group->layer_depth[*frame_ind] = layer_depth;
105
0
  gf_group->frame_type[*frame_ind] = INTER_FRAME;
106
0
  gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
107
0
  gf_group->display_idx[*frame_ind] = (*cur_disp_index);
108
0
  ++(*cur_disp_index);
109
110
0
  set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
111
0
  ++(*frame_ind);
112
0
  ++(*cur_frame_idx);
113
0
}
114
115
// Sets the GF_GROUP params for INTNL_ARF_UPDATE frames.
116
static inline void set_params_for_internal_arfs(
117
    const TWO_PASS *twopass, const TWO_PASS_FRAME *twopass_frame,
118
    const PRIMARY_RATE_CONTROL *p_rc, FRAME_INFO *frame_info,
119
    GF_GROUP *const gf_group, int *cur_frame_idx, int *frame_ind,
120
    int *parallel_frame_count, int max_parallel_frames,
121
    int do_frame_parallel_encode, int *first_frame_index, int depth_thr,
122
    int *cur_disp_idx, int layer_depth, int arf_src_offset, int offset,
123
0
    int f_frames, int b_frames, const bool scale_max_boost) {
124
0
  gf_group->update_type[*frame_ind] = INTNL_ARF_UPDATE;
125
0
  gf_group->arf_src_offset[*frame_ind] = arf_src_offset;
126
0
  gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
127
0
  gf_group->layer_depth[*frame_ind] = layer_depth;
128
0
  gf_group->frame_type[*frame_ind] = INTER_FRAME;
129
0
  gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
130
0
  gf_group->display_idx[*frame_ind] =
131
0
      (*cur_disp_idx) + gf_group->arf_src_offset[*frame_ind];
132
0
  gf_group->arf_boost[*frame_ind] =
133
0
      av1_calc_arf_boost(twopass, twopass_frame, p_rc, frame_info, offset,
134
0
                         f_frames, b_frames, NULL, NULL, 0, scale_max_boost);
135
136
0
  if (do_frame_parallel_encode) {
137
0
    if (depth_thr != INT_MAX) {
138
0
      assert(depth_thr == 3 || depth_thr == 4);
139
0
      assert(IMPLIES(depth_thr == 3, layer_depth == 4));
140
0
      assert(IMPLIES(depth_thr == 4, layer_depth == 5));
141
      // Set frame_parallel_level of the first frame in the given layer to 1.
142
0
      if (gf_group->layer_depth[(*frame_ind) - 1] != layer_depth) {
143
0
        gf_group->frame_parallel_level[*frame_ind] = 1;
144
0
      } else {
145
        // Set frame_parallel_level of the consecutive frame in the same given
146
        // layer to 2.
147
0
        assert(gf_group->frame_parallel_level[(*frame_ind) - 1] == 1);
148
0
        gf_group->frame_parallel_level[*frame_ind] = 2;
149
        // Store the display order hints of the past 2 INTNL_ARF_UPDATE
150
        // frames which would not have been displayed at the time of the encode
151
        // of current frame.
152
0
        gf_group->skip_frame_refresh[*frame_ind][0] =
153
0
            gf_group->display_idx[(*frame_ind) - 1];
154
0
        gf_group->skip_frame_refresh[*frame_ind][1] =
155
0
            gf_group->display_idx[(*frame_ind) - 2];
156
        // Set the display_idx of frame_parallel_level 1 frame in
157
        // gf_group->skip_frame_as_ref.
158
0
        gf_group->skip_frame_as_ref[*frame_ind] =
159
0
            gf_group->display_idx[(*frame_ind) - 1];
160
0
      }
161
0
    }
162
    // If max_parallel_frames is not exceeded and if the frame will not be
163
    // temporally filtered, encode the next internal ARF frame in parallel.
164
0
    if (*parallel_frame_count > 1 &&
165
0
        *parallel_frame_count <= max_parallel_frames) {
166
0
      if (gf_group->arf_src_offset[*frame_ind] < TF_LOOKAHEAD_IDX_THR)
167
0
        gf_group->frame_parallel_level[*frame_ind] = 2;
168
0
      *parallel_frame_count = 1;
169
0
    }
170
0
  }
171
0
  set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
172
0
  ++(*frame_ind);
173
0
}
174
175
// Set parameters for frames between 'start' and 'end' (excluding both).
176
static void set_multi_layer_params_for_fp(
177
    const TWO_PASS *twopass, const TWO_PASS_FRAME *twopass_frame,
178
    GF_GROUP *const gf_group, const PRIMARY_RATE_CONTROL *p_rc,
179
    RATE_CONTROL *rc, FRAME_INFO *frame_info, int start, int end,
180
    int *cur_frame_idx, int *frame_ind, int *parallel_frame_count,
181
    int max_parallel_frames, int do_frame_parallel_encode,
182
    int *first_frame_index, int depth_thr, int *cur_disp_idx, int layer_depth,
183
0
    const bool scale_max_boost) {
184
0
  const int num_frames_to_process = end - start;
185
186
  // Either we are at the last level of the pyramid, or we don't have enough
187
  // frames between 'l' and 'r' to create one more level.
188
0
  if (layer_depth > gf_group->max_layer_depth_allowed ||
189
0
      num_frames_to_process < 3) {
190
    // Leaf nodes.
191
0
    while (start < end) {
192
0
      set_params_for_leaf_frames(
193
0
          twopass, twopass_frame, p_rc, frame_info, gf_group, cur_frame_idx,
194
0
          frame_ind, parallel_frame_count, max_parallel_frames,
195
0
          do_frame_parallel_encode, first_frame_index, cur_disp_idx,
196
0
          layer_depth, start, end, scale_max_boost);
197
0
      ++start;
198
0
    }
199
0
  } else {
200
0
    const int m = (start + end - 1) / 2;
201
202
    // Internal ARF.
203
0
    int arf_src_offset = m - start;
204
0
    set_params_for_internal_arfs(
205
0
        twopass, twopass_frame, p_rc, frame_info, gf_group, cur_frame_idx,
206
0
        frame_ind, parallel_frame_count, max_parallel_frames,
207
0
        do_frame_parallel_encode, first_frame_index, INT_MAX, cur_disp_idx,
208
0
        layer_depth, arf_src_offset, m, end - m, m - start, scale_max_boost);
209
210
    // If encode reordering is enabled, configure the multi-layers accordingly
211
    // and return. For e.g., the encode order for gf-interval 16 after
212
    // reordering would be 0-> 16-> 8-> 4-> 2-> 6-> 1-> 3-> 5-> 7-> 12-> 10->
213
    // 14-> 9-> 11-> 13-> 15.
214
0
    if (layer_depth >= depth_thr) {
215
0
      int m1 = (m + start - 1) / 2;
216
0
      int m2 = (m + 1 + end) / 2;
217
0
      int arf_src_offsets[2] = { m1 - start, m2 - start };
218
      // Parameters to compute arf_boost.
219
0
      int offset[2] = { m1, m2 };
220
0
      int f_frames[2] = { m - m1, end - m2 };
221
0
      int b_frames[2] = { m1 - start, m2 - (m + 1) };
222
223
      // Set GF_GROUP params for INTNL_ARF_UPDATE frames which are reordered.
224
0
      for (int i = 0; i < 2; i++) {
225
0
        set_params_for_internal_arfs(
226
0
            twopass, twopass_frame, p_rc, frame_info, gf_group, cur_frame_idx,
227
0
            frame_ind, parallel_frame_count, max_parallel_frames,
228
0
            do_frame_parallel_encode, first_frame_index, depth_thr,
229
0
            cur_disp_idx, layer_depth + 1, arf_src_offsets[i], offset[i],
230
0
            f_frames[i], b_frames[i], scale_max_boost);
231
0
      }
232
233
      // Initialize the start and end indices to configure LF_UPDATE frames.
234
0
      int start_idx[4] = { start, m1 + 1, m + 1, end - 1 };
235
0
      int end_idx[4] = { m1, m, m2, end };
236
0
      int layer_depth_for_intnl_overlay[4] = { layer_depth + 1, layer_depth,
237
0
                                               layer_depth + 1, INVALID_IDX };
238
239
      // Set GF_GROUP params for the rest of LF_UPDATE and INTNL_OVERLAY_UPDATE
240
      // frames after reordering.
241
0
      for (int i = 0; i < 4; i++) {
242
0
        set_multi_layer_params_for_fp(
243
0
            twopass, twopass_frame, gf_group, p_rc, rc, frame_info,
244
0
            start_idx[i], end_idx[i], cur_frame_idx, frame_ind,
245
0
            parallel_frame_count, max_parallel_frames, do_frame_parallel_encode,
246
0
            first_frame_index, depth_thr, cur_disp_idx, layer_depth + 2,
247
0
            scale_max_boost);
248
0
        if (layer_depth_for_intnl_overlay[i] != INVALID_IDX)
249
0
          set_params_for_intnl_overlay_frames(
250
0
              gf_group, cur_frame_idx, frame_ind, first_frame_index,
251
0
              cur_disp_idx, layer_depth_for_intnl_overlay[i]);
252
0
      }
253
0
      return;
254
0
    }
255
256
    // Frames displayed before this internal ARF.
257
0
    set_multi_layer_params_for_fp(
258
0
        twopass, twopass_frame, gf_group, p_rc, rc, frame_info, start, m,
259
0
        cur_frame_idx, frame_ind, parallel_frame_count, max_parallel_frames,
260
0
        do_frame_parallel_encode, first_frame_index, depth_thr, cur_disp_idx,
261
0
        layer_depth + 1, scale_max_boost);
262
263
    // Overlay for internal ARF.
264
0
    set_params_for_intnl_overlay_frames(gf_group, cur_frame_idx, frame_ind,
265
0
                                        first_frame_index, cur_disp_idx,
266
0
                                        layer_depth);
267
268
    // Frames displayed after this internal ARF.
269
0
    set_multi_layer_params_for_fp(
270
0
        twopass, twopass_frame, gf_group, p_rc, rc, frame_info, m + 1, end,
271
0
        cur_frame_idx, frame_ind, parallel_frame_count, max_parallel_frames,
272
0
        do_frame_parallel_encode, first_frame_index, depth_thr, cur_disp_idx,
273
0
        layer_depth + 1, scale_max_boost);
274
0
  }
275
0
}
276
277
// Structure for bookkeeping start, end and display indices to configure
278
// INTNL_ARF_UPDATE frames.
279
typedef struct {
280
  int start;
281
  int end;
282
  int display_index;
283
} FRAME_REORDER_INFO;
284
285
// Updates the stats required to configure the GF_GROUP.
286
static inline void fill_arf_frame_stats(FRAME_REORDER_INFO *arf_frame_stats,
287
                                        int arf_frame_index, int display_idx,
288
0
                                        int start, int end) {
289
0
  arf_frame_stats[arf_frame_index].start = start;
290
0
  arf_frame_stats[arf_frame_index].end = end;
291
0
  arf_frame_stats[arf_frame_index].display_index = display_idx;
292
0
}
293
294
// Sets GF_GROUP params for INTNL_ARF_UPDATE frames. Also populates
295
// doh_gf_index_map and arf_frame_stats.
296
static inline void set_params_for_internal_arfs_in_gf14(
297
    GF_GROUP *const gf_group, FRAME_REORDER_INFO *arf_frame_stats,
298
    int *cur_frame_idx, int *cur_disp_idx, int *frame_ind,
299
    int *count_arf_frames, int *doh_gf_index_map, int start, int end,
300
0
    int layer_depth, int layer_with_parallel_encodes) {
301
0
  int index = (start + end - 1) / 2;
302
0
  gf_group->update_type[*frame_ind] = INTNL_ARF_UPDATE;
303
0
  gf_group->arf_src_offset[*frame_ind] = index - 1;
304
0
  gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
305
0
  gf_group->layer_depth[*frame_ind] = layer_depth;
306
0
  gf_group->frame_type[*frame_ind] = INTER_FRAME;
307
0
  gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
308
0
  gf_group->display_idx[*frame_ind] =
309
0
      (*cur_disp_idx) + gf_group->arf_src_offset[*frame_ind];
310
311
  // Update the display index of the current frame with its gf index.
312
0
  doh_gf_index_map[index] = *frame_ind;
313
0
  if (layer_with_parallel_encodes) {
314
0
    assert(layer_depth == 4);
315
    // Set frame_parallel_level of the first frame in the given layer depth
316
    // to 1.
317
0
    if (gf_group->layer_depth[(*frame_ind) - 1] != layer_depth) {
318
0
      gf_group->frame_parallel_level[*frame_ind] = 1;
319
0
    } else {
320
      // Set frame_parallel_level of the consecutive frame in the same given
321
      // layer depth to 2.
322
0
      assert(gf_group->frame_parallel_level[(*frame_ind) - 1] == 1);
323
0
      gf_group->frame_parallel_level[*frame_ind] = 2;
324
      // Set the display_idx of frame_parallel_level 1 frame in
325
      // gf_group->skip_frame_as_ref.
326
0
      gf_group->skip_frame_as_ref[*frame_ind] =
327
0
          gf_group->display_idx[(*frame_ind) - 1];
328
0
    }
329
0
  }
330
0
  ++(*frame_ind);
331
332
  // Update arf_frame_stats.
333
0
  fill_arf_frame_stats(arf_frame_stats, *count_arf_frames, index, start, end);
334
0
  ++(*count_arf_frames);
335
0
}
336
337
// Sets GF_GROUP params for all INTNL_ARF_UPDATE frames in the given layer
338
// dpeth.
339
static inline void set_params_for_cur_layer_frames(
340
    GF_GROUP *const gf_group, FRAME_REORDER_INFO *arf_frame_stats,
341
    int *cur_frame_idx, int *cur_disp_idx, int *frame_ind,
342
    int *count_arf_frames, int *doh_gf_index_map, int num_dir, int node_start,
343
0
    int node_end, int layer_depth) {
344
0
  assert(num_dir < 3);
345
0
  int start, end;
346
  // Iterate through the nodes in the previous layer depth.
347
0
  for (int i = node_start; i < node_end; i++) {
348
    // For each node, check if a frame can be coded as INTNL_ARF_UPDATE frame on
349
    // either direction.
350
0
    for (int dir = 0; dir < num_dir; dir++) {
351
      // Checks for a frame to the left of current node.
352
0
      if (dir == 0) {
353
0
        start = arf_frame_stats[i].start;
354
0
        end = arf_frame_stats[i].display_index;
355
0
      } else {
356
        // Checks for a frame to the right of current node.
357
0
        start = arf_frame_stats[i].display_index + 1;
358
0
        end = arf_frame_stats[i].end;
359
0
      }
360
0
      const int num_frames_to_process = end - start;
361
      // Checks if a frame can be coded as INTNL_ARF_UPDATE frame. If
362
      // num_frames_to_process is less than 3, then there are not enough frames
363
      // between 'start' and 'end' to create another level.
364
0
      if (num_frames_to_process >= 3) {
365
        // Flag to indicate the lower layer depths for which parallel encoding
366
        // is enabled. Currently enabled for layer 4 frames.
367
0
        int layer_with_parallel_encodes = layer_depth == 4;
368
0
        set_params_for_internal_arfs_in_gf14(
369
0
            gf_group, arf_frame_stats, cur_frame_idx, cur_disp_idx, frame_ind,
370
0
            count_arf_frames, doh_gf_index_map, start, end, layer_depth,
371
0
            layer_with_parallel_encodes);
372
0
      }
373
0
    }
374
0
  }
375
0
}
376
377
// Configures multi-layers of the GF_GROUP when consecutive encode of frames in
378
// the same layer depth is enbaled.
379
static inline void set_multi_layer_params_for_gf14(
380
    const TWO_PASS *twopass, const TWO_PASS_FRAME *twopass_frame,
381
    const PRIMARY_RATE_CONTROL *p_rc, FRAME_INFO *frame_info,
382
    GF_GROUP *const gf_group, FRAME_REORDER_INFO *arf_frame_stats,
383
    int *cur_frame_idx, int *frame_ind, int *count_arf_frames,
384
    int *doh_gf_index_map, int *parallel_frame_count, int *first_frame_index,
385
    int *cur_disp_index, int gf_interval, int layer_depth,
386
0
    int max_parallel_frames, const bool scale_max_boost) {
387
0
  assert(layer_depth == 2);
388
0
  assert(gf_group->max_layer_depth_allowed >= 4);
389
0
  int layer, node_start, node_end = 0;
390
  // Maximum layer depth excluding LF_UPDATE frames is 4 since applicable only
391
  // for gf-interval 14.
392
0
  const int max_layer_depth = 4;
393
  // Iterate through each layer depth starting from 2 till 'max_layer_depth'.
394
0
  for (layer = layer_depth; layer <= max_layer_depth; layer++) {
395
    // 'node_start' and 'node_end' indicate the number of nodes from the
396
    // previous layer depth to be considered. It also corresponds to the indices
397
    // of arf_frame_stats.
398
0
    node_start = node_end;
399
0
    node_end = (*count_arf_frames);
400
    // 'num_dir' indicates the number of directions to traverse w.r.t. a given
401
    // node in order to choose an INTNL_ARF_UPDATE frame. Layer depth 2 would
402
    // have only one frame and hence needs to traverse only in the left
403
    // direction w.r.t the node in the previous layer.
404
0
    int num_dir = layer == 2 ? 1 : 2;
405
0
    set_params_for_cur_layer_frames(gf_group, arf_frame_stats, cur_frame_idx,
406
0
                                    cur_disp_index, frame_ind, count_arf_frames,
407
0
                                    doh_gf_index_map, num_dir, node_start,
408
0
                                    node_end, layer);
409
0
  }
410
411
0
  for (int i = 1; i < gf_interval; i++) {
412
    // Since doh_gf_index_map is already populated for all INTNL_ARF_UPDATE
413
    // frames in the GF_GROUP, any frame with INVALID_IDX would correspond to an
414
    // LF_UPDATE frame.
415
0
    if (doh_gf_index_map[i] == INVALID_IDX) {
416
      // LF_UPDATE frames.
417
      // TODO(Remya): Correct start and end parameters passed to
418
      // set_params_for_leaf_frames() once encode reordering for gf-interval 14
419
      // is enbaled for parallel encode of lower layer frames.
420
0
      set_params_for_leaf_frames(
421
0
          twopass, twopass_frame, p_rc, frame_info, gf_group, cur_frame_idx,
422
0
          frame_ind, parallel_frame_count, max_parallel_frames, 1,
423
0
          first_frame_index, cur_disp_index, layer, 0, 0, scale_max_boost);
424
0
    } else {
425
      // In order to obtain the layer depths of INTNL_OVERLAY_UPDATE frames, get
426
      // the gf index of corresponding INTNL_ARF_UPDATE frames.
427
0
      int intnl_arf_index = doh_gf_index_map[i];
428
0
      int ld = gf_group->layer_depth[intnl_arf_index];
429
0
      set_params_for_intnl_overlay_frames(gf_group, cur_frame_idx, frame_ind,
430
0
                                          first_frame_index, cur_disp_index,
431
0
                                          ld);
432
0
    }
433
0
  }
434
0
}
435
436
// Set parameters for frames between 'start' and 'end' (excluding both).
437
static void set_multi_layer_params(
438
    const TWO_PASS *twopass, const TWO_PASS_FRAME *twopass_frame,
439
    GF_GROUP *const gf_group, const PRIMARY_RATE_CONTROL *p_rc,
440
    RATE_CONTROL *rc, FRAME_INFO *frame_info, int start, int end,
441
    int *cur_frame_idx, int *frame_ind, int *parallel_frame_count,
442
    int max_parallel_frames, int do_frame_parallel_encode,
443
    int *first_frame_index, int *cur_disp_idx, int layer_depth,
444
0
    const bool scale_max_boost) {
445
0
  const int num_frames_to_process = end - start;
446
447
  // Either we are at the last level of the pyramid, or we don't have enough
448
  // frames between 'l' and 'r' to create one more level.
449
0
  if (layer_depth > gf_group->max_layer_depth_allowed ||
450
0
      num_frames_to_process < 3) {
451
    // Leaf nodes.
452
0
    while (start < end) {
453
0
      gf_group->update_type[*frame_ind] = LF_UPDATE;
454
0
      gf_group->arf_src_offset[*frame_ind] = 0;
455
0
      gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
456
0
      gf_group->display_idx[*frame_ind] = *cur_disp_idx;
457
0
      gf_group->layer_depth[*frame_ind] = MAX_ARF_LAYERS;
458
0
      gf_group->arf_boost[*frame_ind] =
459
0
          av1_calc_arf_boost(twopass, twopass_frame, p_rc, frame_info, start,
460
0
                             end - start, 0, NULL, NULL, 0, scale_max_boost);
461
0
      gf_group->frame_type[*frame_ind] = INTER_FRAME;
462
0
      gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
463
0
      gf_group->max_layer_depth =
464
0
          AOMMAX(gf_group->max_layer_depth, layer_depth);
465
      // Set the level of parallelism for the LF_UPDATE frame.
466
0
      if (do_frame_parallel_encode) {
467
0
        set_frame_parallel_level(&gf_group->frame_parallel_level[*frame_ind],
468
0
                                 parallel_frame_count, max_parallel_frames);
469
        // Set LF_UPDATE frames as non-reference frames.
470
0
        gf_group->is_frame_non_ref[*frame_ind] = true;
471
0
      }
472
0
      set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
473
0
      ++(*frame_ind);
474
0
      ++(*cur_frame_idx);
475
0
      ++(*cur_disp_idx);
476
0
      ++start;
477
0
    }
478
0
  } else {
479
0
    const int m = (start + end - 1) / 2;
480
481
    // Internal ARF.
482
0
    gf_group->update_type[*frame_ind] = INTNL_ARF_UPDATE;
483
0
    gf_group->arf_src_offset[*frame_ind] = m - start;
484
0
    gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
485
0
    gf_group->display_idx[*frame_ind] =
486
0
        *cur_disp_idx + gf_group->arf_src_offset[*frame_ind];
487
0
    gf_group->layer_depth[*frame_ind] = layer_depth;
488
0
    gf_group->frame_type[*frame_ind] = INTER_FRAME;
489
0
    gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
490
491
0
    if (do_frame_parallel_encode) {
492
      // If max_parallel_frames is not exceeded and if the frame will not be
493
      // temporally filtered, encode the next internal ARF frame in parallel.
494
0
      if (*parallel_frame_count > 1 &&
495
0
          *parallel_frame_count <= max_parallel_frames) {
496
0
        if (gf_group->arf_src_offset[*frame_ind] < TF_LOOKAHEAD_IDX_THR)
497
0
          gf_group->frame_parallel_level[*frame_ind] = 2;
498
0
        *parallel_frame_count = 1;
499
0
      }
500
0
    }
501
0
    set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
502
503
    // Get the boost factor for intermediate ARF frames.
504
0
    gf_group->arf_boost[*frame_ind] =
505
0
        av1_calc_arf_boost(twopass, twopass_frame, p_rc, frame_info, m, end - m,
506
0
                           m - start, NULL, NULL, 0, scale_max_boost);
507
0
    ++(*frame_ind);
508
509
    // Frames displayed before this internal ARF.
510
0
    set_multi_layer_params(twopass, twopass_frame, gf_group, p_rc, rc,
511
0
                           frame_info, start, m, cur_frame_idx, frame_ind,
512
0
                           parallel_frame_count, max_parallel_frames,
513
0
                           do_frame_parallel_encode, first_frame_index,
514
0
                           cur_disp_idx, layer_depth + 1, scale_max_boost);
515
516
    // Overlay for internal ARF.
517
0
    gf_group->update_type[*frame_ind] = INTNL_OVERLAY_UPDATE;
518
0
    gf_group->arf_src_offset[*frame_ind] = 0;
519
0
    gf_group->cur_frame_idx[*frame_ind] = *cur_frame_idx;
520
0
    gf_group->display_idx[*frame_ind] = *cur_disp_idx;
521
0
    gf_group->arf_boost[*frame_ind] = 0;
522
0
    gf_group->layer_depth[*frame_ind] = layer_depth;
523
0
    gf_group->frame_type[*frame_ind] = INTER_FRAME;
524
0
    gf_group->refbuf_state[*frame_ind] = REFBUF_UPDATE;
525
526
0
    set_src_offset(gf_group, first_frame_index, *cur_frame_idx, *frame_ind);
527
0
    ++(*frame_ind);
528
0
    ++(*cur_frame_idx);
529
0
    ++(*cur_disp_idx);
530
531
    // Frames displayed after this internal ARF.
532
0
    set_multi_layer_params(twopass, twopass_frame, gf_group, p_rc, rc,
533
0
                           frame_info, m + 1, end, cur_frame_idx, frame_ind,
534
0
                           parallel_frame_count, max_parallel_frames,
535
0
                           do_frame_parallel_encode, first_frame_index,
536
0
                           cur_disp_idx, layer_depth + 1, scale_max_boost);
537
0
  }
538
0
}
539
540
static int construct_multi_layer_gf_structure(
541
    AV1_COMP *cpi, TWO_PASS *twopass, GF_GROUP *const gf_group,
542
    RATE_CONTROL *rc, FRAME_INFO *const frame_info, int baseline_gf_interval,
543
0
    FRAME_UPDATE_TYPE first_frame_update_type) {
544
0
  PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc;
545
  // TODO(angiebird): Why do we need "-1" here?
546
0
  const int gf_interval = baseline_gf_interval - 1;
547
0
  int frame_index = 0;
548
0
  int cur_frame_index = 0;
549
550
  // Set the display order hint for the first frame in the GF_GROUP.
551
0
  int cur_disp_index = (first_frame_update_type == KF_UPDATE)
552
0
                           ? 0
553
0
                           : cpi->common.current_frame.frame_number;
554
555
  // Initialize gf_group->frame_parallel_level, gf_group->is_frame_non_ref,
556
  // gf_group->src_offset and gf_group->is_frame_dropped with 0.
557
0
  memset(gf_group->frame_parallel_level, 0,
558
0
         sizeof(gf_group->frame_parallel_level));
559
0
  memset(gf_group->is_frame_non_ref, 0, sizeof(gf_group->is_frame_non_ref));
560
0
  memset(gf_group->src_offset, 0, sizeof(gf_group->src_offset));
561
0
  memset(gf_group->is_frame_dropped, 0, sizeof(gf_group->is_frame_dropped));
562
  // Initialize gf_group->skip_frame_refresh and gf_group->skip_frame_as_ref
563
  // with INVALID_IDX.
564
0
  memset(gf_group->skip_frame_refresh, INVALID_IDX,
565
0
         sizeof(gf_group->skip_frame_refresh));
566
0
  memset(gf_group->skip_frame_as_ref, INVALID_IDX,
567
0
         sizeof(gf_group->skip_frame_as_ref));
568
569
0
  int kf_decomp = cpi->oxcf.kf_cfg.enable_keyframe_filtering > 1;
570
  // This is a patch that fixes https://crbug.com/aomedia/3163
571
  // enable_keyframe_filtering > 1 will introduce an extra overlay frame at
572
  // key frame location. However when
573
  // baseline_gf_interval == MAX_STATIC_GF_GROUP_LENGTH, we can't
574
  // afford to have an extra overlay frame. Otherwise, the gf_group->size will
575
  // become MAX_STATIC_GF_GROUP_LENGTH + 1, which causes memory error.
576
  // A cheap solution is to turn of kf_decomp here.
577
  // TODO(angiebird): Find a systematic way to solve this issue.
578
0
  if (baseline_gf_interval == MAX_STATIC_GF_GROUP_LENGTH) {
579
0
    kf_decomp = 0;
580
0
  }
581
0
  if (first_frame_update_type == KF_UPDATE) {
582
0
    gf_group->update_type[frame_index] = kf_decomp ? ARF_UPDATE : KF_UPDATE;
583
0
    gf_group->arf_src_offset[frame_index] = 0;
584
0
    gf_group->cur_frame_idx[frame_index] = cur_frame_index;
585
0
    gf_group->layer_depth[frame_index] = 0;
586
0
    gf_group->frame_type[frame_index] = KEY_FRAME;
587
0
    gf_group->refbuf_state[frame_index] = REFBUF_RESET;
588
0
    gf_group->max_layer_depth = 0;
589
0
    gf_group->display_idx[frame_index] = cur_disp_index;
590
0
    if (!kf_decomp) cur_disp_index++;
591
0
    ++frame_index;
592
593
0
    if (kf_decomp) {
594
0
      gf_group->update_type[frame_index] = OVERLAY_UPDATE;
595
0
      gf_group->arf_src_offset[frame_index] = 0;
596
0
      gf_group->cur_frame_idx[frame_index] = cur_frame_index;
597
0
      gf_group->layer_depth[frame_index] = 0;
598
0
      gf_group->frame_type[frame_index] = INTER_FRAME;
599
0
      gf_group->refbuf_state[frame_index] = REFBUF_UPDATE;
600
0
      gf_group->max_layer_depth = 0;
601
0
      gf_group->display_idx[frame_index] = cur_disp_index;
602
0
      cur_disp_index++;
603
0
      ++frame_index;
604
0
    }
605
0
    cur_frame_index++;
606
0
  }
607
608
0
  if (first_frame_update_type == GF_UPDATE) {
609
0
    gf_group->update_type[frame_index] = GF_UPDATE;
610
0
    gf_group->arf_src_offset[frame_index] = 0;
611
0
    gf_group->cur_frame_idx[frame_index] = cur_frame_index;
612
0
    gf_group->layer_depth[frame_index] = 0;
613
0
    gf_group->frame_type[frame_index] = INTER_FRAME;
614
0
    gf_group->refbuf_state[frame_index] = REFBUF_UPDATE;
615
0
    gf_group->max_layer_depth = 0;
616
0
    gf_group->display_idx[frame_index] = cur_disp_index;
617
0
    cur_disp_index++;
618
0
    ++frame_index;
619
0
    ++cur_frame_index;
620
0
  }
621
622
  // ALTREF.
623
0
  const int use_altref = gf_group->max_layer_depth_allowed > 0;
624
0
  int is_fwd_kf = rc->frames_to_fwd_kf == gf_interval;
625
626
0
  const int sframe_dist = cpi->oxcf.kf_cfg.sframe_dist;
627
0
  const int sframe_mode = cpi->oxcf.kf_cfg.sframe_mode;
628
0
  const int sframe_enabled = (sframe_mode > 0) && (sframe_dist > 0);
629
630
0
  if (sframe_enabled) {
631
0
    switch (sframe_mode) {
632
0
      case 1: gf_group->is_sframe_due = use_altref; break;
633
0
      case 2:
634
0
        gf_group->is_sframe_due |=
635
0
            (frame_index && !(frame_index % sframe_dist));
636
0
        break;
637
0
    }
638
0
  }
639
640
0
  if (use_altref) {
641
0
    gf_group->update_type[frame_index] = ARF_UPDATE;
642
0
    gf_group->arf_src_offset[frame_index] = gf_interval - cur_frame_index;
643
0
    gf_group->cur_frame_idx[frame_index] = cur_frame_index;
644
0
    gf_group->layer_depth[frame_index] = 1;
645
0
    gf_group->arf_boost[frame_index] = cpi->ppi->p_rc.gfu_boost;
646
0
    gf_group->frame_type[frame_index] = is_fwd_kf                 ? KEY_FRAME
647
0
                                        : gf_group->is_sframe_due ? S_FRAME
648
0
                                                                  : INTER_FRAME;
649
0
    gf_group->is_sframe_due =
650
0
        sframe_enabled && gf_group->frame_type[frame_index] != S_FRAME;
651
0
    gf_group->refbuf_state[frame_index] = REFBUF_UPDATE;
652
0
    gf_group->max_layer_depth = 1;
653
0
    gf_group->arf_index = frame_index;
654
0
    gf_group->display_idx[frame_index] =
655
0
        cur_disp_index + gf_group->arf_src_offset[frame_index];
656
0
    ++frame_index;
657
0
  } else {
658
0
    gf_group->arf_index = -1;
659
0
  }
660
661
  // Flag to indicate if multi-layer configuration is complete.
662
0
  int is_multi_layer_configured = 0;
663
664
  // Running count of no. of frames that is part of a given parallel
665
  // encode set in a gf_group. Value of 1 indicates no parallel encode.
666
0
  int parallel_frame_count = 1;
667
  // Enable parallel encode of frames if gf_group has a multi-layer pyramid
668
  // structure with minimum 4 layers.
669
0
  int do_frame_parallel_encode = (cpi->ppi->num_fp_contexts > 1 && use_altref &&
670
0
                                  gf_group->max_layer_depth_allowed >= 4);
671
672
0
  int first_frame_index = cur_frame_index;
673
0
  const bool scale_max_boost = (cpi->oxcf.mode != REALTIME);
674
675
0
  if (do_frame_parallel_encode) {
676
    // construct_multi_layer_gf_structure() takes the input parameter
677
    // 'gf_interval' as p_rc->baseline_gf_interval - 1 . Below code computes the
678
    // actual GF_GROUP length by compensating for this offset.
679
0
    int actual_gf_length = ((first_frame_update_type == KF_UPDATE) ||
680
0
                            (first_frame_update_type == GF_UPDATE))
681
0
                               ? gf_interval
682
0
                               : gf_interval + 1;
683
684
    // In order to facilitate parallel encoding of frames in lower layer depths,
685
    // encode reordering is done. Currently encode reordering is enabled only
686
    // for gf-intervals 16 and 32. NOTE: Since the buffer holding the
687
    // reference frames is of size 8 (ref_frame_map[REF_FRAMES]), there is a
688
    // limitation on the number of hidden frames possible at any given point and
689
    // hence the reordering is enabled only for gf-intervals 16 and 32.
690
    // Disabling encode reordering for gf-interval 14 since some cross-frame
691
    // dependencies related to temporal filtering for FPMT is currently not
692
    // handled.
693
0
    int disable_gf14_reorder = 1;
694
0
    if (actual_gf_length == 14 && !disable_gf14_reorder) {
695
      // This array holds the gf index of INTNL_ARF_UPDATE frames in the slot
696
      // corresponding to their display order hint. This is used while
697
      // configuring the LF_UPDATE frames and INTNL_OVERLAY_UPDATE frames.
698
0
      int doh_gf_index_map[FIXED_GF_INTERVAL];
699
      // Initialize doh_gf_index_map with INVALID_IDX.
700
0
      memset(&doh_gf_index_map[0], INVALID_IDX,
701
0
             (sizeof(doh_gf_index_map[0]) * FIXED_GF_INTERVAL));
702
703
0
      FRAME_REORDER_INFO arf_frame_stats[REF_FRAMES - 1];
704
      // Store the stats corresponding to layer 1 frame.
705
0
      fill_arf_frame_stats(arf_frame_stats, 0, actual_gf_length, 1,
706
0
                           actual_gf_length);
707
0
      int count_arf_frames = 1;
708
709
      // Sets multi-layer params for gf-interval 14 to consecutively encode
710
      // frames in the same layer depth, i.e., encode order would be 0-> 14->
711
      // 7-> 3-> 10-> 5-> 12-> 1-> 2-> 4-> 6-> 8-> 9-> 11-> 13.
712
      // TODO(Remya): Set GF_GROUP param 'arf_boost' for all frames.
713
0
      set_multi_layer_params_for_gf14(
714
0
          twopass, &cpi->twopass_frame, p_rc, frame_info, gf_group,
715
0
          arf_frame_stats, &cur_frame_index, &frame_index, &count_arf_frames,
716
0
          doh_gf_index_map, &parallel_frame_count, &first_frame_index,
717
0
          &cur_disp_index, actual_gf_length, use_altref + 1,
718
0
          cpi->ppi->num_fp_contexts, scale_max_boost);
719
720
      // Set gf_group->skip_frame_refresh.
721
0
      for (int i = 0; i < actual_gf_length; i++) {
722
0
        int count = 0;
723
0
        if (gf_group->update_type[i] == INTNL_ARF_UPDATE) {
724
0
          for (int j = 0; j < i; j++) {
725
            // Store the display order hint of the frames which would not
726
            // have been displayed at the encode call of frame 'i'.
727
0
            if ((gf_group->display_idx[j] < gf_group->display_idx[i]) &&
728
0
                gf_group->update_type[j] == INTNL_ARF_UPDATE) {
729
0
              gf_group->skip_frame_refresh[i][count++] =
730
0
                  gf_group->display_idx[j];
731
0
            }
732
0
          }
733
0
        }
734
0
      }
735
0
    } else {
736
      // Set layer depth threshold for reordering as per the gf length.
737
0
      int depth_thr = (actual_gf_length == 16)   ? 3
738
0
                      : (actual_gf_length == 32) ? 4
739
0
                                                 : INT_MAX;
740
741
0
      set_multi_layer_params_for_fp(
742
0
          twopass, &cpi->twopass_frame, gf_group, p_rc, rc, frame_info,
743
0
          cur_frame_index, gf_interval, &cur_frame_index, &frame_index,
744
0
          &parallel_frame_count, cpi->ppi->num_fp_contexts,
745
0
          do_frame_parallel_encode, &first_frame_index, depth_thr,
746
0
          &cur_disp_index, use_altref + 1, scale_max_boost);
747
0
    }
748
0
    is_multi_layer_configured = 1;
749
0
  }
750
751
  // Rest of the frames.
752
0
  if (!is_multi_layer_configured)
753
0
    set_multi_layer_params(twopass, &cpi->twopass_frame, gf_group, p_rc, rc,
754
0
                           frame_info, cur_frame_index, gf_interval,
755
0
                           &cur_frame_index, &frame_index,
756
0
                           &parallel_frame_count, cpi->ppi->num_fp_contexts,
757
0
                           do_frame_parallel_encode, &first_frame_index,
758
0
                           &cur_disp_index, use_altref + 1, scale_max_boost);
759
760
0
  if (use_altref) {
761
0
    gf_group->update_type[frame_index] = OVERLAY_UPDATE;
762
0
    gf_group->arf_src_offset[frame_index] = 0;
763
0
    gf_group->cur_frame_idx[frame_index] = cur_frame_index;
764
0
    gf_group->layer_depth[frame_index] = MAX_ARF_LAYERS;
765
0
    gf_group->arf_boost[frame_index] = NORMAL_BOOST;
766
0
    gf_group->frame_type[frame_index] = INTER_FRAME;
767
0
    gf_group->refbuf_state[frame_index] =
768
0
        is_fwd_kf ? REFBUF_RESET : REFBUF_UPDATE;
769
0
    gf_group->display_idx[frame_index] = cur_disp_index;
770
0
    ++frame_index;
771
0
  } else {
772
0
    for (; cur_frame_index <= gf_interval; ++cur_frame_index) {
773
0
      gf_group->update_type[frame_index] = LF_UPDATE;
774
0
      gf_group->arf_src_offset[frame_index] = 0;
775
0
      gf_group->cur_frame_idx[frame_index] = cur_frame_index;
776
0
      gf_group->layer_depth[frame_index] = MAX_ARF_LAYERS;
777
0
      gf_group->arf_boost[frame_index] = NORMAL_BOOST;
778
0
      gf_group->frame_type[frame_index] = INTER_FRAME;
779
0
      gf_group->refbuf_state[frame_index] = REFBUF_UPDATE;
780
0
      gf_group->max_layer_depth = AOMMAX(gf_group->max_layer_depth, 2);
781
0
      set_src_offset(gf_group, &first_frame_index, cur_frame_index,
782
0
                     frame_index);
783
0
      gf_group->display_idx[frame_index] = cur_disp_index;
784
0
      cur_disp_index++;
785
0
      ++frame_index;
786
0
    }
787
0
  }
788
0
  if (do_frame_parallel_encode) {
789
    // Iterate through the gf_group and reset frame_parallel_level to 0 in case
790
    // a frame is marked as frame_parallel_level 1 with no subsequent
791
    // frame_parallel_level 2 frame(s).
792
0
    int level1_frame_idx = INT_MAX;
793
0
    int level2_frame_count = 0;
794
0
    for (int frame_idx = 0; frame_idx < frame_index; frame_idx++) {
795
0
      if (gf_group->frame_parallel_level[frame_idx] == 1) {
796
        // Set frame_parallel_level to 0 if only one frame is present in a
797
        // parallel encode set.
798
0
        if (level1_frame_idx != INT_MAX && !level2_frame_count)
799
0
          gf_group->frame_parallel_level[level1_frame_idx] = 0;
800
        // Book-keep frame_idx of frame_parallel_level 1 frame and reset the
801
        // count of frame_parallel_level 2 frames in the corresponding parallel
802
        // encode set.
803
0
        level1_frame_idx = frame_idx;
804
0
        level2_frame_count = 0;
805
0
      }
806
0
      if (gf_group->frame_parallel_level[frame_idx] == 2) level2_frame_count++;
807
0
    }
808
    // If frame_parallel_level is set to 1 for the last LF_UPDATE
809
    // frame in the gf_group, reset it to zero since there are no subsequent
810
    // frames in the gf_group.
811
0
    if (gf_group->frame_parallel_level[frame_index - 2] == 1) {
812
0
      assert(gf_group->update_type[frame_index - 2] == LF_UPDATE);
813
0
      gf_group->frame_parallel_level[frame_index - 2] = 0;
814
0
    }
815
0
  }
816
817
0
  for (int gf_idx = frame_index; gf_idx < MAX_STATIC_GF_GROUP_LENGTH;
818
0
       ++gf_idx) {
819
0
    gf_group->update_type[gf_idx] = LF_UPDATE;
820
0
    gf_group->arf_src_offset[gf_idx] = 0;
821
0
    gf_group->cur_frame_idx[gf_idx] = gf_idx;
822
0
    gf_group->layer_depth[gf_idx] = MAX_ARF_LAYERS;
823
0
    gf_group->arf_boost[gf_idx] = NORMAL_BOOST;
824
0
    gf_group->frame_type[gf_idx] = INTER_FRAME;
825
0
    gf_group->refbuf_state[gf_idx] = REFBUF_UPDATE;
826
0
    gf_group->max_layer_depth = AOMMAX(gf_group->max_layer_depth, 2);
827
0
  }
828
829
0
  return frame_index;
830
0
}
831
832
0
static void set_ld_layer_depth(GF_GROUP *gf_group, int gop_length) {
833
0
  int log_gop_length = 0;
834
0
  while ((1 << log_gop_length) < gop_length) {
835
0
    ++log_gop_length;
836
0
  }
837
838
0
  for (int gf_index = 0; gf_index < gf_group->size; ++gf_index) {
839
0
    int count = 0;
840
    // Find the trailing zeros
841
0
    for (; count < MAX_ARF_LAYERS; ++count) {
842
0
      if ((gf_index >> count) & 0x01) break;
843
0
    }
844
0
    gf_group->layer_depth[gf_index] = AOMMAX(log_gop_length - count, 0);
845
0
  }
846
0
  gf_group->max_layer_depth = AOMMIN(log_gop_length, MAX_ARF_LAYERS);
847
0
}
848
849
static void construct_gop_structure_from_rc(
850
0
    GF_GROUP *gf_group, aom_rc_gop_decision_t *rc_gop_decision) {
851
0
  gf_group->size = rc_gop_decision->gop_frame_count;
852
0
  for (int frame_index = 0; frame_index < gf_group->size; ++frame_index) {
853
0
    aom_rc_gop_frame_t *gop_frame_rc =
854
0
        &rc_gop_decision->gop_frame_list[frame_index];
855
0
    gf_group->update_type[frame_index] = gop_frame_rc->update_type;
856
0
    gf_group->layer_depth[frame_index] = gop_frame_rc->layer_depth;
857
0
    gf_group->update_ref_idx[frame_index] = gop_frame_rc->update_ref_idx;
858
    // `display_idx` means differently in libaom and RC.
859
    // - in libaom: it is display order index in the GOP, equivalent to
860
    //              `order_idx` in RC
861
    // - in RC: it is the number of display frames precedeing this frame, which
862
    //          is equivalent to `cur_frame_idx` in libaom.
863
0
    gf_group->display_idx[frame_index] = gop_frame_rc->order_idx;
864
0
    gf_group->cur_frame_idx[frame_index] = gop_frame_rc->display_idx;
865
0
    switch (gf_group->update_type[frame_index]) {
866
0
      case LF_UPDATE:
867
0
      case INTNL_OVERLAY_UPDATE:
868
0
        gf_group->arf_src_offset[frame_index] = 0;
869
0
        break;
870
0
      case ARF_UPDATE:
871
0
      case INTNL_ARF_UPDATE:
872
0
        gf_group->arf_src_offset[frame_index] =
873
0
            gop_frame_rc->order_idx - gop_frame_rc->display_idx;
874
0
        break;
875
0
      default: gf_group->arf_src_offset[frame_index] = 0;
876
0
    }
877
0
    gf_group->frame_type[frame_index] =
878
0
        gop_frame_rc->is_key_frame ? KEY_FRAME : INTER_FRAME;
879
0
    gf_group->refbuf_state[frame_index] =
880
0
        gop_frame_rc->is_key_frame ? REFBUF_RESET : REFBUF_UPDATE;
881
    // Always override the ref frame map from external RC.
882
0
    gf_group->use_ext_ref_frame_map[frame_index] = 1;
883
0
    for (int i = 0; i < REF_FRAMES; ++i) {
884
0
      gf_group->ref_frame_list[frame_index][i] = INVALID_IDX;
885
0
    }
886
0
    for (int i = 0; i < AOM_RC_MAX_REF_FRAMES; ++i) {
887
0
      int ref_name = gop_frame_rc->ref_frame_list.name[i];
888
0
      int buf_idx = gop_frame_rc->ref_frame_list.index[i];
889
0
      if (ref_name >= LAST_FRAME && ref_name <= ALTREF_FRAME) {
890
0
        gf_group->ref_frame_list[frame_index][ref_name] = (int8_t)buf_idx;
891
0
      }
892
0
    }
893
0
  }
894
0
}
895
896
0
void av1_gop_setup_structure(AV1_COMP *cpi, const int is_final_pass) {
897
0
  RATE_CONTROL *const rc = &cpi->rc;
898
0
  PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc;
899
0
  GF_GROUP *const gf_group = &cpi->ppi->gf_group;
900
0
  TWO_PASS *const twopass = &cpi->ppi->twopass;
901
0
  FRAME_INFO *const frame_info = &cpi->frame_info;
902
0
  const int key_frame = rc->frames_since_key == 0;
903
0
  FRAME_UPDATE_TYPE first_frame_update_type = ARF_UPDATE;
904
905
  // define_gf_group() is called twice in av1_set_second_pass_params() with
906
  // `is_final_pass` being 0 and 1 separately. But only one GOP can be advanced
907
  // with the external RC. That is only done when `is_final_pass` is true.
908
0
  if (cpi->ext_ratectrl.ready &&
909
0
      (cpi->ext_ratectrl.funcs.rc_type & AOM_RC_GOP) != 0 &&
910
0
      cpi->ext_ratectrl.funcs.get_gop_decision != NULL && is_final_pass) {
911
0
    aom_rc_gop_decision_t gop_decision;
912
0
    aom_codec_err_t codec_status =
913
0
        av1_extrc_get_gop_decision(&cpi->ext_ratectrl, &gop_decision);
914
0
    if (codec_status != AOM_CODEC_OK) {
915
0
      aom_internal_error(cpi->common.error, codec_status,
916
0
                         "av1_extrc_get_gop_decision() failed");
917
0
    }
918
0
    construct_gop_structure_from_rc(gf_group, &gop_decision);
919
0
    if (gop_decision.gop_frame_list[0].is_key_frame) {
920
0
      rc->frames_since_key = 0;
921
0
    }
922
0
  } else {
923
0
    if (key_frame) {
924
0
      first_frame_update_type = KF_UPDATE;
925
0
      if (cpi->oxcf.kf_max_pyr_height != -1) {
926
0
        gf_group->max_layer_depth_allowed = AOMMIN(
927
0
            cpi->oxcf.kf_max_pyr_height, gf_group->max_layer_depth_allowed);
928
0
      }
929
0
    } else if (!cpi->ppi->gf_state.arf_gf_boost_lst) {
930
0
      first_frame_update_type = GF_UPDATE;
931
0
    }
932
933
0
    if (cpi->oxcf.algo_cfg.sharpness == 3)
934
0
      gf_group->max_layer_depth_allowed =
935
0
          AOMMIN(gf_group->max_layer_depth_allowed, 2);
936
937
0
    gf_group->size = construct_multi_layer_gf_structure(
938
0
        cpi, twopass, gf_group, rc, frame_info, p_rc->baseline_gf_interval,
939
0
        first_frame_update_type);
940
941
0
    if (gf_group->max_layer_depth_allowed == 0)
942
0
      set_ld_layer_depth(gf_group, p_rc->baseline_gf_interval);
943
0
  }
944
0
}
945
946
int av1_gop_check_forward_keyframe(const GF_GROUP *gf_group,
947
0
                                   int gf_frame_index) {
948
0
  return gf_group->frame_type[gf_frame_index] == KEY_FRAME &&
949
0
         gf_group->refbuf_state[gf_frame_index] == REFBUF_UPDATE;
950
0
}
951
952
0
int av1_gop_is_second_arf(const GF_GROUP *gf_group, int gf_frame_index) {
953
0
  const int arf_src_offset = gf_group->arf_src_offset[gf_frame_index];
954
  // TODO(angiebird): when gf_group->size == 32, it's possble to
955
  // have "two" second arf. Check if this is acceptable.
956
0
  if (gf_group->update_type[gf_frame_index] == INTNL_ARF_UPDATE &&
957
0
      arf_src_offset >= TF_LOOKAHEAD_IDX_THR) {
958
0
    return 1;
959
0
  }
960
0
  return 0;
961
0
}