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 "config/aom_config.h"
15 #include "config/aom_scale_rtcd.h"
16
17 #include "aom/aom_codec.h"
18 #include "aom/aom_encoder.h"
19
20 #include "aom_ports/system_state.h"
21
22 #if CONFIG_MISMATCH_DEBUG
23 #include "aom_util/debug_util.h"
24 #endif // CONFIG_MISMATCH_DEBUG
25
26 #include "av1/common/onyxc_int.h"
27
28 #include "av1/encoder/encoder.h"
29 #include "av1/encoder/encode_strategy.h"
30 #include "av1/encoder/firstpass.h"
31 #include "av1/encoder/pass2_strategy.h"
32 #include "av1/encoder/temporal_filter.h"
33 #include "av1/encoder/tpl_model.h"
34
av1_configure_buffer_updates(AV1_COMP * const cpi,EncodeFrameParams * const frame_params,const FRAME_UPDATE_TYPE type,int force_refresh_all)35 void av1_configure_buffer_updates(AV1_COMP *const cpi,
36 EncodeFrameParams *const frame_params,
37 const FRAME_UPDATE_TYPE type,
38 int force_refresh_all) {
39 // NOTE(weitinglin): Should we define another function to take care of
40 // cpi->rc.is_$Source_Type to make this function as it is in the comment?
41
42 cpi->rc.is_src_frame_alt_ref = 0;
43 cpi->rc.is_src_frame_internal_arf = 0;
44
45 switch (type) {
46 case KF_UPDATE:
47 frame_params->refresh_last_frame = 1;
48 frame_params->refresh_golden_frame = 1;
49 frame_params->refresh_bwd_ref_frame = 1;
50 frame_params->refresh_alt2_ref_frame = 1;
51 frame_params->refresh_alt_ref_frame = 1;
52 break;
53
54 case LF_UPDATE:
55 frame_params->refresh_last_frame = 1;
56 frame_params->refresh_golden_frame = 0;
57 frame_params->refresh_bwd_ref_frame = 0;
58 frame_params->refresh_alt2_ref_frame = 0;
59 frame_params->refresh_alt_ref_frame = 0;
60 break;
61
62 case GF_UPDATE:
63 // TODO(zoeliu): To further investigate whether 'refresh_last_frame' is
64 // needed.
65 frame_params->refresh_last_frame = 1;
66 frame_params->refresh_golden_frame = 1;
67 frame_params->refresh_bwd_ref_frame = 0;
68 frame_params->refresh_alt2_ref_frame = 0;
69 frame_params->refresh_alt_ref_frame = 0;
70 break;
71
72 case OVERLAY_UPDATE:
73 frame_params->refresh_last_frame = 0;
74 frame_params->refresh_golden_frame = 1;
75 frame_params->refresh_bwd_ref_frame = 0;
76 frame_params->refresh_alt2_ref_frame = 0;
77 frame_params->refresh_alt_ref_frame = 0;
78
79 cpi->rc.is_src_frame_alt_ref = 1;
80 break;
81
82 case ARF_UPDATE:
83 frame_params->refresh_last_frame = 0;
84 frame_params->refresh_golden_frame = 0;
85 // NOTE: BWDREF does not get updated along with ALTREF_FRAME.
86 frame_params->refresh_bwd_ref_frame = 0;
87 frame_params->refresh_alt2_ref_frame = 0;
88 frame_params->refresh_alt_ref_frame = 1;
89 break;
90
91 case INTNL_OVERLAY_UPDATE:
92 frame_params->refresh_last_frame = 1;
93 frame_params->refresh_golden_frame = 0;
94 frame_params->refresh_bwd_ref_frame = 0;
95 frame_params->refresh_alt2_ref_frame = 0;
96 frame_params->refresh_alt_ref_frame = 0;
97
98 cpi->rc.is_src_frame_alt_ref = 1;
99 cpi->rc.is_src_frame_internal_arf = 1;
100 break;
101
102 case INTNL_ARF_UPDATE:
103 frame_params->refresh_last_frame = 0;
104 frame_params->refresh_golden_frame = 0;
105 if (cpi->oxcf.pass == 2) {
106 frame_params->refresh_bwd_ref_frame = 1;
107 frame_params->refresh_alt2_ref_frame = 0;
108 } else {
109 frame_params->refresh_bwd_ref_frame = 0;
110 frame_params->refresh_alt2_ref_frame = 1;
111 }
112 frame_params->refresh_alt_ref_frame = 0;
113 break;
114
115 default: assert(0); break;
116 }
117
118 if (cpi->ext_refresh_frame_flags_pending &&
119 (cpi->oxcf.pass == 0 || cpi->oxcf.pass == 2)) {
120 frame_params->refresh_last_frame = cpi->ext_refresh_last_frame;
121 frame_params->refresh_golden_frame = cpi->ext_refresh_golden_frame;
122 frame_params->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
123 frame_params->refresh_bwd_ref_frame = cpi->ext_refresh_bwd_ref_frame;
124 frame_params->refresh_alt2_ref_frame = cpi->ext_refresh_alt2_ref_frame;
125 }
126
127 if (force_refresh_all) {
128 frame_params->refresh_last_frame = 1;
129 frame_params->refresh_golden_frame = 1;
130 frame_params->refresh_bwd_ref_frame = 1;
131 frame_params->refresh_alt2_ref_frame = 1;
132 frame_params->refresh_alt_ref_frame = 1;
133 }
134 }
135
set_additional_frame_flags(const AV1_COMMON * const cm,unsigned int * const frame_flags)136 static void set_additional_frame_flags(const AV1_COMMON *const cm,
137 unsigned int *const frame_flags) {
138 if (frame_is_intra_only(cm)) *frame_flags |= FRAMEFLAGS_INTRAONLY;
139 if (frame_is_sframe(cm)) *frame_flags |= FRAMEFLAGS_SWITCH;
140 if (cm->error_resilient_mode) *frame_flags |= FRAMEFLAGS_ERROR_RESILIENT;
141 }
142
update_keyframe_counters(AV1_COMP * cpi)143 static INLINE void update_keyframe_counters(AV1_COMP *cpi) {
144 if (cpi->common.show_frame) {
145 if (!cpi->common.show_existing_frame || cpi->rc.is_src_frame_alt_ref ||
146 cpi->common.current_frame.frame_type == KEY_FRAME) {
147 // If this is a show_existing_frame with a source other than altref,
148 // or if it is not a displayed forward keyframe, the keyframe update
149 // counters were incremented when it was originally encoded.
150 cpi->rc.frames_since_key++;
151 cpi->rc.frames_to_key--;
152 }
153 }
154 }
155
is_frame_droppable(const AV1_COMP * const cpi)156 static INLINE int is_frame_droppable(const AV1_COMP *const cpi) {
157 return !(cpi->refresh_alt_ref_frame || cpi->refresh_alt2_ref_frame ||
158 cpi->refresh_bwd_ref_frame || cpi->refresh_golden_frame ||
159 cpi->refresh_last_frame);
160 }
161
update_frames_till_gf_update(AV1_COMP * cpi)162 static INLINE void update_frames_till_gf_update(AV1_COMP *cpi) {
163 // TODO(weitinglin): Updating this counter for is_frame_droppable
164 // is a work-around to handle the condition when a frame is drop.
165 // We should fix the cpi->common.show_frame flag
166 // instead of checking the other condition to update the counter properly.
167 if (cpi->common.show_frame || is_frame_droppable(cpi)) {
168 // Decrement count down till next gf
169 if (cpi->rc.frames_till_gf_update_due > 0)
170 cpi->rc.frames_till_gf_update_due--;
171 }
172 }
173
update_twopass_gf_group_index(AV1_COMP * cpi)174 static INLINE void update_twopass_gf_group_index(AV1_COMP *cpi) {
175 // Increment the gf group index ready for the next frame. If this is
176 // a show_existing_frame with a source other than altref, or if it is not
177 // a displayed forward keyframe, the index was incremented when it was
178 // originally encoded.
179 if (!cpi->common.show_existing_frame || cpi->rc.is_src_frame_alt_ref ||
180 cpi->common.current_frame.frame_type == KEY_FRAME) {
181 ++cpi->twopass.gf_group.index;
182 }
183 }
184
update_rc_counts(AV1_COMP * cpi)185 static void update_rc_counts(AV1_COMP *cpi) {
186 update_keyframe_counters(cpi);
187 update_frames_till_gf_update(cpi);
188 if (cpi->oxcf.pass == 2) update_twopass_gf_group_index(cpi);
189 }
190
check_show_existing_frame(AV1_COMP * const cpi,EncodeFrameParams * const frame_params)191 static void check_show_existing_frame(AV1_COMP *const cpi,
192 EncodeFrameParams *const frame_params) {
193 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
194 AV1_COMMON *const cm = &cpi->common;
195 const FRAME_UPDATE_TYPE frame_update_type =
196 gf_group->update_type[gf_group->index];
197 const int which_arf = (gf_group->arf_update_idx[gf_group->index] > 0);
198
199 if (cm->show_existing_frame == 1) {
200 frame_params->show_existing_frame = 0;
201 } else if (cpi->is_arf_filter_off[which_arf] &&
202 (frame_update_type == OVERLAY_UPDATE ||
203 frame_update_type == INTNL_OVERLAY_UPDATE)) {
204 // Other parameters related to OVERLAY_UPDATE will be taken care of
205 // in av1_get_second_pass_params(cpi)
206 frame_params->show_existing_frame = 1;
207 frame_params->existing_fb_idx_to_show =
208 (frame_update_type == OVERLAY_UPDATE)
209 ? get_ref_frame_map_idx(cm, ALTREF_FRAME)
210 : get_ref_frame_map_idx(cm, BWDREF_FRAME);
211 }
212 }
213
set_ext_overrides(AV1_COMP * const cpi,EncodeFrameParams * const frame_params)214 static void set_ext_overrides(AV1_COMP *const cpi,
215 EncodeFrameParams *const frame_params) {
216 // Overrides the defaults with the externally supplied values with
217 // av1_update_reference() and av1_update_entropy() calls
218 // Note: The overrides are valid only for the next frame passed
219 // to av1_encode_lowlevel()
220
221 AV1_COMMON *const cm = &cpi->common;
222
223 if (cpi->ext_use_s_frame) {
224 frame_params->frame_type = S_FRAME;
225 }
226
227 if (cpi->ext_refresh_frame_context_pending) {
228 cm->refresh_frame_context = cpi->ext_refresh_frame_context;
229 cpi->ext_refresh_frame_context_pending = 0;
230 }
231 cm->allow_ref_frame_mvs = cpi->ext_use_ref_frame_mvs;
232
233 frame_params->error_resilient_mode = cpi->ext_use_error_resilient;
234 // A keyframe is already error resilient and keyframes with
235 // error_resilient_mode interferes with the use of show_existing_frame
236 // when forward reference keyframes are enabled.
237 frame_params->error_resilient_mode &= frame_params->frame_type != KEY_FRAME;
238 // For bitstream conformance, s-frames must be error-resilient
239 frame_params->error_resilient_mode |= frame_params->frame_type == S_FRAME;
240 }
241
get_ref_frame_flags(const AV1_COMP * const cpi)242 static int get_ref_frame_flags(const AV1_COMP *const cpi) {
243 const AV1_COMMON *const cm = &cpi->common;
244
245 const RefCntBuffer *last_buf = get_ref_frame_buf(cm, LAST_FRAME);
246 const RefCntBuffer *last2_buf = get_ref_frame_buf(cm, LAST2_FRAME);
247 const RefCntBuffer *last3_buf = get_ref_frame_buf(cm, LAST3_FRAME);
248 const RefCntBuffer *golden_buf = get_ref_frame_buf(cm, GOLDEN_FRAME);
249 const RefCntBuffer *bwd_buf = get_ref_frame_buf(cm, BWDREF_FRAME);
250 const RefCntBuffer *alt2_buf = get_ref_frame_buf(cm, ALTREF2_FRAME);
251 const RefCntBuffer *alt_buf = get_ref_frame_buf(cm, ALTREF_FRAME);
252
253 // No.1 Priority: LAST_FRAME
254 const int last2_is_last = (last2_buf == last_buf);
255 const int last3_is_last = (last3_buf == last_buf);
256 const int gld_is_last = (golden_buf == last_buf);
257 const int bwd_is_last = (bwd_buf == last_buf);
258 const int alt2_is_last = (alt2_buf == last_buf);
259 const int alt_is_last = (alt_buf == last_buf);
260
261 // No.2 Priority: ALTREF_FRAME
262 const int last2_is_alt = (last2_buf == alt_buf);
263 const int last3_is_alt = (last3_buf == alt_buf);
264 const int gld_is_alt = (golden_buf == alt_buf);
265 const int bwd_is_alt = (bwd_buf == alt_buf);
266 const int alt2_is_alt = (alt2_buf == alt_buf);
267
268 // No.3 Priority: LAST2_FRAME
269 const int last3_is_last2 = (last3_buf == last2_buf);
270 const int gld_is_last2 = (golden_buf == last2_buf);
271 const int bwd_is_last2 = (bwd_buf == last2_buf);
272 const int alt2_is_last2 = (alt2_buf == last2_buf);
273
274 // No.4 Priority: LAST3_FRAME
275 const int gld_is_last3 = (golden_buf == last3_buf);
276 const int bwd_is_last3 = (bwd_buf == last3_buf);
277 const int alt2_is_last3 = (alt2_buf == last3_buf);
278
279 // No.5 Priority: GOLDEN_FRAME
280 const int bwd_is_gld = (bwd_buf == golden_buf);
281 const int alt2_is_gld = (alt2_buf == golden_buf);
282
283 // No.6 Priority: BWDREF_FRAME
284 const int alt2_is_bwd = (alt2_buf == bwd_buf);
285
286 // No.7 Priority: ALTREF2_FRAME
287
288 // cpi->ext_ref_frame_flags allows certain reference types to be disabled
289 // by the external interface. These are set by av1_apply_encoding_flags().
290 // Start with what the external interface allows, then suppress any reference
291 // types which we have found to be duplicates.
292
293 int flags = cpi->ext_ref_frame_flags;
294
295 if (cpi->rc.frames_till_gf_update_due == INT_MAX) flags &= ~AOM_GOLD_FLAG;
296
297 if (alt_is_last) flags &= ~AOM_ALT_FLAG;
298
299 if (last2_is_last || last2_is_alt) flags &= ~AOM_LAST2_FLAG;
300
301 if (last3_is_last || last3_is_alt || last3_is_last2) flags &= ~AOM_LAST3_FLAG;
302
303 if (gld_is_last || gld_is_alt || gld_is_last2 || gld_is_last3)
304 flags &= ~AOM_GOLD_FLAG;
305
306 if ((bwd_is_last || bwd_is_alt || bwd_is_last2 || bwd_is_last3 || bwd_is_gld))
307 flags &= ~AOM_BWD_FLAG;
308
309 if ((alt2_is_last || alt2_is_alt || alt2_is_last2 || alt2_is_last3 ||
310 alt2_is_gld || alt2_is_bwd))
311 flags &= ~AOM_ALT2_FLAG;
312
313 return flags;
314 }
315
get_current_frame_ref_type(const AV1_COMP * const cpi,const EncodeFrameParams * const frame_params)316 static int get_current_frame_ref_type(
317 const AV1_COMP *const cpi, const EncodeFrameParams *const frame_params) {
318 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
319 // We choose the reference "type" of this frame from the flags which indicate
320 // which reference frames will be refreshed by it. More than one of these
321 // flags may be set, so the order here implies an order of precedence.
322 // This is just used to choose the primary_ref_frame (as the most recent
323 // reference buffer of the same reference-type as the current frame)
324
325 const int intra_only = frame_params->frame_type == KEY_FRAME ||
326 frame_params->frame_type == INTRA_ONLY_FRAME;
327 if (intra_only || frame_params->error_resilient_mode ||
328 cpi->ext_use_primary_ref_none)
329 return REGULAR_FRAME;
330 else if (gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE)
331 return INTERNAL_ARF_FRAME;
332 else if (frame_params->refresh_alt_ref_frame)
333 return ARF_FRAME;
334 else if (cpi->rc.is_src_frame_alt_ref)
335 return OVERLAY_FRAME;
336 else if (frame_params->refresh_golden_frame)
337 return GLD_FRAME;
338 else if (frame_params->refresh_bwd_ref_frame)
339 return BRF_FRAME;
340 else
341 return REGULAR_FRAME;
342 }
343
choose_primary_ref_frame(const AV1_COMP * const cpi,const EncodeFrameParams * const frame_params)344 static int choose_primary_ref_frame(
345 const AV1_COMP *const cpi, const EncodeFrameParams *const frame_params) {
346 const AV1_COMMON *const cm = &cpi->common;
347
348 const int intra_only = frame_params->frame_type == KEY_FRAME ||
349 frame_params->frame_type == INTRA_ONLY_FRAME;
350 if (intra_only || frame_params->error_resilient_mode ||
351 cpi->ext_use_primary_ref_none) {
352 return PRIMARY_REF_NONE;
353 }
354
355 // Find the most recent reference frame with the same reference type as the
356 // current frame
357 const FRAME_CONTEXT_INDEX current_ref_type =
358 get_current_frame_ref_type(cpi, frame_params);
359 int wanted_fb = cpi->fb_of_context_type[current_ref_type];
360
361 int primary_ref_frame = PRIMARY_REF_NONE;
362 for (int ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
363 if (get_ref_frame_map_idx(cm, ref_frame) == wanted_fb) {
364 primary_ref_frame = ref_frame - LAST_FRAME;
365 }
366 }
367 return primary_ref_frame;
368 }
369
update_fb_of_context_type(const AV1_COMP * const cpi,const EncodeFrameParams * const frame_params,int * const fb_of_context_type)370 static void update_fb_of_context_type(
371 const AV1_COMP *const cpi, const EncodeFrameParams *const frame_params,
372 int *const fb_of_context_type) {
373 const AV1_COMMON *const cm = &cpi->common;
374
375 if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
376 cpi->ext_use_primary_ref_none) {
377 for (int i = 0; i < REF_FRAMES; i++) {
378 fb_of_context_type[i] = -1;
379 }
380 fb_of_context_type[REGULAR_FRAME] =
381 cm->show_frame ? get_ref_frame_map_idx(cm, GOLDEN_FRAME)
382 : get_ref_frame_map_idx(cm, ALTREF_FRAME);
383 }
384
385 if (!encode_show_existing_frame(cm)) {
386 // Refresh fb_of_context_type[]: see encoder.h for explanation
387 if (cm->current_frame.frame_type == KEY_FRAME) {
388 // All ref frames are refreshed, pick one that will live long enough
389 fb_of_context_type[REGULAR_FRAME] = 0;
390 } else {
391 // If more than one frame is refreshed, it doesn't matter which one we
392 // pick so pick the first. LST sometimes doesn't refresh any: this is ok
393 const int current_frame_ref_type =
394 get_current_frame_ref_type(cpi, frame_params);
395 for (int i = 0; i < REF_FRAMES; i++) {
396 if (cm->current_frame.refresh_frame_flags & (1 << i)) {
397 fb_of_context_type[current_frame_ref_type] = i;
398 break;
399 }
400 }
401 }
402 }
403 }
404
get_order_offset(const GF_GROUP * const gf_group,const EncodeFrameParams * const frame_params)405 static int get_order_offset(const GF_GROUP *const gf_group,
406 const EncodeFrameParams *const frame_params) {
407 // shown frame by definition has order offset 0
408 // show_existing_frame ignores order_offset and simply takes the order_hint
409 // from the reference frame being shown.
410 if (frame_params->show_frame || frame_params->show_existing_frame) return 0;
411
412 const int arf_offset =
413 AOMMIN((MAX_GF_INTERVAL - 1), gf_group->arf_src_offset[gf_group->index]);
414 return AOMMIN((MAX_GF_INTERVAL - 1), arf_offset);
415 }
416
adjust_frame_rate(AV1_COMP * cpi,const struct lookahead_entry * source)417 static void adjust_frame_rate(AV1_COMP *cpi,
418 const struct lookahead_entry *source) {
419 int64_t this_duration;
420 int step = 0;
421
422 // Clear down mmx registers
423 aom_clear_system_state();
424
425 if (source->ts_start == cpi->first_time_stamp_ever) {
426 this_duration = source->ts_end - source->ts_start;
427 step = 1;
428 } else {
429 int64_t last_duration =
430 cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
431
432 this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
433
434 // do a step update if the duration changes by 10%
435 if (last_duration)
436 step = (int)((this_duration - last_duration) * 10 / last_duration);
437 }
438
439 if (this_duration) {
440 if (step) {
441 av1_new_framerate(cpi, 10000000.0 / this_duration);
442 } else {
443 // Average this frame's rate into the last second's average
444 // frame rate. If we haven't seen 1 second yet, then average
445 // over the whole interval seen.
446 const double interval = AOMMIN(
447 (double)(source->ts_end - cpi->first_time_stamp_ever), 10000000.0);
448 double avg_duration = 10000000.0 / cpi->framerate;
449 avg_duration *= (interval - avg_duration + this_duration);
450 avg_duration /= interval;
451
452 av1_new_framerate(cpi, 10000000.0 / avg_duration);
453 }
454 }
455 cpi->last_time_stamp_seen = source->ts_start;
456 cpi->last_end_time_stamp_seen = source->ts_end;
457 }
458
459 // If this is an alt-ref, returns the offset of the source frame used
460 // as the arf midpoint. Otherwise, returns 0.
get_arf_src_index(AV1_COMP * cpi)461 static int get_arf_src_index(AV1_COMP *cpi) {
462 RATE_CONTROL *const rc = &cpi->rc;
463 int arf_src_index = 0;
464 if (cpi->oxcf.pass == 2) {
465 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
466 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
467 assert(is_altref_enabled(cpi));
468 arf_src_index = gf_group->arf_src_offset[gf_group->index];
469 }
470 } else if (rc->source_alt_ref_pending) {
471 arf_src_index = rc->frames_till_gf_update_due;
472 }
473 return arf_src_index;
474 }
475
476 // If this is an internal alt-ref, returns the offset of the source frame used
477 // as the internal arf midpoint. Otherwise, returns 0.
get_internal_arf_src_index(AV1_COMP * cpi)478 static int get_internal_arf_src_index(AV1_COMP *cpi) {
479 int internal_arf_src_index = 0;
480 if (cpi->oxcf.pass == 2) {
481 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
482 if (gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE) {
483 assert(is_altref_enabled(cpi) && cpi->internal_altref_allowed);
484 internal_arf_src_index = gf_group->arf_src_offset[gf_group->index];
485 }
486 }
487 return internal_arf_src_index;
488 }
489
490 // Called if this frame is an ARF or ARF2. Also handles forward-keyframes
491 // For an ARF set arf2=0, for ARF2 set arf2=1
492 // temporal_filtered is set to 1 if we temporally filter the ARF frame, so that
493 // the correct post-filter buffer can be used.
setup_arf_or_arf2(AV1_COMP * const cpi,const int arf_src_index,const int arf2,int * temporal_filtered,EncodeFrameParams * const frame_params)494 static struct lookahead_entry *setup_arf_or_arf2(
495 AV1_COMP *const cpi, const int arf_src_index, const int arf2,
496 int *temporal_filtered, EncodeFrameParams *const frame_params) {
497 AV1_COMMON *const cm = &cpi->common;
498 RATE_CONTROL *const rc = &cpi->rc;
499 const AV1EncoderConfig *const oxcf = &cpi->oxcf;
500
501 assert(arf_src_index <= rc->frames_to_key);
502 *temporal_filtered = 0;
503
504 struct lookahead_entry *source =
505 av1_lookahead_peek(cpi->lookahead, arf_src_index);
506
507 if (source != NULL) {
508 cm->showable_frame = 1;
509 cpi->alt_ref_source = source;
510
511 // When arf_src_index == rc->frames_to_key, it indicates a fwd_kf
512 if (!arf2 && arf_src_index == rc->frames_to_key) {
513 // Skip temporal filtering and mark as intra_only if we have a fwd_kf
514 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
515 int which_arf = gf_group->arf_update_idx[gf_group->index];
516 cpi->is_arf_filter_off[which_arf] = 1;
517 cpi->no_show_kf = 1;
518 } else {
519 if (oxcf->arnr_max_frames > 0) {
520 // Produce the filtered ARF frame.
521 av1_temporal_filter(cpi, arf_src_index);
522 aom_extend_frame_borders(&cpi->alt_ref_buffer, av1_num_planes(cm));
523 *temporal_filtered = 1;
524 }
525 }
526 frame_params->show_frame = 0;
527 }
528 rc->source_alt_ref_pending = 0;
529 return source;
530 }
531
532 // Determine whether there is a forced keyframe pending in the lookahead buffer
is_forced_keyframe_pending(struct lookahead_ctx * lookahead,const int up_to_index)533 static int is_forced_keyframe_pending(struct lookahead_ctx *lookahead,
534 const int up_to_index) {
535 for (int i = 0; i <= up_to_index; i++) {
536 const struct lookahead_entry *e = av1_lookahead_peek(lookahead, i);
537 if (e == NULL) {
538 // We have reached the end of the lookahead buffer and not early-returned
539 // so there isn't a forced key-frame pending.
540 return 0;
541 } else if (e->flags == AOM_EFLAG_FORCE_KF) {
542 return 1;
543 } else {
544 continue;
545 }
546 }
547 return 0; // Never reached
548 }
549
550 // Check if we should encode an ARF or internal ARF. If not, try a LAST
551 // Do some setup associated with the chosen source
552 // temporal_filtered, flush, and frame_update_type are outputs.
553 // Return the frame source, or NULL if we couldn't find one
choose_frame_source(AV1_COMP * const cpi,int * const temporal_filtered,int * const flush,struct lookahead_entry ** last_source,FRAME_UPDATE_TYPE * frame_update_type,EncodeFrameParams * const frame_params)554 struct lookahead_entry *choose_frame_source(
555 AV1_COMP *const cpi, int *const temporal_filtered, int *const flush,
556 struct lookahead_entry **last_source, FRAME_UPDATE_TYPE *frame_update_type,
557 EncodeFrameParams *const frame_params) {
558 AV1_COMMON *const cm = &cpi->common;
559 struct lookahead_entry *source = NULL;
560 *temporal_filtered = 0;
561
562 // Should we encode an alt-ref frame.
563 int arf_src_index = get_arf_src_index(cpi);
564 if (arf_src_index &&
565 is_forced_keyframe_pending(cpi->lookahead, arf_src_index)) {
566 arf_src_index = 0;
567 *flush = 1;
568 }
569
570 if (arf_src_index) {
571 source = setup_arf_or_arf2(cpi, arf_src_index, 0, temporal_filtered,
572 frame_params);
573 *frame_update_type = ARF_UPDATE;
574 }
575
576 // Should we encode an internal Alt-ref frame (mutually exclusive to ARF)
577 arf_src_index = get_internal_arf_src_index(cpi);
578 if (arf_src_index &&
579 is_forced_keyframe_pending(cpi->lookahead, arf_src_index)) {
580 arf_src_index = 0;
581 *flush = 1;
582 }
583
584 if (arf_src_index) {
585 source = setup_arf_or_arf2(cpi, arf_src_index, 1, temporal_filtered,
586 frame_params);
587 *frame_update_type = INTNL_ARF_UPDATE;
588 }
589
590 if (!source) {
591 // Get last frame source.
592 if (cm->current_frame.frame_number > 0) {
593 *last_source = av1_lookahead_peek(cpi->lookahead, -1);
594 }
595 // Read in the source frame.
596 source = av1_lookahead_pop(cpi->lookahead, *flush);
597 if (source == NULL) return NULL;
598 *frame_update_type = LF_UPDATE; // Default update type
599 frame_params->show_frame = 1;
600
601 // Check to see if the frame should be encoded as an arf overlay.
602 if (cpi->alt_ref_source == source) {
603 *frame_update_type = OVERLAY_UPDATE;
604 cpi->alt_ref_source = NULL;
605 }
606 }
607 return source;
608 }
609
610 // Don't allow a show_existing_frame to coincide with an error resilient or
611 // S-Frame. An exception can be made in the case of a keyframe, since it does
612 // not depend on any previous frames.
allow_show_existing(const AV1_COMP * const cpi,unsigned int frame_flags)613 static int allow_show_existing(const AV1_COMP *const cpi,
614 unsigned int frame_flags) {
615 if (cpi->common.current_frame.frame_number == 0) return 0;
616
617 const struct lookahead_entry *lookahead_src =
618 av1_lookahead_peek(cpi->lookahead, 0);
619 if (lookahead_src == NULL) return 1;
620
621 const int is_error_resilient =
622 cpi->oxcf.error_resilient_mode ||
623 (lookahead_src->flags & AOM_EFLAG_ERROR_RESILIENT);
624 const int is_s_frame =
625 cpi->oxcf.s_frame_mode || (lookahead_src->flags & AOM_EFLAG_SET_S_FRAME);
626 const int is_key_frame =
627 (cpi->rc.frames_to_key == 0) || (frame_flags & FRAMEFLAGS_KEY);
628 return !(is_error_resilient || is_s_frame) || is_key_frame;
629 }
630
631 // Update frame_flags to tell the encoder's caller what sort of frame was
632 // encoded.
update_frame_flags(AV1_COMP * cpi,unsigned int * frame_flags)633 static void update_frame_flags(AV1_COMP *cpi, unsigned int *frame_flags) {
634 if (encode_show_existing_frame(&cpi->common)) {
635 *frame_flags &= ~FRAMEFLAGS_GOLDEN;
636 *frame_flags &= ~FRAMEFLAGS_BWDREF;
637 *frame_flags &= ~FRAMEFLAGS_ALTREF;
638 *frame_flags &= ~FRAMEFLAGS_KEY;
639 return;
640 }
641
642 if (cpi->refresh_golden_frame == 1) {
643 *frame_flags |= FRAMEFLAGS_GOLDEN;
644 } else {
645 *frame_flags &= ~FRAMEFLAGS_GOLDEN;
646 }
647
648 if (cpi->refresh_alt_ref_frame == 1) {
649 *frame_flags |= FRAMEFLAGS_ALTREF;
650 } else {
651 *frame_flags &= ~FRAMEFLAGS_ALTREF;
652 }
653
654 if (cpi->refresh_bwd_ref_frame == 1) {
655 *frame_flags |= FRAMEFLAGS_BWDREF;
656 } else {
657 *frame_flags &= ~FRAMEFLAGS_BWDREF;
658 }
659
660 if (cpi->common.current_frame.frame_type == KEY_FRAME) {
661 *frame_flags |= FRAMEFLAGS_KEY;
662 } else {
663 *frame_flags &= ~FRAMEFLAGS_KEY;
664 }
665 }
666
667 #define DUMP_REF_FRAME_IMAGES 0
668
669 #if DUMP_REF_FRAME_IMAGES == 1
dump_one_image(AV1_COMMON * cm,const YV12_BUFFER_CONFIG * const ref_buf,char * file_name)670 static int dump_one_image(AV1_COMMON *cm,
671 const YV12_BUFFER_CONFIG *const ref_buf,
672 char *file_name) {
673 int h;
674 FILE *f_ref = NULL;
675
676 if (ref_buf == NULL) {
677 printf("Frame data buffer is NULL.\n");
678 return AOM_CODEC_MEM_ERROR;
679 }
680
681 if ((f_ref = fopen(file_name, "wb")) == NULL) {
682 printf("Unable to open file %s to write.\n", file_name);
683 return AOM_CODEC_MEM_ERROR;
684 }
685
686 // --- Y ---
687 for (h = 0; h < cm->height; ++h) {
688 fwrite(&ref_buf->y_buffer[h * ref_buf->y_stride], 1, cm->width, f_ref);
689 }
690 // --- U ---
691 for (h = 0; h < (cm->height >> 1); ++h) {
692 fwrite(&ref_buf->u_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
693 f_ref);
694 }
695 // --- V ---
696 for (h = 0; h < (cm->height >> 1); ++h) {
697 fwrite(&ref_buf->v_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
698 f_ref);
699 }
700
701 fclose(f_ref);
702
703 return AOM_CODEC_OK;
704 }
705
dump_ref_frame_images(AV1_COMP * cpi)706 static void dump_ref_frame_images(AV1_COMP *cpi) {
707 AV1_COMMON *const cm = &cpi->common;
708 MV_REFERENCE_FRAME ref_frame;
709
710 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
711 char file_name[256] = "";
712 snprintf(file_name, sizeof(file_name), "/tmp/enc_F%d_ref_%d.yuv",
713 cm->current_frame.frame_number, ref_frame);
714 dump_one_image(cm, get_ref_frame_yv12_buf(cpi, ref_frame), file_name);
715 }
716 }
717 #endif // DUMP_REF_FRAME_IMAGES == 1
718
719 // Assign new_ref in the new mapping to point at the reference buffer pointed at
720 // by old_ref in the old_map. The new mapping is stored in *new_map, while the
721 // old map comes from cm->remapped_ref_idx[].
assign_new_map(AV1_COMMON * const cm,int * new_map,int new_ref,int old_ref)722 static void assign_new_map(AV1_COMMON *const cm, int *new_map, int new_ref,
723 int old_ref) {
724 new_map[new_ref - LAST_FRAME] = cm->remapped_ref_idx[old_ref - LAST_FRAME];
725 }
726
727 // Generate a new reference frame mapping. This function updates
728 // cm->remapped_ref_idx[] depending on the frame_update_type of this frame.
729 // This determines which references (e.g. LAST_FRAME, ALTREF_FRAME) point at the
730 // 8 underlying buffers and, together with get_refresh_frame_flags(), implements
731 // our reference frame management strategy.
update_ref_frame_map(AV1_COMP * cpi,FRAME_UPDATE_TYPE frame_update_type)732 static void update_ref_frame_map(AV1_COMP *cpi,
733 FRAME_UPDATE_TYPE frame_update_type) {
734 AV1_COMMON *const cm = &cpi->common;
735
736 // If check_frame_refs_short_signaling() decided to set
737 // frame_refs_short_signaling=1 then we update remapped_ref_idx[] here. Every
738 // reference will still map to the same RefCntBuffer (through ref_frame_map[])
739 // after this, but that does not necessarily mean that remapped_ref_idx[] is
740 // unchanged.
741 if (cm->current_frame.frame_refs_short_signaling) {
742 const int lst_map_idx = get_ref_frame_map_idx(cm, LAST_FRAME);
743 const int gld_map_idx = get_ref_frame_map_idx(cm, GOLDEN_FRAME);
744 av1_set_frame_refs(cm, cm->remapped_ref_idx, lst_map_idx, gld_map_idx);
745 }
746
747 // For shown keyframes and S-frames all buffers are refreshed, but we don't
748 // change any of the mapping.
749 if ((cm->current_frame.frame_type == KEY_FRAME && cm->show_frame) ||
750 frame_is_sframe(cm)) {
751 return;
752 }
753
754 // Initialize the new reference map as a copy of the old one.
755 int new_map[REF_FRAMES];
756 memcpy(new_map, cm->remapped_ref_idx, sizeof(new_map));
757
758 // The reference management strategy is currently as follows. See
759 // gop_structure.c for more details of the structure and DOI
760 // 10.1109/DCC.2018.00045 for a higher-level explanation
761 //
762 // * ALTREF_FRAME and GOLDEN_FRAME are kept separate from the other
763 // references. When we code an ALTREF it refreshes the ALTREF buffer. When
764 // we code an OVERLAY the old GOLDEN becomes the new ALTREF and the old
765 // ALTREF (possibly refreshed by the OVERLAY) becomes the new GOLDEN.
766 // * LAST_FRAME, LAST2_FRAME, and LAST3_FRAME work like a FIFO. When we code
767 // a frame which does a last-frame update we pick a buffer to refresh and
768 // then point the LAST_FRAME reference at it. The old LAST_FRAME becomes
769 // LAST2_FRAME and the old LAST2_FRAME becomes LAST3_FRAME. The old
770 // LAST3_FRAME is re-used somewhere else.
771 // * BWDREF, ALTREF2, and EXTREF act like a stack structure, so we can
772 // "push" and "pop" internal alt-ref frames through the three references.
773 // * When we code a BRF or internal-ARF (they work the same in this
774 // structure) we push it onto the bwdref stack. Because we have a finite
775 // number of buffers, we actually refresh EXTREF, the bottom of the stack,
776 // and rotate the three references to make EXTREF the top.
777 // * When we code an INTNL_OVERLAY we refresh BWDREF, then pop it off of the
778 // bwdref stack and push it into the last-frame FIFO. The old LAST3
779 // buffer gets pushed out of the last-frame FIFO and becomes the new
780 // EXTREF, bottom of the bwdref stack.
781 // * LAST_BIPRED just acts like a LAST_FRAME. The BWDREF will have an
782 // INTNL_OVERLAY and so can do its own ref map update.
783 //
784 // Note that this function runs *after* a frame has been coded, so it does not
785 // affect reference assignment of the current frame, it only affects future
786 // frames. This is why we refresh buffers using the old reference map before
787 // remapping them.
788 //
789 // show_existing_frames don't refresh any buffers or send the reference map to
790 // the decoder, but we can still update our reference map if we want to: the
791 // decoder will update its map next time we code a non-show-existing frame.
792
793 if (frame_update_type == OVERLAY_UPDATE) {
794 // We want the old golden-frame to become our new ARF so swap the
795 // references. If cpi->preserve_arf_as_gld == 0 then we will refresh the
796 // old ARF before it becomes our new GF
797 assign_new_map(cm, new_map, ALTREF_FRAME, GOLDEN_FRAME);
798 assign_new_map(cm, new_map, GOLDEN_FRAME, ALTREF_FRAME);
799 } else if (frame_update_type == INTNL_OVERLAY_UPDATE &&
800 encode_show_existing_frame(cm)) {
801 // Note that because encode_show_existing_frame(cm) we don't refresh any
802 // buffers.
803 // Pop BWDREF (shown as current frame) from the bwdref stack and make it
804 // the new LAST_FRAME.
805 assign_new_map(cm, new_map, LAST_FRAME, BWDREF_FRAME);
806
807 // Progress the last-frame FIFO and the bwdref stack
808 assign_new_map(cm, new_map, LAST2_FRAME, LAST_FRAME);
809 assign_new_map(cm, new_map, LAST3_FRAME, LAST2_FRAME);
810 assign_new_map(cm, new_map, BWDREF_FRAME, ALTREF2_FRAME);
811 assign_new_map(cm, new_map, ALTREF2_FRAME, EXTREF_FRAME);
812 assign_new_map(cm, new_map, EXTREF_FRAME, LAST3_FRAME);
813 } else if (frame_update_type == INTNL_ARF_UPDATE &&
814 !cm->show_existing_frame) {
815 // We want to push the current frame onto the bwdref stack. We refresh
816 // EXTREF (the old bottom of the stack) and rotate the references so it
817 // becomes BWDREF, the top of the stack.
818 assign_new_map(cm, new_map, BWDREF_FRAME, EXTREF_FRAME);
819 assign_new_map(cm, new_map, ALTREF2_FRAME, BWDREF_FRAME);
820 assign_new_map(cm, new_map, EXTREF_FRAME, ALTREF2_FRAME);
821 }
822
823 if ((frame_update_type == LF_UPDATE || frame_update_type == GF_UPDATE ||
824 frame_update_type == INTNL_OVERLAY_UPDATE) &&
825 !encode_show_existing_frame(cm) &&
826 (!cm->show_existing_frame || frame_update_type == INTNL_OVERLAY_UPDATE)) {
827 // A standard last-frame: we refresh the LAST3_FRAME buffer and then push it
828 // into the last-frame FIFO.
829 assign_new_map(cm, new_map, LAST3_FRAME, LAST2_FRAME);
830 assign_new_map(cm, new_map, LAST2_FRAME, LAST_FRAME);
831 assign_new_map(cm, new_map, LAST_FRAME, LAST3_FRAME);
832 }
833
834 memcpy(cm->remapped_ref_idx, new_map, sizeof(new_map));
835
836 #if DUMP_REF_FRAME_IMAGES == 1
837 // Dump out all reference frame images.
838 dump_ref_frame_images(cpi);
839 #endif // DUMP_REF_FRAME_IMAGES
840 }
841
get_refresh_frame_flags(const AV1_COMP * const cpi,const EncodeFrameParams * const frame_params,FRAME_UPDATE_TYPE frame_update_type)842 static int get_refresh_frame_flags(const AV1_COMP *const cpi,
843 const EncodeFrameParams *const frame_params,
844 FRAME_UPDATE_TYPE frame_update_type) {
845 const AV1_COMMON *const cm = &cpi->common;
846
847 // Switch frames and shown key-frames overwrite all reference slots
848 if ((frame_params->frame_type == KEY_FRAME && frame_params->show_frame) ||
849 frame_params->frame_type == S_FRAME)
850 return 0xFF;
851
852 // show_existing_frames don't actually send refresh_frame_flags so set the
853 // flags to 0 to keep things consistent.
854 if (frame_params->show_existing_frame &&
855 (!frame_params->error_resilient_mode ||
856 frame_params->frame_type == KEY_FRAME)) {
857 return 0;
858 }
859
860 int refresh_mask = 0;
861
862 if (cpi->ext_refresh_frame_flags_pending) {
863 // Unfortunately the encoder interface reflects the old refresh_*_frame
864 // flags so we have to replicate the old refresh_frame_flags logic here in
865 // order to preserve the behaviour of the flag overrides.
866 refresh_mask |= cpi->ext_refresh_last_frame
867 << get_ref_frame_map_idx(cm, LAST3_FRAME);
868 refresh_mask |= cpi->ext_refresh_bwd_ref_frame
869 << get_ref_frame_map_idx(cm, EXTREF_FRAME);
870 refresh_mask |= cpi->ext_refresh_alt2_ref_frame
871 << get_ref_frame_map_idx(cm, ALTREF2_FRAME);
872 if (frame_update_type == OVERLAY_UPDATE) {
873 if (!cpi->preserve_arf_as_gld) {
874 refresh_mask |= cpi->ext_refresh_golden_frame
875 << get_ref_frame_map_idx(cm, ALTREF_FRAME);
876 }
877 } else {
878 refresh_mask |= cpi->ext_refresh_golden_frame
879 << get_ref_frame_map_idx(cm, GOLDEN_FRAME);
880 refresh_mask |= cpi->ext_refresh_alt_ref_frame
881 << get_ref_frame_map_idx(cm, ALTREF_FRAME);
882 }
883 return refresh_mask;
884 }
885
886 // See update_ref_frame_map() for a thorough description of the reference
887 // buffer management strategy currently in use. This function just decides
888 // which buffers should be refreshed.
889
890 switch (frame_update_type) {
891 case KF_UPDATE:
892 // Note that a real shown key-frame or S-frame refreshes every buffer,
893 // handled in a special case above. This case is for frames which aren't
894 // really a shown key-frame or S-frame but want to refresh all the
895 // important buffers.
896 refresh_mask |= 1 << get_ref_frame_map_idx(cm, LAST3_FRAME);
897 refresh_mask |= 1 << get_ref_frame_map_idx(cm, EXTREF_FRAME);
898 refresh_mask |= 1 << get_ref_frame_map_idx(cm, ALTREF2_FRAME);
899 refresh_mask |= 1 << get_ref_frame_map_idx(cm, GOLDEN_FRAME);
900 refresh_mask |= 1 << get_ref_frame_map_idx(cm, ALTREF_FRAME);
901 break;
902 case LF_UPDATE:
903 // Refresh LAST3, which becomes the new LAST while LAST becomes LAST2
904 // and LAST2 becomes the new LAST3 (like a FIFO but circular)
905 refresh_mask |= 1 << get_ref_frame_map_idx(cm, LAST3_FRAME);
906 break;
907 case GF_UPDATE:
908 // In addition to refreshing the GF buffer, we refresh LAST3 and push it
909 // into the last-frame FIFO.
910 refresh_mask |= 1 << get_ref_frame_map_idx(cm, LAST3_FRAME);
911 refresh_mask |= 1 << get_ref_frame_map_idx(cm, GOLDEN_FRAME);
912 break;
913 case OVERLAY_UPDATE:
914 if (!cpi->preserve_arf_as_gld) {
915 // The result of our OVERLAY should become the GOLDEN_FRAME but we'd
916 // like to keep the old GOLDEN as our new ALTREF. So we refresh the
917 // ALTREF and swap around the ALTREF and GOLDEN references.
918 refresh_mask |= 1 << get_ref_frame_map_idx(cm, ALTREF_FRAME);
919 }
920 break;
921 case ARF_UPDATE:
922 refresh_mask |= 1 << get_ref_frame_map_idx(cm, ALTREF_FRAME);
923 break;
924 case INTNL_OVERLAY_UPDATE:
925 // INTNL_OVERLAY may be a show_existing_frame in which case we don't
926 // refresh anything and the BWDREF or ALTREF2 being shown becomes the new
927 // LAST_FRAME. But, if it's not a show_existing_frame, then we update as
928 // though it's a normal LF_UPDATE: we refresh LAST3 and
929 // update_ref_frame_map() makes that the new LAST_FRAME.
930 refresh_mask |= 1 << get_ref_frame_map_idx(cm, LAST3_FRAME);
931 break;
932 case INTNL_ARF_UPDATE:
933 if (cpi->oxcf.pass == 2) {
934 // Push the new ARF2 onto the bwdref stack. We refresh EXTREF which is
935 // at the bottom of the stack then move it to the top.
936 refresh_mask |= 1 << get_ref_frame_map_idx(cm, EXTREF_FRAME);
937 } else {
938 // ARF2 just gets stored in the ARF2 slot, no reference map change.
939 refresh_mask |= 1 << get_ref_frame_map_idx(cm, ALTREF2_FRAME);
940 }
941 break;
942 default: assert(0); break;
943 }
944 return refresh_mask;
945 }
946
av1_encode_strategy(AV1_COMP * const cpi,size_t * const size,uint8_t * const dest,unsigned int * frame_flags,int64_t * const time_stamp,int64_t * const time_end,const aom_rational_t * const timebase,int flush)947 int av1_encode_strategy(AV1_COMP *const cpi, size_t *const size,
948 uint8_t *const dest, unsigned int *frame_flags,
949 int64_t *const time_stamp, int64_t *const time_end,
950 const aom_rational_t *const timebase, int flush) {
951 const AV1EncoderConfig *const oxcf = &cpi->oxcf;
952 AV1_COMMON *const cm = &cpi->common;
953
954 EncodeFrameInput frame_input;
955 EncodeFrameParams frame_params;
956 EncodeFrameResults frame_results;
957 memset(&frame_input, 0, sizeof(frame_input));
958 memset(&frame_params, 0, sizeof(frame_params));
959 memset(&frame_results, 0, sizeof(frame_results));
960
961 if (oxcf->pass == 0 || oxcf->pass == 2) {
962 check_show_existing_frame(cpi, &frame_params);
963 frame_params.show_existing_frame &= allow_show_existing(cpi, *frame_flags);
964 } else {
965 frame_params.show_existing_frame = 0;
966 }
967
968 int temporal_filtered = 0;
969 struct lookahead_entry *source = NULL;
970 struct lookahead_entry *last_source = NULL;
971 FRAME_UPDATE_TYPE frame_update_type;
972 if (frame_params.show_existing_frame) {
973 source = av1_lookahead_pop(cpi->lookahead, flush);
974 frame_update_type = LF_UPDATE;
975 } else {
976 source = choose_frame_source(cpi, &temporal_filtered, &flush, &last_source,
977 &frame_update_type, &frame_params);
978 }
979
980 // In pass 2 we get the frame_update_type from gf_group
981 if (oxcf->pass == 2) {
982 frame_update_type =
983 cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index];
984 }
985
986 if (source == NULL) { // If no source was found, we can't encode a frame.
987 if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) {
988 av1_end_first_pass(cpi); /* get last stats packet */
989 cpi->twopass.first_pass_done = 1;
990 }
991 return -1;
992 }
993
994 frame_input.source = temporal_filtered ? &cpi->alt_ref_buffer : &source->img;
995 frame_input.last_source = last_source != NULL ? &last_source->img : NULL;
996 frame_input.ts_duration = source->ts_end - source->ts_start;
997
998 *time_stamp = source->ts_start;
999 *time_end = source->ts_end;
1000 if (source->ts_start < cpi->first_time_stamp_ever) {
1001 cpi->first_time_stamp_ever = source->ts_start;
1002 cpi->last_end_time_stamp_seen = source->ts_start;
1003 }
1004
1005 av1_apply_encoding_flags(cpi, source->flags);
1006 if (!frame_params.show_existing_frame)
1007 *frame_flags = (source->flags & AOM_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
1008
1009 const int is_overlay = frame_params.show_existing_frame &&
1010 (frame_update_type == OVERLAY_UPDATE ||
1011 frame_update_type == INTNL_OVERLAY_UPDATE);
1012 if (frame_params.show_frame || is_overlay) {
1013 // Shown frames and arf-overlay frames need frame-rate considering
1014 adjust_frame_rate(cpi, source);
1015 }
1016
1017 if (frame_params.show_existing_frame) {
1018 // show_existing_frame implies this frame is shown!
1019 frame_params.show_frame = 1;
1020 } else {
1021 if (cpi->film_grain_table) {
1022 cm->cur_frame->film_grain_params_present = aom_film_grain_table_lookup(
1023 cpi->film_grain_table, *time_stamp, *time_end, 0 /* =erase */,
1024 &cm->film_grain_params);
1025 } else {
1026 cm->cur_frame->film_grain_params_present =
1027 cm->seq_params.film_grain_params_present;
1028 }
1029 // only one operating point supported now
1030 const int64_t pts64 = ticks_to_timebase_units(timebase, *time_stamp);
1031 if (pts64 < 0 || pts64 > UINT32_MAX) return AOM_CODEC_ERROR;
1032 cpi->common.frame_presentation_time = (uint32_t)pts64;
1033 }
1034
1035 if (oxcf->pass == 2 && (!frame_params.show_existing_frame || is_overlay)) {
1036 // GF_GROUP needs updating for arf overlays as well as non-show-existing
1037 av1_get_second_pass_params(cpi, &frame_params, *frame_flags);
1038 frame_update_type =
1039 cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index];
1040 }
1041
1042 if (frame_params.show_existing_frame &&
1043 frame_params.frame_type != KEY_FRAME) {
1044 // Force show-existing frames to be INTER, except forward keyframes
1045 frame_params.frame_type = INTER_FRAME;
1046 }
1047
1048 // TODO(david.turner@argondesign.com): Move all the encode strategy
1049 // (largely near av1_get_compressed_data) in here
1050
1051 // TODO(david.turner@argondesign.com): Change all the encode strategy to
1052 // modify frame_params instead of cm or cpi.
1053
1054 // Per-frame encode speed. In theory this can vary, but things may have been
1055 // written assuming speed-level will not change within a sequence, so this
1056 // parameter should be used with caution.
1057 frame_params.speed = oxcf->speed;
1058
1059 if (!frame_params.show_existing_frame) {
1060 cm->using_qmatrix = cpi->oxcf.using_qm;
1061 cm->min_qmlevel = cpi->oxcf.qm_minlevel;
1062 cm->max_qmlevel = cpi->oxcf.qm_maxlevel;
1063 if (cpi->twopass.gf_group.index == 1 && cpi->oxcf.enable_tpl_model) {
1064 av1_configure_buffer_updates(cpi, &frame_params, frame_update_type, 0);
1065 av1_set_frame_size(cpi, cm->width, cm->height);
1066 av1_tpl_setup_stats(cpi, &frame_input);
1067 }
1068 }
1069
1070 // Work out some encoding parameters specific to the pass:
1071 if (oxcf->pass == 0) {
1072 if (cpi->oxcf.rc_mode == AOM_CBR) {
1073 av1_rc_get_one_pass_cbr_params(cpi, &frame_update_type, &frame_params,
1074 *frame_flags);
1075 } else {
1076 av1_rc_get_one_pass_vbr_params(cpi, &frame_update_type, &frame_params,
1077 *frame_flags);
1078 }
1079 } else if (oxcf->pass == 1) {
1080 cpi->td.mb.e_mbd.lossless[0] = is_lossless_requested(&cpi->oxcf);
1081 const int kf_requested = (cm->current_frame.frame_number == 0 ||
1082 (*frame_flags & FRAMEFLAGS_KEY));
1083 if (kf_requested && frame_update_type != OVERLAY_UPDATE &&
1084 frame_update_type != INTNL_OVERLAY_UPDATE) {
1085 frame_params.frame_type = KEY_FRAME;
1086 } else {
1087 frame_params.frame_type = INTER_FRAME;
1088 }
1089 } else if (oxcf->pass == 2) {
1090 #if CONFIG_MISMATCH_DEBUG
1091 mismatch_move_frame_idx_w();
1092 #endif
1093 #if TXCOEFF_COST_TIMER
1094 cm->txcoeff_cost_timer = 0;
1095 cm->txcoeff_cost_count = 0;
1096 #endif
1097 }
1098
1099 if (oxcf->pass == 0 || oxcf->pass == 2) set_ext_overrides(cpi, &frame_params);
1100
1101 // Shown keyframes and S frames refresh all reference buffers
1102 const int force_refresh_all =
1103 ((frame_params.frame_type == KEY_FRAME && frame_params.show_frame) ||
1104 frame_params.frame_type == S_FRAME) &&
1105 !frame_params.show_existing_frame;
1106
1107 av1_configure_buffer_updates(cpi, &frame_params, frame_update_type,
1108 force_refresh_all);
1109
1110 if (oxcf->pass == 0 || oxcf->pass == 2) {
1111 // Work out which reference frame slots may be used.
1112 frame_params.ref_frame_flags = get_ref_frame_flags(cpi);
1113
1114 frame_params.primary_ref_frame =
1115 choose_primary_ref_frame(cpi, &frame_params);
1116 frame_params.order_offset =
1117 get_order_offset(&cpi->twopass.gf_group, &frame_params);
1118
1119 frame_params.refresh_frame_flags =
1120 get_refresh_frame_flags(cpi, &frame_params, frame_update_type);
1121 }
1122
1123 // The way frame_params->remapped_ref_idx is setup is a placeholder.
1124 // Currently, reference buffer assignment is done by update_ref_frame_map()
1125 // which is called by high-level strategy AFTER encoding a frame. It modifies
1126 // cm->remapped_ref_idx. If you want to use an alternative method to
1127 // determine reference buffer assignment, just put your assignments into
1128 // frame_params->remapped_ref_idx here and they will be used when encoding
1129 // this frame. If frame_params->remapped_ref_idx is setup independently of
1130 // cm->remapped_ref_idx then update_ref_frame_map() will have no effect.
1131 memcpy(frame_params.remapped_ref_idx, cm->remapped_ref_idx,
1132 REF_FRAMES * sizeof(*cm->remapped_ref_idx));
1133
1134 if (av1_encode(cpi, dest, &frame_input, &frame_params, &frame_results) !=
1135 AOM_CODEC_OK) {
1136 return AOM_CODEC_ERROR;
1137 }
1138
1139 if (oxcf->pass == 0 || oxcf->pass == 2) {
1140 // First pass doesn't modify reference buffer assignment or produce frame
1141 // flags
1142 update_frame_flags(cpi, frame_flags);
1143 update_ref_frame_map(cpi, frame_update_type);
1144 }
1145
1146 if (oxcf->pass == 2) {
1147 #if TXCOEFF_COST_TIMER
1148 cm->cum_txcoeff_cost_timer += cm->txcoeff_cost_timer;
1149 fprintf(stderr,
1150 "\ntxb coeff cost block number: %ld, frame time: %ld, cum time %ld "
1151 "in us\n",
1152 cm->txcoeff_cost_count, cm->txcoeff_cost_timer,
1153 cm->cum_txcoeff_cost_timer);
1154 #endif
1155 av1_twopass_postencode_update(cpi);
1156 }
1157
1158 if (oxcf->pass == 0 || oxcf->pass == 2) {
1159 update_fb_of_context_type(cpi, &frame_params, cpi->fb_of_context_type);
1160 set_additional_frame_flags(cm, frame_flags);
1161 update_rc_counts(cpi);
1162 }
1163
1164 // Unpack frame_results:
1165 *size = frame_results.size;
1166
1167 // Leave a signal for a higher level caller about if this frame is droppable
1168 if (*size > 0) {
1169 cpi->droppable = is_frame_droppable(cpi);
1170 }
1171
1172 return AOM_CODEC_OK;
1173 }
1174