Merge "Adding vp9_rc_update_framerate() function."

This commit is contained in:
Dmitry Kovalev 2014-04-11 18:27:34 -07:00 committed by Gerrit Code Review
commit 16efb54939
3 changed files with 52 additions and 48 deletions

View File

@ -61,11 +61,6 @@ void vp9_coef_tree_initialize();
// now so that HIGH_PRECISION is always // now so that HIGH_PRECISION is always
// chosen. // chosen.
// Max rate target for 1080P and below encodes under normal circumstances
// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
#define MAX_MB_RATE 250
#define MAXRATE_1080P 2025000
// #define OUTPUT_YUV_REC // #define OUTPUT_YUV_REC
#ifdef OUTPUT_YUV_SRC #ifdef OUTPUT_YUV_SRC
@ -629,49 +624,8 @@ static void update_frame_size(VP9_COMP *cpi) {
} }
void vp9_new_framerate(VP9_COMP *cpi, double framerate) { void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
VP9_COMMON *const cm = &cpi->common; cpi->oxcf.framerate = framerate < 0.1 ? 30 : framerate;
RATE_CONTROL *const rc = &cpi->rc; vp9_rc_update_framerate(cpi);
VP9_CONFIG *const oxcf = &cpi->oxcf;
int vbr_max_bits;
oxcf->framerate = framerate < 0.1 ? 30 : framerate;
rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth /
oxcf->framerate);
rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth *
oxcf->two_pass_vbrmin_section / 100);
rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
// A maximum bitrate for a frame is defined.
// The baseline for this aligns with HW implementations that
// can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
// per 16x16 MB (averaged over a frame). However this limit is extended if
// a very high rate is given on the command line or the the rate cannnot
// be acheived because of a user specificed max q (e.g. when the user
// specifies lossless encode.
//
vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth *
oxcf->two_pass_vbrmax_section) / 100);
rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
vbr_max_bits);
// Set Maximum gf/arf interval
rc->max_gf_interval = 16;
// Extended interval for genuinely static scenes
rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
// Special conditions when alt ref frame enabled in lagged compress mode
if (oxcf->play_alternate && oxcf->lag_in_frames) {
if (rc->max_gf_interval > oxcf->lag_in_frames - 1)
rc->max_gf_interval = oxcf->lag_in_frames - 1;
if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
}
if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
rc->max_gf_interval = rc->static_scene_max_gf_interval;
} }
int64_t vp9_rescale(int64_t val, int64_t num, int denom) { int64_t vp9_rescale(int64_t val, int64_t num, int denom) {

View File

@ -27,6 +27,11 @@
#include "vp9/encoder/vp9_encodemv.h" #include "vp9/encoder/vp9_encodemv.h"
#include "vp9/encoder/vp9_ratectrl.h" #include "vp9/encoder/vp9_ratectrl.h"
// Max rate target for 1080P and below encodes under normal circumstances
// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
#define MAX_MB_RATE 250
#define MAXRATE_1080P 2025000
#define DEFAULT_KF_BOOST 2000 #define DEFAULT_KF_BOOST 2000
#define DEFAULT_GF_BOOST 2000 #define DEFAULT_GF_BOOST 2000
@ -1399,3 +1404,46 @@ int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type,
return target_index - qindex; return target_index - qindex;
} }
void vp9_rc_update_framerate(VP9_COMP *cpi) {
const VP9_COMMON *const cm = &cpi->common;
const VP9_CONFIG *const oxcf = &cpi->oxcf;
RATE_CONTROL *const rc = &cpi->rc;
int vbr_max_bits;
rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth / oxcf->framerate);
rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth *
oxcf->two_pass_vbrmin_section / 100);
rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
// A maximum bitrate for a frame is defined.
// The baseline for this aligns with HW implementations that
// can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
// per 16x16 MB (averaged over a frame). However this limit is extended if
// a very high rate is given on the command line or the the rate cannnot
// be acheived because of a user specificed max q (e.g. when the user
// specifies lossless encode.
vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth *
oxcf->two_pass_vbrmax_section) / 100);
rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
vbr_max_bits);
// Set Maximum gf/arf interval
rc->max_gf_interval = 16;
// Extended interval for genuinely static scenes
rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
// Special conditions when alt ref frame enabled in lagged compress mode
if (oxcf->play_alternate && oxcf->lag_in_frames) {
if (rc->max_gf_interval > oxcf->lag_in_frames - 1)
rc->max_gf_interval = oxcf->lag_in_frames - 1;
if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
}
if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
rc->max_gf_interval = rc->static_scene_max_gf_interval;
}

View File

@ -174,6 +174,8 @@ int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget);
int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type, int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type,
int qindex, double rate_target_ratio); int qindex, double rate_target_ratio);
void vp9_rc_update_framerate(struct VP9_COMP *cpi);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif