• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,
44                                         int other_w, int other_h,
45                                         int this_w, int this_h,
46                                         int use_high);
47  #else
48  void vp9_setup_scale_factors_for_frame(struct scale_factors *sf,
49                                         int other_w, int other_h,
50                                         int this_w, int this_h);
51  #endif
52  
vp9_is_valid_scale(const struct scale_factors * sf)53  static INLINE int vp9_is_valid_scale(const struct scale_factors *sf) {
54    return sf->x_scale_fp != REF_INVALID_SCALE &&
55           sf->y_scale_fp != REF_INVALID_SCALE;
56  }
57  
vp9_is_scaled(const struct scale_factors * sf)58  static INLINE int vp9_is_scaled(const struct scale_factors *sf) {
59    return vp9_is_valid_scale(sf) &&
60           (sf->x_scale_fp != REF_NO_SCALE || sf->y_scale_fp != REF_NO_SCALE);
61  }
62  
valid_ref_frame_size(int ref_width,int ref_height,int this_width,int this_height)63  static INLINE int valid_ref_frame_size(int ref_width, int ref_height,
64                                        int this_width, int this_height) {
65    return 2 * this_width >= ref_width &&
66           2 * this_height >= ref_height &&
67           this_width <= 16 * ref_width &&
68           this_height <= 16 * ref_height;
69  }
70  
71  #ifdef __cplusplus
72  }  // extern "C"
73  #endif
74  
75  #endif  // VP9_COMMON_VP9_SCALE_H_
76