Coverage Report

Created: 2023-06-07 06:31

/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_