/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 | | // Filters for factor of 2 downsampling. |
24 | | static const int16_t av1_down2_symeven_half_filter[] = { 56, 12, -3, -1 }; |
25 | | static const int16_t av1_down2_symodd_half_filter[] = { 64, 35, 0, -3 }; |
26 | | |
27 | | bool av1_resize_plane(const uint8_t *input, int height, int width, |
28 | | int in_stride, uint8_t *output, int height2, int width2, |
29 | | int out_stride); |
30 | | |
31 | | void av1_upscale_normative_rows(const AV1_COMMON *cm, const uint8_t *src, |
32 | | int src_stride, uint8_t *dst, int dst_stride, |
33 | | int plane, int rows); |
34 | | |
35 | | YV12_BUFFER_CONFIG *av1_realloc_and_scale_if_required( |
36 | | AV1_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled, |
37 | | const InterpFilter filter, const int phase, const bool use_optimized_scaler, |
38 | | const bool for_psnr, const int border_in_pixels, const bool alloc_pyramid); |
39 | | |
40 | | bool av1_resize_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src, |
41 | | YV12_BUFFER_CONFIG *dst, int bd, |
42 | | int num_planes); |
43 | | |
44 | | // Calculates the scaled dimensions from the given original dimensions and the |
45 | | // resize scale denominator. |
46 | | void av1_calculate_scaled_size(int *width, int *height, int resize_denom); |
47 | | |
48 | | // Similar to above, but calculates scaled dimensions after superres from the |
49 | | // given original dimensions and superres scale denominator. |
50 | | void av1_calculate_scaled_superres_size(int *width, int *height, |
51 | | int superres_denom); |
52 | | |
53 | | void av1_superres_upscale(AV1_COMMON *cm, BufferPool *const pool, |
54 | | bool alloc_pyramid); |
55 | | |
56 | | bool av1_resize_plane_to_half(const uint8_t *const input, int height, int width, |
57 | | int in_stride, uint8_t *output, int height2, |
58 | | int width2, int out_stride); |
59 | | |
60 | | void down2_symeven(const uint8_t *const input, int length, uint8_t *output, |
61 | | int start_offset); |
62 | | |
63 | | bool should_resize_by_half(int height, int width, int height2, int width2); |
64 | | |
65 | | // Returns 1 if a superres upscaled frame is scaled and 0 otherwise. |
66 | 534k | static inline int av1_superres_scaled(const AV1_COMMON *cm) { |
67 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling |
68 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. |
69 | | // So, the following check is more accurate. |
70 | 534k | return (cm->width != cm->superres_upscaled_width); |
71 | 534k | } decodeframe.c:av1_superres_scaled Line | Count | Source | 66 | 63.0k | static inline int av1_superres_scaled(const AV1_COMMON *cm) { | 67 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 68 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 69 | | // So, the following check is more accurate. | 70 | 63.0k | return (cm->width != cm->superres_upscaled_width); | 71 | 63.0k | } |
Unexecuted instantiation: av1_cx_iface.c:av1_superres_scaled Unexecuted instantiation: allintra_vis.c:av1_superres_scaled Unexecuted instantiation: av1_quantize.c:av1_superres_scaled Unexecuted instantiation: bitstream.c:av1_superres_scaled Unexecuted instantiation: context_tree.c:av1_superres_scaled Unexecuted instantiation: encodeframe.c:av1_superres_scaled Unexecuted instantiation: encodeframe_utils.c:av1_superres_scaled Unexecuted instantiation: encodemb.c:av1_superres_scaled Unexecuted instantiation: encodemv.c:av1_superres_scaled Unexecuted instantiation: encoder.c:av1_superres_scaled Unexecuted instantiation: encoder_utils.c:av1_superres_scaled Unexecuted instantiation: encodetxb.c:av1_superres_scaled Unexecuted instantiation: ethread.c:av1_superres_scaled Unexecuted instantiation: firstpass.c:av1_superres_scaled Unexecuted instantiation: global_motion_facade.c:av1_superres_scaled Unexecuted instantiation: level.c:av1_superres_scaled Unexecuted instantiation: lookahead.c:av1_superres_scaled Unexecuted instantiation: mcomp.c:av1_superres_scaled Unexecuted instantiation: mv_prec.c:av1_superres_scaled Unexecuted instantiation: palette.c:av1_superres_scaled Unexecuted instantiation: partition_search.c:av1_superres_scaled Unexecuted instantiation: partition_strategy.c:av1_superres_scaled Unexecuted instantiation: pass2_strategy.c:av1_superres_scaled Unexecuted instantiation: pickcdef.c:av1_superres_scaled Unexecuted instantiation: picklpf.c:av1_superres_scaled Unexecuted instantiation: pickrst.c:av1_superres_scaled Unexecuted instantiation: ratectrl.c:av1_superres_scaled Unexecuted instantiation: rd.c:av1_superres_scaled Unexecuted instantiation: rdopt.c:av1_superres_scaled Unexecuted instantiation: nonrd_pickmode.c:av1_superres_scaled Unexecuted instantiation: nonrd_opt.c:av1_superres_scaled Unexecuted instantiation: segmentation.c:av1_superres_scaled Unexecuted instantiation: speed_features.c:av1_superres_scaled Unexecuted instantiation: superres_scale.c:av1_superres_scaled Unexecuted instantiation: svc_layercontext.c:av1_superres_scaled Unexecuted instantiation: temporal_filter.c:av1_superres_scaled Unexecuted instantiation: tokenize.c:av1_superres_scaled Unexecuted instantiation: tpl_model.c:av1_superres_scaled Unexecuted instantiation: tx_search.c:av1_superres_scaled Unexecuted instantiation: txb_rdopt.c:av1_superres_scaled Unexecuted instantiation: intra_mode_search.c:av1_superres_scaled Unexecuted instantiation: var_based_part.c:av1_superres_scaled Unexecuted instantiation: av1_noise_estimate.c:av1_superres_scaled Unexecuted instantiation: pyramid.c:av1_superres_scaled resize.c:av1_superres_scaled Line | Count | Source | 66 | 4.26k | static inline int av1_superres_scaled(const AV1_COMMON *cm) { | 67 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 68 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 69 | | // So, the following check is more accurate. | 70 | 4.26k | return (cm->width != cm->superres_upscaled_width); | 71 | 4.26k | } |
restoration.c:av1_superres_scaled Line | Count | Source | 66 | 466k | static inline int av1_superres_scaled(const AV1_COMMON *cm) { | 67 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 68 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 69 | | // So, the following check is more accurate. | 70 | 466k | return (cm->width != cm->superres_upscaled_width); | 71 | 466k | } |
tile_common.c:av1_superres_scaled Line | Count | Source | 66 | 248 | static inline int av1_superres_scaled(const AV1_COMMON *cm) { | 67 | | // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling | 68 | | // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. | 69 | | // So, the following check is more accurate. | 70 | 248 | return (cm->width != cm->superres_upscaled_width); | 71 | 248 | } |
Unexecuted instantiation: aq_complexity.c:av1_superres_scaled Unexecuted instantiation: aq_cyclicrefresh.c:av1_superres_scaled Unexecuted instantiation: aq_variance.c:av1_superres_scaled Unexecuted instantiation: compound_type.c:av1_superres_scaled Unexecuted instantiation: encode_strategy.c:av1_superres_scaled Unexecuted instantiation: global_motion.c:av1_superres_scaled Unexecuted instantiation: gop_structure.c:av1_superres_scaled Unexecuted instantiation: interp_search.c:av1_superres_scaled Unexecuted instantiation: motion_search_facade.c:av1_superres_scaled Unexecuted instantiation: convolve.c:av1_superres_scaled |
72 | | |
73 | | // The optimized scaler av1_resize_and_extend_frame() can only handle scaling |
74 | | // ratios >= 1/4 and <= 16. See comment in aom_scaled_2d_c() for detail. |
75 | | // Visual assessment shows that if the scaling ratio or its reciprocal is not a |
76 | | // multiple of 1/16, there are some artifacts in the output of the optimized |
77 | | // scaler, especially on lines, due to non-exact ratio representation. SSSE3 |
78 | | // and NEON have a specialized 3/4 version of av1_resize_and_extend_frame() |
79 | | // that does not have this issue. |
80 | | // |
81 | | // Use the non-normative scaler av1_resize_and_extend_frame_nonnormative() |
82 | | // for other scaling ratios. |
83 | | static inline bool av1_has_optimized_scaler(const int src_width, |
84 | | const int src_height, |
85 | | const int dst_width, |
86 | 0 | const int dst_height) { |
87 | 0 | bool has_optimized_scaler = |
88 | 0 | (dst_width * 4 >= src_width && dst_height * 4 >= src_height) && |
89 | 0 | (dst_width <= src_width * 16 && dst_height <= src_height * 16) && |
90 | 0 | (16 * dst_width % src_width == 0) && (16 * src_width % dst_width == 0) && |
91 | 0 | (16 * dst_height % src_height == 0) && |
92 | 0 | (16 * src_height % dst_height == 0); |
93 | | #if HAVE_SSSE3 || HAVE_NEON |
94 | | has_optimized_scaler = |
95 | | has_optimized_scaler || |
96 | | (4 * dst_width == 3 * src_width && 4 * dst_height == 3 * src_height); |
97 | | #endif |
98 | 0 | return has_optimized_scaler; |
99 | 0 | } Unexecuted instantiation: decodeframe.c:av1_has_optimized_scaler Unexecuted instantiation: av1_cx_iface.c:av1_has_optimized_scaler Unexecuted instantiation: allintra_vis.c:av1_has_optimized_scaler Unexecuted instantiation: av1_quantize.c:av1_has_optimized_scaler Unexecuted instantiation: bitstream.c:av1_has_optimized_scaler Unexecuted instantiation: context_tree.c:av1_has_optimized_scaler Unexecuted instantiation: encodeframe.c:av1_has_optimized_scaler Unexecuted instantiation: encodeframe_utils.c:av1_has_optimized_scaler Unexecuted instantiation: encodemb.c:av1_has_optimized_scaler Unexecuted instantiation: encodemv.c:av1_has_optimized_scaler Unexecuted instantiation: encoder.c:av1_has_optimized_scaler Unexecuted instantiation: encoder_utils.c:av1_has_optimized_scaler Unexecuted instantiation: encodetxb.c:av1_has_optimized_scaler Unexecuted instantiation: ethread.c:av1_has_optimized_scaler Unexecuted instantiation: firstpass.c:av1_has_optimized_scaler Unexecuted instantiation: global_motion_facade.c:av1_has_optimized_scaler Unexecuted instantiation: level.c:av1_has_optimized_scaler Unexecuted instantiation: lookahead.c:av1_has_optimized_scaler Unexecuted instantiation: mcomp.c:av1_has_optimized_scaler Unexecuted instantiation: mv_prec.c:av1_has_optimized_scaler Unexecuted instantiation: palette.c:av1_has_optimized_scaler Unexecuted instantiation: partition_search.c:av1_has_optimized_scaler Unexecuted instantiation: partition_strategy.c:av1_has_optimized_scaler Unexecuted instantiation: pass2_strategy.c:av1_has_optimized_scaler Unexecuted instantiation: pickcdef.c:av1_has_optimized_scaler Unexecuted instantiation: picklpf.c:av1_has_optimized_scaler Unexecuted instantiation: pickrst.c:av1_has_optimized_scaler Unexecuted instantiation: ratectrl.c:av1_has_optimized_scaler Unexecuted instantiation: rd.c:av1_has_optimized_scaler Unexecuted instantiation: rdopt.c:av1_has_optimized_scaler Unexecuted instantiation: nonrd_pickmode.c:av1_has_optimized_scaler Unexecuted instantiation: nonrd_opt.c:av1_has_optimized_scaler Unexecuted instantiation: segmentation.c:av1_has_optimized_scaler Unexecuted instantiation: speed_features.c:av1_has_optimized_scaler Unexecuted instantiation: superres_scale.c:av1_has_optimized_scaler Unexecuted instantiation: svc_layercontext.c:av1_has_optimized_scaler Unexecuted instantiation: temporal_filter.c:av1_has_optimized_scaler Unexecuted instantiation: tokenize.c:av1_has_optimized_scaler Unexecuted instantiation: tpl_model.c:av1_has_optimized_scaler Unexecuted instantiation: tx_search.c:av1_has_optimized_scaler Unexecuted instantiation: txb_rdopt.c:av1_has_optimized_scaler Unexecuted instantiation: intra_mode_search.c:av1_has_optimized_scaler Unexecuted instantiation: var_based_part.c:av1_has_optimized_scaler Unexecuted instantiation: av1_noise_estimate.c:av1_has_optimized_scaler Unexecuted instantiation: pyramid.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: aq_complexity.c:av1_has_optimized_scaler Unexecuted instantiation: aq_cyclicrefresh.c:av1_has_optimized_scaler Unexecuted instantiation: aq_variance.c:av1_has_optimized_scaler Unexecuted instantiation: compound_type.c:av1_has_optimized_scaler Unexecuted instantiation: encode_strategy.c:av1_has_optimized_scaler Unexecuted instantiation: global_motion.c:av1_has_optimized_scaler Unexecuted instantiation: gop_structure.c:av1_has_optimized_scaler Unexecuted instantiation: interp_search.c:av1_has_optimized_scaler Unexecuted instantiation: motion_search_facade.c:av1_has_optimized_scaler Unexecuted instantiation: convolve.c:av1_has_optimized_scaler |
100 | | |
101 | 3.91G | #define UPSCALE_NORMATIVE_TAPS 8 |
102 | | extern const int16_t av1_resize_filter_normative[1 << RS_SUBPEL_BITS] |
103 | | [UPSCALE_NORMATIVE_TAPS]; |
104 | | |
105 | | int32_t av1_get_upscale_convolve_step(int in_length, int out_length); |
106 | | |
107 | | #ifdef __cplusplus |
108 | | } // extern "C" |
109 | | #endif |
110 | | |
111 | | #endif // AOM_AV1_COMMON_RESIZE_H_ |