Line data Source code
1 : /*
2 : * Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef VP9_COMMON_VP9_SCALE_H_
12 : #define VP9_COMMON_VP9_SCALE_H_
13 :
14 : #include "vp9/common/vp9_mv.h"
15 : #include "vpx_dsp/vpx_convolve.h"
16 :
17 : #ifdef __cplusplus
18 : extern "C" {
19 : #endif
20 :
21 : #define REF_SCALE_SHIFT 14
22 : #define REF_NO_SCALE (1 << REF_SCALE_SHIFT)
23 : #define REF_INVALID_SCALE -1
24 :
25 : struct scale_factors {
26 : int x_scale_fp; // horizontal fixed point scale factor
27 : int y_scale_fp; // vertical fixed point scale factor
28 : int x_step_q4;
29 : int y_step_q4;
30 :
31 : int (*scale_value_x)(int val, const struct scale_factors *sf);
32 : int (*scale_value_y)(int val, const struct scale_factors *sf);
33 :
34 : convolve_fn_t predict[2][2][2]; // horiz, vert, avg
35 : #if CONFIG_VP9_HIGHBITDEPTH
36 : highbd_convolve_fn_t highbd_predict[2][2][2]; // horiz, vert, avg
37 : #endif
38 : };
39 :
40 : MV32 vp9_scale_mv(const MV *mv, int x, int y, const struct scale_factors *sf);
41 :
42 : #if CONFIG_VP9_HIGHBITDEPTH
43 : void vp9_setup_scale_factors_for_frame(struct scale_factors *sf, int other_w,
44 : int other_h, int this_w, int this_h,
45 : int use_high);
46 : #else
47 : void vp9_setup_scale_factors_for_frame(struct scale_factors *sf, int other_w,
48 : int other_h, int this_w, int this_h);
49 : #endif
50 :
51 0 : static INLINE int vp9_is_valid_scale(const struct scale_factors *sf) {
52 0 : return sf->x_scale_fp != REF_INVALID_SCALE &&
53 0 : sf->y_scale_fp != REF_INVALID_SCALE;
54 : }
55 :
56 0 : static INLINE int vp9_is_scaled(const struct scale_factors *sf) {
57 0 : return vp9_is_valid_scale(sf) &&
58 0 : (sf->x_scale_fp != REF_NO_SCALE || sf->y_scale_fp != REF_NO_SCALE);
59 : }
60 :
61 0 : static INLINE int valid_ref_frame_size(int ref_width, int ref_height,
62 : int this_width, int this_height) {
63 0 : return 2 * this_width >= ref_width && 2 * this_height >= ref_height &&
64 0 : this_width <= 16 * ref_width && this_height <= 16 * ref_height;
65 : }
66 :
67 : #ifdef __cplusplus
68 : } // extern "C"
69 : #endif
70 :
71 : #endif // VP9_COMMON_VP9_SCALE_H_
|