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