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/onyxc_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 void av1_resize_and_extend_frame(const YV12_BUFFER_CONFIG *src, 67 YV12_BUFFER_CONFIG *dst, int bd, 68 const int num_planes); 69 70 void av1_upscale_normative_rows(const AV1_COMMON *cm, const uint8_t *src, 71 int src_stride, uint8_t *dst, int dst_stride, 72 int plane, int rows); 73 void av1_upscale_normative_and_extend_frame(const AV1_COMMON *cm, 74 const YV12_BUFFER_CONFIG *src, 75 YV12_BUFFER_CONFIG *dst); 76 77 YV12_BUFFER_CONFIG *av1_scale_if_required(AV1_COMMON *cm, 78 YV12_BUFFER_CONFIG *unscaled, 79 YV12_BUFFER_CONFIG *scaled); 80 81 // Calculates the scaled dimensions from the given original dimensions and the 82 // resize scale denominator. 83 void av1_calculate_scaled_size(int *width, int *height, int resize_denom); 84 85 // Similar to above, but calculates scaled dimensions after superres from the 86 // given original dimensions and superres scale denominator. 87 void av1_calculate_scaled_superres_size(int *width, int *height, 88 int superres_denom); 89 90 // Inverse of av1_calculate_scaled_superres_size() above: calculates the 91 // original dimensions from the given scaled dimensions and the scale 92 // denominator. 93 void av1_calculate_unscaled_superres_size(int *width, int *height, int denom); 94 95 void av1_superres_upscale(AV1_COMMON *cm, BufferPool *const pool); 96 97 // Returns 1 if a superres upscaled frame is scaled and 0 otherwise. 98 static INLINE int av1_superres_scaled(const AV1_COMMON *cm) { 99 // Note: for some corner cases (e.g. cm->width of 1), there may be no scaling 100 // required even though cm->superres_scale_denominator != SCALE_NUMERATOR. 101 // So, the following check is more accurate. 102 return !(cm->width == cm->superres_upscaled_width); 103 } 104 105 #define UPSCALE_NORMATIVE_TAPS 8 106 extern const int16_t av1_resize_filter_normative[1 << RS_SUBPEL_BITS] 107 [UPSCALE_NORMATIVE_TAPS]; 108 109 int32_t av1_get_upscale_convolve_step(int in_length, int out_length); 110 111 #ifdef __cplusplus 112 } // extern "C" 113 #endif 114 115 #endif // AOM_AV1_COMMON_RESIZE_H_ 116