tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

scale.h (3046B)


      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 AOM_AV1_COMMON_SCALE_H_
     13 #define AOM_AV1_COMMON_SCALE_H_
     14 
     15 #include "av1/common/convolve.h"
     16 #include "av1/common/mv.h"
     17 
     18 #ifdef __cplusplus
     19 extern "C" {
     20 #endif
     21 
     22 #define SCALE_NUMERATOR 8
     23 
     24 #define REF_SCALE_SHIFT 14
     25 #define REF_NO_SCALE (1 << REF_SCALE_SHIFT)
     26 #define REF_INVALID_SCALE -1
     27 
     28 struct scale_factors {
     29  int x_scale_fp;  // horizontal fixed point scale factor
     30  int y_scale_fp;  // vertical fixed point scale factor
     31  int x_step_q4;
     32  int y_step_q4;
     33 };
     34 
     35 // Note: Expect val to be in q4 precision
     36 static inline int av1_scaled_x(int val, const struct scale_factors *sf) {
     37  const int off =
     38      (sf->x_scale_fp - (1 << REF_SCALE_SHIFT)) * (1 << (SUBPEL_BITS - 1));
     39  const int64_t tval = (int64_t)val * sf->x_scale_fp + off;
     40  return (int)ROUND_POWER_OF_TWO_SIGNED_64(tval,
     41                                           REF_SCALE_SHIFT - SCALE_EXTRA_BITS);
     42 }
     43 
     44 // Note: Expect val to be in q4 precision
     45 static inline int av1_scaled_y(int val, const struct scale_factors *sf) {
     46  const int off =
     47      (sf->y_scale_fp - (1 << REF_SCALE_SHIFT)) * (1 << (SUBPEL_BITS - 1));
     48  const int64_t tval = (int64_t)val * sf->y_scale_fp + off;
     49  return (int)ROUND_POWER_OF_TWO_SIGNED_64(tval,
     50                                           REF_SCALE_SHIFT - SCALE_EXTRA_BITS);
     51 }
     52 
     53 // Note: Expect val to be in q4 precision
     54 static inline int av1_unscaled_value(int val, const struct scale_factors *sf) {
     55  (void)sf;
     56  return val * (1 << SCALE_EXTRA_BITS);
     57 }
     58 
     59 MV32 av1_scale_mv(const MV *mv, int x, int y, const struct scale_factors *sf);
     60 
     61 void av1_setup_scale_factors_for_frame(struct scale_factors *sf, int other_w,
     62                                       int other_h, int this_w, int this_h);
     63 
     64 static inline int av1_is_valid_scale(const struct scale_factors *sf) {
     65  assert(sf != NULL);
     66  return sf->x_scale_fp != REF_INVALID_SCALE &&
     67         sf->y_scale_fp != REF_INVALID_SCALE;
     68 }
     69 
     70 static inline int av1_is_scaled(const struct scale_factors *sf) {
     71  assert(sf != NULL);
     72  return av1_is_valid_scale(sf) &&
     73         (sf->x_scale_fp != REF_NO_SCALE || sf->y_scale_fp != REF_NO_SCALE);
     74 }
     75 
     76 // See AV1 spec, Section 6.8.6. Frame size with refs semantics.
     77 static inline int valid_ref_frame_size(int ref_width, int ref_height,
     78                                       int this_width, int this_height) {
     79  return 2 * this_width >= ref_width && 2 * this_height >= ref_height &&
     80         this_width <= 16 * ref_width && this_height <= 16 * ref_height;
     81 }
     82 
     83 #ifdef __cplusplus
     84 }  // extern "C"
     85 #endif
     86 
     87 #endif  // AOM_AV1_COMMON_SCALE_H_