Line data Source code
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 AV1_COMMON_SCALE_H_
13 : #define AV1_COMMON_SCALE_H_
14 :
15 : #include "av1/common/mv.h"
16 : #include "aom_dsp/aom_convolve.h"
17 :
18 : #ifdef __cplusplus
19 : extern "C" {
20 : #endif
21 :
22 : #define REF_SCALE_SHIFT 14
23 : #define REF_NO_SCALE (1 << REF_SCALE_SHIFT)
24 : #define REF_INVALID_SCALE -1
25 :
26 : struct scale_factors {
27 : int x_scale_fp; // horizontal fixed point scale factor
28 : int y_scale_fp; // vertical fixed point scale factor
29 : int x_step_q4;
30 : int y_step_q4;
31 :
32 : int (*scale_value_x)(int val, const struct scale_factors *sf);
33 : int (*scale_value_y)(int val, const struct scale_factors *sf);
34 :
35 : convolve_fn_t predict[2][2][2]; // horiz, vert, avg
36 : #if CONFIG_HIGHBITDEPTH
37 : highbd_convolve_fn_t highbd_predict[2][2][2]; // horiz, vert, avg
38 : #endif // CONFIG_HIGHBITDEPTH
39 : };
40 :
41 : MV32 av1_scale_mv(const MV *mv, int x, int y, const struct scale_factors *sf);
42 :
43 : #if CONFIG_HIGHBITDEPTH
44 : void av1_setup_scale_factors_for_frame(struct scale_factors *sf, int other_w,
45 : int other_h, int this_w, int this_h,
46 : int use_high);
47 : #else
48 : void av1_setup_scale_factors_for_frame(struct scale_factors *sf, int other_w,
49 : int other_h, int this_w, int this_h);
50 : #endif // CONFIG_HIGHBITDEPTH
51 :
52 0 : static INLINE int av1_is_valid_scale(const struct scale_factors *sf) {
53 0 : return sf->x_scale_fp != REF_INVALID_SCALE &&
54 0 : sf->y_scale_fp != REF_INVALID_SCALE;
55 : }
56 :
57 0 : static INLINE int av1_is_scaled(const struct scale_factors *sf) {
58 0 : return av1_is_valid_scale(sf) &&
59 0 : (sf->x_scale_fp != REF_NO_SCALE || sf->y_scale_fp != REF_NO_SCALE);
60 : }
61 :
62 0 : static INLINE int valid_ref_frame_size(int ref_width, int ref_height,
63 : int this_width, int this_height) {
64 0 : return 2 * this_width >= ref_width && 2 * this_height >= ref_height &&
65 0 : this_width <= 16 * ref_width && this_height <= 16 * ref_height;
66 : }
67 :
68 : #ifdef __cplusplus
69 : } // extern "C"
70 : #endif
71 :
72 : #endif // AV1_COMMON_SCALE_H_
|