/src/aom/av1/common/resize.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2016, 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 | | #ifndef AOM_AV1_COMMON_RESIZE_H_ |
13 | | #define AOM_AV1_COMMON_RESIZE_H_ |
14 | | |
15 | | #include <stdio.h> |
16 | | #include "aom/aom_integer.h" |
17 | | #include "av1/common/av1_common_int.h" |
18 | | |
19 | | #ifdef __cplusplus |
20 | | extern "C" { |
21 | | #endif |
22 | | |
23 | | void av1_resize_plane(const uint8_t *const input, int height, int width, |
24 | | int in_stride, uint8_t *output, int height2, int width2, |
25 | | int out_stride); |
26 | | void av1_upscale_plane_double_prec(const double *const input, int height, |
27 | | int width, int in_stride, double *output, |
28 | | int height2, int width2, int out_stride); |
29 | | void av1_resize_frame420(const uint8_t *const y, int y_stride, |
30 | | const uint8_t *const u, const uint8_t *const v, |
31 | | int uv_stride, int height, int width, uint8_t *oy, |
32 | | int oy_stride, uint8_t *ou, uint8_t *ov, |
33 | | int ouv_stride, int oheight, int owidth); |
34 | | void av1_resize_frame422(const uint8_t *const y, int y_stride, |
35 | | const uint8_t *const u, const uint8_t *const v, |
36 | | int uv_stride, int height, int width, uint8_t *oy, |
37 | | int oy_stride, uint8_t *ou, uint8_t *ov, |
38 | | int ouv_stride, int oheight, int owidth); |
39 | | void av1_resize_frame444(const uint8_t *const y, int y_stride, |
40 | | const uint8_t *const u, const uint8_t *const v, |
41 | | int uv_stride, int height, int width, uint8_t *oy, |
42 | | int oy_stride, uint8_t *ou, uint8_t *ov, |
43 | | int ouv_stride, int oheight, int owidth); |
44 | | |
45 | | void av1_highbd_resize_plane(const uint8_t *const input, int height, int width, |
46 | | int in_stride, uint8_t *output, int height2, |
47 | | int width2, int out_stride, int bd); |
48 | | void av1_highbd_resize_frame420(const uint8_t *const y, int y_stride, |
49 | | const uint8_t *const u, const uint8_t *const v, |
50 | | int uv_stride, int height, int width, |
51 | | uint8_t *oy, int oy_stride, uint8_t *ou, |
52 | | uint8_t *ov, int ouv_stride, int oheight, |
53 | | int owidth, int bd); |
54 | | void av1_highbd_resize_frame422(const uint8_t *const y, int y_stride, |
55 | | const uint8_t *const u, const uint8_t *const v, |
56 | | int uv_stride, int height, int width, |
57 | | uint8_t *oy, int oy_stride, uint8_t *ou, |
58 | | uint8_t *ov, int ouv_stride, int oheight, |
59 | | int owidth, int bd); |
60 | | void av1_highbd_resize_frame444(const uint8_t *const y, int y_stride, |
61 | | const uint8_t *const u, const uint8_t *const v, |
62 | | int uv_stride, int height, int width, |
63 | | uint8_t *oy, int oy_stride, uint8_t *ou, |
64 | | uint8_t *ov, int ouv_stride, int oheight, |
65 | | int owidth, int bd); |
66 | | |
67 | | void av1_upscale_normative_rows(const AV1_COMMON *cm, const uint8_t *src, |
68 | | int src_stride, uint8_t *dst, int dst_stride, |
69 | | int plane, int rows); |
70 | | void av1_upscale_normative_and_extend_frame(const AV1_COMMON *cm, |
71 | | const YV12_BUFFER_CONFIG *src, |
72 | | YV12_BUFFER_CONFIG *dst); |
73 | | |
74 | | YV12_BUFFER_CONFIG *av1_realloc_and_scale_if_required( |
75 | | AV1_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled, |
76 | | const InterpFilter filter, const int phase, const bool use_optimized_scaler, |
77 | | const bool for_psnr, const int border_in_pixels, |
78 | | const int num_pyramid_levels); |
79 | | |
80 | | void av1_resize_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src, |
81 | | YV12_BUFFER_CONFIG *dst, int bd, |
82 | | const int num_planes); |
83 | | |
84 | | // Calculates the scaled dimensions from the given original dimensions and the |
85 | | // resize scale denominator. |
86 | | void av1_calculate_scaled_size(int *width, int *height, int resize_denom); |
87 | | |
88 | | // Similar to above, but calculates scaled dimensions after superres from the |
89 | | // given original dimensions and superres scale denominator. |
90 | | void av1_calculate_scaled_superres_size(int *width, int *height, |
91 | | int superres_denom); |
92 | | |
93 | | // Inverse of av1_calculate_scaled_superres_size() above: calculates the |
94 | | // original dimensions from the given scaled dimensions and the scale |
95 | | // denominator. |
96 | | void av1_calculate_unscaled_superres_size(int *width, int *height, int denom); |
97 | | |
98 | | void av1_superres_upscale(AV1_COMMON *cm, BufferPool *const pool, |
99 | | int num_pyramid_levels); |
100 | | |
101 | | // Returns 1 if a superres upscaled frame is scaled and 0 otherwise. |
102 | 2.45M | static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { |
103 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling |
104 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. |
105 | | // So, the following check is more accurate. |
106 | 2.45M | return (cm->width != cm->superres_upscaled_width); |
107 | 2.45M | } decodeframe.c:av1_superres_scaled Line | Count | Source | 102 | 234k | static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { | 103 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 104 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 105 | | // So, the following check is more accurate. | 106 | 234k | return (cm->width != cm->superres_upscaled_width); | 107 | 234k | } |
Unexecuted instantiation: convolve.c:av1_superres_scaled resize.c:av1_superres_scaled Line | Count | Source | 102 | 6.26k | static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { | 103 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 104 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 105 | | // So, the following check is more accurate. | 106 | 6.26k | return (cm->width != cm->superres_upscaled_width); | 107 | 6.26k | } |
restoration.c:av1_superres_scaled Line | Count | Source | 102 | 2.19M | static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { | 103 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 104 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 105 | | // So, the following check is more accurate. | 106 | 2.19M | return (cm->width != cm->superres_upscaled_width); | 107 | 2.19M | } |
tile_common.c:av1_superres_scaled Line | Count | Source | 102 | 15.5k | static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { | 103 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 104 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 105 | | // So, the following check is more accurate. | 106 | 15.5k | return (cm->width != cm->superres_upscaled_width); | 107 | 15.5k | } |
Unexecuted instantiation: resize_ssse3.c:av1_superres_scaled Unexecuted instantiation: av1_convolve_horiz_rs_sse4.c:av1_superres_scaled |
108 | | |
109 | | // The optimized scaler av1_resize_and_extend_frame() can only handle scaling |
110 | | // ratios >= 1/4 and <= 16. See comment in aom_convolve8_c() for detail. |
111 | | // Visual assessment shows that if the scaling ratio or its reciprocal is not a |
112 | | // multiple of 1/16, there are some artifacts in the output of the optimized |
113 | | // scaler, especially on lines, due to non-exact ratio representation. SSSE3 |
114 | | // and NEON have a specialized 3/4 version of av1_resize_and_extend_frame() |
115 | | // that does not have this issue. |
116 | | // |
117 | | // Use the non-normative scaler av1_resize_and_extend_frame_nonnormative() |
118 | | // for other scaling ratios. |
119 | | static INLINE bool av1_has_optimized_scaler(const int src_width, |
120 | | const int src_height, |
121 | | const int dst_width, |
122 | 0 | const int dst_height) { |
123 | 0 | bool has_optimized_scaler = |
124 | 0 | (dst_width * 4 >= src_width && dst_height * 4 >= src_height) && |
125 | 0 | (dst_width <= src_width * 16 && dst_height <= src_height * 16) && |
126 | 0 | (16 * dst_width % src_width == 0) && (16 * src_width % dst_width == 0) && |
127 | 0 | (16 * dst_height % src_height == 0) && |
128 | 0 | (16 * src_height % dst_height == 0); |
129 | 0 | #if HAVE_SSSE3 || HAVE_NEON |
130 | 0 | has_optimized_scaler = |
131 | 0 | has_optimized_scaler || |
132 | 0 | (4 * dst_width == 3 * src_width && 4 * dst_height == 3 * src_height); |
133 | 0 | #endif |
134 | 0 | return has_optimized_scaler; |
135 | 0 | } Unexecuted instantiation: decodeframe.c:av1_has_optimized_scaler Unexecuted instantiation: convolve.c:av1_has_optimized_scaler Unexecuted instantiation: resize.c:av1_has_optimized_scaler Unexecuted instantiation: restoration.c:av1_has_optimized_scaler Unexecuted instantiation: tile_common.c:av1_has_optimized_scaler Unexecuted instantiation: resize_ssse3.c:av1_has_optimized_scaler Unexecuted instantiation: av1_convolve_horiz_rs_sse4.c:av1_has_optimized_scaler |
136 | | |
137 | 7.17M | #define UPSCALE_NORMATIVE_TAPS 8 |
138 | | extern const int16_t av1_resize_filter_normative[1 << RS_SUBPEL_BITS] |
139 | | [UPSCALE_NORMATIVE_TAPS]; |
140 | | |
141 | | int32_t av1_get_upscale_convolve_step(int in_length, int out_length); |
142 | | |
143 | | #ifdef __cplusplus |
144 | | } // extern "C" |
145 | | #endif |
146 | | |
147 | | #endif // AOM_AV1_COMMON_RESIZE_H_ |