• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2019, Alliance for Open Media. 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 AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_
12 #define AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_
13 
14 #include "aom_scale/yv12config.h"
15 #include "av1/encoder/aq_cyclicrefresh.h"
16 #include "av1/encoder/encoder.h"
17 #include "av1/encoder/ratectrl.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /*!
24  * \brief The stucture of quantities related to each spatial and temporal layer.
25  * \ingroup SVC
26  */
27 typedef struct {
28   /*!\cond */
29   RATE_CONTROL rc;
30   PRIMARY_RATE_CONTROL p_rc;
31   int framerate_factor;
32   int64_t layer_target_bitrate;
33   int scaling_factor_num;
34   int scaling_factor_den;
35   int64_t target_bandwidth;
36   int64_t spatial_layer_target_bandwidth;
37   double framerate;
38   int avg_frame_size;
39   int max_q;
40   int min_q;
41   int frames_from_key_frame;
42   /*!\endcond */
43 
44   /*!
45    * Cyclic refresh parameters (aq-mode=3), that need to be updated per-frame.
46    */
47   int sb_index;
48   /*!
49    * Segmentation map
50    */
51   int8_t *map;
52   /*!
53    * Number of blocks on segment 1
54    */
55   int actual_num_seg1_blocks;
56 
57   /*!
58    * Number of blocks on segment 2
59    */
60   int actual_num_seg2_blocks;
61   /*!
62    * Counter used to detect scene change.
63    */
64   int counter_encode_maxq_scene_change;
65 
66   /*!
67    * Speed settings for each layer.
68    */
69   uint8_t speed;
70   /*!
71    * GF group index.
72    */
73   unsigned char group_index;
74   /*!
75    * If current layer is key frame.
76    */
77   int is_key_frame;
78   /*!
79    * Maximum motion magnitude of previous encoded layer.
80    */
81   int max_mv_magnitude;
82 } LAYER_CONTEXT;
83 
84 /*!
85  * \brief The stucture of SVC.
86  * \ingroup SVC
87  */
88 typedef struct SVC {
89   /*!\cond */
90   int spatial_layer_id;
91   int temporal_layer_id;
92   int number_spatial_layers;
93   int number_temporal_layers;
94   int use_flexible_mode;
95   int ksvc_fixed_mode;
96   /*!\endcond */
97 
98   /*!\cond */
99   double base_framerate;
100   unsigned int current_superframe;
101   unsigned int buffer_time_index[REF_FRAMES];
102   unsigned char buffer_spatial_layer[REF_FRAMES];
103   int skip_mvsearch_last;
104   int skip_mvsearch_gf;
105   int skip_mvsearch_altref;
106   int spatial_layer_fb[REF_FRAMES];
107   int temporal_layer_fb[REF_FRAMES];
108   int num_encoded_top_layer;
109   int first_layer_denoise;
110   YV12_BUFFER_CONFIG source_last_TL0;
111   int mi_cols_full_resoln;
112   int mi_rows_full_resoln;
113   /*!\endcond */
114 
115   /*!
116    * Layer context used for rate control in CBR mode.
117    */
118   LAYER_CONTEXT *layer_context;
119 
120   /*!
121    * Number of layers allocated for layer_context.
122    */
123   int num_allocated_layers;
124 
125   /*!
126    * EIGHTTAP_SMOOTH or BILINEAR
127    */
128   InterpFilter downsample_filter_type[AOM_MAX_SS_LAYERS];
129 
130   /*!
131    * Downsample_filter_phase: = 0 will do sub-sampling (no weighted average),
132    * = 8 will center the target pixel and get a symmetric averaging filter.
133    */
134   int downsample_filter_phase[AOM_MAX_SS_LAYERS];
135 
136   /*!
137    * Force zero-mv in mode search for the spatial/inter-layer reference.
138    */
139   int force_zero_mode_spatial_ref;
140 } SVC;
141 
142 struct AV1_COMP;
143 struct EncodeFrameInput;
144 
145 /*!\brief Initialize layer context data from init_config().
146  *
147  * \ingroup SVC
148  * \callgraph
149  * \callergraph
150  *
151  * \param[in]       cpi  Top level encoder structure
152  *
153  * \remark  Nothing returned. Set cpi->svc.
154  */
155 void av1_init_layer_context(struct AV1_COMP *const cpi);
156 
157 /*!\brief Allocate layer context data.
158  *
159  * \ingroup SVC
160  * \callgraph
161  * \callergraph
162  *
163  * \param[in]       cpi  Top level encoder structure
164  * \param[in]       num_layers  Number of layers to be allocated
165  *
166  * \remark  Allocates memory for cpi->svc.layer_context.
167  * \return  True on success, false on allocation failure.
168  */
169 bool av1_alloc_layer_context(struct AV1_COMP *cpi, int num_layers);
170 
171 /*!\brief Update the layer context from a change_config() call.
172  *
173  * \ingroup SVC
174  * \callgraph
175  * \callergraph
176  *
177  * \param[in]       cpi  Top level encoder structure
178  * \param[in]       target_bandwidth  Total target bandwidth
179  *
180  * \remark  Nothing returned. Buffer level for each layer is set.
181  */
182 void av1_update_layer_context_change_config(struct AV1_COMP *const cpi,
183                                             const int64_t target_bandwidth);
184 
185 /*!\brief Prior to encoding the frame, update framerate-related quantities
186           for the current temporal layer.
187  *
188  * \ingroup SVC
189  * \callgraph
190  * \callergraph
191  *
192  * \param[in]       cpi  Top level encoder structure
193  *
194  * \remark  Nothing returned. Frame related quantities for current temporal
195  layer are updated.
196  */
197 void av1_update_temporal_layer_framerate(struct AV1_COMP *const cpi);
198 
199 /*!\brief Prior to encoding the frame, set the layer context, for the current
200  layer to be encoded, to the cpi struct.
201  *
202  * \ingroup SVC
203  * \callgraph
204  * \callergraph
205  *
206  * \param[in]       cpi  Top level encoder structure
207  *
208  * \remark  Nothing returned. Layer context for current layer is set.
209  */
210 void av1_restore_layer_context(struct AV1_COMP *const cpi);
211 
212 /*!\brief Save the layer context after encoding the frame.
213  *
214  * \ingroup SVC
215  * \callgraph
216  * \callergraph
217  *
218  * \param[in]       cpi  Top level encoder structure
219  */
220 void av1_save_layer_context(struct AV1_COMP *const cpi);
221 
222 /*!\brief Free the memory used for cyclic refresh in layer context.
223  *
224  * \ingroup SVC
225  * \callgraph
226  * \callergraph
227  *
228  * \param[in]       cpi  Top level encoder structure
229  */
230 void av1_free_svc_cyclic_refresh(struct AV1_COMP *const cpi);
231 
232 /*!\brief Reset on key frame: reset counters, references and buffer updates.
233  *
234  * \ingroup SVC
235  * \callgraph
236  * \callergraph
237  *
238  * \param[in]       cpi  Top level encoder structure
239  * \param[in]       is_key  Whether current layer is key frame
240  */
241 void av1_svc_reset_temporal_layers(struct AV1_COMP *const cpi, int is_key);
242 
243 /*!\brief Before encoding, set resolutions and allocate compressor data.
244  *
245  * \ingroup SVC
246  * \callgraph
247  * \callergraph
248  *
249  * \param[in]       cpi  Top level encoder structure
250  */
251 void av1_one_pass_cbr_svc_start_layer(struct AV1_COMP *const cpi);
252 
253 /*!\brief Get primary reference frame for current layer
254  *
255  * \ingroup SVC
256  * \callgraph
257  * \callergraph
258  *
259  * \param[in]       cpi  Top level encoder structure
260  *
261  * \return  The primary reference frame for current layer.
262  */
263 int av1_svc_primary_ref_frame(const struct AV1_COMP *const cpi);
264 
265 /*!\brief Get resolution for current layer.
266  *
267  * \ingroup SVC
268  * \param[in]       width_org    Original width, unscaled
269  * \param[in]       height_org   Original height, unscaled
270  * \param[in]       num          Numerator for the scale ratio
271  * \param[in]       den          Denominator for the scale ratio
272  * \param[in]       width_out    Output width, scaled for current layer
273  * \param[in]       height_out   Output height, scaled for current layer
274  *
275  * \remark Nothing is returned. Instead the scaled width and height are set.
276  */
277 void av1_get_layer_resolution(const int width_org, const int height_org,
278                               const int num, const int den, int *width_out,
279                               int *height_out);
280 
281 void av1_set_svc_fixed_mode(struct AV1_COMP *const cpi);
282 
283 void av1_svc_check_reset_layer_rc_flag(struct AV1_COMP *const cpi);
284 
285 void av1_svc_set_last_source(struct AV1_COMP *const cpi,
286                              struct EncodeFrameInput *frame_input,
287                              YV12_BUFFER_CONFIG *prev_source);
288 
289 #ifdef __cplusplus
290 }  // extern "C"
291 #endif
292 
293 #endif  // AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_
294