vp9_scale.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #ifndef VP9_COMMON_VP9_SCALE_H_
  11. #define VP9_COMMON_VP9_SCALE_H_
  12. #include "vp9/common/vp9_mv.h"
  13. #include "vp9/common/vp9_convolve.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. #define REF_SCALE_SHIFT 14
  18. #define REF_NO_SCALE (1 << REF_SCALE_SHIFT)
  19. #define REF_INVALID_SCALE -1
  20. struct scale_factors {
  21. int x_scale_fp; // horizontal fixed point scale factor
  22. int y_scale_fp; // vertical fixed point scale factor
  23. int x_step_q4;
  24. int y_step_q4;
  25. int (*scale_value_x)(int val, const struct scale_factors *sf);
  26. int (*scale_value_y)(int val, const struct scale_factors *sf);
  27. convolve_fn_t predict[2][2][2]; // horiz, vert, avg
  28. #if CONFIG_VP9_HIGHBITDEPTH
  29. highbd_convolve_fn_t highbd_predict[2][2][2]; // horiz, vert, avg
  30. #endif
  31. };
  32. MV32 vp9_scale_mv(const MV *mv, int x, int y, const struct scale_factors *sf);
  33. #if CONFIG_VP9_HIGHBITDEPTH
  34. void vp9_setup_scale_factors_for_frame(struct scale_factors *sf,
  35. int other_w, int other_h,
  36. int this_w, int this_h,
  37. int use_high);
  38. #else
  39. void 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. #endif
  43. static 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. static INLINE int vp9_is_scaled(const struct scale_factors *sf) {
  48. return vp9_is_valid_scale(sf) &&
  49. (sf->x_scale_fp != REF_NO_SCALE || sf->y_scale_fp != REF_NO_SCALE);
  50. }
  51. static INLINE int valid_ref_frame_size(int ref_width, int ref_height,
  52. int this_width, int this_height) {
  53. return 2 * this_width >= ref_width &&
  54. 2 * this_height >= ref_height &&
  55. this_width <= 16 * ref_width &&
  56. this_height <= 16 * ref_height;
  57. }
  58. #ifdef __cplusplus
  59. } // extern "C"
  60. #endif
  61. #endif // VP9_COMMON_VP9_SCALE_H_