Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 1 | /* |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 3 | * |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 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. |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 10 | */ |
| 11 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 12 | #ifndef AV1_COMMON_ENTROPYMV_H_ |
| 13 | #define AV1_COMMON_ENTROPYMV_H_ |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 14 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 15 | #include "./aom_config.h" |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 16 | |
| 17 | #include "aom_dsp/prob.h" |
| 18 | |
| 19 | #include "av1/common/mv.h" |
| 20 | |
| 21 | #ifdef __cplusplus |
| 22 | extern "C" { |
| 23 | #endif |
| 24 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 25 | struct AV1Common; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 26 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 27 | void av1_init_mv_probs(struct AV1Common *cm); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 28 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 29 | void av1_adapt_mv_probs(struct AV1Common *cm, int usehp); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 30 | |
| 31 | #define MV_UPDATE_PROB 252 |
| 32 | |
| 33 | /* Symbols for coding which components are zero jointly */ |
| 34 | #define MV_JOINTS 4 |
| 35 | typedef enum { |
| 36 | MV_JOINT_ZERO = 0, /* Zero vector */ |
| 37 | MV_JOINT_HNZVZ = 1, /* Vert zero, hor nonzero */ |
| 38 | MV_JOINT_HZVNZ = 2, /* Hor zero, vert nonzero */ |
| 39 | MV_JOINT_HNZVNZ = 3, /* Both components nonzero */ |
| 40 | } MV_JOINT_TYPE; |
| 41 | |
| 42 | static INLINE int mv_joint_vertical(MV_JOINT_TYPE type) { |
| 43 | return type == MV_JOINT_HZVNZ || type == MV_JOINT_HNZVNZ; |
| 44 | } |
| 45 | |
| 46 | static INLINE int mv_joint_horizontal(MV_JOINT_TYPE type) { |
| 47 | return type == MV_JOINT_HNZVZ || type == MV_JOINT_HNZVNZ; |
| 48 | } |
| 49 | |
| 50 | /* Symbols for coding magnitude class of nonzero components */ |
| 51 | #define MV_CLASSES 11 |
| 52 | typedef enum { |
| 53 | MV_CLASS_0 = 0, /* (0, 2] integer pel */ |
| 54 | MV_CLASS_1 = 1, /* (2, 4] integer pel */ |
| 55 | MV_CLASS_2 = 2, /* (4, 8] integer pel */ |
| 56 | MV_CLASS_3 = 3, /* (8, 16] integer pel */ |
| 57 | MV_CLASS_4 = 4, /* (16, 32] integer pel */ |
| 58 | MV_CLASS_5 = 5, /* (32, 64] integer pel */ |
| 59 | MV_CLASS_6 = 6, /* (64, 128] integer pel */ |
| 60 | MV_CLASS_7 = 7, /* (128, 256] integer pel */ |
| 61 | MV_CLASS_8 = 8, /* (256, 512] integer pel */ |
| 62 | MV_CLASS_9 = 9, /* (512, 1024] integer pel */ |
| 63 | MV_CLASS_10 = 10, /* (1024,2048] integer pel */ |
| 64 | } MV_CLASS_TYPE; |
| 65 | |
| 66 | #define CLASS0_BITS 1 /* bits at integer precision for class 0 */ |
| 67 | #define CLASS0_SIZE (1 << CLASS0_BITS) |
| 68 | #define MV_OFFSET_BITS (MV_CLASSES + CLASS0_BITS - 2) |
| 69 | #define MV_FP_SIZE 4 |
| 70 | |
| 71 | #define MV_MAX_BITS (MV_CLASSES + CLASS0_BITS + 2) |
| 72 | #define MV_MAX ((1 << MV_MAX_BITS) - 1) |
| 73 | #define MV_VALS ((MV_MAX << 1) + 1) |
| 74 | |
| 75 | #define MV_IN_USE_BITS 14 |
| 76 | #define MV_UPP ((1 << MV_IN_USE_BITS) - 1) |
| 77 | #define MV_LOW (-(1 << MV_IN_USE_BITS)) |
| 78 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 79 | extern const aom_tree_index av1_mv_joint_tree[]; |
| 80 | extern const aom_tree_index av1_mv_class_tree[]; |
| 81 | extern const aom_tree_index av1_mv_class0_tree[]; |
| 82 | extern const aom_tree_index av1_mv_fp_tree[]; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 83 | |
| 84 | typedef struct { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 85 | aom_prob sign; |
| 86 | aom_prob classes[MV_CLASSES - 1]; |
Thomas Davies | f3eb840 | 2017-02-20 18:20:20 +0000 | [diff] [blame] | 87 | aom_cdf_prob class_cdf[CDF_SIZE(MV_CLASSES)]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 88 | aom_prob class0[CLASS0_SIZE - 1]; |
| 89 | aom_prob bits[MV_OFFSET_BITS]; |
| 90 | aom_prob class0_fp[CLASS0_SIZE][MV_FP_SIZE - 1]; |
| 91 | aom_prob fp[MV_FP_SIZE - 1]; |
Thomas Davies | f3eb840 | 2017-02-20 18:20:20 +0000 | [diff] [blame] | 92 | aom_cdf_prob class0_fp_cdf[CLASS0_SIZE][CDF_SIZE(MV_FP_SIZE)]; |
| 93 | aom_cdf_prob fp_cdf[CDF_SIZE(MV_FP_SIZE)]; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 94 | aom_prob class0_hp; |
| 95 | aom_prob hp; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 96 | } nmv_component; |
| 97 | |
| 98 | typedef struct { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 99 | aom_prob joints[MV_JOINTS - 1]; |
Thomas Davies | f3eb840 | 2017-02-20 18:20:20 +0000 | [diff] [blame] | 100 | aom_cdf_prob joint_cdf[CDF_SIZE(MV_JOINTS)]; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 101 | nmv_component comps[2]; |
| 102 | } nmv_context; |
| 103 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 104 | static INLINE MV_JOINT_TYPE av1_get_mv_joint(const MV *mv) { |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 105 | if (mv->row == 0) { |
| 106 | return mv->col == 0 ? MV_JOINT_ZERO : MV_JOINT_HNZVZ; |
| 107 | } else { |
| 108 | return mv->col == 0 ? MV_JOINT_HZVNZ : MV_JOINT_HNZVNZ; |
| 109 | } |
| 110 | } |
| 111 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 112 | MV_CLASS_TYPE av1_get_mv_class(int z, int *offset); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 113 | |
| 114 | typedef struct { |
| 115 | unsigned int sign[2]; |
| 116 | unsigned int classes[MV_CLASSES]; |
| 117 | unsigned int class0[CLASS0_SIZE]; |
| 118 | unsigned int bits[MV_OFFSET_BITS][2]; |
| 119 | unsigned int class0_fp[CLASS0_SIZE][MV_FP_SIZE]; |
| 120 | unsigned int fp[MV_FP_SIZE]; |
| 121 | unsigned int class0_hp[2]; |
| 122 | unsigned int hp[2]; |
| 123 | } nmv_component_counts; |
| 124 | |
| 125 | typedef struct { |
| 126 | unsigned int joints[MV_JOINTS]; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 127 | nmv_component_counts comps[2]; |
| 128 | } nmv_context_counts; |
| 129 | |
Alex Converse | 6b2584c | 2017-05-02 09:51:21 -0700 | [diff] [blame^] | 130 | typedef enum { |
| 131 | #if CONFIG_INTRABC |
| 132 | MV_SUBPEL_NONE = -1, |
| 133 | #endif |
| 134 | MV_SUBPEL_LOW_PRECISION = 0, |
| 135 | MV_SUBPEL_HIGH_PRECISION, |
| 136 | } MvSubpelPrecision; |
| 137 | |
| 138 | void av1_inc_mv(const MV *mv, nmv_context_counts *mvctx, |
| 139 | MvSubpelPrecision precision); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 140 | #if CONFIG_GLOBAL_MOTION |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 141 | extern const aom_tree_index |
David Barker | cf3d0b0 | 2016-11-10 10:14:49 +0000 | [diff] [blame] | 142 | av1_global_motion_types_tree[TREE_SIZE(GLOBAL_TRANS_TYPES)]; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 143 | #endif // CONFIG_GLOBAL_MOTION |
Nathan E. Egge | 476c63c | 2017-05-18 18:35:16 -0400 | [diff] [blame] | 144 | #if !CONFIG_EC_ADAPT |
Thomas Davies | 6519beb | 2016-10-19 14:46:07 +0100 | [diff] [blame] | 145 | void av1_set_mv_cdfs(nmv_context *ctx); |
| 146 | #endif |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 147 | |
| 148 | #ifdef __cplusplus |
| 149 | } // extern "C" |
| 150 | #endif |
| 151 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 152 | #endif // AV1_COMMON_ENTROPYMV_H_ |