/*
 *  Copyright (c) 2019, Alliance for Open Media. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_
#define AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_

#include "av1/encoder/aq_cyclicrefresh.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/ratectrl.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
  RATE_CONTROL rc;
  int framerate_factor;
  int64_t layer_target_bitrate;
  int scaling_factor_num;
  int scaling_factor_den;
  int64_t target_bandwidth;
  int64_t spatial_layer_target_bandwidth;
  double framerate;
  int avg_frame_size;
  int max_q;
  int min_q;
  int frames_from_key_frame;
  // Cyclic refresh parameters (aq-mode=3), that need to be updated per-frame.
  int sb_index;
  int8_t *map;
  uint8_t *last_coded_q_map;
  int actual_num_seg1_blocks;
  int actual_num_seg2_blocks;
  int counter_encode_maxq_scene_change;
  uint8_t speed;
  unsigned char group_index;
  int is_key_frame;
} LAYER_CONTEXT;

typedef struct SVC {
  int spatial_layer_id;
  int temporal_layer_id;
  int number_spatial_layers;
  int number_temporal_layers;
  int external_ref_frame_config;
  int non_reference_frame;
  // LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
  // BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
  int reference[INTER_REFS_PER_FRAME];
  int ref_idx[INTER_REFS_PER_FRAME];
  int refresh[REF_FRAMES];
  double base_framerate;
  unsigned int current_superframe;
  unsigned int buffer_time_index[REF_FRAMES];
  unsigned char buffer_spatial_layer[REF_FRAMES];
  int skip_nonzeromv_last;
  int skip_nonzeromv_gf;
  int spatial_layer_fb[REF_FRAMES];
  int temporal_layer_fb[REF_FRAMES];
  int num_encoded_top_layer;
  // Layer context used for rate control in CBR mode.
  LAYER_CONTEXT layer_context[AOM_MAX_LAYERS];
  // EIGHTTAP_SMOOTH or BILINEAR
  InterpFilter downsample_filter_type[AOM_MAX_SS_LAYERS];
  // downsample_filter_phase: = 0 will do sub-sampling (no weighted average),
  // = 8 will center the target pixel and get a symmetric averaging filter.
  int downsample_filter_phase[AOM_MAX_SS_LAYERS];
  // Force zero-mv in mode search for the spatial/inter-layer reference.
  int force_zero_mode_spatial_ref;
} SVC;

struct AV1_COMP;

// Initialize layer context data from init_config().
void av1_init_layer_context(struct AV1_COMP *const cpi);

// Update the layer context from a change_config() call.
void av1_update_layer_context_change_config(struct AV1_COMP *const cpi,
                                            const int64_t target_bandwidth);

// Prior to encoding the frame, update framerate-related quantities
// for the current temporal layer.
void av1_update_temporal_layer_framerate(struct AV1_COMP *const cpi);

// Prior to encoding the frame, set the layer context, for the current layer
// to be encoded, to the cpi struct.
void av1_restore_layer_context(struct AV1_COMP *const cpi);

// Save the layer context after encoding the frame.
void av1_save_layer_context(struct AV1_COMP *const cpi);

void av1_free_svc_cyclic_refresh(struct AV1_COMP *const cpi);

void av1_svc_reset_temporal_layers(struct AV1_COMP *const cpi, int is_key);

void av1_one_pass_cbr_svc_start_layer(struct AV1_COMP *const cpi);

int av1_svc_primary_ref_frame(const struct AV1_COMP *const cpi);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AV1_ENCODER_SVC_LAYERCONTEXT_H_
