1 /*
2 * i965_vpp_avs.h - Adaptive Video Scaler (AVS) block
3 *
4 * Copyright (C) 2014 Intel Corporation
5 * Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
17 * of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 */
27
28 #ifndef I965_VPP_AVS_H
29 #define I965_VPP_AVS_H
30
31 #include <stdint.h>
32 #include <stdbool.h>
33
34 /** Maximum number of phases for the sharp filter */
35 #define AVS_MAX_PHASES 32
36
37 /** Maximum number of coefficients for luma samples */
38 #define AVS_MAX_LUMA_COEFFS 8
39
40 /** Maximum number of coefficients for chroma samples */
41 #define AVS_MAX_CHROMA_COEFFS 4
42
43 typedef struct avs_coeffs AVSCoeffs;
44 typedef struct avs_coeffs_range AVSCoeffsRange;
45 typedef struct avs_config AVSConfig;
46 typedef struct avs_state AVSState;
47
48 /** AVS coefficients for one phase */
49 struct avs_coeffs {
50 /** Coefficients for luma samples on the X-axis (horizontal) */
51 float y_k_h[AVS_MAX_LUMA_COEFFS];
52 /** Coefficients for luma samples on the Y-axis (vertical) */
53 float y_k_v[AVS_MAX_LUMA_COEFFS];
54 /** Coefficients for chroma samples on the X-axis (horizontal) */
55 float uv_k_h[AVS_MAX_CHROMA_COEFFS];
56 /** Coefficients for chroma samples on the Y-axis (vertical) */
57 float uv_k_v[AVS_MAX_CHROMA_COEFFS];
58 };
59
60 /** AVS coefficients range used for validation */
61 struct avs_coeffs_range {
62 /** Lower bound for all coefficients */
63 AVSCoeffs lower_bound;
64 /** Upper bound for all coefficients */
65 AVSCoeffs upper_bound;
66 };
67
68 /** Static configuration (per-generation) */
69 struct avs_config {
70 /** Number of bits used for the fractional part of a coefficient */
71 int coeff_frac_bits;
72 /** The smallest float that could be represented as a coefficient */
73 float coeff_epsilon;
74 /** Coefficients range */
75 AVSCoeffsRange coeff_range;
76 /** Number of phases for the sharp filter */
77 int num_phases;
78 /** Number of coefficients for luma samples */
79 int num_luma_coeffs;
80 /** Number of coefficients for chroma samples */
81 int num_chroma_coeffs;
82 };
83
84 /** AVS block state */
85 struct avs_state {
86 /** Per-generation configuration parameters */
87 const AVSConfig *config;
88 /** Scaling flags */
89 uint32_t flags;
90 /** Scaling factor on the X-axis (horizontal) */
91 float scale_x;
92 /** Scaling factor on the Y-axis (vertical) */
93 float scale_y;
94 /** Coefficients for the polyphase scaler */
95 AVSCoeffs coeffs[AVS_MAX_PHASES + 1];
96 };
97
98 /** Initializes AVS state with the supplied configuration */
99 void
100 avs_init_state(AVSState *avs, const AVSConfig *config);
101
102 /** Updates AVS coefficients for the supplied factors and quality level */
103 bool
104 avs_update_coefficients(AVSState *avs, float sx, float sy, uint32_t flags);
105
106 /** Checks whether AVS is needed, e.g. if high-quality scaling is requested */
107 static inline bool
avs_is_needed(uint32_t flags)108 avs_is_needed(uint32_t flags)
109 {
110 return ((flags & VA_FILTER_SCALING_MASK) >= VA_FILTER_SCALING_HQ);
111 }
112
113 #endif /* I965_VPP_AVS_H */
114