193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/*
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org */
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifndef VP9_ENCODER_VP9_SVC_LAYERCONTEXT_H_
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#define VP9_ENCODER_VP9_SVC_LAYERCONTEXT_H_
1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vpx/vpx_encoder.h"
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vp9/encoder/vp9_ratectrl.h"
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifdef __cplusplus
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgextern "C" {
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif
2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgtypedef struct {
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  RATE_CONTROL rc;
2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int target_bandwidth;
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  double framerate;
2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int avg_frame_size;
2787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int max_q;
2887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int min_q;
2987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int scaling_factor_num;
3087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int scaling_factor_den;
3188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  TWO_PASS twopass;
32d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  vpx_fixed_buf_t rc_twopass_stats_in;
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  unsigned int current_video_frame_in_layer;
349a5fccadbf86bd614db22afaff64c794c1e16215fgalligan@chromium.org  int is_key_frame;
35d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  int frames_from_key_frame;
36d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  FRAME_TYPE last_frame_type;
37ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  struct lookahead_entry  *alt_ref_source;
38ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  int alt_ref_idx;
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int gold_ref_idx;
40ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  int has_alt_frame;
41ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  size_t layer_size;
4287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  struct vpx_psnr_pkt psnr_pkt;
4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org} LAYER_CONTEXT;
4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgtypedef struct {
4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int spatial_layer_id;
4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int temporal_layer_id;
4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int number_spatial_layers;
4993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int number_temporal_layers;
50ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
5187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int spatial_layer_to_encode;
5287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
53ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  // Store scaled source frames to be used for temporal filter to generate
54ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  // a alt ref frame.
55ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  YV12_BUFFER_CONFIG scaled_frames[MAX_LAG_BUFFERS];
56ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
5793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  // Layer context used for rate control in one pass temporal CBR mode or
5893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  // two pass spatial mode. Defined for temporal or spatial layers for now.
5993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  // Does not support temporal combined with spatial RC.
6093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  LAYER_CONTEXT layer_context[MAX(VPX_TS_MAX_LAYERS, VPX_SS_MAX_LAYERS)];
6193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org} SVC;
6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgstruct VP9_COMP;
6493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Initialize layer context data from init_config().
6693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_init_layer_context(struct VP9_COMP *const cpi);
6793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Update the layer context from a change_config() call.
6993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_update_layer_context_change_config(struct VP9_COMP *const cpi,
7093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                                            const int target_bandwidth);
7193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
7293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Prior to encoding the frame, update framerate-related quantities
7393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// for the current temporal layer.
7493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_update_temporal_layer_framerate(struct VP9_COMP *const cpi);
7593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
7693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Update framerate-related quantities for the current spatial layer.
7793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_update_spatial_layer_framerate(struct VP9_COMP *const cpi,
7893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                                        double framerate);
7993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Prior to encoding the frame, set the layer context, for the current layer
8193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// to be encoded, to the cpi struct.
8293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_restore_layer_context(struct VP9_COMP *const cpi);
8393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Save the layer context after encoding the frame.
8593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_save_layer_context(struct VP9_COMP *const cpi);
8693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
8793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Initialize second pass rc for spatial svc.
8893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_init_second_pass_spatial_svc(struct VP9_COMP *cpi);
8993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
90693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// Increment number of video frames in layer
91d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid vp9_inc_frame_in_layer(struct VP9_COMP *const cpi);
92693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
939a5fccadbf86bd614db22afaff64c794c1e16215fgalligan@chromium.org// Check if current layer is key frame in spatial upper layer
949a5fccadbf86bd614db22afaff64c794c1e16215fgalligan@chromium.orgint vp9_is_upper_layer_key_frame(const struct VP9_COMP *const cpi);
959a5fccadbf86bd614db22afaff64c794c1e16215fgalligan@chromium.org
96e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org// Get the next source buffer to encode
97e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.orgstruct lookahead_entry *vp9_svc_lookahead_pop(struct VP9_COMP *const cpi,
98e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org                                              struct lookahead_ctx *ctx,
99e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org                                              int drain);
100e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org
10187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org// Start a frame and initialize svc parameters
10287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgint vp9_svc_start_frame(struct VP9_COMP *const cpi);
103e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org
10493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifdef __cplusplus
10593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}  // extern "C"
10693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif
10793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
10893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif  // VP9_ENCODER_VP9_SVC_LAYERCONTEXT_
109