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 "vp9/common/vp9_convolve.h"
16
17#ifdef __cplusplus
18extern "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
25struct 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};
36
37MV32 vp9_scale_mv(const MV *mv, int x, int y, const struct scale_factors *sf);
38
39void vp9_setup_scale_factors_for_frame(struct scale_factors *sf,
40                                       int other_w, int other_h,
41                                       int this_w, int this_h);
42
43static INLINE int vp9_is_valid_scale(const struct scale_factors *sf) {
44  return sf->x_scale_fp != REF_INVALID_SCALE &&
45         sf->y_scale_fp != REF_INVALID_SCALE;
46}
47
48static INLINE int vp9_is_scaled(const struct scale_factors *sf) {
49  return sf->x_scale_fp != REF_NO_SCALE ||
50         sf->y_scale_fp != REF_NO_SCALE;
51}
52
53#ifdef __cplusplus
54}  // extern "C"
55#endif
56
57#endif  // VP9_COMMON_VP9_SCALE_H_
58