mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 11:37:30 +09:00
aom: update libaom to 0ec86ac7ae1e32a7e70410fa4972a655ec3670a4
This commit is contained in:
parent
bc3f20e378
commit
eb361970c5
438 changed files with 52661 additions and 21905 deletions
248
third_party/aom/av1/common/mvref_common.c
vendored
248
third_party/aom/av1/common/mvref_common.c
vendored
|
|
@ -346,10 +346,11 @@ static int add_tpl_ref_mv(const AV1_COMMON *cm, const MACROBLOCKD *xd,
|
|||
av1_set_ref_frame(rf, ref_frame);
|
||||
|
||||
if (rf[1] == NONE_FRAME) {
|
||||
int cur_frame_index = cm->cur_frame->cur_frame_offset;
|
||||
int buf_idx_0 = cm->frame_refs[FWD_RF_OFFSET(rf[0])].idx;
|
||||
int frame0_index = cm->buffer_pool->frame_bufs[buf_idx_0].cur_frame_offset;
|
||||
int cur_offset_0 = get_relative_dist(cm, cur_frame_index, frame0_index);
|
||||
int cur_frame_index = cm->cur_frame->order_hint;
|
||||
const RefCntBuffer *const buf_0 = get_ref_frame_buf(cm, rf[0]);
|
||||
int frame0_index = buf_0->order_hint;
|
||||
int cur_offset_0 = get_relative_dist(&cm->seq_params.order_hint_info,
|
||||
cur_frame_index, frame0_index);
|
||||
CANDIDATE_MV *ref_mv_stack = ref_mv_stacks[rf[0]];
|
||||
|
||||
if (prev_frame_mvs->mfmv0.as_int != INVALID_MV) {
|
||||
|
|
@ -380,14 +381,16 @@ static int add_tpl_ref_mv(const AV1_COMMON *cm, const MACROBLOCKD *xd,
|
|||
}
|
||||
} else {
|
||||
// Process compound inter mode
|
||||
int cur_frame_index = cm->cur_frame->cur_frame_offset;
|
||||
int buf_idx_0 = cm->frame_refs[FWD_RF_OFFSET(rf[0])].idx;
|
||||
int frame0_index = cm->buffer_pool->frame_bufs[buf_idx_0].cur_frame_offset;
|
||||
int cur_frame_index = cm->cur_frame->order_hint;
|
||||
const RefCntBuffer *const buf_0 = get_ref_frame_buf(cm, rf[0]);
|
||||
int frame0_index = buf_0->order_hint;
|
||||
|
||||
int cur_offset_0 = get_relative_dist(cm, cur_frame_index, frame0_index);
|
||||
int buf_idx_1 = cm->frame_refs[FWD_RF_OFFSET(rf[1])].idx;
|
||||
int frame1_index = cm->buffer_pool->frame_bufs[buf_idx_1].cur_frame_offset;
|
||||
int cur_offset_1 = get_relative_dist(cm, cur_frame_index, frame1_index);
|
||||
int cur_offset_0 = get_relative_dist(&cm->seq_params.order_hint_info,
|
||||
cur_frame_index, frame0_index);
|
||||
const RefCntBuffer *const buf_1 = get_ref_frame_buf(cm, rf[1]);
|
||||
int frame1_index = buf_1->order_hint;
|
||||
int cur_offset_1 = get_relative_dist(&cm->seq_params.order_hint_info,
|
||||
cur_frame_index, frame1_index);
|
||||
CANDIDATE_MV *ref_mv_stack = ref_mv_stacks[ref_frame];
|
||||
|
||||
if (prev_frame_mvs->mfmv0.as_int != INVALID_MV) {
|
||||
|
|
@ -861,26 +864,25 @@ void av1_find_best_ref_mvs(int allow_hp, int_mv *mvlist, int_mv *nearest_mv,
|
|||
}
|
||||
|
||||
void av1_setup_frame_buf_refs(AV1_COMMON *cm) {
|
||||
cm->cur_frame->cur_frame_offset = cm->frame_offset;
|
||||
cm->cur_frame->order_hint = cm->current_frame.order_hint;
|
||||
|
||||
MV_REFERENCE_FRAME ref_frame;
|
||||
for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
|
||||
const int buf_idx = cm->frame_refs[ref_frame - LAST_FRAME].idx;
|
||||
if (buf_idx >= 0)
|
||||
cm->cur_frame->ref_frame_offset[ref_frame - LAST_FRAME] =
|
||||
cm->buffer_pool->frame_bufs[buf_idx].cur_frame_offset;
|
||||
const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
|
||||
if (buf != NULL)
|
||||
cm->cur_frame->ref_order_hints[ref_frame - LAST_FRAME] = buf->order_hint;
|
||||
}
|
||||
}
|
||||
|
||||
void av1_setup_frame_sign_bias(AV1_COMMON *cm) {
|
||||
MV_REFERENCE_FRAME ref_frame;
|
||||
for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
|
||||
const int buf_idx = cm->frame_refs[ref_frame - LAST_FRAME].idx;
|
||||
if (cm->seq_params.enable_order_hint && buf_idx != INVALID_IDX) {
|
||||
const int ref_frame_offset =
|
||||
cm->buffer_pool->frame_bufs[buf_idx].cur_frame_offset;
|
||||
const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
|
||||
if (cm->seq_params.order_hint_info.enable_order_hint && buf != NULL) {
|
||||
const int ref_order_hint = buf->order_hint;
|
||||
cm->ref_frame_sign_bias[ref_frame] =
|
||||
(get_relative_dist(cm, ref_frame_offset, (int)cm->frame_offset) <= 0)
|
||||
(get_relative_dist(&cm->seq_params.order_hint_info, ref_order_hint,
|
||||
(int)cm->current_frame.order_hint) <= 0)
|
||||
? 0
|
||||
: 1;
|
||||
} else {
|
||||
|
|
@ -935,33 +937,34 @@ static int motion_field_projection(AV1_COMMON *cm,
|
|||
TPL_MV_REF *tpl_mvs_base = cm->tpl_mvs;
|
||||
int ref_offset[REF_FRAMES] = { 0 };
|
||||
|
||||
(void)dir;
|
||||
const RefCntBuffer *const start_frame_buf =
|
||||
get_ref_frame_buf(cm, start_frame);
|
||||
if (start_frame_buf == NULL) return 0;
|
||||
|
||||
const int start_frame_idx = cm->frame_refs[FWD_RF_OFFSET(start_frame)].idx;
|
||||
if (start_frame_idx < 0) return 0;
|
||||
|
||||
if (cm->buffer_pool->frame_bufs[start_frame_idx].intra_only) return 0;
|
||||
|
||||
if (cm->buffer_pool->frame_bufs[start_frame_idx].mi_rows != cm->mi_rows ||
|
||||
cm->buffer_pool->frame_bufs[start_frame_idx].mi_cols != cm->mi_cols)
|
||||
if (start_frame_buf->frame_type == KEY_FRAME ||
|
||||
start_frame_buf->frame_type == INTRA_ONLY_FRAME)
|
||||
return 0;
|
||||
|
||||
const int start_frame_offset =
|
||||
cm->buffer_pool->frame_bufs[start_frame_idx].cur_frame_offset;
|
||||
const unsigned int *const ref_frame_offsets =
|
||||
&cm->buffer_pool->frame_bufs[start_frame_idx].ref_frame_offset[0];
|
||||
const int cur_frame_offset = cm->cur_frame->cur_frame_offset;
|
||||
int start_to_current_frame_offset =
|
||||
get_relative_dist(cm, start_frame_offset, cur_frame_offset);
|
||||
if (start_frame_buf->mi_rows != cm->mi_rows ||
|
||||
start_frame_buf->mi_cols != cm->mi_cols)
|
||||
return 0;
|
||||
|
||||
const int start_frame_order_hint = start_frame_buf->order_hint;
|
||||
const unsigned int *const ref_order_hints =
|
||||
&start_frame_buf->ref_order_hints[0];
|
||||
const int cur_order_hint = cm->cur_frame->order_hint;
|
||||
int start_to_current_frame_offset = get_relative_dist(
|
||||
&cm->seq_params.order_hint_info, start_frame_order_hint, cur_order_hint);
|
||||
|
||||
for (MV_REFERENCE_FRAME rf = LAST_FRAME; rf <= INTER_REFS_PER_FRAME; ++rf) {
|
||||
ref_offset[rf] = get_relative_dist(cm, start_frame_offset,
|
||||
ref_frame_offsets[rf - LAST_FRAME]);
|
||||
ref_offset[rf] = get_relative_dist(&cm->seq_params.order_hint_info,
|
||||
start_frame_order_hint,
|
||||
ref_order_hints[rf - LAST_FRAME]);
|
||||
}
|
||||
|
||||
if (dir == 2) start_to_current_frame_offset = -start_to_current_frame_offset;
|
||||
|
||||
MV_REF *mv_ref_base = cm->buffer_pool->frame_bufs[start_frame_idx].mvs;
|
||||
MV_REF *mv_ref_base = start_frame_buf->mvs;
|
||||
const int mvs_rows = (cm->mi_rows + 1) >> 1;
|
||||
const int mvs_cols = (cm->mi_cols + 1) >> 1;
|
||||
|
||||
|
|
@ -1002,8 +1005,10 @@ static int motion_field_projection(AV1_COMMON *cm,
|
|||
}
|
||||
|
||||
void av1_setup_motion_field(AV1_COMMON *cm) {
|
||||
const OrderHintInfo *const order_hint_info = &cm->seq_params.order_hint_info;
|
||||
|
||||
memset(cm->ref_frame_side, 0, sizeof(cm->ref_frame_side));
|
||||
if (!cm->seq_params.enable_order_hint) return;
|
||||
if (!order_hint_info->enable_order_hint) return;
|
||||
|
||||
TPL_MV_REF *tpl_mvs_base = cm->tpl_mvs;
|
||||
int size = ((cm->mi_rows + MAX_MIB_SIZE) >> 1) * (cm->mi_stride >> 1);
|
||||
|
|
@ -1012,23 +1017,22 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
|
|||
tpl_mvs_base[idx].ref_frame_offset = 0;
|
||||
}
|
||||
|
||||
const int cur_order_hint = cm->cur_frame->cur_frame_offset;
|
||||
RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
|
||||
const int cur_order_hint = cm->cur_frame->order_hint;
|
||||
|
||||
int ref_buf_idx[INTER_REFS_PER_FRAME];
|
||||
const RefCntBuffer *ref_buf[INTER_REFS_PER_FRAME];
|
||||
int ref_order_hint[INTER_REFS_PER_FRAME];
|
||||
|
||||
for (int ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
|
||||
const int ref_idx = ref_frame - LAST_FRAME;
|
||||
const int buf_idx = cm->frame_refs[ref_idx].idx;
|
||||
const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
|
||||
int order_hint = 0;
|
||||
|
||||
if (buf_idx >= 0) order_hint = frame_bufs[buf_idx].cur_frame_offset;
|
||||
if (buf != NULL) order_hint = buf->order_hint;
|
||||
|
||||
ref_buf_idx[ref_idx] = buf_idx;
|
||||
ref_buf[ref_idx] = buf;
|
||||
ref_order_hint[ref_idx] = order_hint;
|
||||
|
||||
if (get_relative_dist(cm, order_hint, cur_order_hint) > 0)
|
||||
if (get_relative_dist(order_hint_info, order_hint, cur_order_hint) > 0)
|
||||
cm->ref_frame_side[ref_frame] = 1;
|
||||
else if (order_hint == cur_order_hint)
|
||||
cm->ref_frame_side[ref_frame] = -1;
|
||||
|
|
@ -1036,10 +1040,10 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
|
|||
|
||||
int ref_stamp = MFMV_STACK_SIZE - 1;
|
||||
|
||||
if (ref_buf_idx[LAST_FRAME - LAST_FRAME] >= 0) {
|
||||
if (ref_buf[LAST_FRAME - LAST_FRAME] != NULL) {
|
||||
const int alt_of_lst_order_hint =
|
||||
frame_bufs[ref_buf_idx[LAST_FRAME - LAST_FRAME]]
|
||||
.ref_frame_offset[ALTREF_FRAME - LAST_FRAME];
|
||||
ref_buf[LAST_FRAME - LAST_FRAME]
|
||||
->ref_order_hints[ALTREF_FRAME - LAST_FRAME];
|
||||
|
||||
const int is_lst_overlay =
|
||||
(alt_of_lst_order_hint == ref_order_hint[GOLDEN_FRAME - LAST_FRAME]);
|
||||
|
|
@ -1047,23 +1051,25 @@ void av1_setup_motion_field(AV1_COMMON *cm) {
|
|||
--ref_stamp;
|
||||
}
|
||||
|
||||
if (get_relative_dist(cm, ref_order_hint[BWDREF_FRAME - LAST_FRAME],
|
||||
if (get_relative_dist(order_hint_info,
|
||||
ref_order_hint[BWDREF_FRAME - LAST_FRAME],
|
||||
cur_order_hint) > 0) {
|
||||
if (motion_field_projection(cm, BWDREF_FRAME, 0)) --ref_stamp;
|
||||
}
|
||||
|
||||
if (get_relative_dist(cm, ref_order_hint[ALTREF2_FRAME - LAST_FRAME],
|
||||
if (get_relative_dist(order_hint_info,
|
||||
ref_order_hint[ALTREF2_FRAME - LAST_FRAME],
|
||||
cur_order_hint) > 0) {
|
||||
if (motion_field_projection(cm, ALTREF2_FRAME, 0)) --ref_stamp;
|
||||
}
|
||||
|
||||
if (get_relative_dist(cm, ref_order_hint[ALTREF_FRAME - LAST_FRAME],
|
||||
if (get_relative_dist(order_hint_info,
|
||||
ref_order_hint[ALTREF_FRAME - LAST_FRAME],
|
||||
cur_order_hint) > 0 &&
|
||||
ref_stamp >= 0)
|
||||
if (motion_field_projection(cm, ALTREF_FRAME, 0)) --ref_stamp;
|
||||
|
||||
if (ref_stamp >= 0 && ref_buf_idx[LAST2_FRAME - LAST_FRAME] >= 0)
|
||||
if (motion_field_projection(cm, LAST2_FRAME, 2)) --ref_stamp;
|
||||
if (ref_stamp >= 0) motion_field_projection(cm, LAST2_FRAME, 2);
|
||||
}
|
||||
|
||||
static INLINE void record_samples(MB_MODE_INFO *mbmi, int *pts, int *pts_inref,
|
||||
|
|
@ -1264,36 +1270,43 @@ int findSamples(const AV1_COMMON *cm, MACROBLOCKD *xd, int mi_row, int mi_col,
|
|||
}
|
||||
|
||||
void av1_setup_skip_mode_allowed(AV1_COMMON *cm) {
|
||||
cm->is_skip_mode_allowed = 0;
|
||||
cm->ref_frame_idx_0 = cm->ref_frame_idx_1 = INVALID_IDX;
|
||||
const OrderHintInfo *const order_hint_info = &cm->seq_params.order_hint_info;
|
||||
SkipModeInfo *const skip_mode_info = &cm->current_frame.skip_mode_info;
|
||||
|
||||
if (!cm->seq_params.enable_order_hint || frame_is_intra_only(cm) ||
|
||||
cm->reference_mode == SINGLE_REFERENCE)
|
||||
skip_mode_info->skip_mode_allowed = 0;
|
||||
skip_mode_info->ref_frame_idx_0 = INVALID_IDX;
|
||||
skip_mode_info->ref_frame_idx_1 = INVALID_IDX;
|
||||
|
||||
if (!order_hint_info->enable_order_hint || frame_is_intra_only(cm) ||
|
||||
cm->current_frame.reference_mode == SINGLE_REFERENCE)
|
||||
return;
|
||||
|
||||
RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
|
||||
const int cur_frame_offset = cm->frame_offset;
|
||||
int ref_frame_offset[2] = { -1, INT_MAX };
|
||||
const int cur_order_hint = cm->current_frame.order_hint;
|
||||
int ref_order_hints[2] = { -1, INT_MAX };
|
||||
int ref_idx[2] = { INVALID_IDX, INVALID_IDX };
|
||||
|
||||
// Identify the nearest forward and backward references.
|
||||
for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
|
||||
const int buf_idx = cm->frame_refs[i].idx;
|
||||
if (buf_idx == INVALID_IDX) continue;
|
||||
const RefCntBuffer *const buf = get_ref_frame_buf(cm, LAST_FRAME + i);
|
||||
if (buf == NULL) continue;
|
||||
|
||||
const int ref_offset = frame_bufs[buf_idx].cur_frame_offset;
|
||||
if (get_relative_dist(cm, ref_offset, cur_frame_offset) < 0) {
|
||||
const int ref_order_hint = buf->order_hint;
|
||||
if (get_relative_dist(order_hint_info, ref_order_hint, cur_order_hint) <
|
||||
0) {
|
||||
// Forward reference
|
||||
if (ref_frame_offset[0] == -1 ||
|
||||
get_relative_dist(cm, ref_offset, ref_frame_offset[0]) > 0) {
|
||||
ref_frame_offset[0] = ref_offset;
|
||||
if (ref_order_hints[0] == -1 ||
|
||||
get_relative_dist(order_hint_info, ref_order_hint,
|
||||
ref_order_hints[0]) > 0) {
|
||||
ref_order_hints[0] = ref_order_hint;
|
||||
ref_idx[0] = i;
|
||||
}
|
||||
} else if (get_relative_dist(cm, ref_offset, cur_frame_offset) > 0) {
|
||||
} else if (get_relative_dist(order_hint_info, ref_order_hint,
|
||||
cur_order_hint) > 0) {
|
||||
// Backward reference
|
||||
if (ref_frame_offset[1] == INT_MAX ||
|
||||
get_relative_dist(cm, ref_offset, ref_frame_offset[1]) < 0) {
|
||||
ref_frame_offset[1] = ref_offset;
|
||||
if (ref_order_hints[1] == INT_MAX ||
|
||||
get_relative_dist(order_hint_info, ref_order_hint,
|
||||
ref_order_hints[1]) < 0) {
|
||||
ref_order_hints[1] = ref_order_hint;
|
||||
ref_idx[1] = i;
|
||||
}
|
||||
}
|
||||
|
|
@ -1301,75 +1314,71 @@ void av1_setup_skip_mode_allowed(AV1_COMMON *cm) {
|
|||
|
||||
if (ref_idx[0] != INVALID_IDX && ref_idx[1] != INVALID_IDX) {
|
||||
// == Bi-directional prediction ==
|
||||
cm->is_skip_mode_allowed = 1;
|
||||
cm->ref_frame_idx_0 = AOMMIN(ref_idx[0], ref_idx[1]);
|
||||
cm->ref_frame_idx_1 = AOMMAX(ref_idx[0], ref_idx[1]);
|
||||
skip_mode_info->skip_mode_allowed = 1;
|
||||
skip_mode_info->ref_frame_idx_0 = AOMMIN(ref_idx[0], ref_idx[1]);
|
||||
skip_mode_info->ref_frame_idx_1 = AOMMAX(ref_idx[0], ref_idx[1]);
|
||||
} else if (ref_idx[0] != INVALID_IDX && ref_idx[1] == INVALID_IDX) {
|
||||
// == Forward prediction only ==
|
||||
// Identify the second nearest forward reference.
|
||||
ref_frame_offset[1] = -1;
|
||||
ref_order_hints[1] = -1;
|
||||
for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
|
||||
const int buf_idx = cm->frame_refs[i].idx;
|
||||
if (buf_idx == INVALID_IDX) continue;
|
||||
const RefCntBuffer *const buf = get_ref_frame_buf(cm, LAST_FRAME + i);
|
||||
if (buf == NULL) continue;
|
||||
|
||||
const int ref_offset = frame_bufs[buf_idx].cur_frame_offset;
|
||||
if ((ref_frame_offset[0] != -1 &&
|
||||
get_relative_dist(cm, ref_offset, ref_frame_offset[0]) < 0) &&
|
||||
(ref_frame_offset[1] == -1 ||
|
||||
get_relative_dist(cm, ref_offset, ref_frame_offset[1]) > 0)) {
|
||||
const int ref_order_hint = buf->order_hint;
|
||||
if ((ref_order_hints[0] != -1 &&
|
||||
get_relative_dist(order_hint_info, ref_order_hint,
|
||||
ref_order_hints[0]) < 0) &&
|
||||
(ref_order_hints[1] == -1 ||
|
||||
get_relative_dist(order_hint_info, ref_order_hint,
|
||||
ref_order_hints[1]) > 0)) {
|
||||
// Second closest forward reference
|
||||
ref_frame_offset[1] = ref_offset;
|
||||
ref_order_hints[1] = ref_order_hint;
|
||||
ref_idx[1] = i;
|
||||
}
|
||||
}
|
||||
if (ref_frame_offset[1] != -1) {
|
||||
cm->is_skip_mode_allowed = 1;
|
||||
cm->ref_frame_idx_0 = AOMMIN(ref_idx[0], ref_idx[1]);
|
||||
cm->ref_frame_idx_1 = AOMMAX(ref_idx[0], ref_idx[1]);
|
||||
if (ref_order_hints[1] != -1) {
|
||||
skip_mode_info->skip_mode_allowed = 1;
|
||||
skip_mode_info->ref_frame_idx_0 = AOMMIN(ref_idx[0], ref_idx[1]);
|
||||
skip_mode_info->ref_frame_idx_1 = AOMMAX(ref_idx[0], ref_idx[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int map_idx; // frame map index
|
||||
int buf_idx; // frame buffer index
|
||||
int sort_idx; // index based on the offset to be used for sorting
|
||||
int map_idx; // frame map index
|
||||
RefCntBuffer *buf; // frame buffer
|
||||
int sort_idx; // index based on the offset to be used for sorting
|
||||
} REF_FRAME_INFO;
|
||||
|
||||
// Compares the sort_idx fields. If they are equal, then compares the map_idx
|
||||
// fields to break the tie. This ensures a stable sort.
|
||||
static int compare_ref_frame_info(const void *arg_a, const void *arg_b) {
|
||||
const REF_FRAME_INFO *info_a = (REF_FRAME_INFO *)arg_a;
|
||||
const REF_FRAME_INFO *info_b = (REF_FRAME_INFO *)arg_b;
|
||||
|
||||
if (info_a->sort_idx < info_b->sort_idx) return -1;
|
||||
if (info_a->sort_idx > info_b->sort_idx) return 1;
|
||||
return (info_a->map_idx < info_b->map_idx)
|
||||
? -1
|
||||
: ((info_a->map_idx > info_b->map_idx) ? 1 : 0);
|
||||
const int sort_idx_diff = info_a->sort_idx - info_b->sort_idx;
|
||||
if (sort_idx_diff != 0) return sort_idx_diff;
|
||||
return info_a->map_idx - info_b->map_idx;
|
||||
}
|
||||
|
||||
static void set_ref_frame_info(AV1_COMMON *const cm, int frame_idx,
|
||||
REF_FRAME_INFO *ref_info) {
|
||||
assert(frame_idx >= 0 && frame_idx < INTER_REFS_PER_FRAME);
|
||||
|
||||
const int buf_idx = ref_info->buf_idx;
|
||||
|
||||
cm->frame_refs[frame_idx].idx = buf_idx;
|
||||
cm->frame_refs[frame_idx].buf = &cm->buffer_pool->frame_bufs[buf_idx].buf;
|
||||
cm->frame_refs[frame_idx].map_idx = ref_info->map_idx;
|
||||
cm->remapped_ref_idx[frame_idx] = ref_info->map_idx;
|
||||
}
|
||||
|
||||
void av1_set_frame_refs(AV1_COMMON *const cm, int lst_map_idx,
|
||||
int gld_map_idx) {
|
||||
BufferPool *const pool = cm->buffer_pool;
|
||||
RefCntBuffer *const frame_bufs = pool->frame_bufs;
|
||||
|
||||
int lst_frame_sort_idx = -1;
|
||||
int gld_frame_sort_idx = -1;
|
||||
|
||||
assert(cm->seq_params.enable_order_hint);
|
||||
assert(cm->seq_params.order_hint_bits_minus_1 >= 0);
|
||||
const int cur_frame_offset = (int)cm->frame_offset;
|
||||
const int cur_frame_sort_idx = 1 << cm->seq_params.order_hint_bits_minus_1;
|
||||
assert(cm->seq_params.order_hint_info.enable_order_hint);
|
||||
assert(cm->seq_params.order_hint_info.order_hint_bits_minus_1 >= 0);
|
||||
const int cur_order_hint = (int)cm->current_frame.order_hint;
|
||||
const int cur_frame_sort_idx =
|
||||
1 << cm->seq_params.order_hint_info.order_hint_bits_minus_1;
|
||||
|
||||
REF_FRAME_INFO ref_frame_info[REF_FRAMES];
|
||||
int ref_flag_list[INTER_REFS_PER_FRAME] = { 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
|
@ -1380,18 +1389,21 @@ void av1_set_frame_refs(AV1_COMMON *const cm, int lst_map_idx,
|
|||
ref_frame_info[i].map_idx = map_idx;
|
||||
ref_frame_info[i].sort_idx = -1;
|
||||
|
||||
const int buf_idx = cm->ref_frame_map[map_idx];
|
||||
ref_frame_info[i].buf_idx = buf_idx;
|
||||
RefCntBuffer *const buf = cm->ref_frame_map[map_idx];
|
||||
ref_frame_info[i].buf = buf;
|
||||
|
||||
if (buf_idx < 0 || buf_idx >= FRAME_BUFFERS) continue;
|
||||
// TODO(zoeliu@google.com): To verify the checking on ref_count.
|
||||
if (frame_bufs[buf_idx].ref_count <= 0) continue;
|
||||
if (buf == NULL) continue;
|
||||
// If this assertion fails, there is a reference leak.
|
||||
assert(buf->ref_count > 0);
|
||||
// TODO(wtc@google.com): Remove the checking on ref_count after 2019-03-01.
|
||||
if (buf->ref_count <= 0) continue;
|
||||
|
||||
const int offset = (int)frame_bufs[buf_idx].cur_frame_offset;
|
||||
const int offset = (int)buf->order_hint;
|
||||
ref_frame_info[i].sort_idx =
|
||||
(offset == -1) ? -1
|
||||
: cur_frame_sort_idx +
|
||||
get_relative_dist(cm, offset, cur_frame_offset);
|
||||
get_relative_dist(&cm->seq_params.order_hint_info,
|
||||
offset, cur_order_hint);
|
||||
assert(ref_frame_info[i].sort_idx >= -1);
|
||||
|
||||
if (map_idx == lst_map_idx) lst_frame_sort_idx = ref_frame_info[i].sort_idx;
|
||||
|
|
@ -1414,8 +1426,8 @@ void av1_set_frame_refs(AV1_COMMON *const cm, int lst_map_idx,
|
|||
compare_ref_frame_info);
|
||||
|
||||
// Identify forward and backward reference frames.
|
||||
// Forward reference: offset < cur_frame_offset
|
||||
// Backward reference: offset >= cur_frame_offset
|
||||
// Forward reference: offset < order_hint
|
||||
// Backward reference: offset >= order_hint
|
||||
int fwd_start_idx = 0, fwd_end_idx = REF_FRAMES - 1;
|
||||
|
||||
for (int i = 0; i < REF_FRAMES; i++) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue