• 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 #include <math.h>
12 
13 #include "av1/encoder/encoder.h"
14 
swap_ptr(void * a,void * b)15 static void swap_ptr(void *a, void *b) {
16   void **a_p = (void **)a;
17   void **b_p = (void **)b;
18   void *c = *a_p;
19   *a_p = *b_p;
20   *b_p = c;
21 }
22 
av1_init_layer_context(AV1_COMP * const cpi)23 void av1_init_layer_context(AV1_COMP *const cpi) {
24   AV1_COMMON *const cm = &cpi->common;
25   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
26   SVC *const svc = &cpi->svc;
27   int mi_rows = cpi->common.mi_params.mi_rows;
28   int mi_cols = cpi->common.mi_params.mi_cols;
29   svc->base_framerate = 30.0;
30   svc->current_superframe = 0;
31 
32   for (int sl = 0; sl < svc->number_spatial_layers; ++sl) {
33     for (int tl = 0; tl < svc->number_temporal_layers; ++tl) {
34       int layer = LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers);
35       LAYER_CONTEXT *const lc = &svc->layer_context[layer];
36       RATE_CONTROL *const lrc = &lc->rc;
37       lrc->ni_av_qi = oxcf->worst_allowed_q;
38       lrc->total_actual_bits = 0;
39       lrc->total_target_vs_actual = 0;
40       lrc->ni_tot_qi = 0;
41       lrc->tot_q = 0.0;
42       lrc->avg_q = 0.0;
43       lrc->ni_frames = 0;
44       lrc->decimation_count = 0;
45       lrc->decimation_factor = 0;
46       lrc->worst_quality = av1_quantizer_to_qindex(lc->max_q);
47       lrc->best_quality = av1_quantizer_to_qindex(lc->min_q);
48       for (int i = 0; i < RATE_FACTOR_LEVELS; ++i) {
49         lrc->rate_correction_factors[i] = 1.0;
50       }
51       lc->target_bandwidth = lc->layer_target_bitrate;
52       lrc->last_q[INTER_FRAME] = lrc->worst_quality;
53       lrc->avg_frame_qindex[INTER_FRAME] = lrc->worst_quality;
54       lrc->avg_frame_qindex[KEY_FRAME] = lrc->worst_quality;
55       lrc->buffer_level =
56           oxcf->starting_buffer_level_ms * lc->target_bandwidth / 1000;
57       lrc->bits_off_target = lrc->buffer_level;
58       // Initialize the cyclic refresh parameters. If spatial layers are used
59       // (i.e., ss_number_layers > 1), these need to be updated per spatial
60       // layer. Cyclic refresh is only applied on base temporal layer.
61       if (svc->number_spatial_layers > 1 && tl == 0) {
62         size_t last_coded_q_map_size;
63         lc->sb_index = 0;
64         lc->actual_num_seg1_blocks = 0;
65         lc->actual_num_seg2_blocks = 0;
66         lc->counter_encode_maxq_scene_change = 0;
67         CHECK_MEM_ERROR(cm, lc->map,
68                         aom_malloc(mi_rows * mi_cols * sizeof(*lc->map)));
69         memset(lc->map, 0, mi_rows * mi_cols);
70         last_coded_q_map_size =
71             mi_rows * mi_cols * sizeof(*lc->last_coded_q_map);
72         CHECK_MEM_ERROR(cm, lc->last_coded_q_map,
73                         aom_malloc(last_coded_q_map_size));
74         assert(MAXQ <= 255);
75         memset(lc->last_coded_q_map, MAXQ, last_coded_q_map_size);
76       }
77     }
78   }
79 }
80 
81 // Update the layer context from a change_config() call.
av1_update_layer_context_change_config(AV1_COMP * const cpi,const int64_t target_bandwidth)82 void av1_update_layer_context_change_config(AV1_COMP *const cpi,
83                                             const int64_t target_bandwidth) {
84   const RATE_CONTROL *const rc = &cpi->rc;
85   SVC *const svc = &cpi->svc;
86   int layer = 0;
87   int64_t spatial_layer_target = 0;
88   float bitrate_alloc = 1.0;
89 
90   for (int sl = 0; sl < svc->number_spatial_layers; ++sl) {
91     for (int tl = 0; tl < svc->number_temporal_layers; ++tl) {
92       layer = LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers);
93       LAYER_CONTEXT *const lc = &svc->layer_context[layer];
94       svc->layer_context[layer].target_bandwidth = lc->layer_target_bitrate;
95     }
96     spatial_layer_target = svc->layer_context[layer].target_bandwidth;
97     for (int tl = 0; tl < svc->number_temporal_layers; ++tl) {
98       LAYER_CONTEXT *const lc =
99           &svc->layer_context[sl * svc->number_temporal_layers + tl];
100       RATE_CONTROL *const lrc = &lc->rc;
101       lc->spatial_layer_target_bandwidth = spatial_layer_target;
102       bitrate_alloc = (float)lc->target_bandwidth / target_bandwidth;
103       lrc->starting_buffer_level =
104           (int64_t)(rc->starting_buffer_level * bitrate_alloc);
105       lrc->optimal_buffer_level =
106           (int64_t)(rc->optimal_buffer_level * bitrate_alloc);
107       lrc->maximum_buffer_size =
108           (int64_t)(rc->maximum_buffer_size * bitrate_alloc);
109       lrc->bits_off_target =
110           AOMMIN(lrc->bits_off_target, lrc->maximum_buffer_size);
111       lrc->buffer_level = AOMMIN(lrc->buffer_level, lrc->maximum_buffer_size);
112       lc->framerate = cpi->framerate / lc->framerate_factor;
113       lrc->avg_frame_bandwidth = (int)(lc->target_bandwidth / lc->framerate);
114       lrc->max_frame_bandwidth = rc->max_frame_bandwidth;
115       lrc->worst_quality = av1_quantizer_to_qindex(lc->max_q);
116       lrc->best_quality = av1_quantizer_to_qindex(lc->min_q);
117     }
118   }
119 }
120 
get_layer_context(AV1_COMP * const cpi)121 static LAYER_CONTEXT *get_layer_context(AV1_COMP *const cpi) {
122   return &cpi->svc.layer_context[cpi->svc.spatial_layer_id *
123                                      cpi->svc.number_temporal_layers +
124                                  cpi->svc.temporal_layer_id];
125 }
126 
av1_update_temporal_layer_framerate(AV1_COMP * const cpi)127 void av1_update_temporal_layer_framerate(AV1_COMP *const cpi) {
128   SVC *const svc = &cpi->svc;
129   LAYER_CONTEXT *const lc = get_layer_context(cpi);
130   RATE_CONTROL *const lrc = &lc->rc;
131   const int tl = svc->temporal_layer_id;
132   lc->framerate = cpi->framerate / lc->framerate_factor;
133   lrc->avg_frame_bandwidth = (int)(lc->target_bandwidth / lc->framerate);
134   lrc->max_frame_bandwidth = cpi->rc.max_frame_bandwidth;
135   // Update the average layer frame size (non-cumulative per-frame-bw).
136   if (tl == 0) {
137     lc->avg_frame_size = lrc->avg_frame_bandwidth;
138   } else {
139     int prev_layer = svc->spatial_layer_id * svc->number_temporal_layers +
140                      svc->temporal_layer_id - 1;
141     LAYER_CONTEXT *const lcprev = &svc->layer_context[prev_layer];
142     const double prev_layer_framerate =
143         cpi->framerate / lcprev->framerate_factor;
144     const int64_t prev_layer_target_bandwidth = lcprev->layer_target_bitrate;
145     lc->avg_frame_size =
146         (int)((lc->target_bandwidth - prev_layer_target_bandwidth) /
147               (lc->framerate - prev_layer_framerate));
148   }
149 }
150 
av1_restore_layer_context(AV1_COMP * const cpi)151 void av1_restore_layer_context(AV1_COMP *const cpi) {
152   GF_GROUP *const gf_group = &cpi->gf_group;
153   SVC *const svc = &cpi->svc;
154   LAYER_CONTEXT *const lc = get_layer_context(cpi);
155   const int old_frame_since_key = cpi->rc.frames_since_key;
156   const int old_frame_to_key = cpi->rc.frames_to_key;
157   // Restore layer rate control.
158   cpi->rc = lc->rc;
159   cpi->oxcf.target_bandwidth = lc->target_bandwidth;
160   gf_group->index = lc->group_index;
161   // Reset the frames_since_key and frames_to_key counters to their values
162   // before the layer restore. Keep these defined for the stream (not layer).
163   cpi->rc.frames_since_key = old_frame_since_key;
164   cpi->rc.frames_to_key = old_frame_to_key;
165   // For spatial-svc, allow cyclic-refresh to be applied on the spatial layers,
166   // for the base temporal layer.
167   if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ &&
168       svc->number_spatial_layers > 1 && svc->temporal_layer_id == 0) {
169     CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
170     swap_ptr(&cr->map, &lc->map);
171     swap_ptr(&cr->last_coded_q_map, &lc->last_coded_q_map);
172     cr->sb_index = lc->sb_index;
173     cr->actual_num_seg1_blocks = lc->actual_num_seg1_blocks;
174     cr->actual_num_seg2_blocks = lc->actual_num_seg2_blocks;
175   }
176   svc->skip_nonzeromv_last = 0;
177   svc->skip_nonzeromv_gf = 0;
178   // For each reference (LAST/GOLDEN) set the skip_nonzero_last/gf frame flags.
179   // This is to skip testing nonzero-mv for that reference if it was last
180   // refreshed (i.e., buffer slot holding that reference was refreshed) on the
181   // previous spatial layer at the same time (current_superframe).
182   if (svc->external_ref_frame_config) {
183     int ref_frame_idx = svc->ref_idx[LAST_FRAME - 1];
184     if (svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
185         svc->buffer_spatial_layer[ref_frame_idx] == svc->spatial_layer_id - 1)
186       svc->skip_nonzeromv_last = 1;
187     ref_frame_idx = svc->ref_idx[GOLDEN_FRAME - 1];
188     if (svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
189         svc->buffer_spatial_layer[ref_frame_idx] == svc->spatial_layer_id - 1)
190       svc->skip_nonzeromv_gf = 1;
191   }
192 }
193 
av1_save_layer_context(AV1_COMP * const cpi)194 void av1_save_layer_context(AV1_COMP *const cpi) {
195   GF_GROUP *const gf_group = &cpi->gf_group;
196   SVC *const svc = &cpi->svc;
197   LAYER_CONTEXT *lc = get_layer_context(cpi);
198   lc->rc = cpi->rc;
199   lc->target_bandwidth = (int)cpi->oxcf.target_bandwidth;
200   lc->group_index = gf_group->index;
201   if (svc->spatial_layer_id == 0) svc->base_framerate = cpi->framerate;
202   // For spatial-svc, allow cyclic-refresh to be applied on the spatial layers,
203   // for the base temporal layer.
204   if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ &&
205       cpi->svc.number_spatial_layers > 1 && svc->temporal_layer_id == 0) {
206     CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
207     signed char *temp = lc->map;
208     uint8_t *temp2 = lc->last_coded_q_map;
209     lc->map = cr->map;
210     cr->map = temp;
211     lc->last_coded_q_map = cr->last_coded_q_map;
212     cr->last_coded_q_map = temp2;
213     lc->sb_index = cr->sb_index;
214     lc->actual_num_seg1_blocks = cr->actual_num_seg1_blocks;
215     lc->actual_num_seg2_blocks = cr->actual_num_seg2_blocks;
216   }
217   // For any buffer slot that is refreshed, update it with
218   // the spatial_layer_id and the current_superframe.
219   if (cpi->common.current_frame.frame_type == KEY_FRAME) {
220     // All slots are refreshed on KEY.
221     for (unsigned int i = 0; i < REF_FRAMES; i++) {
222       svc->buffer_time_index[i] = svc->current_superframe;
223       svc->buffer_spatial_layer[i] = svc->spatial_layer_id;
224     }
225   } else if (cpi->svc.external_ref_frame_config) {
226     for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++) {
227       int ref_frame_map_idx = svc->ref_idx[i];
228       if (cpi->svc.refresh[ref_frame_map_idx]) {
229         svc->buffer_time_index[ref_frame_map_idx] = svc->current_superframe;
230         svc->buffer_spatial_layer[ref_frame_map_idx] = svc->spatial_layer_id;
231       }
232     }
233   }
234   if (svc->spatial_layer_id == svc->number_spatial_layers - 1)
235     svc->current_superframe++;
236 }
237 
av1_free_svc_cyclic_refresh(AV1_COMP * const cpi)238 void av1_free_svc_cyclic_refresh(AV1_COMP *const cpi) {
239   SVC *const svc = &cpi->svc;
240   for (int sl = 0; sl < svc->number_spatial_layers; ++sl) {
241     for (int tl = 0; tl < svc->number_temporal_layers; ++tl) {
242       int layer = LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers);
243       LAYER_CONTEXT *const lc = &svc->layer_context[layer];
244       if (lc->map) aom_free(lc->map);
245       if (lc->last_coded_q_map) aom_free(lc->last_coded_q_map);
246     }
247   }
248 }
249 
250 // Reset on key frame: reset counters, references and buffer updates.
av1_svc_reset_temporal_layers(AV1_COMP * const cpi,int is_key)251 void av1_svc_reset_temporal_layers(AV1_COMP *const cpi, int is_key) {
252   SVC *const svc = &cpi->svc;
253   LAYER_CONTEXT *lc = NULL;
254   for (int sl = 0; sl < svc->number_spatial_layers; ++sl) {
255     for (int tl = 0; tl < svc->number_temporal_layers; ++tl) {
256       lc = &cpi->svc.layer_context[sl * svc->number_temporal_layers + tl];
257       if (is_key) lc->frames_from_key_frame = 0;
258     }
259   }
260   av1_update_temporal_layer_framerate(cpi);
261   av1_restore_layer_context(cpi);
262 }
263 
get_layer_resolution(const int width_org,const int height_org,const int num,const int den,int * width_out,int * height_out)264 static void get_layer_resolution(const int width_org, const int height_org,
265                                  const int num, const int den, int *width_out,
266                                  int *height_out) {
267   int w, h;
268   if (width_out == NULL || height_out == NULL || den == 0) return;
269   w = width_org * num / den;
270   h = height_org * num / den;
271   // Make height and width even.
272   w += w % 2;
273   h += h % 2;
274   *width_out = w;
275   *height_out = h;
276 }
277 
av1_one_pass_cbr_svc_start_layer(AV1_COMP * const cpi)278 void av1_one_pass_cbr_svc_start_layer(AV1_COMP *const cpi) {
279   SVC *const svc = &cpi->svc;
280   LAYER_CONTEXT *lc = NULL;
281   int width = 0, height = 0;
282   lc = &svc->layer_context[svc->spatial_layer_id * svc->number_temporal_layers +
283                            svc->temporal_layer_id];
284   get_layer_resolution(cpi->oxcf.width, cpi->oxcf.height,
285                        lc->scaling_factor_num, lc->scaling_factor_den, &width,
286                        &height);
287   av1_set_size_literal(cpi, width, height);
288 }
289