1 /*
2  * Copyright (c) 2020, 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_ENCODER_INTERP_FILTER_SEARCH_H_
13 #define AOM_AV1_ENCODER_INTERP_FILTER_SEARCH_H_
14 
15 #include "av1/encoder/block.h"
16 #include "av1/encoder/encoder.h"
17 #include "av1/encoder/rdopt_utils.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #define MAX_INTERP_FILTER_STATS 128
24 #define DUAL_FILTER_SET_SIZE (SWITCHABLE_FILTERS * SWITCHABLE_FILTERS)
25 
26 typedef struct {
27   int_interpfilters filters;
28   int_mv mv[2];
29   int8_t ref_frames[2];
30   COMPOUND_TYPE comp_type;
31   int compound_idx;
32   int64_t rd;
33   unsigned int pred_sse;
34 } INTERPOLATION_FILTER_STATS;
35 
36 typedef struct {
37   // OBMC secondary prediction buffers and respective strides
38   uint8_t *above_pred_buf[MAX_MB_PLANE];
39   int above_pred_stride[MAX_MB_PLANE];
40   uint8_t *left_pred_buf[MAX_MB_PLANE];
41   int left_pred_stride[MAX_MB_PLANE];
42   int_mv (*single_newmv)[REF_FRAMES];
43   // Pointer to array of motion vectors to use for each ref and their rates
44   // Should point to first of 2 arrays in 2D array
45   int (*single_newmv_rate)[REF_FRAMES];
46   int (*single_newmv_valid)[REF_FRAMES];
47   // Pointer to array of predicted rate-distortion
48   // Should point to first of 2 arrays in 2D array
49   int64_t (*modelled_rd)[MAX_REF_MV_SEARCH][REF_FRAMES];
50   int ref_frame_cost;
51   int single_comp_cost;
52   int64_t (*simple_rd)[MAX_REF_MV_SEARCH][REF_FRAMES];
53   int skip_motion_mode;
54   INTERINTRA_MODE *inter_intra_mode;
55   int single_ref_first_pass;
56   SimpleRDState *simple_rd_state;
57   // [comp_idx][saved stat_idx]
58   INTERPOLATION_FILTER_STATS interp_filter_stats[MAX_INTERP_FILTER_STATS];
59   int interp_filter_stats_idx;
60 } HandleInterModeArgs;
61 
62 static const int_interpfilters filter_sets[DUAL_FILTER_SET_SIZE] = {
63   { 0x00000000 }, { 0x00010000 }, { 0x00020000 },  // y = 0
64   { 0x00000001 }, { 0x00010001 }, { 0x00020001 },  // y = 1
65   { 0x00000002 }, { 0x00010002 }, { 0x00020002 },  // y = 2
66 };
67 
68 int av1_find_interp_filter_match(
69     MB_MODE_INFO *const mbmi, const AV1_COMP *const cpi,
70     const InterpFilter assign_filter, const int need_search,
71     INTERPOLATION_FILTER_STATS *interp_filter_stats,
72     int interp_filter_stats_idx);
73 
74 int64_t av1_interpolation_filter_search(
75     MACROBLOCK *const x, const AV1_COMP *const cpi,
76     const TileDataEnc *tile_data, BLOCK_SIZE bsize,
77     const BUFFER_SET *const tmp_dst, const BUFFER_SET *const orig_dst,
78     int64_t *const rd, int *const switchable_rate, int *skip_build_pred,
79     HandleInterModeArgs *args, int64_t ref_best_rd);
80 
81 #ifdef __cplusplus
82 }  // extern "C"
83 #endif
84 
85 #endif  // AOM_AV1_ENCODER_INTERP_FILTER_SEARCH_H_
86