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