/src/avm/av2/common/tip.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2021, Alliance for Open Media. All rights reserved |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 3-Clause Clear License |
5 | | * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause |
6 | | * Clear License was not distributed with this source code in the LICENSE file, |
7 | | * you can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. |
8 | | * If the Alliance for Open Media Patent License 1.0 was not distributed with |
9 | | * this source code in the PATENTS file, you can obtain it at |
10 | | * aomedia.org/license/patent-license/. |
11 | | */ |
12 | | |
13 | | #ifndef AVM_AV2_COMMON_TIP_H_ |
14 | | #define AVM_AV2_COMMON_TIP_H_ |
15 | | |
16 | | #ifdef __cplusplus |
17 | | extern "C" { |
18 | | #endif |
19 | | |
20 | | #include "av2/common/av2_common_int.h" |
21 | | #include "av2/common/mvref_common.h" |
22 | | #include "av2/common/reconinter.h" |
23 | | |
24 | | #define TIP_RD_CORRECTION 100000 |
25 | | |
26 | | // Maximum block size allowed to combine the blocks with same MV |
27 | 0 | #define MAX_BLOCK_SIZE_WITH_SAME_MV 64 |
28 | | |
29 | | // Encoder: Decide TIP mode is enabled or disabled. If TIP is enabled, derive |
30 | | // temporal motion field from one closest forward and one closet backward |
31 | | // reference frames, then fill the hole |
32 | | void av2_enc_setup_tip_motion_field(AV2_COMMON *cm); |
33 | | |
34 | | // Derive temporal motion field from one closest forward and one closet |
35 | | // backward reference frames, then fill the hole |
36 | | void av2_setup_tip_motion_field(AV2_COMMON *cm); |
37 | | |
38 | | // Generate the whole TIP frame with the temporal motion field |
39 | | void av2_setup_tip_frame(AV2_COMMON *cm, MACROBLOCKD *xd, uint16_t **mc_buf, |
40 | | CONV_BUF_TYPE *tmp_conv_dst, |
41 | | CalcSubpelParamsFunc calc_subpel_params_func, |
42 | | int copy_refined_mvs); |
43 | | |
44 | | // Row based processing for TIP frame |
45 | | void av2_tip_setup_tip_frame_row(AV2_COMMON *cm, MACROBLOCKD *xd, int blk_row, |
46 | | int blk_col_start, int blk_row_end, |
47 | | int blk_col_end, int mvs_stride, |
48 | | int unit_blk_size, int max_allow_blk_size, |
49 | | uint16_t **mc_buf, CONV_BUF_TYPE *tmp_conv_dst, |
50 | | CalcSubpelParamsFunc calc_subpel_params_func, |
51 | | int copy_refined_mvs); |
52 | | |
53 | | // Get the block width when blocks with same MV are combined. |
54 | | static AVM_INLINE int get_tip_block_width_with_same_mv( |
55 | | const AV2_COMMON *cm, const TPL_MV_REF *tpl_mvs, int unit_blk_size, |
56 | 0 | int blk_col, int blk_col_end, int max_allow_blk_size) { |
57 | 0 | int blk_width = unit_blk_size; |
58 | 0 | const int step = unit_blk_size >> TMVP_MI_SZ_LOG2; |
59 | 0 | int offset = step; |
60 | |
|
61 | 0 | const int cur_col_offset = blk_col + derive_col_mv_tpl_offset(cm, blk_col); |
62 | 0 | int next_col_offset = |
63 | 0 | blk_col + offset + derive_col_mv_tpl_offset(cm, blk_col + offset); |
64 | 0 | const int is_zero_tpl_mv = tpl_mvs[cur_col_offset].mfmv0.as_int == 0 || |
65 | 0 | tpl_mvs[cur_col_offset].mfmv0.as_int == INVALID_MV; |
66 | |
|
67 | 0 | while (blk_col + offset < blk_col_end && blk_width < max_allow_blk_size && |
68 | 0 | (tpl_mvs[cur_col_offset].mfmv0.as_int == |
69 | 0 | tpl_mvs[next_col_offset].mfmv0.as_int || |
70 | 0 | (is_zero_tpl_mv && |
71 | 0 | (tpl_mvs[next_col_offset].mfmv0.as_int == 0 || |
72 | 0 | tpl_mvs[next_col_offset].mfmv0.as_int == INVALID_MV)))) { |
73 | 0 | blk_width += unit_blk_size; |
74 | 0 | offset += step; |
75 | 0 | next_col_offset = |
76 | 0 | blk_col + offset + derive_col_mv_tpl_offset(cm, blk_col + offset); |
77 | 0 | } |
78 | |
|
79 | 0 | blk_width = 1 << get_msb(blk_width); |
80 | 0 | return blk_width; |
81 | 0 | } Unexecuted instantiation: av2_dx_iface.c:get_tip_block_width_with_same_mv Unexecuted instantiation: annexF.c:get_tip_block_width_with_same_mv Unexecuted instantiation: decodeframe.c:get_tip_block_width_with_same_mv Unexecuted instantiation: decodemv.c:get_tip_block_width_with_same_mv Unexecuted instantiation: decoder.c:get_tip_block_width_with_same_mv Unexecuted instantiation: decodetxb.c:get_tip_block_width_with_same_mv Unexecuted instantiation: detokenize.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_fgm.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_ci.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_atlas.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_lcr.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_ops.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_buf.c:get_tip_block_width_with_same_mv Unexecuted instantiation: alloccommon.c:get_tip_block_width_with_same_mv Unexecuted instantiation: level.c:get_tip_block_width_with_same_mv Unexecuted instantiation: mvref_common.c:get_tip_block_width_with_same_mv Unexecuted instantiation: reconinter.c:get_tip_block_width_with_same_mv Unexecuted instantiation: thread_common.c:get_tip_block_width_with_same_mv Unexecuted instantiation: tip.c:get_tip_block_width_with_same_mv Unexecuted instantiation: obu_qm.c:get_tip_block_width_with_same_mv |
82 | | |
83 | | // Check if MV refinement is disabled for TIP 16x16 blocks. |
84 | | static AVM_INLINE int is_tip_mv_refinement_disabled_for_unit_size_16x16( |
85 | 0 | int unit_blk_size, int enable_tip_refinemv, TIP_FRAME_MODE tip_frame_mode) { |
86 | 0 | if (unit_blk_size != 16) return 0; |
87 | 0 | return !enable_tip_refinemv || tip_frame_mode == TIP_FRAME_AS_OUTPUT; |
88 | 0 | } Unexecuted instantiation: av2_dx_iface.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: annexF.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: decodeframe.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: decodemv.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: decoder.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: decodetxb.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: detokenize.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_fgm.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_ci.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_atlas.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_lcr.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_ops.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_buf.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: alloccommon.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: level.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: mvref_common.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: reconinter.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: thread_common.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: tip.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 Unexecuted instantiation: obu_qm.c:is_tip_mv_refinement_disabled_for_unit_size_16x16 |
89 | | |
90 | | // Compute scale factor for temporal scaling |
91 | 0 | static AVM_INLINE int tip_derive_scale_factor(int num, int den_signed) { |
92 | 0 | int den = den_signed < 0 ? -den_signed : den_signed; |
93 | 0 | int sign = den_signed < 0 ? -1 : 1; |
94 | 0 | den = AVMMIN(den, MAX_FRAME_DISTANCE); |
95 | 0 | num = num > 0 ? AVMMIN(num, MAX_FRAME_DISTANCE) |
96 | 0 | : AVMMAX(num, -MAX_FRAME_DISTANCE); |
97 | 0 | return sign * num * div_mult[den]; |
98 | 0 | } Unexecuted instantiation: av2_dx_iface.c:tip_derive_scale_factor Unexecuted instantiation: annexF.c:tip_derive_scale_factor Unexecuted instantiation: decodeframe.c:tip_derive_scale_factor Unexecuted instantiation: decodemv.c:tip_derive_scale_factor Unexecuted instantiation: decoder.c:tip_derive_scale_factor Unexecuted instantiation: decodetxb.c:tip_derive_scale_factor Unexecuted instantiation: detokenize.c:tip_derive_scale_factor Unexecuted instantiation: obu_fgm.c:tip_derive_scale_factor Unexecuted instantiation: obu.c:tip_derive_scale_factor Unexecuted instantiation: obu_ci.c:tip_derive_scale_factor Unexecuted instantiation: obu_atlas.c:tip_derive_scale_factor Unexecuted instantiation: obu_lcr.c:tip_derive_scale_factor Unexecuted instantiation: obu_ops.c:tip_derive_scale_factor Unexecuted instantiation: obu_buf.c:tip_derive_scale_factor Unexecuted instantiation: alloccommon.c:tip_derive_scale_factor Unexecuted instantiation: level.c:tip_derive_scale_factor Unexecuted instantiation: mvref_common.c:tip_derive_scale_factor Unexecuted instantiation: reconinter.c:tip_derive_scale_factor Unexecuted instantiation: thread_common.c:tip_derive_scale_factor Unexecuted instantiation: tip.c:tip_derive_scale_factor Unexecuted instantiation: obu_qm.c:tip_derive_scale_factor |
99 | | #ifdef __cplusplus |
100 | | } // extern "C" |
101 | | #endif |
102 | | |
103 | | #endif // AVM_AV2_COMMON_TIP_H_ |