190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h> 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h> 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h> 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <limits.h> 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <assert.h> 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "math.h" 1879f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/common.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "ratectrl.h" 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/entropymode.h" 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h" 2279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/systemdependent.h" 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "encodemv.h" 242263fc984bdc858ee931d3e35c87c404de923950Johann#include "vpx_dsp/vpx_dsp_common.h" 257bc9febe8749e98a3812a0dc4380ceae75c29450Johann#include "vpx_ports/system_state.h" 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 277bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define MIN_BPB_FACTOR 0.01 287bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define MAX_BPB_FACTOR 50 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int y_modes[5]; 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int uv_modes[4]; 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int b_modes[10]; 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_y_modes[10]; 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_uv_modes[4]; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_b_modes[10]; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 421b362b15af34006e6a11974088a46d42b903418eJohann/* Bits Per MB at different Q (Multiplied by 512) */ 437bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define BPER_MB_NORMBITS 9 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 451b362b15af34006e6a11974088a46d42b903418eJohann/* Work in progress recalibration of baseline rate tables based on 461b362b15af34006e6a11974088a46d42b903418eJohann * the assumption that bits per mb is inversely proportional to the 471b362b15af34006e6a11974088a46d42b903418eJohann * quantizer value. 481b362b15af34006e6a11974088a46d42b903418eJohann */ 497bc9febe8749e98a3812a0dc4380ceae75c29450Johannconst int vp8_bits_per_mb[2][QINDEX_RANGE] = { 507bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Intra case 450000/Qintra */ 517bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 527bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1125000, 900000, 750000, 642857, 562500, 500000, 450000, 450000, 409090, 537bc9febe8749e98a3812a0dc4380ceae75c29450Johann 375000, 346153, 321428, 300000, 281250, 264705, 264705, 250000, 236842, 547bc9febe8749e98a3812a0dc4380ceae75c29450Johann 225000, 225000, 214285, 214285, 204545, 204545, 195652, 195652, 187500, 557bc9febe8749e98a3812a0dc4380ceae75c29450Johann 180000, 180000, 173076, 166666, 160714, 155172, 150000, 145161, 140625, 567bc9febe8749e98a3812a0dc4380ceae75c29450Johann 136363, 132352, 128571, 125000, 121621, 121621, 118421, 115384, 112500, 577bc9febe8749e98a3812a0dc4380ceae75c29450Johann 109756, 107142, 104651, 102272, 100000, 97826, 97826, 95744, 93750, 587bc9febe8749e98a3812a0dc4380ceae75c29450Johann 91836, 90000, 88235, 86538, 84905, 83333, 81818, 80357, 78947, 597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 77586, 76271, 75000, 73770, 72580, 71428, 70312, 69230, 68181, 607bc9febe8749e98a3812a0dc4380ceae75c29450Johann 67164, 66176, 65217, 64285, 63380, 62500, 61643, 60810, 60000, 617bc9febe8749e98a3812a0dc4380ceae75c29450Johann 59210, 59210, 58441, 57692, 56962, 56250, 55555, 54878, 54216, 627bc9febe8749e98a3812a0dc4380ceae75c29450Johann 53571, 52941, 52325, 51724, 51136, 50561, 49450, 48387, 47368, 637bc9febe8749e98a3812a0dc4380ceae75c29450Johann 46875, 45918, 45000, 44554, 44117, 43269, 42452, 41666, 40909, 647bc9febe8749e98a3812a0dc4380ceae75c29450Johann 40178, 39473, 38793, 38135, 36885, 36290, 35714, 35156, 34615, 657bc9febe8749e98a3812a0dc4380ceae75c29450Johann 34090, 33582, 33088, 32608, 32142, 31468, 31034, 30405, 29801, 667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 29220, 28662, 677bc9febe8749e98a3812a0dc4380ceae75c29450Johann }, 687bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Inter case 285000/Qinter */ 697bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 707bc9febe8749e98a3812a0dc4380ceae75c29450Johann 712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090, 237500, 717bc9febe8749e98a3812a0dc4380ceae75c29450Johann 219230, 203571, 190000, 178125, 167647, 158333, 150000, 142500, 135714, 727bc9febe8749e98a3812a0dc4380ceae75c29450Johann 129545, 123913, 118750, 114000, 109615, 105555, 101785, 98275, 95000, 737bc9febe8749e98a3812a0dc4380ceae75c29450Johann 91935, 89062, 86363, 83823, 81428, 79166, 77027, 75000, 73076, 747bc9febe8749e98a3812a0dc4380ceae75c29450Johann 71250, 69512, 67857, 66279, 64772, 63333, 61956, 60638, 59375, 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann 58163, 57000, 55882, 54807, 53773, 52777, 51818, 50892, 50000, 767bc9febe8749e98a3812a0dc4380ceae75c29450Johann 49137, 47500, 45967, 44531, 43181, 41911, 40714, 39583, 38513, 777bc9febe8749e98a3812a0dc4380ceae75c29450Johann 37500, 36538, 35625, 34756, 33928, 33139, 32386, 31666, 30978, 787bc9febe8749e98a3812a0dc4380ceae75c29450Johann 30319, 29687, 29081, 28500, 27941, 27403, 26886, 26388, 25909, 797bc9febe8749e98a3812a0dc4380ceae75c29450Johann 25446, 25000, 24568, 23949, 23360, 22800, 22265, 21755, 21268, 807bc9febe8749e98a3812a0dc4380ceae75c29450Johann 20802, 20357, 19930, 19520, 19127, 18750, 18387, 18037, 17701, 817bc9febe8749e98a3812a0dc4380ceae75c29450Johann 17378, 17065, 16764, 16473, 16101, 15745, 15405, 15079, 14766, 827bc9febe8749e98a3812a0dc4380ceae75c29450Johann 14467, 14179, 13902, 13636, 13380, 13133, 12895, 12666, 12445, 837bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12179, 11924, 11632, 11445, 11220, 11003, 10795, 10594, 10401, 847bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10215, 10035, 857bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int kf_boost_qadjustment[QINDEX_RANGE] = { 897bc9febe8749e98a3812a0dc4380ceae75c29450Johann 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 907bc9febe8749e98a3812a0dc4380ceae75c29450Johann 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 917bc9febe8749e98a3812a0dc4380ceae75c29450Johann 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 927bc9febe8749e98a3812a0dc4380ceae75c29450Johann 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 937bc9febe8749e98a3812a0dc4380ceae75c29450Johann 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 947bc9febe8749e98a3812a0dc4380ceae75c29450Johann 201, 202, 203, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 957bc9febe8749e98a3812a0dc4380ceae75c29450Johann 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 967bc9febe8749e98a3812a0dc4380ceae75c29450Johann 216, 217, 217, 218, 218, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, 977bc9febe8749e98a3812a0dc4380ceae75c29450Johann 220, 220, 220, 220, 220, 220, 220, 220, 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1001b362b15af34006e6a11974088a46d42b903418eJohann/* #define GFQ_ADJUSTMENT (Q+100) */ 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q] 1027bc9febe8749e98a3812a0dc4380ceae75c29450Johannconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] = { 1037bc9febe8749e98a3812a0dc4380ceae75c29450Johann 80, 82, 84, 86, 88, 90, 92, 94, 96, 97, 98, 99, 100, 101, 102, 1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 1087bc9febe8749e98a3812a0dc4380ceae75c29450Johann 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 1097bc9febe8749e98a3812a0dc4380ceae75c29450Johann 178, 179, 180, 181, 182, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann 188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 194, 194, 1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann 195, 195, 196, 196, 197, 197, 198, 198 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] = 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 100,101,102,103,104,105,105,106, 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 106,107,107,108,109,109,110,111, 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 112,113,114,115,116,117,118,119, 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 120,121,122,123,124,125,126,127, 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128,129,130,131,132,133,134,135, 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 136,137,138,139,140,141,142,143, 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 144,145,146,147,148,149,150,151, 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 152,153,154,155,156,157,158,159, 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160,161,162,163,164,165,166,167, 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 168,169,170,170,171,171,172,172, 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 173,173,173,174,174,174,175,175, 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 175,176,176,176,177,177,177,177, 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 178,178,179,179,180,180,181,181, 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 182,182,183,183,184,184,185,185, 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 186,186,187,187,188,188,189,189, 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 190,190,191,191,192,192,193,193, 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*/ 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int kf_gf_boost_qlimits[QINDEX_RANGE] = { 1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann 300, 305, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann 590, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1447bc9febe8749e98a3812a0dc4380ceae75c29450Johann 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1457bc9febe8749e98a3812a0dc4380ceae75c29450Johann 600, 600, 600, 600, 600, 600, 600, 600, 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1487bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_adjust_table[101] = { 1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann 100, 115, 130, 145, 160, 175, 190, 200, 210, 220, 230, 240, 260, 270, 280, 1507bc9febe8749e98a3812a0dc4380ceae75c29450Johann 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 400, 400, 400, 1517bc9febe8749e98a3812a0dc4380ceae75c29450Johann 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 1537bc9febe8749e98a3812a0dc4380ceae75c29450Johann 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1587bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_intra_usage_adjustment[20] = { 1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 125, 120, 115, 110, 105, 100, 95, 85, 80, 75, 1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann 70, 65, 60, 55, 50, 50, 50, 50, 50, 50, 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1637bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_interval_table[101] = { 1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1727bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4, 5 }; 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1757bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_save_coding_context(VP8_COMP *cpi) { 1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann CODING_CONTEXT *const cc = &cpi->coding_context; 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Stores a snapshot of key state variables which can subsequently be 1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann * restored with a call to vp8_restore_coding_context. These functions are 1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann * intended for use in a re-code loop in vp8_compress_frame where the 1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann * quantizer value is adjusted between loop iterations. 1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann cc->frames_since_key = cpi->frames_since_key; 1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann cc->filter_level = cpi->common.filter_level; 1867bc9febe8749e98a3812a0dc4380ceae75c29450Johann cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due; 1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann cc->frames_since_golden = cpi->frames_since_golden; 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->mvc, cpi->common.fc.mvc); 1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts); 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob); 1937bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob); 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->ymode_count, cpi->mb.ymode_count); 1967bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count); 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1987bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* Stats */ 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS 2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->y_modes, y_modes); 2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->uv_modes, uv_modes); 2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->b_modes, b_modes); 2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->inter_y_modes, inter_y_modes); 2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->inter_uv_modes, inter_uv_modes); 2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cc->inter_b_modes, inter_b_modes); 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann cc->this_frame_percent_intra = cpi->this_frame_percent_intra; 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2117bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_restore_coding_context(VP8_COMP *cpi) { 2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann CODING_CONTEXT *const cc = &cpi->coding_context; 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Restore key state variables to the snapshot state stored in the 2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann * previous call to vp8_save_coding_context. 2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2187bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_since_key = cc->frames_since_key; 2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.filter_level = cc->filter_level; 2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due; 2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_since_golden = cc->frames_since_golden; 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->common.fc.mvc, cc->mvc); 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts); 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2277bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob); 2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob); 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2307bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->mb.ymode_count, cc->ymode_count); 2317bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count); 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2337bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* Stats */ 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS 2357bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(y_modes, cc->y_modes); 2367bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(uv_modes, cc->uv_modes); 2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(b_modes, cc->b_modes); 2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(inter_y_modes, cc->inter_y_modes); 2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(inter_uv_modes, cc->inter_uv_modes); 2407bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_copy(inter_b_modes, cc->inter_b_modes); 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2437bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_percent_intra = cc->this_frame_percent_intra; 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2467bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_setup_key_frame(VP8_COMP *cpi) { 2477bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Setup for Key frame: */ 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2497bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_default_coef_probs(&cpi->common); 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2517bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(cpi->common.fc.mvc, vp8_default_mv_context, 2527bc9febe8749e98a3812a0dc4380ceae75c29450Johann sizeof(vp8_default_mv_context)); 2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 2547bc9febe8749e98a3812a0dc4380ceae75c29450Johann int flag[2] = { 1, 1 }; 2557bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_build_component_cost_table( 2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flag); 2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Make sure we initialize separate contexts for altref,gold, and normal. 2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann * TODO shouldn't need 3 different copies of structure to do this! 2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc)); 2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc)); 2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc)); 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2667bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.filter_level = cpi->common.base_qindex * 3 / 8; 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2687bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Provisional interval before next GF */ 2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->auto_gold) { 2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 2727bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL; 2737bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2741b362b15af34006e6a11974088a46d42b903418eJohann 2757bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame = 1; 2767bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_alt_ref_frame = 1; 2771b362b15af34006e6a11974088a46d42b903418eJohann} 2781b362b15af34006e6a11974088a46d42b903418eJohann 2791b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_bits_at_q(int frame_kind, int Q, int MBs, 2807bc9febe8749e98a3812a0dc4380ceae75c29450Johann double correction_factor) { 2817bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]); 2827bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Attempt to retain reasonable accuracy without overflow. The cutoff is 2847bc9febe8749e98a3812a0dc4380ceae75c29450Johann * chosen such that the maximum product of Bpm and MBs fits 31 bits. The 2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann * largest Bpm takes 20 bits. 2867bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (MBs > (1 << 11)) { 2887bc9febe8749e98a3812a0dc4380ceae75c29450Johann return (Bpm >> BPER_MB_NORMBITS) * MBs; 2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann return (Bpm * MBs) >> BPER_MB_NORMBITS; 2917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2947bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_iframe_target_size(VP8_COMP *cpi) { 2957bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* boost defaults to half second */ 2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann int kf_boost; 2977bc9febe8749e98a3812a0dc4380ceae75c29450Johann uint64_t target; 2981b362b15af34006e6a11974088a46d42b903418eJohann 2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Clear down mmx registers to allow floating point in what follows */ 3007bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_clear_system_state(); 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3027bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.fixed_q >= 0) { 3037bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = cpi->oxcf.key_q; 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3057bc9febe8749e98a3812a0dc4380ceae75c29450Johann target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs, 3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->key_frame_rate_correction_factor); 3077bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->pass == 2) { 3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* New Two pass RC */ 3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann target = cpi->per_frame_bandwidth; 3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* First Frame is a special case */ 3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann else if (cpi->common.current_video_frame == 0) { 3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* 1 Pass there is no information on which to base size so use 3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann * bandwidth per second * fraction of the initial buffer 3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann * level 3167bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 3177bc9febe8749e98a3812a0dc4380ceae75c29450Johann target = cpi->oxcf.starting_buffer_level / 2; 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (target > cpi->oxcf.target_bandwidth * 3 / 2) { 3207bc9febe8749e98a3812a0dc4380ceae75c29450Johann target = cpi->oxcf.target_bandwidth * 3 / 2; 3211b362b15af34006e6a11974088a46d42b903418eJohann } 3227bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* if this keyframe was forced, use a more recent Q estimate */ 3247bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ? cpi->avg_frame_qindex 3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann : cpi->ni_av_qi; 3267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3277bc9febe8749e98a3812a0dc4380ceae75c29450Johann int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */ 3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Boost depends somewhat on frame rate: only used for 1 layer case. */ 3297bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers == 1) { 3307bc9febe8749e98a3812a0dc4380ceae75c29450Johann kf_boost = VPXMAX(initial_boost, (int)(2 * cpi->output_framerate - 16)); 3317bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 3327bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */ 3337bc9febe8749e98a3812a0dc4380ceae75c29450Johann kf_boost = initial_boost; 33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3367bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */ 3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100; 33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* frame separation adjustment ( down) */ 3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->frames_since_key < cpi->output_framerate / 2) { 3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann kf_boost = 3427bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(kf_boost * cpi->frames_since_key / (cpi->output_framerate / 2)); 34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Minimal target size is |2* per_frame_bandwidth|. */ 3467bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (kf_boost < 16) kf_boost = 16; 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4; 3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.rc_max_intra_bitrate_pct) { 3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int max_rate = 3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->per_frame_bandwidth * cpi->oxcf.rc_max_intra_bitrate_pct / 100; 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (target > max_rate) target = max_rate; 3567bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3571b362b15af34006e6a11974088a46d42b903418eJohann 3587bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = (int)target; 3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* TODO: if we separate rate targeting from Q targetting, move this. 3617bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Reset the active worst quality to the baseline value for key frames. 3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass != 2) cpi->active_worst_quality = cpi->worst_quality; 3641b362b15af34006e6a11974088a46d42b903418eJohann 3651b362b15af34006e6a11974088a46d42b903418eJohann#if 0 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber FILE *f; 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber f = fopen("kf_boost.stt", "a"); 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fprintf(f, " %8u %10d %10d %10d\n", 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cpi->common.current_video_frame, cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending); 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fclose(f); 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 3751b362b15af34006e6a11974088a46d42b903418eJohann#endif 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3781b362b15af34006e6a11974088a46d42b903418eJohann/* Do the best we can to define the parameters for the next GF based on what 3791b362b15af34006e6a11974088a46d42b903418eJohann * information we have available. 3801b362b15af34006e6a11974088a46d42b903418eJohann */ 3817bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_gf_params(VP8_COMP *cpi) { 3827bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = 3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q; 3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Boost = 0; 3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann int gf_frame_useage = 0; /* Golden frame useage since last GF */ 3877bc9febe8749e98a3812a0dc4380ceae75c29450Johann int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] + 3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[LAST_FRAME] + 3897bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[GOLDEN_FRAME] + 3907bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[ALTREF_FRAME]; 3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3927bc9febe8749e98a3812a0dc4380ceae75c29450Johann int pct_gf_active = (100 * cpi->gf_active_count) / 3937bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.mb_rows * cpi->common.mb_cols); 3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (tot_mbs) { 3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + 3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 3987bc9febe8749e98a3812a0dc4380ceae75c29450Johann 100 / tot_mbs; 3997bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4017bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active; 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Not two pass */ 4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass != 2) { 4057bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Single Pass lagged mode: TBD */ 4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (0) { 4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Single Pass compression: Has to use current and historical data */ 4107bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0 4121b362b15af34006e6a11974088a46d42b903418eJohann /* Experimental code */ 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int index = cpi->one_pass_frame_index; 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS; 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4161b362b15af34006e6a11974088a46d42b903418eJohann /* ************** Experimental code - incomplete */ 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber double decay_val = 1.0; 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber double IIAccumulator = 0.0; 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber double last_iiaccumulator = 0.0; 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber double IIRatio; 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS; 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ( i = 0; i < (frames_to_scan - 1); i++ ) 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( index < 0 ) 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber index = MAX_LAG_BUFFERS; 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber index --; 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 ) 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error; 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( IIRatio > 30.0 ) 43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber IIRatio = 30.0; 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber IIRatio = 30.0; 44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber IIAccumulator += IIRatio * decay_val; 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter; 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( (i > MIN_GF_INTERVAL) && 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((IIAccumulator - last_iiaccumulator) < 2.0) ) 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last_iiaccumulator = IIAccumulator; 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Boost = IIAccumulator*100.0/16.0; 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cpi->baseline_gf_interval = i; 45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4597bc9febe8749e98a3812a0dc4380ceae75c29450Johann /*************************************************************/ 4607bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* OLD code */ 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust boost based upon ambient Q */ 4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost = GFQ_ADJUSTMENT; 46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4657bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust based upon most recently measure intra useage */ 4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost = Boost * 4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) 4687bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? cpi->this_frame_percent_intra 4697bc9febe8749e98a3812a0dc4380ceae75c29450Johann : 14] / 4707bc9febe8749e98a3812a0dc4380ceae75c29450Johann 100; 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4727bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust gf boost based upon GF usage since last GF */ 4737bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost = Boost * gf_adjust_table[gf_frame_useage] / 100; 47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4777bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* golden frame boost without recode loop often goes awry. be 4787bc9febe8749e98a3812a0dc4380ceae75c29450Johann * safe by keeping numbers down. 4797bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!cpi->sf.recode_loop) { 4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->compressor_speed == 2) Boost = Boost / 2; 4827bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4847bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Apply an upper limit based on Q for 1 pass encodes */ 4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0)) { 4867bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost = kf_gf_boost_qlimits[Q]; 48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4887bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Apply lower limits to boost. */ 4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (Boost < 110) { 4907bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost = 110; 49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4937bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Note the boost used */ 4947bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->last_boost = Boost; 4957bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4967bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Estimate next interval 4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann * This is updated once the real frame size/boost is known. 4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 5007bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.fixed_q == -1) { 501df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->pass == 2) { /* 2 Pass */ 5027bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 503df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } else { /* 1 Pass */ 5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5067bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->last_boost > 750) cpi->frames_till_gf_update_due++; 50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->last_boost > 1000) cpi->frames_till_gf_update_due++; 50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->last_boost > 1250) cpi->frames_till_gf_update_due++; 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->last_boost >= 1500) cpi->frames_till_gf_update_due++; 51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due) { 5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage]; 5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->frames_till_gf_update_due > cpi->max_gf_interval) { 5197bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->max_gf_interval; 5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* ARF on or off */ 5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass != 2) { 5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For now Alt ref is not allowed except in 2 pass modes. */ 5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->source_alt_ref_pending = 0; 5307bc9febe8749e98a3812a0dc4380ceae75c29450Johann 5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann /*if ( cpi->oxcf.fixed_q == -1) 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5337bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + 5347bc9febe8749e98a3812a0dc4380ceae75c29450Johann (AF_THRESH*cpi->frames_till_gf_update_due)) ) ) 5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->source_alt_ref_pending = 1; 5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann else 5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->source_alt_ref_pending = 0; 5387bc9febe8749e98a3812a0dc4380ceae75c29450Johann }*/ 5397bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5427bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_pframe_target_size(VP8_COMP *cpi) { 5437bc9febe8749e98a3812a0dc4380ceae75c29450Johann int min_frame_target; 5447bc9febe8749e98a3812a0dc4380ceae75c29450Johann int old_per_frame_bandwidth = cpi->per_frame_bandwidth; 54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5467bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->current_layer > 0) { 5477bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->per_frame_bandwidth = 5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer; 5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5517bc9febe8749e98a3812a0dc4380ceae75c29450Johann min_frame_target = 0; 55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5537bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass == 2) { 5547bc9febe8749e98a3812a0dc4380ceae75c29450Johann min_frame_target = cpi->min_frame_bandwidth; 55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5567bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) { 5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann min_frame_target = cpi->av_per_frame_bandwidth >> 5; 55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5597bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (min_frame_target < cpi->per_frame_bandwidth / 4) { 5607bc9febe8749e98a3812a0dc4380ceae75c29450Johann min_frame_target = cpi->per_frame_bandwidth / 4; 5617bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5637bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Special alt reference frame case */ 5647bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->common.refresh_alt_ref_frame) && 5657bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.number_of_layers == 1)) { 5667bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass == 2) { 5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Per frame bit target for the alt ref frame */ 5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->per_frame_bandwidth = cpi->twopass.gf_bits; 5697bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = cpi->per_frame_bandwidth; 5707bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5727bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* One Pass ??? TBD */ 5737bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5757bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Normal frames (gf,and inter) */ 5767bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 5777bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* 2 pass */ 5787bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass == 2) { 5797bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = cpi->per_frame_bandwidth; 58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5817bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* 1 pass */ 5827bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 5837bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Adjustment; 5847bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Make rate adjustment to recover bits spent in key frame 5857bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Test to see if the key frame inter data rate correction 5867bc9febe8749e98a3812a0dc4380ceae75c29450Johann * should still be in force 5877bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 5887bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->kf_overspend_bits > 0) { 5897bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) 5907bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? cpi->kf_bitrate_adjustment 5917bc9febe8749e98a3812a0dc4380ceae75c29450Johann : cpi->kf_overspend_bits; 5927bc9febe8749e98a3812a0dc4380ceae75c29450Johann 5937bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target)) { 5947bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->per_frame_bandwidth - min_frame_target); 59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->kf_overspend_bits -= Adjustment; 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5997bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Calculate an inter frame bandwidth target for the next 6007bc9febe8749e98a3812a0dc4380ceae75c29450Johann * few frames designed to recover any extra bits spent on 6017bc9febe8749e98a3812a0dc4380ceae75c29450Johann * the key frame. 6027bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment; 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->this_frame_target < min_frame_target) { 6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = min_frame_target; 6077bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6087bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 6097bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = cpi->per_frame_bandwidth; 6107bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6117bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6127bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If appropriate make an adjustment to recover bits spent on a 6137bc9febe8749e98a3812a0dc4380ceae75c29450Johann * recent GF 6147bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 6157bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->gf_overspend_bits > 0) && 6167bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->this_frame_target > min_frame_target)) { 6177bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) 6187bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? cpi->non_gf_bitrate_adjustment 6197bc9febe8749e98a3812a0dc4380ceae75c29450Johann : cpi->gf_overspend_bits; 6207bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6217bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Adjustment > (cpi->this_frame_target - min_frame_target)) { 6227bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->this_frame_target - min_frame_target); 6237bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6257bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->gf_overspend_bits -= Adjustment; 6267bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target -= Adjustment; 6277bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6297bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Apply small + and - boosts for non gf frames */ 6307bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) && 6317bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1))) { 6327bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* % Adjustment limited to the range 1% to 10% */ 6337bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->last_boost - 100) >> 5; 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6357bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Adjustment < 1) { 6367bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = 1; 6377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (Adjustment > 10) { 6387bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = 10; 6397bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6417bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Convert to bits */ 6427bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->this_frame_target * Adjustment) / 100; 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6447bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Adjustment > (cpi->this_frame_target - min_frame_target)) { 6457bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->this_frame_target - min_frame_target); 6467bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6487bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1)) { 6497bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (cpi->current_gf_interval - 1) * Adjustment; 6507bc9febe8749e98a3812a0dc4380ceae75c29450Johann // Limit adjustment to 10% of current target. 6517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Adjustment > (10 * cpi->this_frame_target) / 100) { 6527bc9febe8749e98a3812a0dc4380ceae75c29450Johann Adjustment = (10 * cpi->this_frame_target) / 100; 6537bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6547bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target += Adjustment; 6557bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 6567bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target -= Adjustment; 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6587bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6607bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6627bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Sanity check that the total sum of adjustments is not above the 6637bc9febe8749e98a3812a0dc4380ceae75c29450Johann * maximum allowed That is that having allowed for KF and GF penalties 6647bc9febe8749e98a3812a0dc4380ceae75c29450Johann * we have not pushed the current interframe target to low. If the 6657bc9febe8749e98a3812a0dc4380ceae75c29450Johann * adjustment we apply here is not capable of recovering all the extra 6667bc9febe8749e98a3812a0dc4380ceae75c29450Johann * bits we have spent in the KF or GF then the remainder will have to 6677bc9febe8749e98a3812a0dc4380ceae75c29450Johann * be recovered over a longer time span via other buffer / rate control 6687bc9febe8749e98a3812a0dc4380ceae75c29450Johann * mechanisms. 6697bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 6707bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->this_frame_target < min_frame_target) { 6717bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = min_frame_target; 6727bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6747bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!cpi->common.refresh_alt_ref_frame) { 6757bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Note the baseline target data rate for this inter frame. */ 6767bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->inter_frame_target = cpi->this_frame_target; 6777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6797bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* One Pass specific code */ 6807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass == 0) { 6817bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adapt target frame size with respect to any buffering constraints: */ 6827bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->buffered_mode) { 6837bc9febe8749e98a3812a0dc4380ceae75c29450Johann int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100); 6847bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6857bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) || 6867bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level)) { 6877bc9febe8749e98a3812a0dc4380ceae75c29450Johann int percent_low = 0; 6887bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6897bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Decide whether or not we need to adjust the frame data 6907bc9febe8749e98a3812a0dc4380ceae75c29450Johann * rate target. 6917bc9febe8749e98a3812a0dc4380ceae75c29450Johann * 6927bc9febe8749e98a3812a0dc4380ceae75c29450Johann * If we are are below the optimal buffer fullness level 6937bc9febe8749e98a3812a0dc4380ceae75c29450Johann * and adherence to buffering constraints is important to 6947bc9febe8749e98a3812a0dc4380ceae75c29450Johann * the end usage then adjust the per frame target. 6957bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 6967bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) && 6977bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) { 6987bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_low = 6997bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) / 7007bc9febe8749e98a3812a0dc4380ceae75c29450Johann one_percent_bits); 7017bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7027bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Are we overshooting the long term clip data rate... */ 7037bc9febe8749e98a3812a0dc4380ceae75c29450Johann else if (cpi->bits_off_target < 0) { 7047bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust per frame data target downwards to compensate. */ 7057bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_low = 7067bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(100 * -cpi->bits_off_target / (cpi->total_byte_count * 8)); 7077bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7097bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (percent_low > cpi->oxcf.under_shoot_pct) { 7107bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_low = cpi->oxcf.under_shoot_pct; 7117bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (percent_low < 0) { 7127bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_low = 0; 7137bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7157bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* lower the target bandwidth for this frame. */ 7167bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target -= (cpi->this_frame_target * percent_low) / 200; 71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7187bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Are we using allowing control of active_worst_allowed_q 7197bc9febe8749e98a3812a0dc4380ceae75c29450Johann * according to buffer level. 7207bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7217bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->auto_worst_q && cpi->ni_frames > 150) { 7227bc9febe8749e98a3812a0dc4380ceae75c29450Johann int64_t critical_buffer_level; 7237bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7247bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For streaming applications the most important factor is 7257bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->buffer_level as this takes into account the 7267bc9febe8749e98a3812a0dc4380ceae75c29450Johann * specified short term buffering constraints. However, 7277bc9febe8749e98a3812a0dc4380ceae75c29450Johann * hitting the long term clip data rate target is also 7287bc9febe8749e98a3812a0dc4380ceae75c29450Johann * important. 7297bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7307bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { 7317bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Take the smaller of cpi->buffer_level and 7327bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->bits_off_target 7337bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7347bc9febe8749e98a3812a0dc4380ceae75c29450Johann critical_buffer_level = (cpi->buffer_level < cpi->bits_off_target) 7357bc9febe8749e98a3812a0dc4380ceae75c29450Johann ? cpi->buffer_level 7367bc9febe8749e98a3812a0dc4380ceae75c29450Johann : cpi->bits_off_target; 7377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7387bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For local file playback short term buffering constraints 7397bc9febe8749e98a3812a0dc4380ceae75c29450Johann * are less of an issue 7407bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7417bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 7427bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Consider only how we are doing for the clip as a 7437bc9febe8749e98a3812a0dc4380ceae75c29450Johann * whole 7447bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7457bc9febe8749e98a3812a0dc4380ceae75c29450Johann critical_buffer_level = cpi->bits_off_target; 7467bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7477bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7487bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set the active worst quality based upon the selected 7497bc9febe8749e98a3812a0dc4380ceae75c29450Johann * buffer fullness number. 7507bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) { 7527bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (critical_buffer_level > (cpi->oxcf.optimal_buffer_level >> 2)) { 7537bc9febe8749e98a3812a0dc4380ceae75c29450Johann int64_t qadjustment_range = cpi->worst_quality - cpi->ni_av_qi; 7547bc9febe8749e98a3812a0dc4380ceae75c29450Johann int64_t above_base = (critical_buffer_level - 7557bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.optimal_buffer_level >> 2)); 7567bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7577bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Step active worst quality down from 7587bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->ni_av_qi when (critical_buffer_level == 7597bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->optimal_buffer_level) to 7607bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->worst_quality when 7617bc9febe8749e98a3812a0dc4380ceae75c29450Johann * (critical_buffer_level == 7627bc9febe8749e98a3812a0dc4380ceae75c29450Johann * cpi->optimal_buffer_level >> 2) 7637bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7647bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = 7657bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->worst_quality - 7667bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)((qadjustment_range * above_base) / 7677bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.optimal_buffer_level * 3 >> 2)); 7687bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7697bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->worst_quality; 77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7717bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7727bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->ni_av_qi; 7737bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7747bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7757bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->worst_quality; 7767bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7787bc9febe8749e98a3812a0dc4380ceae75c29450Johann int percent_high = 0; 7797bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) && 7817bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) { 7827bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_high = 7837bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) / 7847bc9febe8749e98a3812a0dc4380ceae75c29450Johann one_percent_bits); 7857bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) { 7867bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_high = 7877bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)((100 * cpi->bits_off_target) / (cpi->total_byte_count * 8)); 7887bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (percent_high > cpi->oxcf.over_shoot_pct) { 7917bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_high = cpi->oxcf.over_shoot_pct; 7927bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (percent_high < 0) { 7937bc9febe8749e98a3812a0dc4380ceae75c29450Johann percent_high = 0; 7947bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7967bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target += (cpi->this_frame_target * percent_high) / 200; 79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7987bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Are we allowing control of active_worst_allowed_q according 7997bc9febe8749e98a3812a0dc4380ceae75c29450Johann * to buffer level. 8007bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 8017bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->auto_worst_q && cpi->ni_frames > 150) { 8027bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* When using the relaxed buffer model stick to the 8037bc9febe8749e98a3812a0dc4380ceae75c29450Johann * user specified value 8047bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 8057bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->ni_av_qi; 8067bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 8077bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->worst_quality; 8087bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8097bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8117bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set active_best_quality to prevent quality rising too high */ 8127bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_best_quality = cpi->best_quality; 81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8147bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Worst quality obviously must not be better than best quality */ 8157bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->active_worst_quality <= cpi->active_best_quality) { 8167bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->active_best_quality + 1; 8177bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8197bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->active_worst_quality > 127) cpi->active_worst_quality = 127; 8207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8217bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Unbuffered mode (eg. video conferencing) */ 8227bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 8237bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set the active worst quality */ 8247bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->worst_quality; 8257bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 82679f15823c34ae1e423108295e416213200bb280fAndreas Huber 8277bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Special trap for constrained quality mode 8287bc9febe8749e98a3812a0dc4380ceae75c29450Johann * "active_worst_quality" may never drop below cq level 8297bc9febe8749e98a3812a0dc4380ceae75c29450Johann * for any frame type. 8307bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY && 8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality < cpi->cq_target_quality) { 8337bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->cq_target_quality; 83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8357bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8377bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Test to see if we have to drop a frame 8387bc9febe8749e98a3812a0dc4380ceae75c29450Johann * The auto-drop frame code is only used in buffered mode. 8397bc9febe8749e98a3812a0dc4380ceae75c29450Johann * In unbufferd mode (eg vide conferencing) the descision to 8407bc9febe8749e98a3812a0dc4380ceae75c29450Johann * code or drop a frame is made outside the codec in response to real 8417bc9febe8749e98a3812a0dc4380ceae75c29450Johann * world comms or buffer considerations. 8427bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 8437bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->drop_frames_allowed && 8447bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) && 8457bc9febe8749e98a3812a0dc4380ceae75c29450Johann ((cpi->common.frame_type != KEY_FRAME))) { 8467bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Check for a buffer underun-crisis in which case we have to drop 8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann * a frame 8481b362b15af34006e6a11974088a46d42b903418eJohann */ 8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->buffer_level < 0)) { 85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0 85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber FILE *f = fopen("dec.stt", "a"); 85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n", 85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (int) cpi->common.current_video_frame, 85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cpi->decimation_factor, cpi->common.horiz_scale, 85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level); 85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fclose(f); 85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 8587bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->drop_frame = 1; 8597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8607bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Update the buffer level variable. */ 8617bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->bits_off_target += cpi->av_per_frame_bandwidth; 8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) { 8637bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size; 8647bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8657bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->buffer_level = cpi->bits_off_target; 8667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8677bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers > 1) { 8687bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int i; 8697bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8707bc9febe8749e98a3812a0dc4380ceae75c29450Johann // Propagate bits saved by dropping the frame to higher layers. 8717bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) { 8727bc9febe8749e98a3812a0dc4380ceae75c29450Johann LAYER_CONTEXT *lc = &cpi->layer_context[i]; 8737bc9febe8749e98a3812a0dc4380ceae75c29450Johann lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate); 8747bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (lc->bits_off_target > lc->maximum_buffer_size) { 8757bc9febe8749e98a3812a0dc4380ceae75c29450Johann lc->bits_off_target = lc->maximum_buffer_size; 8767bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8777bc9febe8749e98a3812a0dc4380ceae75c29450Johann lc->buffer_level = lc->bits_off_target; 87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8797bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8817bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8837bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust target frame size for Golden Frames: */ 8847bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.error_resilient_mode == 0 && 8857bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame) { 8867bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!cpi->gf_update_onepass_cbr) { 8877bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] 8887bc9febe8749e98a3812a0dc4380ceae75c29450Johann : cpi->oxcf.fixed_q; 8897bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8907bc9febe8749e98a3812a0dc4380ceae75c29450Johann int gf_frame_useage = 0; /* Golden frame useage since last GF */ 8917bc9febe8749e98a3812a0dc4380ceae75c29450Johann int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] + 8927bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[LAST_FRAME] + 8937bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[GOLDEN_FRAME] + 8947bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[ALTREF_FRAME]; 8957bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8967bc9febe8749e98a3812a0dc4380ceae75c29450Johann int pct_gf_active = (100 * cpi->gf_active_count) / 8977bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.mb_rows * cpi->common.mb_cols); 8987bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8997bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (tot_mbs) { 9007bc9febe8749e98a3812a0dc4380ceae75c29450Johann gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + 9017bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 9027bc9febe8749e98a3812a0dc4380ceae75c29450Johann 100 / tot_mbs; 9037bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9047bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9057bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active; 9067bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Is a fixed manual GF frequency being used */ 9087bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->auto_gold) { 9097bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For one pass throw a GF if recent frame intra useage is 9107bc9febe8749e98a3812a0dc4380ceae75c29450Johann * low or the GF useage is high 9117bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9127bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->pass == 0) && 9137bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5)) { 9147bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame = 1; 91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9167bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Two pass GF descision */ 9177bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->pass == 2) { 9187bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame = 1; 91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 92190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 92290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0 92390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9247bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Debug stats */ 9257bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (0) { 9267bc9febe8749e98a3812a0dc4380ceae75c29450Johann FILE *f; 92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9287bc9febe8749e98a3812a0dc4380ceae75c29450Johann f = fopen("gf_useaget.stt", "a"); 9297bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n", 9307bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.current_video_frame, cpi->gfu_boost, 9317bc9febe8749e98a3812a0dc4380ceae75c29450Johann GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage); 9327bc9febe8749e98a3812a0dc4380ceae75c29450Johann fclose(f); 9337bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9377bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.refresh_golden_frame == 1) { 93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0 93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9407bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (0) { 94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber FILE *f; 94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber f = fopen("GFexit.stt", "a"); 94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame); 94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber fclose(f); 94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9507bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->auto_adjust_gold_quantizer) { 9517bc9febe8749e98a3812a0dc4380ceae75c29450Johann calc_gf_params(cpi); 9527bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9547bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If we are using alternate ref instead of gf then do not apply the 9557bc9febe8749e98a3812a0dc4380ceae75c29450Johann * boost It will instead be applied to the altref update Jims 9567bc9febe8749e98a3812a0dc4380ceae75c29450Johann * modified boost 9577bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9587bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!cpi->source_alt_ref_active) { 9597bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.fixed_q < 0) { 9607bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->pass == 2) { 9617bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* The spend on the GF is defined in the two pass 9627bc9febe8749e98a3812a0dc4380ceae75c29450Johann * code for two pass encodes 9637bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9647bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = cpi->per_frame_bandwidth; 9657bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9667bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Boost = cpi->last_boost; 9677bc9febe8749e98a3812a0dc4380ceae75c29450Johann int frames_in_section = cpi->frames_till_gf_update_due + 1; 9687bc9febe8749e98a3812a0dc4380ceae75c29450Johann int allocation_chunks = (frames_in_section * 100) + (Boost - 100); 9697bc9febe8749e98a3812a0dc4380ceae75c29450Johann int bits_in_section = cpi->inter_frame_target * frames_in_section; 9707bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9717bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Normalize Altboost and allocations chunck down to 9727bc9febe8749e98a3812a0dc4380ceae75c29450Johann * prevent overflow 9737bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9747bc9febe8749e98a3812a0dc4380ceae75c29450Johann while (Boost > 1000) { 9757bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost /= 2; 9767bc9febe8749e98a3812a0dc4380ceae75c29450Johann allocation_chunks /= 2; 9777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9797bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Avoid loss of precision but avoid overflow */ 9807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((bits_in_section >> 7) > allocation_chunks) { 9817bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = 9827bc9febe8749e98a3812a0dc4380ceae75c29450Johann Boost * (bits_in_section / allocation_chunks); 9837bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9847bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = 9857bc9febe8749e98a3812a0dc4380ceae75c29450Johann (Boost * bits_in_section) / allocation_chunks; 9867bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9887bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9897bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = 9907bc9febe8749e98a3812a0dc4380ceae75c29450Johann (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) * 9917bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->last_boost) / 9927bc9febe8749e98a3812a0dc4380ceae75c29450Johann 100; 9937bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9947bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9957bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If there is an active ARF at this location use the minimum 9967bc9febe8749e98a3812a0dc4380ceae75c29450Johann * bits on this frame even if it is a contructed arf. 9977bc9febe8749e98a3812a0dc4380ceae75c29450Johann * The active maximum quantizer insures that an appropriate 9987bc9febe8749e98a3812a0dc4380ceae75c29450Johann * number of bits will be spent if needed for contstructed ARFs. 9997bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 10007bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = 0; 100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10027bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10037bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->current_gf_interval = cpi->frames_till_gf_update_due; 10047bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10057bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 10067bc9febe8749e98a3812a0dc4380ceae75c29450Johann // Special case for 1 pass CBR: fixed gf period. 10077bc9febe8749e98a3812a0dc4380ceae75c29450Johann // TODO(marpan): Adjust this boost/interval logic. 10087bc9febe8749e98a3812a0dc4380ceae75c29450Johann // If gf_cbr_boost_pct is small (below threshold) set the flag 10097bc9febe8749e98a3812a0dc4380ceae75c29450Johann // gf_noboost_onepass_cbr = 1, which forces the gf to use the same 10107bc9febe8749e98a3812a0dc4380ceae75c29450Johann // rate correction factor as last. 10117bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->gf_noboost_onepass_cbr = (cpi->oxcf.gf_cbr_boost_pct <= 100); 10127bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr; 10137bc9febe8749e98a3812a0dc4380ceae75c29450Johann // Skip this update if the zero_mvcount is low. 10147bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->zeromv_count > (cpi->common.MBs >> 1)) { 10157bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame = 1; 10167bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->this_frame_target = 10177bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->this_frame_target * (100 + cpi->oxcf.gf_cbr_boost_pct)) / 100; 10187bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10197bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; 10207bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->current_gf_interval = cpi->frames_till_gf_update_due; 102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10227bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10231b362b15af34006e6a11974088a46d42b903418eJohann 10247bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->per_frame_bandwidth = old_per_frame_bandwidth; 102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10277bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) { 10287bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = cpi->common.base_qindex; 10297bc9febe8749e98a3812a0dc4380ceae75c29450Johann int correction_factor = 100; 10307bc9febe8749e98a3812a0dc4380ceae75c29450Johann double rate_correction_factor; 10317bc9febe8749e98a3812a0dc4380ceae75c29450Johann double adjustment_limit; 103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10337bc9febe8749e98a3812a0dc4380ceae75c29450Johann int projected_size_based_on_q = 0; 103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10357bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Clear down mmx registers to allow floating point in what follows */ 10367bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_clear_system_state(); 103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10387bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 10397bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = cpi->key_frame_rate_correction_factor; 10407bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 10417bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr && 10427bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.refresh_alt_ref_frame || 10437bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame)) { 10447bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = cpi->gf_rate_correction_factor; 10457bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 10467bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = cpi->rate_correction_factor; 104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10487bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10507bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Work out how big we would have expected the frame to be at this Q 10517bc9febe8749e98a3812a0dc4380ceae75c29450Johann * given the current correction factor. Stay in double to avoid int 10527bc9febe8749e98a3812a0dc4380ceae75c29450Johann * overflow when values are large 10537bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 10547bc9febe8749e98a3812a0dc4380ceae75c29450Johann projected_size_based_on_q = 10557bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(((.5 + 10567bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor * 10577bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_bits_per_mb[cpi->common.frame_type][Q]) * 10587bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.MBs) / 10597bc9febe8749e98a3812a0dc4380ceae75c29450Johann (1 << BPER_MB_NORMBITS)); 10607bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10617bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Make some allowance for cpi->zbin_over_quant */ 10627bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->mb.zbin_over_quant > 0) { 10637bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Z = cpi->mb.zbin_over_quant; 10647bc9febe8749e98a3812a0dc4380ceae75c29450Johann double Factor = 0.99; 10657bc9febe8749e98a3812a0dc4380ceae75c29450Johann double factor_adjustment = 0.01 / 256.0; 10667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10677bc9febe8749e98a3812a0dc4380ceae75c29450Johann while (Z > 0) { 10687bc9febe8749e98a3812a0dc4380ceae75c29450Johann Z--; 10697bc9febe8749e98a3812a0dc4380ceae75c29450Johann projected_size_based_on_q = (int)(Factor * projected_size_based_on_q); 10707bc9febe8749e98a3812a0dc4380ceae75c29450Johann Factor += factor_adjustment; 10717bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10727bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Factor >= 0.999) Factor = 0.999; 107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10747bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 107590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10767bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Work out a size correction factor. */ 10777bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (projected_size_based_on_q > 0) { 10787bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = 10797bc9febe8749e98a3812a0dc4380ceae75c29450Johann (100 * cpi->projected_frame_size) / projected_size_based_on_q; 10807bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10827bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* More heavily damped adjustment used if we have been oscillating 10837bc9febe8749e98a3812a0dc4380ceae75c29450Johann * either side of target 10847bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 10857bc9febe8749e98a3812a0dc4380ceae75c29450Johann switch (damp_var) { 10867bc9febe8749e98a3812a0dc4380ceae75c29450Johann case 0: adjustment_limit = 0.75; break; 10877bc9febe8749e98a3812a0dc4380ceae75c29450Johann case 1: adjustment_limit = 0.375; break; 108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case 2: 10897bc9febe8749e98a3812a0dc4380ceae75c29450Johann default: adjustment_limit = 0.25; break; 10907bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10927bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (correction_factor > 102) { 10937bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* We are not already at the worst allowable quality */ 10947bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = 10957bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(100.5 + ((correction_factor - 100) * adjustment_limit)); 10967bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = 10977bc9febe8749e98a3812a0dc4380ceae75c29450Johann ((rate_correction_factor * correction_factor) / 100); 109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10997bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Keep rate_correction_factor within limits */ 11007bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (rate_correction_factor > MAX_BPB_FACTOR) { 11017bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = MAX_BPB_FACTOR; 110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11037bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (correction_factor < 99) { 11047bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* We are not already at the best allowable quality */ 11057bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = 11067bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(100.5 - ((100 - correction_factor) * adjustment_limit)); 11077bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = 11087bc9febe8749e98a3812a0dc4380ceae75c29450Johann ((rate_correction_factor * correction_factor) / 100); 11097bc9febe8749e98a3812a0dc4380ceae75c29450Johann 11107bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Keep rate_correction_factor within limits */ 11117bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (rate_correction_factor < MIN_BPB_FACTOR) { 11127bc9febe8749e98a3812a0dc4380ceae75c29450Johann rate_correction_factor = MIN_BPB_FACTOR; 111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11167bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 11177bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->key_frame_rate_correction_factor = rate_correction_factor; 11187bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11197bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr && 11207bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.refresh_alt_ref_frame || 11217bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame)) { 11227bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->gf_rate_correction_factor = rate_correction_factor; 11237bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11247bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->rate_correction_factor = rate_correction_factor; 112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11267bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 112790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 112890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11297bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) { 11307bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q = cpi->active_worst_quality; 113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11327bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->force_maxqp == 1) { 11337bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->active_worst_quality = cpi->worst_quality; 11347bc9febe8749e98a3812a0dc4380ceae75c29450Johann return cpi->worst_quality; 11357bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11367bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Reset Zbin OQ value */ 11377bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->mb.zbin_over_quant = 0; 11387bc9febe8749e98a3812a0dc4380ceae75c29450Johann 11397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.fixed_q >= 0) { 11407bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = cpi->oxcf.fixed_q; 11417bc9febe8749e98a3812a0dc4380ceae75c29450Johann 11427bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 11437bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = cpi->oxcf.key_q; 11447bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->oxcf.number_of_layers == 1 && 11457bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_alt_ref_frame && 11467bc9febe8749e98a3812a0dc4380ceae75c29450Johann !cpi->gf_noboost_onepass_cbr) { 11477bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = cpi->oxcf.alt_q; 11487bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->oxcf.number_of_layers == 1 && 11497bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame && 11507bc9febe8749e98a3812a0dc4380ceae75c29450Johann !cpi->gf_noboost_onepass_cbr) { 11517bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = cpi->oxcf.gold_q; 1152da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 11537bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11547bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 11557bc9febe8749e98a3812a0dc4380ceae75c29450Johann int last_error = INT_MAX; 11567bc9febe8749e98a3812a0dc4380ceae75c29450Johann int target_bits_per_mb; 11577bc9febe8749e98a3812a0dc4380ceae75c29450Johann int bits_per_mb_at_this_q; 11587bc9febe8749e98a3812a0dc4380ceae75c29450Johann double correction_factor; 11597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 11607bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Select the appropriate correction factor based upon type of frame. */ 11617bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 11627bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = cpi->key_frame_rate_correction_factor; 11637bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11647bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr && 11657bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.refresh_alt_ref_frame || 11667bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame)) { 11677bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = cpi->gf_rate_correction_factor; 11687bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11697bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor = cpi->rate_correction_factor; 11707bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11737bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Calculate required scaling factor based on target frame size and 11747bc9febe8749e98a3812a0dc4380ceae75c29450Johann * size of frame produced using previous Q 11757bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 11767bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS)) { 11777bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Case where we would overflow int */ 11787bc9febe8749e98a3812a0dc4380ceae75c29450Johann target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) 11797bc9febe8749e98a3812a0dc4380ceae75c29450Johann << BPER_MB_NORMBITS; 11807bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11817bc9febe8749e98a3812a0dc4380ceae75c29450Johann target_bits_per_mb = 11827bc9febe8749e98a3812a0dc4380ceae75c29450Johann (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs; 11837bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11857bc9febe8749e98a3812a0dc4380ceae75c29450Johann i = cpi->active_best_quality; 118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11877bc9febe8749e98a3812a0dc4380ceae75c29450Johann do { 11887bc9febe8749e98a3812a0dc4380ceae75c29450Johann bits_per_mb_at_this_q = 11897bc9febe8749e98a3812a0dc4380ceae75c29450Johann (int)(.5 + 11907bc9febe8749e98a3812a0dc4380ceae75c29450Johann correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]); 119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11927bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (bits_per_mb_at_this_q <= target_bits_per_mb) { 11937bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) { 11947bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = i; 11957bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 11967bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = i - 1; 119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 119890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11997bc9febe8749e98a3812a0dc4380ceae75c29450Johann break; 12007bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 12017bc9febe8749e98a3812a0dc4380ceae75c29450Johann last_error = bits_per_mb_at_this_q - target_bits_per_mb; 12027bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12037bc9febe8749e98a3812a0dc4380ceae75c29450Johann } while (++i <= cpi->active_worst_quality); 12047bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12057bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If we are at MAXQ then enable Q over-run which seeks to claw 12067bc9febe8749e98a3812a0dc4380ceae75c29450Johann * back additional bits through things like the RD multiplier 12077bc9febe8749e98a3812a0dc4380ceae75c29450Johann * and zero bin size. 12087bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 12097bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Q >= MAXQ) { 12107bc9febe8749e98a3812a0dc4380ceae75c29450Johann int zbin_oqmax; 12117bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12127bc9febe8749e98a3812a0dc4380ceae75c29450Johann double Factor = 0.99; 12137bc9febe8749e98a3812a0dc4380ceae75c29450Johann double factor_adjustment = 0.01 / 256.0; 12147bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12157bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 12167bc9febe8749e98a3812a0dc4380ceae75c29450Johann zbin_oqmax = 0; 12177bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->oxcf.number_of_layers == 1 && 12187bc9febe8749e98a3812a0dc4380ceae75c29450Johann !cpi->gf_noboost_onepass_cbr && 12197bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.refresh_alt_ref_frame || 12207bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->common.refresh_golden_frame && 12217bc9febe8749e98a3812a0dc4380ceae75c29450Johann !cpi->source_alt_ref_active))) { 12227bc9febe8749e98a3812a0dc4380ceae75c29450Johann zbin_oqmax = 16; 12237bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 12247bc9febe8749e98a3812a0dc4380ceae75c29450Johann zbin_oqmax = ZBIN_OQ_MAX; 12257bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12277bc9febe8749e98a3812a0dc4380ceae75c29450Johann /*{ 12287bc9febe8749e98a3812a0dc4380ceae75c29450Johann double Factor = 12297bc9febe8749e98a3812a0dc4380ceae75c29450Johann (double)target_bits_per_mb/(double)bits_per_mb_at_this_q; 12307bc9febe8749e98a3812a0dc4380ceae75c29450Johann double Oq; 12317bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12327bc9febe8749e98a3812a0dc4380ceae75c29450Johann Factor = Factor/1.2683; 12337bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12347bc9febe8749e98a3812a0dc4380ceae75c29450Johann Oq = pow( Factor, (1.0/-0.165) ); 12357bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12367bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ( Oq > zbin_oqmax ) 12377bc9febe8749e98a3812a0dc4380ceae75c29450Johann Oq = zbin_oqmax; 12387bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12397bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->zbin_over_quant = (int)Oq; 12407bc9febe8749e98a3812a0dc4380ceae75c29450Johann }*/ 12417bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12427bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Each incrment in the zbin is assumed to have a fixed effect 12437bc9febe8749e98a3812a0dc4380ceae75c29450Johann * on bitrate. This is not of course true. The effect will be 12447bc9febe8749e98a3812a0dc4380ceae75c29450Johann * highly clip dependent and may well have sudden steps. The 12457bc9febe8749e98a3812a0dc4380ceae75c29450Johann * idea here is to acheive higher effective quantizers than the 12467bc9febe8749e98a3812a0dc4380ceae75c29450Johann * normal maximum by expanding the zero bin and hence 12477bc9febe8749e98a3812a0dc4380ceae75c29450Johann * decreasing the number of low magnitude non zero coefficients. 12487bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 12497bc9febe8749e98a3812a0dc4380ceae75c29450Johann while (cpi->mb.zbin_over_quant < zbin_oqmax) { 12507bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->mb.zbin_over_quant++; 12517bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12527bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->mb.zbin_over_quant > zbin_oqmax) { 12537bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->mb.zbin_over_quant = zbin_oqmax; 12547bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 125590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12567bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Adjust bits_per_mb_at_this_q estimate */ 12577bc9febe8749e98a3812a0dc4380ceae75c29450Johann bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q); 12587bc9febe8749e98a3812a0dc4380ceae75c29450Johann Factor += factor_adjustment; 125990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12607bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (Factor >= 0.999) Factor = 0.999; 126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12627bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Break out if we get down to the target rate */ 12637bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (bits_per_mb_at_this_q <= target_bits_per_mb) break; 12647bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12667bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12687bc9febe8749e98a3812a0dc4380ceae75c29450Johann return Q; 126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12717bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int estimate_keyframe_frequency(VP8_COMP *cpi) { 12727bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12747bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Average key frame frequency */ 12757bc9febe8749e98a3812a0dc4380ceae75c29450Johann int av_key_frame_frequency = 0; 127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12777bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* First key frame at start of sequence is a special case. We have no 12787bc9febe8749e98a3812a0dc4380ceae75c29450Johann * frequency data. 12797bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 12807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->key_frame_count == 1) { 12817bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume a default of 1 kf every 2 seconds, or the max kf interval, 12827bc9febe8749e98a3812a0dc4380ceae75c29450Johann * whichever is smaller. 12831b362b15af34006e6a11974088a46d42b903418eJohann */ 12847bc9febe8749e98a3812a0dc4380ceae75c29450Johann int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1; 12857bc9febe8749e98a3812a0dc4380ceae75c29450Johann av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2; 12861b362b15af34006e6a11974088a46d42b903418eJohann 12877bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) { 12887bc9febe8749e98a3812a0dc4380ceae75c29450Johann av_key_frame_frequency = key_freq; 128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12917bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] = 12927bc9febe8749e98a3812a0dc4380ceae75c29450Johann av_key_frame_frequency; 12937bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 12947bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int total_weight = 0; 12957bc9febe8749e98a3812a0dc4380ceae75c29450Johann int last_kf_interval = 12967bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1; 129790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12987bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* reset keyframe context and calculate weighted average of last 12997bc9febe8749e98a3812a0dc4380ceae75c29450Johann * KEY_FRAME_CONTEXT keyframes 13007bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 13017bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < KEY_FRAME_CONTEXT; ++i) { 13027bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (i < KEY_FRAME_CONTEXT - 1) { 13037bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i + 1]; 13047bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13057bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->prior_key_frame_distance[i] = last_kf_interval; 13067bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 13077bc9febe8749e98a3812a0dc4380ceae75c29450Johann 13087bc9febe8749e98a3812a0dc4380ceae75c29450Johann av_key_frame_frequency += 13097bc9febe8749e98a3812a0dc4380ceae75c29450Johann prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i]; 13107bc9febe8749e98a3812a0dc4380ceae75c29450Johann total_weight += prior_key_frame_weight[i]; 131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13121b362b15af34006e6a11974088a46d42b903418eJohann 13137bc9febe8749e98a3812a0dc4380ceae75c29450Johann av_key_frame_frequency /= total_weight; 13147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 13157bc9febe8749e98a3812a0dc4380ceae75c29450Johann // TODO (marpan): Given the checks above, |av_key_frame_frequency| 13167bc9febe8749e98a3812a0dc4380ceae75c29450Johann // should always be above 0. But for now we keep the sanity check in. 13177bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (av_key_frame_frequency == 0) av_key_frame_frequency = 1; 13187bc9febe8749e98a3812a0dc4380ceae75c29450Johann return av_key_frame_frequency; 13197bc9febe8749e98a3812a0dc4380ceae75c29450Johann} 13201b362b15af34006e6a11974088a46d42b903418eJohann 13217bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_adjust_key_frame_context(VP8_COMP *cpi) { 13227bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Clear down mmx registers to allow floating point in what follows */ 13237bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_clear_system_state(); 13247bc9febe8749e98a3812a0dc4380ceae75c29450Johann 13257bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Do we have any key frame overspend to recover? */ 13267bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Two-pass overspend handled elsewhere. */ 13277bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((cpi->pass != 2) && 13287bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->projected_frame_size > cpi->per_frame_bandwidth)) { 13297bc9febe8749e98a3812a0dc4380ceae75c29450Johann int overspend; 13307bc9febe8749e98a3812a0dc4380ceae75c29450Johann 13317bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Update the count of key frame overspend to be recovered in 13327bc9febe8749e98a3812a0dc4380ceae75c29450Johann * subsequent frames. A portion of the KF overspend is treated as gf 13337bc9febe8749e98a3812a0dc4380ceae75c29450Johann * overspend (and hence recovered more quickly) as the kf is also a 13347bc9febe8749e98a3812a0dc4380ceae75c29450Johann * gf. Otherwise the few frames following each kf tend to get more 13357bc9febe8749e98a3812a0dc4380ceae75c29450Johann * bits allocated than those following other gfs. 13367bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 13377bc9febe8749e98a3812a0dc4380ceae75c29450Johann overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth); 13381b362b15af34006e6a11974088a46d42b903418eJohann 13397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers > 1) { 13407bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->kf_overspend_bits += overspend; 13417bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13427bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->kf_overspend_bits += overspend * 7 / 8; 13437bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->gf_overspend_bits += overspend * 1 / 8; 134490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 134590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13467bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Work out how much to try and recover per frame. */ 13477bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->kf_bitrate_adjustment = 13487bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->kf_overspend_bits / estimate_keyframe_frequency(cpi); 13497bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 135090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13517bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->frames_since_key = 0; 13527bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->key_frame_count++; 13537bc9febe8749e98a3812a0dc4380ceae75c29450Johann} 13541b362b15af34006e6a11974088a46d42b903418eJohann 13557bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, 13567bc9febe8749e98a3812a0dc4380ceae75c29450Johann int *frame_over_shoot_limit) { 13577bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set-up bounds on acceptable frame size: */ 13587bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.fixed_q >= 0) { 13597bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Fixed Q scenario: frame size never outranges target 13607bc9febe8749e98a3812a0dc4380ceae75c29450Johann * (there is no target!) 13617bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 13627bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = 0; 13637bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = INT_MAX; 13647bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13657bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->common.frame_type == KEY_FRAME) { 13667bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8; 13677bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8; 13687bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13697bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.number_of_layers > 1 || cpi->common.refresh_alt_ref_frame || 13707bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->common.refresh_golden_frame) { 13717bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8; 13727bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8; 13737bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13747bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For CBR take buffer fullness into account */ 13757bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) { 13767bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + 13777bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->oxcf.maximum_buffer_size) >> 13787bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1)) { 13797bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Buffer is too full so relax overshoot and tighten 13807bc9febe8749e98a3812a0dc4380ceae75c29450Johann * undershoot 13817bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 13827bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 12 / 8; 13837bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8; 13847bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (cpi->buffer_level <= 13857bc9febe8749e98a3812a0dc4380ceae75c29450Johann (cpi->oxcf.optimal_buffer_level >> 1)) { 13867bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Buffer is too low so relax undershoot and tighten 13877bc9febe8749e98a3812a0dc4380ceae75c29450Johann * overshoot 13887bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 13897bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 10 / 8; 13907bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8; 13917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 13927bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8; 13937bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8; 13947bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 139590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13967bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* VBR and CQ mode */ 13977bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Note that tighter restrictions here can help quality 13987bc9febe8749e98a3812a0dc4380ceae75c29450Johann * but hurt encode speed 13991b362b15af34006e6a11974088a46d42b903418eJohann */ 14007bc9febe8749e98a3812a0dc4380ceae75c29450Johann else { 14017bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Stron overshoot limit for constrained quality */ 14027bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) { 14037bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8; 14047bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8; 14057bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 14067bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8; 14077bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8; 14087bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 14097bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 14107bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 14111b362b15af34006e6a11974088a46d42b903418eJohann } 14121b362b15af34006e6a11974088a46d42b903418eJohann 14137bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For very small rate targets where the fractional adjustment 14147bc9febe8749e98a3812a0dc4380ceae75c29450Johann * (eg * 7/8) may be tiny make sure there is at least a minimum 14157bc9febe8749e98a3812a0dc4380ceae75c29450Johann * range. 14167bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 14177bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_over_shoot_limit += 200; 14187bc9febe8749e98a3812a0dc4380ceae75c29450Johann *frame_under_shoot_limit -= 200; 14197bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (*frame_under_shoot_limit < 0) *frame_under_shoot_limit = 0; 14207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 14217bc9febe8749e98a3812a0dc4380ceae75c29450Johann} 14221b362b15af34006e6a11974088a46d42b903418eJohann 14231b362b15af34006e6a11974088a46d42b903418eJohann/* return of 0 means drop frame */ 14247bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_pick_frame_size(VP8_COMP *cpi) { 14257bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *cm = &cpi->common; 14261b362b15af34006e6a11974088a46d42b903418eJohann 14277bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cm->frame_type == KEY_FRAME) { 14287bc9febe8749e98a3812a0dc4380ceae75c29450Johann calc_iframe_target_size(cpi); 14297bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 14307bc9febe8749e98a3812a0dc4380ceae75c29450Johann calc_pframe_target_size(cpi); 14311b362b15af34006e6a11974088a46d42b903418eJohann 14327bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Check if we're dropping the frame: */ 14337bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->drop_frame) { 14347bc9febe8749e98a3812a0dc4380ceae75c29450Johann cpi->drop_frame = 0; 14357bc9febe8749e98a3812a0dc4380ceae75c29450Johann return 0; 143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 14387bc9febe8749e98a3812a0dc4380ceae75c29450Johann return 1; 143990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 1440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// If this just encoded frame (mcomp/transform/quant, but before loopfilter and 1441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// pack_bitstream) has large overshoot, and was not being encoded close to the 1442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// max QP, then drop this frame and force next frame to be encoded at max QP. 1443df37111358d02836cb29bbcb9c6e4c95dff90a16Johann// Allow this for screen_content_mode = 2, or if drop frames is allowed. 1444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// TODO(marpan): Should do this exit condition during the encode_frame 1445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// (i.e., halfway during the encoding of the frame) to save cycles. 1446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) { 1447df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int force_drop_overshoot = 0; 1448df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING 1449df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Only check for dropping due to overshoot on the lowest stream. 1450df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // If the lowest stream of the multi-res encoding was dropped due to 1451df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // overshoot, then force dropping on all upper layer streams 1452df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // (mr_encoder_id > 0). 1453df37111358d02836cb29bbcb9c6e4c95dff90a16Johann LOWER_RES_FRAME_INFO *low_res_frame_info = 1454df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info; 1455df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->oxcf.mr_total_resolutions > 1 && cpi->oxcf.mr_encoder_id > 0) { 1456df37111358d02836cb29bbcb9c6e4c95dff90a16Johann force_drop_overshoot = low_res_frame_info->is_frame_dropped_overshoot_maxqp; 1457df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (!force_drop_overshoot) { 1458df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->force_maxqp = 0; 1459df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_last_drop_overshoot++; 1460df37111358d02836cb29bbcb9c6e4c95dff90a16Johann return 0; 1461df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 1462df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 1463df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif 1464df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->common.frame_type != KEY_FRAME && 1465df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (cpi->oxcf.screen_content_mode == 2 || 1466df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (cpi->drop_frames_allowed && 1467df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (force_drop_overshoot || 1468df37111358d02836cb29bbcb9c6e4c95dff90a16Johann (cpi->rate_correction_factor < (4.0f * MIN_BPB_FACTOR) && 1469df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_last_drop_overshoot > (int)cpi->framerate))))) { 1470da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Note: the "projected_frame_size" from encode_frame() only gives estimate 1471da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // of mode/motion vector rate (in non-rd mode): so below we only require 1472da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // that projected_frame_size is somewhat greater than per-frame-bandwidth, 1473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // but add additional condition with high threshold on prediction residual. 1474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 1475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // QP threshold: only allow dropping if we are not close to qp_max. 1476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int thresh_qp = 3 * cpi->worst_quality >> 2; 1477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Rate threshold, in bytes. 1478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3); 1479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Threshold for the average (over all macroblocks) of the pixel-sum 1480df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // residual error over 16x16 block. 1481df37111358d02836cb29bbcb9c6e4c95dff90a16Johann int thresh_pred_err_mb = (200 << 4); 1482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs); 1483df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Reduce/ignore thresh_rate if pred_err_mb much larger than its threshold, 1484df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // give more weight to pred_err metric for overshoot detection. 1485df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->drop_frames_allowed && pred_err_mb > (thresh_pred_err_mb << 4)) 1486df37111358d02836cb29bbcb9c6e4c95dff90a16Johann thresh_rate = thresh_rate >> 3; 1487df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if ((Q < thresh_qp && cpi->projected_frame_size > thresh_rate && 1488df37111358d02836cb29bbcb9c6e4c95dff90a16Johann pred_err_mb > thresh_pred_err_mb) || 1489df37111358d02836cb29bbcb9c6e4c95dff90a16Johann force_drop_overshoot) { 1490df37111358d02836cb29bbcb9c6e4c95dff90a16Johann unsigned int i; 14917bc9febe8749e98a3812a0dc4380ceae75c29450Johann double new_correction_factor; 14922263fc984bdc858ee931d3e35c87c404de923950Johann int target_bits_per_mb; 1493df37111358d02836cb29bbcb9c6e4c95dff90a16Johann const int target_size = cpi->av_per_frame_bandwidth; 1494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian // Flag to indicate we will force next frame to be encoded at max QP. 1495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian cpi->force_maxqp = 1; 14962263fc984bdc858ee931d3e35c87c404de923950Johann // Reset the buffer levels. 14972263fc984bdc858ee931d3e35c87c404de923950Johann cpi->buffer_level = cpi->oxcf.optimal_buffer_level; 14982263fc984bdc858ee931d3e35c87c404de923950Johann cpi->bits_off_target = cpi->oxcf.optimal_buffer_level; 14992263fc984bdc858ee931d3e35c87c404de923950Johann // Compute a new rate correction factor, corresponding to the current 15002263fc984bdc858ee931d3e35c87c404de923950Johann // target frame size and max_QP, and adjust the rate correction factor 15012263fc984bdc858ee931d3e35c87c404de923950Johann // upwards, if needed. 15022263fc984bdc858ee931d3e35c87c404de923950Johann // This is to prevent a bad state where the re-encoded frame at max_QP 15032263fc984bdc858ee931d3e35c87c404de923950Johann // undershoots significantly, and then we end up dropping every other 15042263fc984bdc858ee931d3e35c87c404de923950Johann // frame because the QP/rate_correction_factor may have been too low 15052263fc984bdc858ee931d3e35c87c404de923950Johann // before the drop and then takes too long to come up. 15067bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (target_size >= (INT_MAX >> BPER_MB_NORMBITS)) { 15077bc9febe8749e98a3812a0dc4380ceae75c29450Johann target_bits_per_mb = (target_size / cpi->common.MBs) 15087bc9febe8749e98a3812a0dc4380ceae75c29450Johann << BPER_MB_NORMBITS; 15097bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 15102263fc984bdc858ee931d3e35c87c404de923950Johann target_bits_per_mb = 15112263fc984bdc858ee931d3e35c87c404de923950Johann (target_size << BPER_MB_NORMBITS) / cpi->common.MBs; 15127bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 15132263fc984bdc858ee931d3e35c87c404de923950Johann // Rate correction factor based on target_size_per_mb and max_QP. 15147bc9febe8749e98a3812a0dc4380ceae75c29450Johann new_correction_factor = 15157bc9febe8749e98a3812a0dc4380ceae75c29450Johann (double)target_bits_per_mb / 15162263fc984bdc858ee931d3e35c87c404de923950Johann (double)vp8_bits_per_mb[INTER_FRAME][cpi->worst_quality]; 15177bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (new_correction_factor > cpi->rate_correction_factor) { 15182263fc984bdc858ee931d3e35c87c404de923950Johann cpi->rate_correction_factor = 15192263fc984bdc858ee931d3e35c87c404de923950Johann VPXMIN(2.0 * cpi->rate_correction_factor, new_correction_factor); 15207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 15217bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (cpi->rate_correction_factor > MAX_BPB_FACTOR) { 15222263fc984bdc858ee931d3e35c87c404de923950Johann cpi->rate_correction_factor = MAX_BPB_FACTOR; 15237bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1524df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Drop this frame: update frame counters. 1525df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->common.current_video_frame++; 1526df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_key++; 1527df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->temporal_pattern_counter++; 1528df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_last_drop_overshoot = 0; 1529df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->oxcf.number_of_layers > 1) { 1530df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // Set max_qp and rate correction for all temporal layers if overshoot 1531df37111358d02836cb29bbcb9c6e4c95dff90a16Johann // is detected. 1532df37111358d02836cb29bbcb9c6e4c95dff90a16Johann for (i = 0; i < cpi->oxcf.number_of_layers; ++i) { 1533df37111358d02836cb29bbcb9c6e4c95dff90a16Johann LAYER_CONTEXT *lc = &cpi->layer_context[i]; 1534df37111358d02836cb29bbcb9c6e4c95dff90a16Johann lc->force_maxqp = 1; 1535df37111358d02836cb29bbcb9c6e4c95dff90a16Johann lc->frames_since_last_drop_overshoot = 0; 1536df37111358d02836cb29bbcb9c6e4c95dff90a16Johann lc->rate_correction_factor = cpi->rate_correction_factor; 1537df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 1538df37111358d02836cb29bbcb9c6e4c95dff90a16Johann } 1539df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING 1540df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->oxcf.mr_total_resolutions > 1) 1541df37111358d02836cb29bbcb9c6e4c95dff90a16Johann low_res_frame_info->is_frame_dropped_overshoot_maxqp = 1; 1542df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif 1543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return 1; 1544da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1545da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian cpi->force_maxqp = 0; 1546df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_last_drop_overshoot++; 1547df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING 1548df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->oxcf.mr_total_resolutions > 1) 1549df37111358d02836cb29bbcb9c6e4c95dff90a16Johann low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0; 1550df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif 1551da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return 0; 1552da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian } 1553da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian cpi->force_maxqp = 0; 1554df37111358d02836cb29bbcb9c6e4c95dff90a16Johann cpi->frames_since_last_drop_overshoot++; 1555df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING 1556df37111358d02836cb29bbcb9c6e4c95dff90a16Johann if (cpi->oxcf.mr_total_resolutions > 1) 1557df37111358d02836cb29bbcb9c6e4c95dff90a16Johann low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0; 1558df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif 1559da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian return 0; 1560da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} 1561