Coverage Report

Created: 2025-07-23 08:18

/src/x265/source/encoder/ratecontrol.cpp
Line
Count
Source (jump to first uncovered line)
1
/*****************************************************************************
2
 * Copyright (C) 2013-2020 MulticoreWare, Inc
3
 *
4
 * Authors: Sumalatha Polureddy <sumalatha@multicorewareinc.com>
5
 *          Aarthi Priya Thirumalai <aarthi@multicorewareinc.com>
6
 *          Xun Xu, PPLive Corporation <xunxu@pptv.com>
7
 *
8
 * This program is free software; you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation; either version 2 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21
 *
22
 * This program is also available under a commercial proprietary license.
23
 * For more information, contact us at license @ x265.com.
24
 *****************************************************************************/
25
26
#if _MSC_VER
27
#pragma warning(disable: 4127) // conditional expression is constant, yes I know
28
#endif
29
30
#include "common.h"
31
#include "param.h"
32
#include "frame.h"
33
#include "framedata.h"
34
#include "picyuv.h"
35
36
#include "encoder.h"
37
#include "slicetype.h"
38
#include "ratecontrol.h"
39
#include "sei.h"
40
41
0
#define BR_SHIFT  6
42
0
#define CPB_SHIFT 4
43
44
0
#define SHARED_DATA_ALIGNMENT      4 ///< 4btye, 32bit
45
0
#define CUTREE_SHARED_MEM_NAME     "cutree"
46
0
#define GOP_CNT_CU_TREE            3
47
48
using namespace X265_NS;
49
50
/* Amortize the partial cost of I frames over the next N frames */
51
52
const int RateControl::s_slidingWindowFrames = 20;
53
const char *RateControl::s_defaultStatFileName = "x265_2pass.log";
54
55
namespace {
56
0
#define CMP_OPT_FIRST_PASS(opt, param_val)\
57
0
{\
58
0
    bErr = 0;\
59
0
    p = strstr(opts, opt "=");\
60
0
    char* q = strstr(opts, "no-" opt " ");\
61
0
    if (p && sscanf(p, opt "=%d" , &i) && param_val != i)\
62
0
        bErr = 1;\
63
0
    else if (!param_val && !q && !p)\
64
0
        bErr = 1;\
65
0
    else if (param_val && (q || !strstr(opts, opt)))\
66
0
        bErr = 1;\
67
0
    if (bErr)\
68
0
    {\
69
0
        x265_log(m_param, X265_LOG_ERROR, "different " opt " setting than first pass (%d vs %d)\n", param_val, i);\
70
0
        return false;\
71
0
    }\
72
0
}
73
74
inline int calcScale(uint32_t x)
75
0
{
76
0
    static uint8_t lut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
77
0
    int y, z = (((x & 0xffff) - 1) >> 27) & 16;
78
0
    x >>= z;
79
0
    z += y = (((x & 0xff) - 1) >> 28) & 8;
80
0
    x >>= y;
81
0
    z += y = (((x & 0xf) - 1) >> 29) & 4;
82
0
    x >>= y;
83
0
    return z + lut[x&0xf];
84
0
}
85
86
inline int calcLength(uint32_t x)
87
0
{
88
0
    static uint8_t lut[16] = {4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0};
89
0
    int y, z = (((x >> 16) - 1) >> 27) & 16;
90
0
    x >>= z ^ 16;
91
0
    z += y = ((x - 0x100) >> 28) & 8;
92
0
    x >>= y ^ 8;
93
0
    z += y = ((x - 0x10) >> 29) & 4;
94
0
    x >>= y ^ 4;
95
0
    return z + lut[x];
96
0
}
97
98
inline char *strcatFilename(const char *input, const char *suffix)
99
0
{
100
0
    char *output = X265_MALLOC(char, strlen(input) + strlen(suffix) + 1);
101
0
    if (!output)
102
0
    {
103
0
        x265_log(NULL, X265_LOG_ERROR, "unable to allocate memory for filename\n");
104
0
        return NULL;
105
0
    }
106
0
    strcpy(output, input);
107
0
    strcat(output, suffix);
108
0
    return output;
109
0
}
110
111
typedef struct CUTreeSharedDataItem
112
{
113
    uint8_t  *type;
114
    uint16_t *stats;
115
}CUTreeSharedDataItem;
116
117
void static ReadSharedCUTreeData(void *dst, void *src, int32_t size)
118
0
{
119
0
    CUTreeSharedDataItem *statsDst = reinterpret_cast<CUTreeSharedDataItem *>(dst);
120
0
    uint8_t *typeSrc = reinterpret_cast<uint8_t *>(src);
121
0
    *statsDst->type = *typeSrc;
122
123
    ///< for memory alignment, the type will take 32bit in the shared memory
124
0
    int32_t offset = (sizeof(*statsDst->type) + SHARED_DATA_ALIGNMENT - 1) & ~(SHARED_DATA_ALIGNMENT - 1);
125
0
    uint16_t *statsSrc = reinterpret_cast<uint16_t *>(typeSrc + offset);
126
0
    memcpy(statsDst->stats, statsSrc, size - offset);
127
0
}
128
129
void static WriteSharedCUTreeData(void *dst, void *src, int32_t size)
130
0
{
131
0
    CUTreeSharedDataItem *statsSrc = reinterpret_cast<CUTreeSharedDataItem *>(src);
132
0
    uint8_t *typeDst = reinterpret_cast<uint8_t *>(dst);
133
0
    *typeDst = *statsSrc->type;
134
135
    ///< for memory alignment, the type will take 32bit in the shared memory
136
0
    int32_t offset = (sizeof(*statsSrc->type) + SHARED_DATA_ALIGNMENT - 1) & ~(SHARED_DATA_ALIGNMENT - 1);
137
0
    uint16_t *statsDst = reinterpret_cast<uint16_t *>(typeDst + offset);
138
0
    memcpy(statsDst, statsSrc->stats, size - offset);
139
0
}
140
141
142
inline double qScale2bits(RateControlEntry *rce, double qScale)
143
0
{
144
0
    if (qScale < 0.1)
145
0
        qScale = 0.1;
146
0
    return (rce->coeffBits + .1) * pow(rce->qScale / qScale, 1.1)
147
0
           + rce->mvBits * pow(X265_MAX(rce->qScale, 1) / X265_MAX(qScale, 1), 0.5)
148
0
           + rce->miscBits;
149
0
}
150
151
inline void copyRceData(RateControlEntry* rce, RateControlEntry* rce2Pass)
152
0
{
153
0
    rce->coeffBits = rce2Pass->coeffBits;
154
0
    rce->mvBits = rce2Pass->mvBits;
155
0
    rce->miscBits = rce2Pass->miscBits;
156
0
    rce->iCuCount = rce2Pass->iCuCount;
157
0
    rce->pCuCount = rce2Pass->pCuCount;
158
0
    rce->skipCuCount = rce2Pass->skipCuCount;
159
0
    rce->keptAsRef = rce2Pass->keptAsRef;
160
0
    rce->qScale = rce2Pass->qScale;
161
0
    rce->newQScale = rce2Pass->newQScale;
162
0
    rce->expectedBits = rce2Pass->expectedBits;
163
0
    rce->expectedVbv = rce2Pass->expectedVbv;
164
0
    rce->blurredComplexity = rce2Pass->blurredComplexity;
165
0
    rce->sliceType = rce2Pass->sliceType;
166
0
    rce->qpNoVbv = rce2Pass->qpNoVbv;
167
0
    rce->newQp = rce2Pass->newQp;
168
0
    rce->qRceq = rce2Pass->qRceq;
169
0
}
170
171
}  // end anonymous namespace
172
/* Returns the zone for the current frame */
173
x265_zone* RateControl::getZone()
174
0
{
175
0
    for (int i = m_param->rc.zoneCount - 1; i >= 0; i--)
176
0
    {
177
0
        x265_zone *z = &m_param->rc.zones[i];
178
0
        if (m_framesDone + 1 >= z->startFrame && m_framesDone < z->endFrame)
179
0
            return z;
180
0
    }
181
0
    return NULL;
182
0
}
183
184
RateControl::RateControl(x265_param& p, Encoder *top)
185
0
{
186
0
    m_param = &p;
187
0
    m_top = top;
188
0
    int lowresCuWidth = ((m_param->sourceWidth / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;
189
0
    int lowresCuHeight = ((m_param->sourceHeight / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;
190
0
    m_ncu = lowresCuWidth * lowresCuHeight;
191
192
0
    m_qCompress = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 1 : m_param->rc.qCompress;
193
194
    // validate for param->rc, maybe it is need to add a function like x265_parameters_valiate()
195
0
    m_zoneBufferIdx = 0;
196
0
    m_residualFrames = 0;
197
0
    m_partialResidualFrames = 0;
198
0
    m_residualCost = 0;
199
0
    m_partialResidualCost = 0;
200
0
    m_rateFactorMaxIncrement = 0;
201
0
    m_rateFactorMaxDecrement = 0;
202
0
    m_fps = (double)m_param->fpsNum / m_param->fpsDenom;
203
0
    m_startEndOrder.set(0);
204
0
    m_bTerminated = false;
205
0
    m_finalFrameCount = 0;
206
0
    m_numEntries = 0;
207
0
    m_isSceneTransition = false;
208
0
    m_lastPredictorReset = 0;
209
0
    m_avgPFrameQp = 0;
210
0
    m_isFirstMiniGop = false;
211
0
    m_lastScenecut = -1;
212
0
    m_lastScenecutAwareIFrame = -1;
213
0
    m_totalFrames = -1;
214
0
    if (m_param->rc.rateControlMode == X265_RC_CRF)
215
0
    {
216
0
        m_param->rc.qp = (int)m_param->rc.rfConstant;
217
0
        m_param->rc.bitrate = 0;
218
219
0
        double baseCplx = m_ncu * (m_param->bframes ? 120 : 80);
220
0
        double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;
221
0
        m_rateFactorConstant = pow(baseCplx, 1 - m_qCompress) /
222
0
            x265_qp2qScale(m_param->rc.rfConstant + mbtree_offset);
223
0
        if (m_param->rc.rfConstantMax)
224
0
        {
225
0
            m_rateFactorMaxIncrement = m_param->rc.rfConstantMax - m_param->rc.rfConstant;
226
0
            if (m_rateFactorMaxIncrement <= 0)
227
0
            {
228
0
                x265_log(m_param, X265_LOG_WARNING, "CRF max must be greater than CRF\n");
229
0
                m_rateFactorMaxIncrement = 0;
230
0
            }
231
0
        }
232
0
        if (m_param->rc.rfConstantMin)
233
0
            m_rateFactorMaxDecrement = m_param->rc.rfConstant - m_param->rc.rfConstantMin;
234
0
    }
235
0
    m_isAbr = m_param->rc.rateControlMode != X265_RC_CQP && !m_param->rc.bStatRead;
236
0
    m_2pass = m_param->rc.rateControlMode != X265_RC_CQP && m_param->rc.bStatRead;
237
0
    m_bitrate = m_param->rc.bitrate * 1000;
238
0
    m_frameDuration = (double)m_param->fpsDenom / m_param->fpsNum;
239
0
    m_qp = m_param->rc.qp;
240
0
    m_lastRceq = 1; /* handles the cmplxrsum when the previous frame cost is zero */
241
0
    m_shortTermCplxSum = 0;
242
0
    m_shortTermCplxCount = 0;
243
0
    m_lastNonBPictType = I_SLICE;
244
0
    m_isAbrReset = false;
245
0
    m_lastAbrResetPoc = -1;
246
0
    m_statFileOut = NULL;
247
0
    m_cutreeStatFileOut = m_cutreeStatFileIn = NULL;
248
0
    m_cutreeShrMem = NULL;
249
0
    m_rce2Pass = NULL;
250
0
    m_encOrder = NULL;
251
0
    m_lastBsliceSatdCost = 0;
252
0
    m_movingAvgSum = 0.0;
253
0
    m_isNextGop = false;
254
0
    m_relativeComplexity = NULL;
255
256
    // vbv initialization
257
0
    m_param->rc.vbvBufferSize = x265_clip3(0, 8000000, m_param->rc.vbvBufferSize);
258
0
    m_param->rc.vbvMaxBitrate = x265_clip3(0, 8000000, m_param->rc.vbvMaxBitrate);
259
0
    m_param->rc.vbvBufferInit = x265_clip3(0.0, 8000000.0, m_param->rc.vbvBufferInit);
260
0
    m_param->vbvBufferEnd = x265_clip3(0.0, 8000000.0, m_param->vbvBufferEnd);
261
0
    m_initVbv = false;
262
0
    m_singleFrameVbv = 0;
263
0
    m_rateTolerance = 1.0;
264
0
    m_encodedSegmentBits = 0;
265
0
    m_segDur = 0;
266
267
0
    if (m_param->rc.vbvBufferSize)
268
0
    {
269
0
        if (m_param->rc.rateControlMode == X265_RC_CQP)
270
0
        {
271
0
            x265_log(m_param, X265_LOG_WARNING, "VBV is incompatible with constant QP, ignored.\n");
272
0
            m_param->rc.vbvBufferSize = 0;
273
0
            m_param->rc.vbvMaxBitrate = 0;
274
0
        }
275
0
        else if (m_param->rc.vbvMaxBitrate == 0)
276
0
        {
277
0
            if (m_param->rc.rateControlMode == X265_RC_ABR)
278
0
            {
279
0
                x265_log(m_param, X265_LOG_WARNING, "VBV maxrate unspecified, assuming CBR\n");
280
0
                m_param->rc.vbvMaxBitrate = m_param->rc.bitrate;
281
0
            }
282
0
            else
283
0
            {
284
0
                x265_log(m_param, X265_LOG_WARNING, "VBV bufsize set but maxrate unspecified, ignored\n");
285
0
                m_param->rc.vbvBufferSize = 0;
286
0
            }
287
0
        }
288
0
        else if (m_param->rc.vbvMaxBitrate < m_param->rc.bitrate &&
289
0
                 m_param->rc.rateControlMode == X265_RC_ABR)
290
0
        {
291
0
            x265_log(m_param, X265_LOG_WARNING, "max bitrate less than average bitrate, assuming CBR\n");
292
0
            m_param->rc.bitrate = m_param->rc.vbvMaxBitrate;
293
0
        }
294
0
    }
295
0
    else if (m_param->rc.vbvMaxBitrate)
296
0
    {
297
0
        x265_log(m_param, X265_LOG_WARNING, "VBV maxrate specified, but no bufsize, ignored\n");
298
0
        m_param->rc.vbvMaxBitrate = 0;
299
0
    }
300
0
    m_isVbv = m_param->rc.vbvMaxBitrate > 0 && m_param->rc.vbvBufferSize > 0;
301
0
    if (m_param->vbvBufferEnd && !m_isVbv)
302
0
    {
303
0
        x265_log(m_param, X265_LOG_WARNING, "vbv-end requires VBV parameters, ignored\n");
304
0
        m_param->vbvBufferEnd = 0;
305
0
    }
306
0
    if (m_param->bEmitHRDSEI && !m_isVbv)
307
0
    {
308
0
        x265_log(m_param, X265_LOG_WARNING, "NAL HRD parameters require VBV parameters, ignored\n");
309
0
        m_param->bEmitHRDSEI = 0;
310
0
    }
311
0
    m_isCbr = m_param->rc.rateControlMode == X265_RC_ABR && m_isVbv && m_param->rc.vbvMaxBitrate <= m_param->rc.bitrate;
312
0
    if (m_param->rc.bStrictCbr && !m_isCbr)
313
0
    {
314
0
        x265_log(m_param, X265_LOG_WARNING, "strict CBR set without CBR mode, ignored\n");
315
0
        m_param->rc.bStrictCbr = 0;
316
0
    }
317
0
    if(m_param->rc.bStrictCbr)
318
0
        m_rateTolerance = 0.7;
319
320
0
    m_bframeBits = 0;
321
0
    m_leadingNoBSatd = 0;
322
0
    m_ipOffset = 6.0 * X265_LOG2(m_param->rc.ipFactor);
323
0
    m_pbOffset = 6.0 * X265_LOG2(m_param->rc.pbFactor);
324
325
0
    for (int i = 0; i < QP_MAX_MAX; i++)
326
0
        m_qpToEncodedBits[i] = 0;
327
328
    /* Adjust the first frame in order to stabilize the quality level compared to the rest */
329
0
#define ABR_INIT_QP_MIN (24)
330
0
#define ABR_INIT_QP_MAX (37)
331
0
#define ABR_INIT_QP_GRAIN_MAX (33)
332
0
#define ABR_SCENECUT_INIT_QP_MIN (12)
333
0
#define CRF_INIT_QP (int)m_param->rc.rfConstant
334
0
    for (int i = 0; i < 3; i++)
335
0
    {
336
0
        m_lastQScaleFor[i] = x265_qp2qScale(m_param->rc.rateControlMode == X265_RC_CRF ? CRF_INIT_QP : ABR_INIT_QP_MIN);
337
0
        m_lmin[i] = x265_qp2qScale(m_param->rc.qpMin);
338
0
        m_lmax[i] = x265_qp2qScale(m_param->rc.qpMax);
339
0
    }
340
341
0
    if (m_param->rc.rateControlMode == X265_RC_CQP)
342
0
    {
343
0
        if (m_qp && !m_param->bLossless)
344
0
        {
345
0
            m_qpConstant[P_SLICE] = m_qp;
346
0
            m_qpConstant[I_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_qp - m_ipOffset + 0.5));
347
0
            m_qpConstant[B_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_qp + m_pbOffset + 0.5));
348
0
        }
349
0
        else
350
0
        {
351
0
            m_qpConstant[P_SLICE] = m_qpConstant[I_SLICE] = m_qpConstant[B_SLICE] = m_qp;
352
0
        }
353
0
    }
354
355
0
    m_bRcReConfig = false;
356
357
    /* qpstep - value set as encoder specific */
358
0
    m_lstep = pow(2, m_param->rc.qpStep / 6.0);
359
360
0
    for (int i = 0; i < 2; i++)
361
0
        m_cuTreeStats.qpBuffer[i] = NULL;
362
0
}
363
364
bool RateControl::initCUTreeSharedMem()
365
0
{
366
0
    if (!m_cutreeShrMem) {
367
0
        m_cutreeShrMem = new RingMem();
368
0
        if (!m_cutreeShrMem)
369
0
        {
370
0
            return false;
371
0
        }
372
373
        ///< now cutree data form at most 3 gops would be stored in the shared memory at the same time
374
0
        int32_t itemSize = (sizeof(uint8_t) + SHARED_DATA_ALIGNMENT - 1) & ~(SHARED_DATA_ALIGNMENT - 1);
375
0
        if (m_param->rc.qgSize == 8)
376
0
        {
377
0
            itemSize += sizeof(uint16_t) * m_ncu * 4;
378
0
        }
379
0
        else
380
0
        {
381
0
            itemSize += sizeof(uint16_t) * m_ncu;
382
0
        }
383
384
0
        int32_t itemCnt = X265_MIN(m_param->keyframeMax, (int)(m_fps + 0.5));
385
0
        itemCnt *= GOP_CNT_CU_TREE;
386
387
0
        char shrname[MAX_SHR_NAME_LEN] = { 0 };
388
0
        strcpy(shrname, m_param->rc.sharedMemName);
389
0
        strcat(shrname, CUTREE_SHARED_MEM_NAME);
390
391
0
        if (!m_cutreeShrMem->init(itemSize, itemCnt, shrname))
392
0
        {
393
0
            return false;
394
0
        }
395
0
    }
396
397
0
    return true;
398
0
}
399
400
void RateControl::initVBV(const SPS& sps)
401
0
{
402
    /* We don't support changing the ABR bitrate right now,
403
 * so if the stream starts as CBR, keep it CBR. */
404
0
    if (m_param->rc.vbvBufferSize < (int)(m_param->rc.vbvMaxBitrate / m_fps))
405
0
    {
406
0
        m_param->rc.vbvBufferSize = (int)(m_param->rc.vbvMaxBitrate / m_fps);
407
0
        x265_log(m_param, X265_LOG_WARNING, "VBV buffer size cannot be smaller than one frame, using %d kbit\n",
408
0
            m_param->rc.vbvBufferSize);
409
0
    }
410
0
    int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
411
0
    int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
412
413
0
    if (m_param->bEmitHRDSEI && !m_param->decoderVbvMaxRate)
414
0
    {
415
0
        const HRDInfo* hrd = &sps.vuiParameters.hrdParameters;
416
0
        vbvBufferSize = hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
417
0
        vbvMaxBitrate = hrd->bitRateValue << (hrd->bitRateScale + BR_SHIFT);
418
0
    }
419
0
    m_bufferRate = vbvMaxBitrate / m_fps;
420
0
    m_vbvMaxRate = vbvMaxBitrate;
421
0
    m_bufferSize = vbvBufferSize;
422
0
    m_singleFrameVbv = m_bufferRate * 1.1 > m_bufferSize;
423
424
0
    if (m_param->rc.vbvBufferInit > 1.)
425
0
        m_param->rc.vbvBufferInit = x265_clip3(0.0, 1.0, m_param->rc.vbvBufferInit / m_param->rc.vbvBufferSize);
426
0
    if (m_param->vbvBufferEnd > 1.)
427
0
        m_param->vbvBufferEnd = x265_clip3(0.0, 1.0, m_param->vbvBufferEnd / m_param->rc.vbvBufferSize);
428
0
    if (m_param->vbvEndFrameAdjust > 1.)
429
0
        m_param->vbvEndFrameAdjust = x265_clip3(0.0, 1.0, m_param->vbvEndFrameAdjust);
430
0
    m_param->rc.vbvBufferInit = x265_clip3(0.0, 1.0, X265_MAX(m_param->rc.vbvBufferInit, m_bufferRate / m_bufferSize));
431
0
    m_bufferFillFinal = m_bufferSize * m_param->rc.vbvBufferInit;
432
0
    m_bufferFillActual = m_bufferFillFinal;
433
0
    m_bufferExcess = 0;
434
0
    m_minBufferFill = m_param->minVbvFullness / 100;
435
0
    m_maxBufferFill = 1 - (m_param->maxVbvFullness / 100);
436
0
    m_initVbv = true;
437
0
}
438
439
bool RateControl::init(const SPS& sps)
440
0
{
441
0
    if (m_isVbv && !m_initVbv)
442
0
        initVBV(sps);
443
444
0
    if (!m_param->bResetZoneConfig && (m_relativeComplexity == NULL))
445
0
    {
446
0
        m_relativeComplexity = X265_MALLOC(double, m_param->reconfigWindowSize);
447
0
        if (m_relativeComplexity == NULL)
448
0
        {
449
0
            x265_log(m_param, X265_LOG_ERROR, "Failed to allocate memory for m_relativeComplexity\n");
450
0
            return false;
451
0
        }
452
0
    }
453
454
0
    m_totalBits = 0;
455
0
    m_encodedBits = 0;
456
0
    m_encodedSegmentBits = 0;
457
0
    m_framesDone = 0;
458
0
    m_segDur = 0;
459
0
    m_residualCost = 0;
460
0
    m_partialResidualCost = 0;
461
0
    m_amortizeFraction = 0.85;
462
0
    m_amortizeFrames = 75;
463
0
    m_bRcReConfig = false;
464
0
    if (m_param->totalFrames && m_param->totalFrames <= 2 * m_fps && m_param->rc.bStrictCbr) /* Strict CBR segment encode */
465
0
    {
466
0
        m_amortizeFraction = 0.85;
467
0
        m_amortizeFrames = m_param->totalFrames / 2;
468
0
    }
469
470
0
    for (int i = 0; i < s_slidingWindowFrames; i++)
471
0
    {
472
0
        m_satdCostWindow[i] = 0;
473
0
        m_encodedBitsWindow[i] = 0;
474
0
    }
475
0
    m_sliderPos = 0;
476
0
    m_isPatternPresent = false;
477
0
    m_numBframesInPattern = 0;
478
479
0
    m_isGrainEnabled = false;
480
0
    if(m_param->rc.bEnableGrain) // tune for grainy content OR equal p-b frame sizes
481
0
        m_isGrainEnabled = true;
482
0
    for (int i = 0; i < 3; i++)
483
0
        m_lastQScaleFor[i] = x265_qp2qScale(m_param->rc.rateControlMode == X265_RC_CRF ? CRF_INIT_QP : ABR_INIT_QP_MIN);
484
0
    m_avgPFrameQp = 0 ;
485
486
    /* 720p videos seem to be a good cutoff for cplxrSum */
487
0
    double tuneCplxFactor = (m_ncu > 3600 && m_param->rc.cuTree && !m_param->rc.hevcAq) ? 2.5 : m_param->rc.hevcAq ? 1.5 : m_isGrainEnabled ? 1.9 : 1.0;
488
489
    /* estimated ratio that produces a reasonable QP for the first I-frame */
490
0
    m_cplxrSum = .01 * pow(7.0e5, m_qCompress) * pow(m_ncu, 0.5) * tuneCplxFactor;
491
0
    m_wantedBitsWindow = m_bitrate * m_frameDuration;
492
0
    m_accumPNorm = .01;
493
0
    m_accumPQp = (m_param->rc.rateControlMode == X265_RC_CRF ? CRF_INIT_QP : ABR_INIT_QP_MIN) * m_accumPNorm;
494
495
496
    /* Frame Predictors used in vbv */
497
0
    initFramePredictors();
498
0
    if (!m_statFileOut && (m_param->rc.bStatWrite || m_param->rc.bStatRead))
499
0
    {
500
        /* If the user hasn't defined the stat filename, use the default value */
501
0
        const char *fileName = m_param->rc.statFileName;
502
0
        if (!strlen(fileName))
503
0
            fileName = s_defaultStatFileName;
504
        /* Load stat file and init 2pass algo */
505
0
        if (m_param->rc.bStatRead)
506
0
        {
507
0
            if (X265_SHARE_MODE_FILE == m_param->rc.dataShareMode)
508
0
            {
509
0
                m_expectedBitsSum = 0;
510
0
                char *p, *statsIn, *statsBuf;
511
                /* read 1st pass stats */
512
0
                statsIn = statsBuf = x265_slurp_file(fileName);
513
0
                if (!statsBuf)
514
0
                    return false;
515
0
                if (m_param->rc.cuTree)
516
0
                {
517
0
                    char *tmpFile = strcatFilename(fileName, ".cutree");
518
0
                    if (!tmpFile)
519
0
                        return false;
520
0
                    m_cutreeStatFileIn = x265_fopen(tmpFile, "rb");
521
0
                    X265_FREE(tmpFile);
522
0
                    if (!m_cutreeStatFileIn)
523
0
                    {
524
0
                        x265_log_file(m_param, X265_LOG_ERROR, "can't open stats file %s.cutree\n", fileName);
525
0
                        return false;
526
0
                    }
527
0
                }
528
529
                /* check whether 1st pass options were compatible with current options */
530
0
                if (strncmp(statsBuf, "#options:", 9))
531
0
                {
532
0
                    x265_log(m_param, X265_LOG_ERROR, "options list in stats file not valid\n");
533
0
                    return false;
534
0
                }
535
0
                {
536
0
                    int i, j, m;
537
0
                    uint32_t k, l;
538
0
                    bool bErr = false;
539
0
                    char *opts = statsBuf;
540
0
                    statsIn = strchr(statsBuf, '\n');
541
0
                    if (!statsIn)
542
0
                    {
543
0
                        x265_log(m_param, X265_LOG_ERROR, "Malformed stats file\n");
544
0
                        return false;
545
0
                    }
546
0
                    *statsIn = '\0';
547
0
                    statsIn++;
548
0
                    if ((p = strstr(opts, " input-res=")) == 0 || sscanf(p, " input-res=%dx%d", &i, &j) != 2)
549
0
                    {
550
0
                        x265_log(m_param, X265_LOG_ERROR, "Resolution specified in stats file not valid\n");
551
0
                        return false;
552
0
                    }
553
0
                    if ((p = strstr(opts, " fps=")) == 0 || sscanf(p, " fps=%u/%u", &k, &l) != 2)
554
0
                    {
555
0
                        x265_log(m_param, X265_LOG_ERROR, "fps specified in stats file not valid\n");
556
0
                        return false;
557
0
                    }
558
0
                    if (((p = strstr(opts, " vbv-maxrate=")) == 0 || sscanf(p, " vbv-maxrate=%d", &m) != 1) && m_param->rc.rateControlMode == X265_RC_CRF)
559
0
                    {
560
0
                        x265_log(m_param, X265_LOG_ERROR, "Constant rate-factor is incompatible with 2pass without vbv-maxrate in the previous pass\n");
561
0
                        return false;
562
0
                    }
563
0
                    if (k != m_param->fpsNum || l != m_param->fpsDenom)
564
0
                    {
565
0
                        x265_log(m_param, X265_LOG_ERROR, "fps mismatch with 1st pass (%u/%u vs %u/%u)\n",
566
0
                            m_param->fpsNum, m_param->fpsDenom, k, l);
567
0
                        return false;
568
0
                    }
569
0
                    if (m_param->analysisMultiPassRefine)
570
0
                    {
571
0
                        p = strstr(opts, "ref=");
572
0
                        sscanf(p, "ref=%d", &i);
573
0
                        if (i > m_param->maxNumReferences)
574
0
                        {
575
0
                            x265_log(m_param, X265_LOG_ERROR, "maxNumReferences cannot be less than 1st pass (%d vs %d)\n",
576
0
                                i, m_param->maxNumReferences);
577
0
                            return false;
578
0
                        }
579
0
                    }
580
0
                    if (m_param->analysisMultiPassRefine || m_param->analysisMultiPassDistortion)
581
0
                    {
582
0
                        p = strstr(opts, "ctu=");
583
0
                        sscanf(p, "ctu=%u", &k);
584
0
                        if (k != m_param->maxCUSize)
585
0
                        {
586
0
                            x265_log(m_param, X265_LOG_ERROR, "maxCUSize mismatch with 1st pass (%u vs %u)\n",
587
0
                                k, m_param->maxCUSize);
588
0
                            return false;
589
0
                        }
590
0
                    }
591
0
                    CMP_OPT_FIRST_PASS("bitdepth", m_param->internalBitDepth);
592
0
                    CMP_OPT_FIRST_PASS("weightp", m_param->bEnableWeightedPred);
593
0
                    CMP_OPT_FIRST_PASS("bframes", m_param->bframes);
594
0
                    CMP_OPT_FIRST_PASS("b-pyramid", m_param->bBPyramid);
595
0
                    CMP_OPT_FIRST_PASS("open-gop", m_param->bOpenGOP);
596
0
                    CMP_OPT_FIRST_PASS(" keyint", m_param->keyframeMax);
597
0
                    CMP_OPT_FIRST_PASS("scenecut", m_param->scenecutThreshold);
598
0
                    CMP_OPT_FIRST_PASS("intra-refresh", m_param->bIntraRefresh);
599
0
                    CMP_OPT_FIRST_PASS("frame-dup", m_param->bEnableFrameDuplication);
600
0
                    if (m_param->bMultiPassOptRPS)
601
0
                    {
602
0
                        CMP_OPT_FIRST_PASS("multi-pass-opt-rps", m_param->bMultiPassOptRPS);
603
0
                        CMP_OPT_FIRST_PASS("repeat-headers", m_param->bRepeatHeaders);
604
0
                        CMP_OPT_FIRST_PASS("min-keyint", m_param->keyframeMin);
605
0
                    }
606
607
0
                    if ((p = strstr(opts, "b-adapt=")) != 0 && sscanf(p, "b-adapt=%d", &i) && i >= X265_B_ADAPT_NONE && i <= X265_B_ADAPT_TRELLIS)
608
0
                    {
609
0
                        m_param->bFrameAdaptive = i;
610
0
                    }
611
0
                    else if (m_param->bframes)
612
0
                    {
613
0
                        x265_log(m_param, X265_LOG_ERROR, "b-adapt method specified in stats file not valid\n");
614
0
                        return false;
615
0
                    }
616
617
0
                    if ((p = strstr(opts, "rc-lookahead=")) != 0 && sscanf(p, "rc-lookahead=%d", &i))
618
0
                        m_param->lookaheadDepth = i;
619
0
                }
620
                /* find number of pics */
621
0
                p = statsIn;
622
0
                int numEntries;
623
0
                for (numEntries = -1; p; numEntries++)
624
0
                    p = strchr(p + 1, ';');
625
0
                if (!numEntries)
626
0
                {
627
0
                    x265_log(m_param, X265_LOG_ERROR, "empty stats file\n");
628
0
                    return false;
629
0
                }
630
0
                m_numEntries = numEntries;
631
632
0
                if (m_param->totalFrames < m_numEntries && m_param->totalFrames > 0)
633
0
                {
634
0
                    x265_log(m_param, X265_LOG_WARNING, "2nd pass has fewer frames than 1st pass (%d vs %d)\n",
635
0
                        m_param->totalFrames, m_numEntries);
636
0
                }
637
0
                if (m_param->totalFrames > m_numEntries && !m_param->bEnableFrameDuplication)
638
0
                {
639
0
                    x265_log(m_param, X265_LOG_ERROR, "2nd pass has more frames than 1st pass (%d vs %d)\n",
640
0
                        m_param->totalFrames, m_numEntries);
641
0
                    return false;
642
0
                }
643
644
0
                m_rce2Pass = X265_MALLOC(RateControlEntry, m_numEntries);
645
0
                if (!m_rce2Pass)
646
0
                {
647
0
                    x265_log(m_param, X265_LOG_ERROR, "Rce Entries for 2 pass cannot be allocated\n");
648
0
                    return false;
649
0
                }
650
0
                m_encOrder = X265_MALLOC(int, m_numEntries);
651
0
                if (!m_encOrder)
652
0
                {
653
0
                    x265_log(m_param, X265_LOG_ERROR, "Encode order for 2 pass cannot be allocated\n");
654
0
                    return false;
655
0
                }
656
                /* init all to skipped p frames */
657
0
                for (int i = 0; i < m_numEntries; i++)
658
0
                {
659
0
                    RateControlEntry *rce = &m_rce2Pass[i];
660
0
                    rce->sliceType = P_SLICE;
661
0
                    rce->qScale = rce->newQScale = x265_qp2qScale(20);
662
0
                    rce->miscBits = m_ncu + 10;
663
0
                    rce->newQp = 0;
664
0
                }
665
                /* read stats */
666
0
                p = statsIn;
667
0
                for (int i = 0; i < m_numEntries; i++)
668
0
                {
669
0
                    RateControlEntry *rce, *rcePocOrder;
670
0
                    int frameNumber;
671
0
                    int encodeOrder;
672
0
                    char picType;
673
0
                    int e;
674
0
                    char *next;
675
0
                    double qpRc, qpAq, qNoVbv, qRceq;
676
0
                    next = strstr(p, ";");
677
0
                    if (next)
678
0
                        *next++ = 0;
679
0
                    e = sscanf(p, " in:%d out:%d", &frameNumber, &encodeOrder);
680
0
                    if (frameNumber < 0 || frameNumber >= m_numEntries)
681
0
                    {
682
0
                        x265_log(m_param, X265_LOG_ERROR, "bad frame number (%d) at stats line %d\n", frameNumber, i);
683
0
                        return false;
684
0
                    }
685
0
                    rce = &m_rce2Pass[encodeOrder];
686
0
                    rcePocOrder = &m_rce2Pass[frameNumber];
687
0
                    m_encOrder[frameNumber] = encodeOrder;
688
0
                    if (!m_param->bMultiPassOptRPS)
689
0
                    {
690
0
                        int scenecut = 0;
691
0
                        e += sscanf(p, " in:%*d out:%*d type:%c q:%lf q-aq:%lf q-noVbv:%lf q-Rceq:%lf tex:%d mv:%d misc:%d icu:%lf pcu:%lf scu:%lf sc:%d",
692
0
                            &picType, &qpRc, &qpAq, &qNoVbv, &qRceq, &rce->coeffBits,
693
0
                            &rce->mvBits, &rce->miscBits, &rce->iCuCount, &rce->pCuCount,
694
0
                            &rce->skipCuCount, &scenecut);
695
0
                        rcePocOrder->scenecut = scenecut != 0;
696
0
                    }
697
0
                    else
698
0
                    {
699
0
                        char deltaPOC[128];
700
0
                        char bUsed[40];
701
0
                        memset(deltaPOC, 0, sizeof(deltaPOC));
702
0
                        memset(bUsed, 0, sizeof(bUsed));
703
0
                        e += sscanf(p, " in:%*d out:%*d type:%c q:%lf q-aq:%lf q-noVbv:%lf q-Rceq:%lf tex:%d mv:%d misc:%d icu:%lf pcu:%lf scu:%lf nump:%d numnegp:%d numposp:%d deltapoc:%127s bused:%39s",
704
0
                            &picType, &qpRc, &qpAq, &qNoVbv, &qRceq, &rce->coeffBits,
705
0
                            &rce->mvBits, &rce->miscBits, &rce->iCuCount, &rce->pCuCount,
706
0
                            &rce->skipCuCount, &rce->rpsData.numberOfPictures, &rce->rpsData.numberOfNegativePictures, &rce->rpsData.numberOfPositivePictures, deltaPOC, bUsed);
707
0
                        splitdeltaPOC(deltaPOC, rce);
708
0
                        splitbUsed(bUsed, rce);
709
0
                        rce->rpsIdx = -1;
710
0
                    }
711
0
                    rce->keptAsRef = true;
712
0
                    rce->isIdr = false;
713
0
                    if (picType == 'b' || picType == 'p')
714
0
                        rce->keptAsRef = false;
715
0
                    if (picType == 'I')
716
0
                        rce->isIdr = true;
717
0
                    if (picType == 'I' || picType == 'i')
718
0
                        rce->sliceType = I_SLICE;
719
0
                    else if (picType == 'P' || picType == 'p')
720
0
                        rce->sliceType = P_SLICE;
721
0
                    else if (picType == 'B' || picType == 'b')
722
0
                        rce->sliceType = B_SLICE;
723
0
                    else
724
0
                        e = -1;
725
0
                    if (e < 10)
726
0
                    {
727
0
                        x265_log(m_param, X265_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e);
728
0
                        return false;
729
0
                    }
730
0
                    rce->qScale = rce->newQScale = x265_qp2qScale(qpRc);
731
0
                    rce->qpNoVbv = qNoVbv;
732
0
                    rce->qpaRc = qpRc;
733
0
                    rce->qpAq = qpAq;
734
0
                    rce->qRceq = qRceq;
735
0
                    p = next;
736
0
                }
737
0
                X265_FREE(statsBuf);
738
0
                if (m_param->rc.rateControlMode != X265_RC_CQP)
739
0
                {
740
0
                    m_start = 0;
741
0
                    m_isQpModified = true;
742
0
                    if (!initPass2())
743
0
                        return false;
744
0
                } /* else we're using constant quant, so no need to run the bitrate allocation */
745
0
            }
746
0
            else // X265_SHARE_MODE_SHAREDMEM == m_param->rc.dataShareMode
747
0
            {
748
0
                if (m_param->rc.cuTree)
749
0
                {
750
0
                    if (!initCUTreeSharedMem())
751
0
                    {
752
0
                        return false;
753
0
                    }
754
0
                }
755
0
            }
756
0
        }
757
        /* Open output file */
758
        /* If input and output files are the same, output to a temp file
759
         * and move it to the real name only when it's complete */
760
0
        if (m_param->rc.bStatWrite)
761
0
        {
762
0
            char *p, *statFileTmpname;
763
0
            statFileTmpname = strcatFilename(fileName, ".temp");
764
0
            if (!statFileTmpname)
765
0
                return false;
766
0
            m_statFileOut = x265_fopen(statFileTmpname, "wb");
767
0
            X265_FREE(statFileTmpname);
768
0
            if (!m_statFileOut)
769
0
            {
770
0
                x265_log_file(m_param, X265_LOG_ERROR, "can't open stats file %s.temp\n", fileName);
771
0
                return false;
772
0
            }
773
0
            p = x265_param2string(m_param, sps.conformanceWindow.rightOffset, sps.conformanceWindow.bottomOffset);
774
0
            if (p)
775
0
                fprintf(m_statFileOut, "#options: %s\n", p);
776
0
            X265_FREE(p);
777
0
            if (m_param->rc.cuTree && !m_param->rc.bStatRead)
778
0
            {
779
0
                if (X265_SHARE_MODE_FILE == m_param->rc.dataShareMode)
780
0
                {
781
0
                    statFileTmpname = strcatFilename(fileName, ".cutree.temp");
782
0
                    if (!statFileTmpname)
783
0
                        return false;
784
0
                    m_cutreeStatFileOut = x265_fopen(statFileTmpname, "wb");
785
0
                    X265_FREE(statFileTmpname);
786
0
                    if (!m_cutreeStatFileOut)
787
0
                    {
788
0
                        x265_log_file(m_param, X265_LOG_ERROR, "can't open mbtree stats file %s.cutree.temp\n", fileName);
789
0
                        return false;
790
0
                    }
791
0
                }
792
0
                else // X265_SHARE_MODE_SHAREDMEM == m_param->rc.dataShareMode
793
0
                {
794
0
                    if (!initCUTreeSharedMem())
795
0
                    {
796
0
                        return false;
797
0
                    }
798
0
                }
799
0
            }
800
0
        }
801
0
        if (m_param->rc.cuTree && !m_cuTreeStats.qpBuffer[0])
802
0
        {
803
0
            if (m_param->rc.qgSize == 8)
804
0
            {
805
0
                m_cuTreeStats.qpBuffer[0] = X265_MALLOC(uint16_t, m_ncu * 4 * sizeof(uint16_t));
806
0
                if (m_param->bBPyramid && m_param->rc.bStatRead)
807
0
                    m_cuTreeStats.qpBuffer[1] = X265_MALLOC(uint16_t, m_ncu * 4 * sizeof(uint16_t));
808
0
            }
809
0
            else
810
0
            {
811
0
                m_cuTreeStats.qpBuffer[0] = X265_MALLOC(uint16_t, m_ncu * sizeof(uint16_t));
812
0
                if (m_param->bBPyramid && m_param->rc.bStatRead)
813
0
                    m_cuTreeStats.qpBuffer[1] = X265_MALLOC(uint16_t, m_ncu * sizeof(uint16_t));
814
0
            }
815
0
            m_cuTreeStats.qpBufPos = -1;
816
0
        }
817
0
    }
818
0
    return true;
819
0
}
820
821
void RateControl::skipCUTreeSharedMemRead(int32_t cnt)
822
0
{
823
0
    m_cutreeShrMem->skipRead(cnt);
824
0
}
825
void RateControl::reconfigureRC()
826
0
{
827
0
    if (m_isVbv)
828
0
    {
829
0
        m_param->rc.vbvBufferSize = x265_clip3(0, 8000000, m_param->rc.vbvBufferSize);
830
0
        m_param->rc.vbvMaxBitrate = x265_clip3(0, 8000000, m_param->rc.vbvMaxBitrate);
831
0
        if (m_param->reconfigWindowSize)
832
0
            m_param->rc.vbvMaxBitrate = (int)(m_param->rc.vbvMaxBitrate * (double)(m_fps / m_param->reconfigWindowSize));
833
0
        if (m_param->rc.vbvMaxBitrate < m_param->rc.bitrate &&
834
0
            m_param->rc.rateControlMode == X265_RC_ABR)
835
0
        {
836
0
            x265_log(m_param, X265_LOG_WARNING, "max bitrate less than average bitrate, assuming CBR\n");
837
0
            m_param->rc.bitrate = m_param->rc.vbvMaxBitrate;
838
0
        }
839
840
0
        if (m_param->rc.vbvBufferSize < (int)(m_param->rc.vbvMaxBitrate / m_fps))
841
0
        {
842
0
            m_param->rc.vbvBufferSize = (int)(m_param->rc.vbvMaxBitrate / m_fps);
843
0
            x265_log(m_param, X265_LOG_WARNING, "VBV buffer size cannot be smaller than one frame, using %d kbit\n",
844
0
                m_param->rc.vbvBufferSize);
845
0
        }
846
0
        int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
847
0
        int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
848
0
        m_bufferRate = vbvMaxBitrate / m_fps;
849
0
        m_vbvMaxRate = vbvMaxBitrate;
850
0
        m_bufferSize = vbvBufferSize;
851
0
        m_singleFrameVbv = m_bufferRate * 1.1 > m_bufferSize;
852
0
    }
853
0
    if (m_param->rc.rateControlMode == X265_RC_CRF)
854
0
    {
855
0
        #define CRF_INIT_QP (int)m_param->rc.rfConstant
856
0
        m_param->rc.bitrate = 0;
857
0
        double baseCplx = m_ncu * (m_param->bframes ? 120 : 80);
858
0
        double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;
859
0
        m_rateFactorConstant = pow(baseCplx, 1 - m_qCompress) /
860
0
            x265_qp2qScale(m_param->rc.rfConstant + mbtree_offset);
861
0
        if (m_param->rc.rfConstantMax)
862
0
        {
863
0
            m_rateFactorMaxIncrement = m_param->rc.rfConstantMax - m_param->rc.rfConstant;
864
0
            if (m_rateFactorMaxIncrement <= 0)
865
0
            {
866
0
                x265_log(m_param, X265_LOG_WARNING, "CRF max must be greater than CRF\n");
867
0
                m_rateFactorMaxIncrement = 0;
868
0
            }
869
0
        }
870
0
        if (m_param->rc.rfConstantMin)
871
0
            m_rateFactorMaxDecrement = m_param->rc.rfConstant - m_param->rc.rfConstantMin;
872
0
    }
873
0
    if (m_param->rc.rateControlMode == X265_RC_CQP)
874
0
    {
875
0
        m_qp = m_param->rc.qp;
876
0
        if (m_qp && !m_param->bLossless)
877
0
        {
878
0
            m_qpConstant[P_SLICE] = m_qp;
879
0
            m_qpConstant[I_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_qp - m_ipOffset + 0.5));
880
0
            m_qpConstant[B_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_qp + m_pbOffset + 0.5));
881
0
        }
882
0
        else
883
0
        {
884
0
            m_qpConstant[P_SLICE] = m_qpConstant[I_SLICE] = m_qpConstant[B_SLICE] = m_qp;
885
0
        }
886
0
    }
887
0
    m_bitrate = (double)m_param->rc.bitrate * 1000;
888
0
}
889
890
void RateControl::initHRD(SPS& sps)
891
0
{
892
0
    int vbvBufferSize = m_param->rc.vbvBufferSize * 1000;
893
0
    int vbvMaxBitrate = m_param->rc.vbvMaxBitrate * 1000;
894
895
    // Init HRD
896
0
    HRDInfo* hrd = &sps.vuiParameters.hrdParameters;
897
0
    hrd->cbrFlag = m_isCbr;
898
0
    if (m_param->reconfigWindowSize) {
899
0
        hrd->cbrFlag = 0;
900
0
        vbvMaxBitrate = m_param->decoderVbvMaxRate * 1000;
901
0
    }
902
903
    // normalize HRD size and rate to the value / scale notation
904
0
    hrd->bitRateScale = x265_clip3(0, 15, calcScale(vbvMaxBitrate) - BR_SHIFT);
905
0
    hrd->bitRateValue = (vbvMaxBitrate >> (hrd->bitRateScale + BR_SHIFT));
906
907
0
    hrd->cpbSizeScale = x265_clip3(0, 15, calcScale(vbvBufferSize) - CPB_SHIFT);
908
0
    hrd->cpbSizeValue = (vbvBufferSize >> (hrd->cpbSizeScale + CPB_SHIFT));
909
0
    int bitRateUnscale = hrd->bitRateValue << (hrd->bitRateScale + BR_SHIFT);
910
0
    int cpbSizeUnscale = hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
911
912
    // arbitrary
913
0
    #define MAX_DURATION 0.5
914
915
0
    TimingInfo *time = &sps.vuiParameters.timingInfo;
916
0
    int maxCpbOutputDelay = (int)(X265_MIN(m_param->keyframeMax * MAX_DURATION * time->timeScale / time->numUnitsInTick, INT_MAX));
917
0
    int maxDpbOutputDelay = (int)(sps.maxDecPicBuffering[sps.maxTempSubLayers - 1] * MAX_DURATION * time->timeScale / time->numUnitsInTick);
918
0
    int maxDelay = (int)(90000.0 * cpbSizeUnscale / bitRateUnscale + 0.5);
919
920
0
    hrd->initialCpbRemovalDelayLength = 2 + x265_clip3(4, 22, 32 - calcLength(maxDelay));
921
0
    hrd->cpbRemovalDelayLength = x265_clip3(4, 31, 32 - calcLength(maxCpbOutputDelay));
922
0
    hrd->dpbOutputDelayLength = x265_clip3(4, 31, 32 - calcLength(maxDpbOutputDelay));
923
924
0
    #undef MAX_DURATION
925
0
}
926
927
bool RateControl::analyseABR2Pass(uint64_t allAvailableBits)
928
0
{
929
0
    double rateFactor, stepMult;
930
0
    double qBlur = m_param->rc.qblur;
931
0
    double cplxBlur = m_param->rc.complexityBlur;
932
0
    const int filterSize = (int)(qBlur * 4) | 1;
933
0
    double expectedBits;
934
0
    double *qScale, *blurredQscale;
935
0
    double baseCplx = m_ncu * (m_param->bframes ? 120 : 80);
936
0
    double clippedDuration = CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION;
937
    /* Blur complexities, to reduce local fluctuation of QP.
938
     * We don't blur the QPs directly, because then one very simple frame
939
     * could drag down the QP of a nearby complex frame and give it more
940
     * bits than intended. */
941
0
    for (int i = 0; i < m_numEntries; i++)
942
0
    {
943
0
        double weightSum = 0;
944
0
        double cplxSum = 0;
945
0
        double weight = 1.0;
946
0
        double gaussianWeight;
947
        /* weighted average of cplx of future frames */
948
0
        for (int j = 1; j < cplxBlur * 2 && j < m_numEntries - i; j++)
949
0
        {
950
0
            int index = i+j;
951
0
            RateControlEntry *rcj = &m_rce2Pass[index];
952
0
            weight *= 1 - pow(rcj->iCuCount / m_ncu, 2);
953
0
            if (weight < 0.0001)
954
0
                break;
955
0
            gaussianWeight = weight * exp(-j * j / 200.0);
956
0
            weightSum += gaussianWeight;
957
0
            cplxSum += gaussianWeight * (qScale2bits(rcj, 1) - rcj->miscBits) / clippedDuration;
958
0
        }
959
        /* weighted average of cplx of past frames */
960
0
        weight = 1.0;
961
0
        for (int j = 0; j <= cplxBlur * 2 && j <= i; j++)
962
0
        {
963
0
            int index = i-j;
964
0
            RateControlEntry *rcj = &m_rce2Pass[index];
965
0
            gaussianWeight = weight * exp(-j * j / 200.0);
966
0
            weightSum += gaussianWeight;
967
0
            cplxSum += gaussianWeight * (qScale2bits(rcj, 1) - rcj->miscBits) / clippedDuration;
968
0
            weight *= 1 - pow(rcj->iCuCount / m_ncu, 2);
969
0
            if (weight < .0001)
970
0
                break;
971
0
        }
972
0
        m_rce2Pass[i].blurredComplexity= cplxSum / weightSum;
973
0
    }
974
0
    CHECKED_MALLOC(qScale, double, m_numEntries);
975
0
    if (filterSize > 1)
976
0
    {
977
0
        CHECKED_MALLOC(blurredQscale, double, m_numEntries);
978
0
    }
979
0
    else
980
0
        blurredQscale = qScale;
981
982
    /* Search for a factor which, when multiplied by the RCEQ values from
983
     * each frame, adds up to the desired total size.
984
     * There is no exact closed-form solution because of VBV constraints and
985
     * because qscale2bits is not invertible, but we can start with the simple
986
     * approximation of scaling the 1st pass by the ratio of bitrates.
987
     * The search range is probably overkill, but speed doesn't matter here. */
988
0
    expectedBits = 1;
989
0
    for (int i = 0; i < m_numEntries; i++)
990
0
    {
991
0
        RateControlEntry* rce = &m_rce2Pass[i];
992
0
        double q = getQScale(rce, 1.0);
993
0
        expectedBits += qScale2bits(rce, q);
994
0
        m_lastQScaleFor[rce->sliceType] = q;
995
0
    }
996
0
    stepMult = allAvailableBits / expectedBits;
997
998
0
    rateFactor = 0;
999
0
    for (double step = 1E4 * stepMult; step > 1E-7 * stepMult; step *= 0.5)
1000
0
    {
1001
0
        expectedBits = 0;
1002
0
        rateFactor += step;
1003
1004
0
        m_lastNonBPictType = -1;
1005
0
        m_lastAccumPNorm = 1;
1006
0
        m_accumPNorm = 0;
1007
1008
0
        m_lastQScaleFor[0] = m_lastQScaleFor[1] =
1009
0
        m_lastQScaleFor[2] = pow(baseCplx, 1 - m_qCompress) / rateFactor;
1010
1011
        /* find qscale */
1012
0
        for (int i = 0; i < m_numEntries; i++)
1013
0
        {
1014
0
            RateControlEntry *rce = &m_rce2Pass[i];
1015
0
            qScale[i] = getQScale(rce, rateFactor);
1016
0
            m_lastQScaleFor[rce->sliceType] = qScale[i];
1017
0
        }
1018
1019
        /* fixed I/B qscale relative to P */
1020
0
        for (int i = 0; i < m_numEntries; i++)
1021
0
        {
1022
0
            qScale[i] = getDiffLimitedQScale(&m_rce2Pass[i], qScale[i]);
1023
0
            X265_CHECK(qScale[i] >= 0, "qScale became negative\n");
1024
0
        }
1025
1026
        /* smooth curve */
1027
0
        if (filterSize > 1)
1028
0
        {
1029
0
            X265_CHECK(filterSize % 2 == 1, "filterSize not an odd number\n");
1030
0
            for (int i = 0; i < m_numEntries; i++)
1031
0
            {
1032
0
                double q = 0.0, sum = 0.0;
1033
0
                for (int j = 0; j < filterSize; j++)
1034
0
                {
1035
0
                    int idx = i + j - filterSize / 2;
1036
0
                    double d = idx - i;
1037
0
                    double coeff = qBlur == 0 ? 1.0 : exp(-d * d / (qBlur * qBlur));
1038
0
                    if (idx < 0 || idx >= m_numEntries)
1039
0
                        continue;
1040
0
                    if (m_rce2Pass[i].sliceType != m_rce2Pass[idx].sliceType)
1041
0
                        continue;
1042
0
                    q += qScale[idx] * coeff;
1043
0
                    sum += coeff;
1044
0
                }
1045
0
                blurredQscale[i] = q / sum;
1046
0
            }
1047
0
        }
1048
1049
        /* find expected bits */
1050
0
        for (int i = 0; i < m_numEntries; i++)
1051
0
        {
1052
0
            RateControlEntry *rce = &m_rce2Pass[i];
1053
0
            rce->newQScale = clipQscale(NULL, rce, blurredQscale[i]); // check if needed
1054
0
            X265_CHECK(rce->newQScale >= 0, "new Qscale is negative\n");
1055
0
            expectedBits += qScale2bits(rce, rce->newQScale);
1056
0
        }
1057
1058
0
        if (expectedBits > allAvailableBits)
1059
0
            rateFactor -= step;
1060
0
    }
1061
1062
0
    X265_FREE(qScale);
1063
0
    if (filterSize > 1)
1064
0
        X265_FREE(blurredQscale);
1065
0
    if (m_isVbv)
1066
0
    if (!vbv2Pass(allAvailableBits, m_numEntries - 1, 0))
1067
0
            return false;
1068
0
    expectedBits = countExpectedBits(0, m_numEntries - 1);
1069
0
    if (fabs(expectedBits / allAvailableBits - 1.0) > 0.01)
1070
0
    {
1071
0
        double avgq = 0;
1072
0
        for (int i = 0; i < m_numEntries; i++)
1073
0
            avgq += m_rce2Pass[i].newQScale;
1074
0
        avgq = x265_qScale2qp(avgq / m_numEntries);
1075
1076
0
        if (expectedBits > allAvailableBits || !m_isVbv)
1077
0
            x265_log(m_param, X265_LOG_WARNING, "Error: 2pass curve failed to converge\n");
1078
0
        x265_log(m_param, X265_LOG_WARNING, "target: %.2f kbit/s, expected: %.2f kbit/s, avg QP: %.4f\n",
1079
0
                 (double)m_param->rc.bitrate,
1080
0
                 expectedBits * m_fps / (m_numEntries * 1000.),
1081
0
                 avgq);
1082
0
        if (expectedBits < allAvailableBits && avgq < m_param->rc.qpMin + 2)
1083
0
        {
1084
0
            if (m_param->rc.qpMin > 0)
1085
0
                x265_log(m_param, X265_LOG_WARNING, "try reducing target bitrate or reducing qp_min (currently %d)\n", m_param->rc.qpMin);
1086
0
            else
1087
0
                x265_log(m_param, X265_LOG_WARNING, "try reducing target bitrate\n");
1088
0
        }
1089
0
        else if (expectedBits > allAvailableBits && avgq > m_param->rc.qpMax - 2)
1090
0
        {
1091
0
            if (m_param->rc.qpMax < QP_MAX_MAX)
1092
0
                x265_log(m_param, X265_LOG_WARNING, "try increasing target bitrate or increasing qp_max (currently %d)\n", m_param->rc.qpMax);
1093
0
            else
1094
0
                x265_log(m_param, X265_LOG_WARNING, "try increasing target bitrate\n");
1095
0
        }
1096
0
        else if (!(m_2pass && m_isVbv))
1097
0
            x265_log(m_param, X265_LOG_WARNING, "internal error\n");
1098
0
    }
1099
1100
0
    return true;
1101
1102
0
fail:
1103
0
    x265_log(m_param, X265_LOG_WARNING, "two-pass ABR initialization failed\n");
1104
0
    return false;
1105
0
}
1106
1107
bool RateControl::initPass2()
1108
0
{
1109
0
    uint64_t allConstBits = 0;
1110
0
    uint64_t allAvailableBits = uint64_t(m_param->rc.bitrate * 1000. * m_numEntries * m_frameDuration);
1111
0
    int startIndex, endIndex;
1112
0
    int fps = X265_MIN(m_param->keyframeMax, (int)(m_fps + 0.5));
1113
0
    int distance = fps << 1;
1114
0
    distance = distance > m_param->keyframeMax ? (m_param->keyframeMax << 1) : m_param->keyframeMax;
1115
0
    startIndex = endIndex = 0;
1116
0
    double targetBits = 0;
1117
0
    double expectedBits = 0;
1118
0
    double targetBits2 = 0;
1119
0
    double expectedBits2 = 0;
1120
0
    double cpxSum = 0;
1121
0
    double cpxSum2 = 0;
1122
1123
0
    if (m_param->rc.rateControlMode == X265_RC_ABR)
1124
0
    {
1125
0
        for (endIndex = m_start; endIndex < m_numEntries; endIndex++)
1126
0
        {
1127
0
            allConstBits += m_rce2Pass[endIndex].miscBits;
1128
0
        }
1129
1130
0
        if (allAvailableBits < allConstBits)
1131
0
        {
1132
0
            x265_log(m_param, X265_LOG_ERROR, "requested bitrate is too low. estimated minimum is %d kbps\n",
1133
0
                (int)(allConstBits * m_fps / (m_numEntries - m_start) * 1000.));
1134
0
            return false;
1135
0
        }
1136
0
        if (!analyseABR2Pass(allAvailableBits))
1137
0
            return false;
1138
1139
0
        return true;
1140
0
    }
1141
1142
0
    if (m_isQpModified)
1143
0
    {
1144
0
        return true;
1145
0
    }
1146
1147
0
    if (m_start + (fps << 1) > m_numEntries)
1148
0
    {
1149
0
        return true;
1150
0
    }
1151
1152
0
    for (startIndex = m_start, endIndex = m_numEntries - 1; startIndex < endIndex; startIndex++, endIndex--)
1153
0
    {
1154
0
        cpxSum += m_rce2Pass[startIndex].qScale / m_rce2Pass[startIndex].coeffBits;
1155
0
        cpxSum2 += m_rce2Pass[endIndex].qScale / m_rce2Pass[endIndex].coeffBits;
1156
1157
0
        RateControlEntry *rce = &m_rce2Pass[startIndex];
1158
0
        targetBits += qScale2bits(rce, x265_qp2qScale(rce->qpNoVbv));
1159
0
        expectedBits += qScale2bits(rce, rce->qScale);
1160
1161
0
        rce = &m_rce2Pass[endIndex];
1162
0
        targetBits2 += qScale2bits(rce, x265_qp2qScale(rce->qpNoVbv));
1163
0
        expectedBits2 += qScale2bits(rce, rce->qScale);
1164
0
    }
1165
1166
0
    if (expectedBits < 0.95 * targetBits || expectedBits2 < 0.95 * targetBits2)
1167
0
    {
1168
0
        if (cpxSum / cpxSum2 < 0.95 || cpxSum2 / cpxSum < 0.95)
1169
0
        {
1170
0
            m_isQpModified = true;
1171
0
            m_isGopReEncoded = true;
1172
1173
0
            m_shortTermCplxSum = 0;
1174
0
            m_shortTermCplxCount = 0;
1175
0
            m_framesDone = m_start;
1176
1177
0
            for (startIndex = m_start; startIndex < m_numEntries; startIndex++)
1178
0
            {
1179
0
                m_shortTermCplxSum *= 0.5;
1180
0
                m_shortTermCplxCount *= 0.5;
1181
0
                m_shortTermCplxSum += m_rce2Pass[startIndex].currentSatd / (CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION);
1182
0
                m_shortTermCplxCount++;
1183
0
            }
1184
1185
0
            m_bufferFill = m_rce2Pass[m_start - 1].bufferFill;
1186
0
            m_bufferFillFinal = m_rce2Pass[m_start - 1].bufferFillFinal;
1187
0
            m_bufferFillActual = m_rce2Pass[m_start - 1].bufferFillActual;
1188
1189
0
            m_reencode = m_start;
1190
0
            m_start = m_numEntries;
1191
0
        }
1192
0
        else
1193
0
        {
1194
1195
0
            m_isQpModified = false;
1196
0
            m_isGopReEncoded = false;
1197
0
        }
1198
0
    }
1199
0
    else
1200
0
    {
1201
1202
0
        m_isQpModified = false;
1203
0
        m_isGopReEncoded = false;
1204
0
    }
1205
1206
0
    m_start = X265_MAX(m_start, m_numEntries - distance + m_param->keyframeMax);
1207
1208
0
    return true;
1209
0
}
1210
1211
bool RateControl::vbv2Pass(uint64_t allAvailableBits, int endPos, int startPos)
1212
0
{
1213
    /* for each interval of bufferFull .. underflow, uniformly increase the qp of all
1214
     * frames in the interval until either buffer is full at some intermediate frame or the
1215
     * last frame in the interval no longer underflows.  Recompute intervals and repeat.
1216
     * Then do the converse to put bits back into overflow areas until target size is met */
1217
1218
0
    double *fills;
1219
0
    double expectedBits = 0;
1220
0
    double adjustment;
1221
0
    double prevBits = 0;
1222
0
    int t0, t1;
1223
0
    double qScaleMin = x265_qp2qScale(m_param->rc.qpMin);
1224
0
    double qScaleMax = x265_qp2qScale(m_param->rc.qpMax);
1225
0
    int adjMin, adjMax;
1226
0
    CHECKED_MALLOC(fills, double, m_numEntries + 1);
1227
0
    fills++;
1228
1229
    /* adjust overall stream size */
1230
0
    do
1231
0
    {
1232
0
        prevBits = expectedBits;
1233
1234
0
        if (expectedBits)
1235
0
        {   /* not first iteration */
1236
0
            adjustment = X265_MAX(X265_MIN(expectedBits / allAvailableBits, 0.999), 0.9);
1237
0
            fills[-1] = m_bufferSize * m_param->rc.vbvBufferInit;
1238
0
            t0 = startPos;
1239
            /* fix overflows */
1240
0
            adjMin = 1;
1241
0
            while (adjMin && findUnderflow(fills, &t0, &t1, 1, endPos))
1242
0
            {
1243
0
                adjMin = fixUnderflow(t0, t1, adjustment, qScaleMin, qScaleMax);
1244
0
                t0 = t1;
1245
0
            }
1246
0
        }
1247
1248
0
        fills[-1] = m_bufferSize * (1. - m_param->rc.vbvBufferInit);
1249
0
        t0 = 0;
1250
        /* fix underflows -- should be done after overflow, as we'd better undersize target than underflowing VBV */
1251
0
        adjMax = 1;
1252
0
        while (adjMax && findUnderflow(fills, &t0, &t1, 0, endPos))
1253
0
            adjMax = fixUnderflow(t0, t1, 1.001, qScaleMin, qScaleMax);
1254
0
        expectedBits = countExpectedBits(startPos, endPos);
1255
0
    }
1256
0
    while ((expectedBits < .995 * allAvailableBits) && ((int64_t)(expectedBits+.5) > (int64_t)(prevBits+.5)) && !(m_param->rc.rateControlMode == X265_RC_CRF));
1257
0
    if (!adjMax)
1258
0
        x265_log(m_param, X265_LOG_WARNING, "vbv-maxrate issue, qpmax or vbv-maxrate too low\n");
1259
    /* store expected vbv filling values for tracking when encoding */
1260
0
    for (int i = startPos; i <= endPos; i++)
1261
0
        m_rce2Pass[i].expectedVbv = m_bufferSize - fills[i];
1262
0
    X265_FREE(fills - 1);
1263
0
    return true;
1264
1265
0
fail:
1266
0
    x265_log(m_param, X265_LOG_ERROR, "malloc failure in two-pass VBV init\n");
1267
0
    return false;
1268
0
}
1269
1270
/* In 2pass, force the same frame types as in the 1st pass */
1271
int RateControl::rateControlSliceType(int frameNum)
1272
0
{
1273
0
    if (m_param->rc.bStatRead)
1274
0
    {
1275
0
        if (frameNum >= m_numEntries)
1276
0
        {
1277
            /* We could try to initialize everything required for ABR and
1278
             * adaptive B-frames, but that would be complicated.
1279
             * So just calculate the average QP used so far. */
1280
0
            m_param->rc.qp = (m_accumPQp < 1) ? ABR_INIT_QP_MAX : (int)(m_accumPQp + 0.5);
1281
0
            m_qpConstant[P_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, m_param->rc.qp);
1282
0
            m_qpConstant[I_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_param->rc.qp - m_ipOffset + 0.5));
1283
0
            m_qpConstant[B_SLICE] = x265_clip3(QP_MIN, QP_MAX_MAX, (int)(m_param->rc.qp + m_pbOffset + 0.5));
1284
1285
0
            x265_log(m_param, X265_LOG_ERROR, "2nd pass has more frames than 1st pass (%d)\n", m_numEntries);
1286
0
            x265_log(m_param, X265_LOG_ERROR, "continuing anyway, at constant QP=%d\n", m_param->rc.qp);
1287
0
            if (m_param->bFrameAdaptive)
1288
0
                x265_log(m_param, X265_LOG_ERROR, "disabling adaptive B-frames\n");
1289
1290
0
            m_isAbr = 0;
1291
0
            m_2pass = 0;
1292
0
            m_param->rc.rateControlMode = X265_RC_CQP;
1293
0
            m_param->rc.bStatRead = 0;
1294
0
            m_param->bFrameAdaptive = 0;
1295
0
            m_param->scenecutThreshold = 0;
1296
0
            m_param->bHistBasedSceneCut = 0;
1297
0
            m_param->rc.cuTree = 0;
1298
0
            if (m_param->bframes > 1)
1299
0
                m_param->bframes = 1;
1300
0
            return X265_TYPE_AUTO;
1301
0
        }
1302
0
        int index = m_encOrder[frameNum];
1303
0
        int frameType = m_rce2Pass[index].sliceType == I_SLICE ? (m_rce2Pass[index].isIdr ? X265_TYPE_IDR : X265_TYPE_I)
1304
0
                        : m_rce2Pass[index].sliceType == P_SLICE ? X265_TYPE_P
1305
0
                        : (m_rce2Pass[index].sliceType == B_SLICE && m_rce2Pass[index].keptAsRef ? X265_TYPE_BREF : X265_TYPE_B);
1306
0
        return frameType;
1307
0
    }
1308
0
    else
1309
0
        return X265_TYPE_AUTO;
1310
0
}
1311
1312
void RateControl::initFramePredictors()
1313
0
{
1314
    /* Frame Predictors used in vbv */
1315
0
    for (int i = 0; i < 4; i++)
1316
0
    {
1317
0
        m_pred[i].coeffMin = 1.0 / 4;
1318
0
        m_pred[i].coeff = 1.0;
1319
0
        m_pred[i].count = 1.0;
1320
0
        m_pred[i].decay = 0.5;
1321
0
        m_pred[i].offset = 0.0;
1322
0
    }
1323
0
    m_pred[0].coeff = m_pred[3].coeff = 0.75;
1324
0
    m_pred[0].coeffMin = m_pred[3].coeffMin = 0.75 / 4;
1325
0
    if (m_isGrainEnabled) // when tuned for grain 
1326
0
    {
1327
0
        m_pred[1].coeffMin = 0.75 / 4;
1328
0
        m_pred[1].coeff = 0.75;
1329
0
        m_pred[0].coeff = m_pred[3].coeff = 0.75;
1330
0
        m_pred[0].coeffMin = m_pred[3].coeffMin = 0.75 / 4;
1331
0
    }
1332
0
}
1333
1334
int RateControl::rateControlStart(Frame* curFrame, RateControlEntry* rce, Encoder* enc)
1335
0
{
1336
0
    int orderValue = m_startEndOrder.get();
1337
0
    int startOrdinal = rce->encodeOrder * 2;
1338
1339
0
    while (orderValue < startOrdinal && !m_bTerminated)
1340
0
        orderValue = m_startEndOrder.waitForChange(orderValue);
1341
1342
0
    if (!curFrame)
1343
0
    {
1344
        // faked rateControlStart calls when the encoder is flushing
1345
0
        m_startEndOrder.incr();
1346
0
        return 0;
1347
0
    }
1348
1349
0
    FrameData& curEncData = *curFrame->m_encData;
1350
0
    m_curSlice = curEncData.m_slice;
1351
0
    m_sliceType = m_curSlice->m_sliceType;
1352
#if ENABLE_SCC_EXT
1353
    if(m_param->bEnableSCC)
1354
        m_sliceType = m_curSlice->m_origSliceType;
1355
#endif
1356
0
    rce->sliceType = m_sliceType;
1357
0
    if (!m_2pass)
1358
0
        rce->keptAsRef = IS_REFERENCED(curFrame);
1359
0
    m_predType = getPredictorType(curFrame->m_lowres.sliceType, m_sliceType);
1360
0
    rce->poc = m_curSlice->m_poc;
1361
1362
0
    if (m_param->bEnableSBRC)
1363
0
    {
1364
0
        if (rce->poc == 0 || (m_framesDone % m_param->keyframeMax == 0))
1365
0
        {
1366
            //Reset SBRC buffer
1367
0
            m_encodedSegmentBits = 0;
1368
0
            m_segDur = 0;
1369
0
        }
1370
0
    }
1371
1372
0
    if (!m_param->bResetZoneConfig && (rce->encodeOrder % m_param->reconfigWindowSize == 0))
1373
0
    {
1374
0
        int index = m_zoneBufferIdx % m_param->rc.zonefileCount;
1375
0
        int read = m_top->zoneReadCount[index].get();
1376
0
        int write = m_top->zoneWriteCount[index].get();
1377
0
        if (write <= read)
1378
0
            write = m_top->zoneWriteCount[index].waitForChange(write);
1379
0
        m_zoneBufferIdx++;
1380
1381
0
        for (int i = 0; i < m_param->rc.zonefileCount; i++)
1382
0
        {
1383
0
            if (m_param->rc.zones[i].startFrame == rce->encodeOrder)
1384
0
            {
1385
0
                m_param->rc.bitrate = m_param->rc.zones[i].zoneParam->rc.bitrate;
1386
0
                m_param->rc.vbvMaxBitrate = m_param->rc.zones[i].zoneParam->rc.vbvMaxBitrate;
1387
0
                memcpy(m_relativeComplexity, m_param->rc.zones[i].relativeComplexity, sizeof(double) * m_param->reconfigWindowSize);
1388
0
                reconfigureRC();
1389
0
                m_isCbr = 1; /* Always vbvmaxrate == bitrate here*/
1390
0
                m_top->zoneReadCount[i].incr();
1391
0
            }
1392
0
        }
1393
0
    }
1394
    
1395
    
1396
0
    if (m_param->bResetZoneConfig)
1397
0
    {
1398
        /* change ratecontrol stats for next zone if specified */
1399
0
        for (int i = 0; i < m_param->rc.zonefileCount; i++)
1400
0
        {
1401
0
            if (m_param->rc.zones[i].startFrame == curFrame->m_encodeOrder)
1402
0
            {
1403
0
                m_param = m_param->rc.zones[i].zoneParam;
1404
0
                reconfigureRC();
1405
0
                if (!m_param->bNoResetZoneConfig)
1406
0
                    init(*m_curSlice->m_sps);
1407
0
            }
1408
0
        }
1409
0
    }
1410
1411
0
    if (m_param->rc.bStatRead)
1412
0
    {
1413
0
        X265_CHECK(rce->poc >= 0 && rce->poc < m_numEntries, "bad encode ordinal\n");
1414
0
        int index = m_encOrder[rce->poc];
1415
0
        copyRceData(rce, &m_rce2Pass[index]);
1416
0
    }
1417
0
    rce->isActive = true;
1418
0
    if (!m_param->rc.bStatRead)
1419
0
        rce->scenecut = false;
1420
0
    rce->isFadeEnd = curFrame->m_lowres.bIsFadeEnd;
1421
0
    bool isRefFrameScenecut = m_sliceType!= I_SLICE && m_curSlice->m_refFrameList[0][0]->m_lowres.bScenecut;
1422
0
    m_isFirstMiniGop = m_sliceType == I_SLICE ? true : m_isFirstMiniGop;
1423
0
    if (curFrame->m_lowres.bScenecut)
1424
0
    {
1425
0
        m_isSceneTransition = true;
1426
0
        rce->scenecut = true;
1427
0
        m_lastPredictorReset = rce->encodeOrder;
1428
1429
0
        initFramePredictors();
1430
0
    }
1431
0
    else if (m_sliceType != B_SLICE && !isRefFrameScenecut)
1432
0
        m_isSceneTransition = false;
1433
1434
0
    if (rce->encodeOrder < m_lastPredictorReset + m_param->frameNumThreads)
1435
0
    {
1436
0
        rce->rowPreds[0][0].count = 0;
1437
0
    }
1438
1439
0
    rce->bLastMiniGopBFrame = curFrame->m_lowres.bLastMiniGopBFrame;
1440
0
    rce->bufferRate = m_bufferRate;
1441
0
    rce->rowCplxrSum = 0.0;
1442
0
    rce->rowTotalBits = 0;
1443
0
    if (m_isVbv)
1444
0
    {
1445
0
        if (rce->rowPreds[0][0].count == 0)
1446
0
        {
1447
0
            for (int i = 0; i < 3; i++)
1448
0
            {
1449
0
                for (int j = 0; j < 2; j++)
1450
0
                {
1451
0
                    rce->rowPreds[i][j].coeffMin = 0.25 / 4;
1452
0
                    rce->rowPreds[i][j].coeff = 0.25;
1453
0
                    rce->rowPreds[i][j].count = 1.0;
1454
0
                    rce->rowPreds[i][j].decay = 0.5;
1455
0
                    rce->rowPreds[i][j].offset = 0.0;
1456
0
                }
1457
0
            }
1458
0
        }
1459
0
        rce->rowPred[0] = &rce->rowPreds[m_sliceType][0];
1460
0
        rce->rowPred[1] = &rce->rowPreds[m_sliceType][1];
1461
0
        m_predictedBits = m_totalBits;
1462
0
        updateVbvPlan(enc);
1463
0
        rce->bufferFill = m_bufferFill;
1464
0
        rce->vbvEndAdj = false;
1465
0
         if (m_param->vbvBufferEnd && ((curFrame->vbvEndFlag) || ((m_param->totalFrames) && (rce->encodeOrder >= (m_param->vbvEndFrameAdjust * m_param->totalFrames)))))
1466
0
         {
1467
0
              if (m_totalFrames == -1)
1468
0
                   m_totalFrames = curFrame->vbvEndFlag ? static_cast<int>((1 / m_param->vbvEndFrameAdjust) * rce->encodeOrder) : m_param->totalFrames;
1469
0
              rce->remainingVbvEndFrames = ((m_totalFrames) - (rce->encodeOrder));
1470
0
              rce->vbvEndAdj = true;
1471
0
              rce->targetFill = 0;
1472
0
         }
1473
1474
0
        int mincr = enc->m_vps.ptl.minCrForLevel;
1475
        /* Profiles above Main10 don't require maxAU size check, so just set the maximum to a large value. */
1476
0
        if (enc->m_vps.ptl.profileIdc[0] > Profile::MAIN10 || enc->m_vps.ptl.levelIdc == Level::NONE)
1477
0
            rce->frameSizeMaximum = 1e9;
1478
0
        else
1479
0
        {
1480
            /* The spec has a special case for the first frame. */
1481
0
            if (curFrame->m_lowres.bKeyframe)
1482
0
            {
1483
                /* 1.5 * (Max( PicSizeInSamplesY, fR * MaxLumaSr) + MaxLumaSr * (AuCpbRemovalTime[ 0 ] -AuNominalRemovalTime[ 0 ])) ? MinCr */
1484
0
                double fr = 1. / 300;
1485
0
                int picSizeInSamplesY = m_param->sourceWidth * m_param->sourceHeight;
1486
0
                rce->frameSizeMaximum = 8 * 1.5 * X265_MAX(picSizeInSamplesY, fr * enc->m_vps.ptl.maxLumaSrForLevel) / mincr;
1487
0
            }
1488
0
            else
1489
0
            {
1490
                /* 1.5 * MaxLumaSr * (AuCpbRemovalTime[ n ] - AuCpbRemovalTime[ n - 1 ]) / MinCr */
1491
0
                rce->frameSizeMaximum = 8 * 1.5 * enc->m_vps.ptl.maxLumaSrForLevel * m_frameDuration / mincr;
1492
0
            }
1493
0
            rce->frameSizeMaximum *= m_param->maxAUSizeFactor;
1494
0
        }
1495
0
    }
1496
1497
    ///< regenerate the qp
1498
0
    if (!m_isAbr && m_2pass && m_param->rc.rateControlMode == X265_RC_CRF)
1499
0
    {
1500
0
        if (!m_param->rc.bEncFocusedFramesOnly)
1501
0
        {
1502
0
            rce->qpPrev = x265_qScale2qp(rce->qScale);
1503
0
            if (m_param->bEnableSceneCutAwareQp)
1504
0
            {
1505
0
                double lqmin = m_lmin[m_sliceType];
1506
0
                double lqmax = m_lmax[m_sliceType];
1507
0
                if (m_param->bEnableSceneCutAwareQp & FORWARD)
1508
0
                    rce->newQScale = forwardMasking(curFrame, rce->newQScale);
1509
0
                if (m_param->bEnableSceneCutAwareQp & BACKWARD)
1510
0
                    rce->newQScale = backwardMasking(curFrame, rce->newQScale);
1511
0
                rce->newQScale = x265_clip3(lqmin, lqmax, rce->newQScale);
1512
0
            }
1513
0
            rce->qScale = rce->newQScale;
1514
0
            rce->qpaRc = curEncData.m_avgQpRc = curEncData.m_avgQpAq = x265_qScale2qp(rce->newQScale);
1515
0
            m_qp = int(rce->qpaRc + 0.5);
1516
0
            rce->frameSizePlanned = qScale2bits(rce, rce->qScale);
1517
0
            m_framesDone++;
1518
0
            return m_qp;
1519
0
        }
1520
0
        else
1521
0
        { 
1522
0
            int index = m_encOrder[rce->poc];
1523
0
            index++;
1524
0
            double totalDuration = m_frameDuration;
1525
0
            for (int j = 0; totalDuration < 1.0 && index < m_numEntries; j++)
1526
0
            {
1527
0
                switch (m_rce2Pass[index].sliceType)
1528
0
                {
1529
0
                case B_SLICE:
1530
0
                    curFrame->m_lowres.plannedType[j] = m_rce2Pass[index].keptAsRef ? X265_TYPE_BREF : X265_TYPE_B;
1531
0
                    break;
1532
0
                case P_SLICE:
1533
0
                    curFrame->m_lowres.plannedType[j] = X265_TYPE_P;
1534
0
                    break;
1535
0
                case I_SLICE:
1536
0
                    curFrame->m_lowres.plannedType[j] = m_param->bOpenGOP ? X265_TYPE_I : X265_TYPE_IDR;
1537
0
                    break;
1538
0
                default:
1539
0
                    break;
1540
0
                }
1541
1542
0
                curFrame->m_lowres.plannedSatd[j] = m_rce2Pass[index].currentSatd;
1543
0
                totalDuration += m_frameDuration;
1544
0
                index++;
1545
0
            }
1546
0
        }
1547
0
    }
1548
1549
0
    if (m_isAbr || m_2pass) // ABR,CRF
1550
0
    {
1551
0
        if (m_isAbr || m_isVbv)
1552
0
        {
1553
0
            m_currentSatd = curFrame->m_lowres.satdCost >> (X265_DEPTH - 8);
1554
            /* Update rce for use in rate control VBV later */
1555
0
            rce->lastSatd = m_currentSatd;
1556
0
            X265_CHECK(rce->lastSatd, "satdcost cannot be zero\n");
1557
            /* Detect a pattern for B frames with same SATDcost to identify a series of static frames
1558
             * and the P frame at the end of the series marks a possible case for ABR reset logic */
1559
0
            if (m_param->bframes)
1560
0
            {
1561
0
                if (m_sliceType != B_SLICE && m_numBframesInPattern > m_param->bframes)
1562
0
                {
1563
0
                    m_isPatternPresent = true;
1564
0
                }
1565
0
                else if (m_sliceType == B_SLICE && !IS_REFERENCED(curFrame))
1566
0
                {
1567
0
                    if (m_currentSatd != m_lastBsliceSatdCost && !rce->bLastMiniGopBFrame)
1568
0
                    {
1569
0
                        m_isPatternPresent = false;
1570
0
                        m_lastBsliceSatdCost = m_currentSatd;
1571
0
                        m_numBframesInPattern = 0;
1572
0
                    }
1573
0
                    else if (m_currentSatd == m_lastBsliceSatdCost)
1574
0
                        m_numBframesInPattern++;
1575
0
                }
1576
0
            }
1577
0
            if (rce->isFadeEnd)
1578
0
                m_isPatternPresent = true;
1579
0
        }
1580
        /* For a scenecut that occurs within the mini-gop, enable scene transition
1581
         * switch until the next mini-gop to ensure a min qp for all the frames within 
1582
         * the scene-transition mini-gop */
1583
1584
0
        double q = x265_qScale2qp(rateEstimateQscale(curFrame, rce));
1585
0
        q = x265_clip3((double)m_param->rc.qpMin, (double)m_param->rc.qpMax, q);
1586
0
        m_qp = int(q + 0.5);
1587
0
        q = m_isGrainEnabled ? m_qp : q;
1588
0
        rce->qpaRc = curEncData.m_avgQpRc = curEncData.m_avgQpAq = q;
1589
        /* copy value of lastRceq into thread local rce struct *to be used in RateControlEnd() */
1590
0
        rce->qRceq = m_lastRceq;
1591
0
        accumPQpUpdate();
1592
0
        curFrame->m_rcData->cumulativePQp = m_accumPQp;
1593
0
        curFrame->m_rcData->cumulativePNorm = m_accumPNorm;
1594
0
        for (int i = 0; i < 3; i++)
1595
0
            curFrame->m_rcData->lastQScaleFor[i] = m_lastQScaleFor[i];
1596
0
        curFrame->m_rcData->shortTermCplxSum = m_shortTermCplxSum;
1597
0
        curFrame->m_rcData->shortTermCplxCount = m_shortTermCplxCount;
1598
0
    }
1599
0
    else // CQP
1600
0
    {
1601
0
        if (m_sliceType == B_SLICE && IS_REFERENCED(curFrame))
1602
0
            m_qp = (m_qpConstant[B_SLICE] + m_qpConstant[P_SLICE]) / 2;
1603
0
        else
1604
0
            m_qp = m_qpConstant[m_sliceType];
1605
0
        curEncData.m_avgQpAq = curEncData.m_avgQpRc = m_qp;
1606
        
1607
0
        x265_zone* zone = getZone();
1608
0
        if (zone)
1609
0
        {
1610
0
            if (zone->bForceQp)
1611
0
                m_qp += zone->qp - m_qpConstant[P_SLICE];
1612
0
            else
1613
0
                m_qp -= (int)(6.0 * X265_LOG2(zone->bitrateFactor));
1614
0
        }
1615
0
        if (m_bRcReConfig)
1616
0
        {
1617
0
            m_qp = curFrame->m_targetQp;
1618
0
            curEncData.m_avgQpAq = curEncData.m_avgQpRc = m_qp;
1619
0
        }
1620
0
    }
1621
0
    if (m_sliceType != B_SLICE)
1622
0
    {
1623
0
        m_lastNonBPictType = m_sliceType;
1624
0
        m_leadingNoBSatd = m_currentSatd;
1625
0
    }
1626
0
    rce->leadingNoBSatd = m_leadingNoBSatd;
1627
0
    if (curFrame->m_forceqp)
1628
0
    {
1629
0
        m_qp = (int32_t)(curFrame->m_forceqp + 0.5) - 1;
1630
0
        m_qp = x265_clip3(m_param->rc.qpMin, m_param->rc.qpMax, m_qp);
1631
0
        rce->qpaRc = curEncData.m_avgQpRc = curEncData.m_avgQpAq = m_qp;
1632
0
        if (m_isAbr || m_2pass)
1633
0
        {
1634
0
            rce->qpNoVbv = rce->qpaRc;
1635
0
            m_lastQScaleFor[m_sliceType] = x265_qp2qScale(rce->qpaRc);
1636
0
            if (rce->poc == 0)
1637
0
                 m_lastQScaleFor[P_SLICE] = m_lastQScaleFor[m_sliceType] * fabs(m_param->rc.ipFactor);
1638
0
            rce->frameSizePlanned = predictSize(&m_pred[m_predType], m_qp, (double)m_currentSatd);
1639
0
        }
1640
0
    }
1641
0
    m_framesDone++;
1642
1643
0
    return m_qp;
1644
0
}
1645
1646
void RateControl::accumPQpUpdate()
1647
0
{
1648
0
    m_accumPQp   *= .95;
1649
0
    m_accumPNorm *= .95;
1650
0
    m_accumPNorm += 1;
1651
0
    if (m_sliceType == I_SLICE)
1652
0
        m_accumPQp += m_qp + m_ipOffset;
1653
0
    else
1654
0
        m_accumPQp += m_qp;
1655
0
}
1656
1657
int RateControl::getPredictorType(int lowresSliceType, int sliceType)
1658
0
{
1659
    /* Use a different predictor for B Ref and B frames for vbv frame size predictions */
1660
0
    if (lowresSliceType == X265_TYPE_BREF)
1661
0
        return 3;
1662
0
    return sliceType;
1663
0
}
1664
1665
double RateControl::getDiffLimitedQScale(RateControlEntry *rce, double q)
1666
0
{
1667
    // force I/B quants as a function of P quants
1668
0
    const double lastPqScale    = m_lastQScaleFor[P_SLICE];
1669
0
    const double lastNonBqScale = m_lastQScaleFor[m_lastNonBPictType];
1670
0
    if (rce->sliceType == I_SLICE)
1671
0
    {
1672
0
        double iq = q;
1673
0
        double pq = x265_qp2qScale(m_accumPQp / m_accumPNorm);
1674
0
        double ipFactor = fabs(m_param->rc.ipFactor);
1675
        /* don't apply ipFactor if the following frame is also I */
1676
0
        if (m_accumPNorm <= 0)
1677
0
            q = iq;
1678
0
        else if (m_param->rc.ipFactor < 0)
1679
0
            q = iq / ipFactor;
1680
0
        else if (m_accumPNorm >= 1)
1681
0
            q = pq / ipFactor;
1682
0
        else
1683
0
            q = m_accumPNorm * pq / ipFactor + (1 - m_accumPNorm) * iq;
1684
0
    }
1685
0
    else if (rce->sliceType == B_SLICE)
1686
0
    {
1687
0
        if (m_param->rc.pbFactor > 0)
1688
0
            q = lastNonBqScale;
1689
0
        if (!rce->keptAsRef)
1690
0
            q *= fabs(m_param->rc.pbFactor);
1691
0
    }
1692
0
    else if (rce->sliceType == P_SLICE
1693
0
             && m_lastNonBPictType == P_SLICE
1694
0
             && rce->coeffBits == 0)
1695
0
    {
1696
0
        q = lastPqScale;
1697
0
    }
1698
1699
    /* last qscale / qdiff stuff */
1700
0
    if (m_lastNonBPictType == rce->sliceType &&
1701
0
        (rce->sliceType != I_SLICE || m_lastAccumPNorm < 1))
1702
0
    {
1703
0
        double maxQscale = m_lastQScaleFor[rce->sliceType] * m_lstep;
1704
0
        double minQscale = m_lastQScaleFor[rce->sliceType] / m_lstep;
1705
0
        q = x265_clip3(minQscale, maxQscale, q);
1706
0
    }
1707
1708
0
    m_lastQScaleFor[rce->sliceType] = q;
1709
0
    if (rce->sliceType != B_SLICE)
1710
0
        m_lastNonBPictType = rce->sliceType;
1711
0
    if (rce->sliceType == I_SLICE)
1712
0
    {
1713
0
        m_lastAccumPNorm = m_accumPNorm;
1714
0
        m_accumPNorm = 0;
1715
0
        m_accumPQp = 0;
1716
0
    }
1717
0
    if (rce->sliceType == P_SLICE)
1718
0
    {
1719
0
        double mask = 1 - pow(rce->iCuCount / m_ncu, 2);
1720
0
        m_accumPQp   = mask * (x265_qScale2qp(q) + m_accumPQp);
1721
0
        m_accumPNorm = mask * (1 + m_accumPNorm);
1722
0
    }
1723
1724
0
    return q;
1725
0
}
1726
1727
double RateControl::countExpectedBits(int startPos, int endPos)
1728
0
{
1729
0
    double expectedBits = 0;
1730
0
    for (int i = startPos; i <= endPos; i++)
1731
0
    {
1732
0
        RateControlEntry *rce = &m_rce2Pass[i];
1733
0
        rce->expectedBits = (uint64_t)expectedBits;
1734
0
        expectedBits += qScale2bits(rce, rce->newQScale);
1735
0
    }
1736
0
    return expectedBits;
1737
0
}
1738
1739
bool RateControl::findUnderflow(double *fills, int *t0, int *t1, int over, int endPos)
1740
0
{
1741
    /* find an interval ending on an overflow or underflow (depending on whether
1742
     * we're adding or removing bits), and starting on the earliest frame that
1743
     * can influence the buffer fill of that end frame. */
1744
0
    const double bufferMin = .1 * m_bufferSize;
1745
0
    const double bufferMax = .9 * m_bufferSize;
1746
0
    double fill = fills[*t0 - 1];
1747
0
    double parity = over ? 1. : -1.;
1748
0
    int start = -1, end = -1;
1749
0
    for (int i = *t0; i <= endPos; i++)
1750
0
    {
1751
0
        fill += (m_frameDuration * m_vbvMaxRate -
1752
0
                 qScale2bits(&m_rce2Pass[i], m_rce2Pass[i].newQScale)) * parity;
1753
0
        fill = x265_clip3(0.0, m_bufferSize, fill);
1754
0
        fills[i] = fill;
1755
0
        if (fill <= bufferMin || i == 0)
1756
0
        {
1757
0
            if (end >= 0)
1758
0
                break;
1759
0
            start = i;
1760
0
        }
1761
0
        else if (fill >= bufferMax && start >= 0)
1762
0
            end = i;
1763
0
    }
1764
0
    *t0 = start;
1765
0
    *t1 = end;
1766
0
    return start >= 0 && end >= 0;
1767
0
}
1768
1769
bool RateControl::fixUnderflow(int t0, int t1, double adjustment, double qscaleMin, double qscaleMax)
1770
0
{
1771
0
    double qscaleOrig, qscaleNew;
1772
0
    bool adjusted = false;
1773
0
    if (t0 > 0)
1774
0
        t0++;
1775
0
    for (int i = t0; i <= t1; i++)
1776
0
    {
1777
0
        qscaleOrig = m_rce2Pass[i].newQScale;
1778
0
        qscaleOrig = x265_clip3(qscaleMin, qscaleMax, qscaleOrig);
1779
0
        qscaleNew  = qscaleOrig * adjustment;
1780
0
        qscaleNew  = x265_clip3(qscaleMin, qscaleMax, qscaleNew);
1781
0
        m_rce2Pass[i].newQScale = qscaleNew;
1782
0
        adjusted = adjusted || (qscaleNew != qscaleOrig);
1783
0
    }
1784
0
    return adjusted;
1785
0
}
1786
1787
bool RateControl::cuTreeReadFor2Pass(Frame* frame)
1788
0
{
1789
0
    int index = m_encOrder[frame->m_poc];
1790
0
    uint8_t sliceTypeActual = (uint8_t)m_rce2Pass[index].sliceType;
1791
0
    int ncu;
1792
0
    if (m_param->rc.qgSize == 8)
1793
0
        ncu = m_ncu * 4;
1794
0
    else
1795
0
        ncu = m_ncu;
1796
0
    if (m_rce2Pass[index].keptAsRef)
1797
0
    {
1798
        /* TODO: We don't need pre-lookahead to measure AQ offsets, but there is currently
1799
         * no way to signal this */
1800
0
        uint8_t type;
1801
0
        if (m_cuTreeStats.qpBufPos < 0)
1802
0
        {
1803
0
            do
1804
0
            {
1805
0
                m_cuTreeStats.qpBufPos++;
1806
1807
0
                if (X265_SHARE_MODE_FILE == m_param->rc.dataShareMode)
1808
0
                {
1809
0
                    if (!fread(&type, 1, 1, m_cutreeStatFileIn))
1810
0
                        goto fail;
1811
0
                    if (fread(m_cuTreeStats.qpBuffer[m_cuTreeStats.qpBufPos], sizeof(uint16_t), ncu, m_cutreeStatFileIn) != (size_t)ncu)
1812
0
                        goto fail;
1813
0
                }
1814
0
                else // X265_SHARE_MODE_SHAREDMEM == m_param->rc.dataShareMode
1815
0
                {
1816
0
                    if (!m_cutreeShrMem)
1817
0
                    {
1818
0
                        goto fail;
1819
0
                    }
1820
1821
0
                    CUTreeSharedDataItem shrItem;
1822
0
                    shrItem.type = &type;
1823
0
                    shrItem.stats = m_cuTreeStats.qpBuffer[m_cuTreeStats.qpBufPos];
1824
0
                    m_cutreeShrMem->readNext(&shrItem, ReadSharedCUTreeData);
1825
0
                }
1826
1827
0
                if (type != sliceTypeActual && m_cuTreeStats.qpBufPos == 1)
1828
0
                {
1829
0
                    x265_log(m_param, X265_LOG_ERROR, "CU-tree frametype %d doesn't match actual frametype %d.\n", type, sliceTypeActual);
1830
0
                    return false;
1831
0
                }
1832
0
            }
1833
0
            while(type != sliceTypeActual);
1834
0
        }
1835
0
        primitives.fix8Unpack(frame->m_lowres.qpCuTreeOffset, m_cuTreeStats.qpBuffer[m_cuTreeStats.qpBufPos], ncu);
1836
0
        for (int i = 0; i < ncu; i++)
1837
0
            frame->m_lowres.invQscaleFactor[i] = x265_exp2fix8(frame->m_lowres.qpCuTreeOffset[i]);
1838
0
        m_cuTreeStats.qpBufPos--;
1839
0
    }
1840
0
    return true;
1841
1842
0
fail:
1843
0
    x265_log(m_param, X265_LOG_ERROR, "Incomplete CU-tree stats file.\n");
1844
0
    return false;
1845
0
}
1846
1847
double RateControl::tuneAbrQScaleFromFeedback(double qScale)
1848
0
{
1849
0
    double abrBuffer = 2 * m_rateTolerance * m_bitrate;
1850
    /* use framesDone instead of POC as poc count is not serial with bframes enabled */
1851
0
    double overflow = 1.0;
1852
0
    double timeDone = (double)(m_framesDone - m_param->frameNumThreads + 1) * m_frameDuration;
1853
0
    double wantedBits = timeDone * m_bitrate;
1854
0
    int64_t encodedBits = m_totalBits;
1855
0
    if (m_param->totalFrames && m_param->totalFrames <= 2 * m_fps)
1856
0
    {
1857
0
        abrBuffer = m_param->totalFrames * (m_bitrate / m_fps);
1858
0
        encodedBits = m_encodedBits;
1859
0
    }
1860
1861
0
    if (wantedBits > 0 && encodedBits > 0 && (!m_partialResidualFrames || 
1862
0
        m_param->rc.bStrictCbr || m_isGrainEnabled))
1863
0
    {
1864
0
        abrBuffer *= X265_MAX(1, sqrt(timeDone));
1865
0
        overflow = x265_clip3(.5, 2.0, 1.0 + (encodedBits - wantedBits) / abrBuffer);
1866
0
        qScale *= overflow;
1867
0
    }
1868
0
    return qScale;
1869
0
}
1870
1871
double RateControl::tuneQScaleForZone(RateControlEntry *rce, double qScale)
1872
0
{
1873
0
    rce->frameSizePlanned = predictSize(&m_pred[m_predType], qScale, (double)m_currentSatd);
1874
0
    int loop = 0;
1875
1876
0
    double availableBits = (double)m_param->rc.bitrate * 1000 * m_relativeComplexity[rce->encodeOrder % m_param->reconfigWindowSize];
1877
1878
    // Tune qScale to adhere to the available frame bits.
1879
0
    for (int i = 0; i < 1000 && loop != 3; i++)
1880
0
    {
1881
0
        if (rce->frameSizePlanned < availableBits)
1882
0
        {
1883
0
            qScale = qScale / 1.01;
1884
0
            loop = loop | 1;
1885
0
        }
1886
0
        else if (rce->frameSizePlanned > availableBits)
1887
0
        {
1888
0
            qScale = qScale * 1.01;
1889
0
            loop = loop | 2;
1890
0
        }
1891
0
        rce->frameSizePlanned = predictSize(&m_pred[m_predType], qScale, (double)m_currentSatd);
1892
0
    }
1893
0
    return qScale;
1894
0
}
1895
1896
double RateControl::tuneQScaleForGrain(double rcOverflow)
1897
0
{
1898
0
    double qpstep = rcOverflow > 1.1 ? rcOverflow : m_lstep;
1899
0
    double qScaleAvg = x265_qp2qScale(m_avgPFrameQp);
1900
0
    double  q = m_lastQScaleFor[P_SLICE];
1901
0
    int curQp = int (x265_qScale2qp(m_lastQScaleFor[P_SLICE]) + 0.5);
1902
0
    double curBitrate = m_qpToEncodedBits[curQp] * int(m_fps + 0.5);
1903
0
    int newQp = rcOverflow > 1.1 ? curQp + 2 : rcOverflow > 1 ? curQp + 1 : curQp - 1 ;
1904
0
    double projectedBitrate =  int(m_fps + 0.5) * m_qpToEncodedBits[newQp];
1905
0
    if (curBitrate > 0 && projectedBitrate > 0)
1906
0
        q =  std::abs(projectedBitrate - m_bitrate) < std::abs (curBitrate - m_bitrate) ? x265_qp2qScale(newQp) : m_lastQScaleFor[P_SLICE];
1907
0
    else
1908
0
        q = rcOverflow > 1 ? qScaleAvg * qpstep : rcOverflow < 1 ?  qScaleAvg / qpstep : m_lastQScaleFor[P_SLICE];
1909
0
    return q;
1910
0
}
1911
1912
double RateControl::rateEstimateQscale(Frame* curFrame, RateControlEntry *rce)
1913
0
{
1914
0
    double q;
1915
0
    if (m_2pass)
1916
0
    {
1917
0
        if (m_sliceType != rce->sliceType)
1918
0
        {
1919
0
            x265_log(m_param, X265_LOG_ERROR, "slice=%c but 2pass stats say %c\n",
1920
0
                     g_sliceTypeToChar[m_sliceType], g_sliceTypeToChar[rce->sliceType]);
1921
0
        }
1922
0
    }
1923
1924
0
    if (m_bRcReConfig)
1925
0
    {
1926
0
        if (m_param->rc.rateControlMode == X265_RC_ABR)
1927
0
            m_bitrate = (double)curFrame->m_targetBitrate * 1000;
1928
0
        else if (m_param->rc.rateControlMode == X265_RC_CRF)
1929
0
        {
1930
0
            double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;
1931
0
            double qComp = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 0.99 : m_param->rc.qCompress;
1932
0
            m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /
1933
0
                x265_qp2qScale(curFrame->m_targetCrf + mbtree_offset);
1934
0
        }
1935
0
    }
1936
0
    if ((m_param->bliveVBV2pass && m_param->rc.rateControlMode == X265_RC_ABR) || m_isAbr)
1937
0
    {
1938
0
        int pos = m_sliderPos % s_slidingWindowFrames;
1939
0
        int addPos = (pos + s_slidingWindowFrames - 1) % s_slidingWindowFrames;
1940
0
        if (m_sliderPos > s_slidingWindowFrames)
1941
0
        {
1942
0
            const static double base = pow(0.5, s_slidingWindowFrames - 1);
1943
0
            m_movingAvgSum -= m_lastRemovedSatdCost * base;
1944
0
            m_movingAvgSum *= 0.5;
1945
0
            m_movingAvgSum += m_satdCostWindow[addPos];
1946
0
        }
1947
0
        else if (m_sliderPos == s_slidingWindowFrames)
1948
0
        {
1949
0
            m_movingAvgSum += m_satdCostWindow[addPos];
1950
0
        }
1951
0
        else if (m_sliderPos > 0)
1952
0
        {
1953
0
            m_movingAvgSum += m_satdCostWindow[addPos];
1954
0
            m_movingAvgSum *= 0.5;
1955
0
        }
1956
1957
0
        rce->movingAvgSum = m_movingAvgSum;
1958
0
        m_lastRemovedSatdCost = m_satdCostWindow[pos];
1959
0
        m_satdCostWindow[pos] = rce->lastSatd;
1960
0
        m_sliderPos++;
1961
0
    }
1962
1963
0
    if((!m_param->bEnableSBRC && m_sliceType == B_SLICE) || (m_param->bEnableSBRC && !IS_REFERENCED(curFrame)))
1964
0
    {
1965
        /* B-frames don't have independent rate control, but rather get the
1966
         * average QP of the two adjacent P-frames + an offset */
1967
0
        Slice* prevRefSlice = m_curSlice->m_refFrameList[0][0]->m_encData->m_slice;
1968
0
        Slice* nextRefSlice = m_curSlice->m_refFrameList[1][0]->m_encData->m_slice;
1969
0
        double q0 = m_curSlice->m_refFrameList[0][0]->m_encData->m_avgQpRc;
1970
0
        double q1 = m_curSlice->m_refFrameList[1][0]->m_encData->m_avgQpRc;
1971
0
        bool i0 = prevRefSlice->m_sliceType == I_SLICE;
1972
0
        bool i1 = nextRefSlice->m_sliceType == I_SLICE;
1973
0
        int dt0 = abs(m_curSlice->m_poc - prevRefSlice->m_poc);
1974
0
        int dt1 = abs(m_curSlice->m_poc - nextRefSlice->m_poc);
1975
1976
        // Skip taking a reference frame before the Scenecut if ABR has been reset.
1977
0
        if (m_lastAbrResetPoc >= 0)
1978
0
        {
1979
0
            if (prevRefSlice->m_sliceType == P_SLICE && prevRefSlice->m_poc < m_lastAbrResetPoc)
1980
0
            {
1981
0
                i0 = i1;
1982
0
                dt0 = dt1;
1983
0
                q0 = q1;
1984
0
            }
1985
0
        }
1986
1987
0
        if (prevRefSlice->m_sliceType == B_SLICE && IS_REFERENCED(m_curSlice->m_refFrameList[0][0]))
1988
0
            q0 -= m_pbOffset / 2;
1989
0
        if (nextRefSlice->m_sliceType == B_SLICE && IS_REFERENCED(m_curSlice->m_refFrameList[1][0]))
1990
0
            q1 -= m_pbOffset / 2;
1991
0
        if (i0 && i1)
1992
0
            q = (q0 + q1) / 2 + m_ipOffset;
1993
0
        else if (i0)
1994
0
            q = q1;
1995
0
        else if (i1)
1996
0
            q = q0;
1997
0
        else if(m_isGrainEnabled && !m_2pass)
1998
0
                q = q1;
1999
0
            else
2000
0
            q = (q0 * dt1 + q1 * dt0) / (dt0 + dt1);
2001
2002
0
        if (IS_REFERENCED(curFrame))
2003
0
            q += m_pbOffset / 2;
2004
0
        else
2005
0
            q += m_pbOffset;
2006
2007
                /* Set a min qp at scenechanges and transitions */
2008
0
        if (m_isSceneTransition)
2009
0
        {
2010
0
            q = X265_MAX(ABR_SCENECUT_INIT_QP_MIN, q);
2011
0
            double minScenecutQscale =x265_qp2qScale(ABR_SCENECUT_INIT_QP_MIN); 
2012
0
            m_lastQScaleFor[P_SLICE] = X265_MAX(minScenecutQscale, m_lastQScaleFor[P_SLICE]);
2013
0
        }
2014
2015
0
        if (m_bRcReConfig && m_param->rc.rateControlMode == X265_RC_CRF)
2016
0
        {
2017
0
            double qScale = getQScale(rce, m_rateFactorConstant);
2018
0
            q = x265_qScale2qp(qScale);
2019
0
        }
2020
0
        double qScale = x265_qp2qScale(q);
2021
0
        rce->qpNoVbv = q;
2022
2023
0
        if (m_param->bEnableSBRC)
2024
0
        {
2025
0
            qScale = tuneQscaleForSBRC(curFrame, qScale);
2026
0
            rce->qpNoVbv = x265_qScale2qp(qScale);
2027
0
        }
2028
2029
0
        double lmin = 0, lmax = 0;
2030
0
        if (m_isGrainEnabled && m_isFirstMiniGop)
2031
0
        {
2032
0
            lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
2033
0
            lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
2034
0
            double tunedQscale = tuneAbrQScaleFromFeedback(qScale);
2035
0
            double overflow = tunedQscale / qScale;
2036
0
            if (!m_isAbrReset)
2037
0
                qScale = x265_clip3(lmin, lmax, qScale);
2038
0
            m_avgPFrameQp = m_avgPFrameQp == 0 ? rce->qpNoVbv : m_avgPFrameQp;
2039
0
            if (overflow != 1)
2040
0
            {
2041
0
                qScale = tuneQScaleForGrain(overflow);
2042
0
                q = x265_qScale2qp(qScale);
2043
0
            }
2044
0
            rce->qpNoVbv = q;
2045
0
        }
2046
        /* Scenecut Aware QP offsets*/
2047
0
        if (m_param->bEnableSceneCutAwareQp)
2048
0
        {
2049
0
            double lqmin = m_lmin[m_sliceType];
2050
0
            double lqmax = m_lmax[m_sliceType];
2051
0
            if (m_param->bEnableSceneCutAwareQp & FORWARD)
2052
0
                qScale = forwardMasking(curFrame, qScale);
2053
0
            if (m_param->bEnableSceneCutAwareQp & BACKWARD)
2054
0
                qScale = backwardMasking(curFrame, qScale);
2055
0
            qScale = x265_clip3(lqmin, lqmax, qScale);
2056
0
            q = x265_qScale2qp(qScale);
2057
0
            rce->qpNoVbv = q;
2058
0
        }
2059
2060
0
        if (m_isVbv)
2061
0
        {
2062
0
            lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
2063
0
            lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
2064
2065
0
            if (m_isCbr && !m_isGrainEnabled)
2066
0
            {
2067
0
                qScale = tuneAbrQScaleFromFeedback(qScale);
2068
0
                if (!m_isAbrReset)
2069
0
                    qScale = x265_clip3(lmin, lmax, qScale);
2070
0
                q = x265_qScale2qp(qScale);
2071
0
            }
2072
2073
0
            if (!m_param->bResetZoneConfig)
2074
0
            {
2075
0
                double lqmin = m_lmin[m_sliceType];
2076
0
                double lqmax = m_lmax[m_sliceType];
2077
0
                qScale = tuneQScaleForZone(rce, qScale);
2078
0
                qScale = x265_clip3(lqmin, lqmax, qScale);
2079
0
            }
2080
2081
0
            if (!m_2pass || m_param->bliveVBV2pass || (m_2pass && m_param->rc.rateControlMode == X265_RC_CRF && m_param->rc.bEncFocusedFramesOnly))
2082
0
            {
2083
                /* clip qp to permissible range after vbv-lookahead estimation to avoid possible 
2084
                 * mispredictions by initial frame size predictors */
2085
0
                qScale = clipQscale(curFrame, rce, qScale);
2086
2087
0
                if (m_pred[m_predType].count == 1)
2088
0
                    qScale = x265_clip3(lmin, lmax, qScale);
2089
0
                m_lastQScaleFor[m_sliceType] = qScale;
2090
0
            }
2091
0
        }
2092
2093
0
        if (m_2pass)
2094
0
            rce->frameSizePlanned = qScale2bits(rce, qScale);
2095
0
        else
2096
0
            rce->frameSizePlanned = predictSize(&m_pred[m_predType], qScale, (double)m_currentSatd);
2097
2098
        /* Limit planned size by MinCR */
2099
0
        if (m_isVbv)
2100
0
            rce->frameSizePlanned = X265_MIN(rce->frameSizePlanned, rce->frameSizeMaximum);
2101
0
        rce->frameSizeEstimated = rce->frameSizePlanned;
2102
2103
0
        rce->newQScale = qScale;
2104
0
        if(rce->bLastMiniGopBFrame)
2105
0
        {
2106
0
            if (m_isFirstMiniGop && m_isGrainEnabled)
2107
0
            {
2108
0
                m_avgPFrameQp = (m_avgPFrameQp + rce->qpNoVbv) / 2;
2109
0
                m_lastQScaleFor[P_SLICE] = x265_qp2qScale(m_avgPFrameQp);
2110
0
            }
2111
0
            m_isFirstMiniGop = false;
2112
0
        }
2113
0
        return qScale;
2114
0
    }
2115
0
    else
2116
0
    {
2117
0
        double abrBuffer = 2 * m_rateTolerance * m_bitrate;
2118
0
        if (m_2pass && (m_param->rc.rateControlMode != X265_RC_CRF || !m_param->rc.bEncFocusedFramesOnly))
2119
0
        {
2120
0
            double lmin = m_lmin[m_sliceType];
2121
0
            double lmax = m_lmax[m_sliceType];
2122
0
            int64_t diff;
2123
0
            if (!m_isVbv)
2124
0
            {
2125
0
                m_predictedBits = m_totalBits;
2126
0
                if (rce->encodeOrder < m_param->frameNumThreads)
2127
0
                    m_predictedBits += (int64_t)(rce->encodeOrder * m_bitrate / m_fps);
2128
0
                else
2129
0
                    m_predictedBits += (int64_t)(m_param->frameNumThreads * m_bitrate / m_fps);
2130
0
            }
2131
            /* Adjust ABR buffer based on distance to the end of the video. */
2132
0
            if (m_numEntries > rce->encodeOrder)
2133
0
            {
2134
0
                uint64_t finalBits = m_rce2Pass[m_numEntries - 1].expectedBits;
2135
0
                double videoPos = (double)rce->expectedBits / finalBits;
2136
0
                double scaleFactor = sqrt((1 - videoPos) * m_numEntries);
2137
0
                abrBuffer *= 0.5 * X265_MAX(scaleFactor, 0.5);
2138
0
            }
2139
0
            diff = m_predictedBits - (int64_t)rce->expectedBits;
2140
0
            q = rce->newQScale;
2141
0
            x265_zone* zone = getZone();
2142
0
            if (zone)
2143
0
            {
2144
0
                if (zone->bForceQp)
2145
0
                    q = x265_qp2qScale(zone->qp);
2146
0
                else
2147
0
                    q /= zone->bitrateFactor;
2148
0
            }
2149
            /*Existing ABR conformance check may not be valid with real time VBV*/
2150
0
            if(!m_param->bliveVBV2pass)
2151
0
                q /= x265_clip3(0.5, 2.0, (double)(abrBuffer - diff) / abrBuffer);
2152
0
            if (m_expectedBitsSum > 0)
2153
0
            {
2154
                /* Adjust quant based on the difference between
2155
                 * achieved and expected bitrate so far */
2156
0
                double curTime = (double)rce->encodeOrder / m_numEntries;
2157
0
                double w = x265_clip3(0.0, 1.0, curTime);
2158
0
                q *= pow((double)m_totalBits / m_expectedBitsSum, w);
2159
0
            }
2160
0
            if (m_framesDone == 0 && m_param->rc.rateControlMode == X265_RC_ABR && m_isGrainEnabled)
2161
0
                q = X265_MIN(x265_qp2qScale(ABR_INIT_QP_GRAIN_MAX), q);
2162
0
            rce->qpNoVbv = x265_qScale2qp(q);
2163
0
            if ((m_sliceType == I_SLICE && m_param->keyframeMax > 1
2164
0
                && m_lastNonBPictType != I_SLICE && !m_isAbrReset) || (m_isNextGop && !m_framesDone))
2165
0
                m_avgPFrameQp = 0;
2166
0
            if (m_sliceType == P_SLICE)
2167
0
            {
2168
0
                m_avgPFrameQp = m_avgPFrameQp == 0 ? rce->qpNoVbv : m_avgPFrameQp;
2169
0
                m_avgPFrameQp = (m_avgPFrameQp + rce->qpNoVbv) / 2;
2170
0
            }
2171
2172
            /* Scenecut Aware QP offsets*/
2173
0
            if (m_param->bEnableSceneCutAwareQp)
2174
0
            {
2175
0
                double qmin = m_lmin[m_sliceType];
2176
0
                double qmax = m_lmax[m_sliceType];
2177
2178
0
                if (m_param->bEnableSceneCutAwareQp & FORWARD)
2179
0
                    q = forwardMasking(curFrame, q);
2180
0
                if (m_param->bEnableSceneCutAwareQp & BACKWARD)
2181
0
                    q = backwardMasking(curFrame, q);
2182
2183
0
                q = x265_clip3(qmin, qmax, q);
2184
0
                rce->qpNoVbv = x265_qScale2qp(q);
2185
0
            }
2186
2187
0
            if (m_isVbv)
2188
0
            {
2189
0
                if (!m_param->bliveVBV2pass)
2190
0
                {
2191
                    /* Do not overflow vbv */
2192
0
                    double expectedSize = qScale2bits(rce, q);
2193
0
                    double expectedVbv = m_bufferFill + m_bufferRate - expectedSize;
2194
0
                    double expectedFullness = rce->expectedVbv / m_bufferSize;
2195
0
                    double qmax = q * (2 - expectedFullness);
2196
0
                    double sizeConstraint = 1 + expectedFullness;
2197
0
                    qmax = X265_MAX(qmax, rce->newQScale);
2198
0
                    if (expectedFullness < .05)
2199
0
                        qmax = lmax;
2200
0
                    qmax = X265_MIN(qmax, lmax);
2201
0
                    while (((expectedVbv < rce->expectedVbv / sizeConstraint) && (q < qmax)) ||
2202
0
                        ((expectedVbv < 0) && (q < lmax)))
2203
0
                    {
2204
0
                        q *= 1.05;
2205
0
                        expectedSize = qScale2bits(rce, q);
2206
0
                        expectedVbv = m_bufferFill + m_bufferRate - expectedSize;
2207
0
                    }
2208
0
                }
2209
0
                else
2210
0
                {
2211
                        /*  clip qp to permissible range after vbv-lookahead estimation to avoid possible
2212
                        * mispredictions by Rate Control pass 1 statistics analysis */
2213
0
                        q = clipQscale(curFrame, rce, q);
2214
0
                }
2215
0
            }
2216
2217
0
            q = x265_clip3(lmin, lmax, q);
2218
0
        }
2219
0
        else
2220
0
        {
2221
            /* 1pass ABR */
2222
2223
            /* Calculate the quantizer which would have produced the desired
2224
             * average bitrate if it had been applied to all frames so far.
2225
             * Then modulate that quant based on the current frame's complexity
2226
             * relative to the average complexity so far (using the 2pass RCEQ).
2227
             * Then bias the quant up or down if total size so far was far from
2228
             * the target.
2229
             * Result: Depending on the value of rate_tolerance, there is a
2230
             * trade-off between quality and bitrate precision. But at large
2231
             * tolerances, the bit distribution approaches that of 2pass. */
2232
2233
0
            double overflow = 1;
2234
0
            double lqmin = m_lmin[m_sliceType];
2235
0
            double lqmax = m_lmax[m_sliceType];
2236
0
            m_shortTermCplxSum *= 0.5;
2237
0
            m_shortTermCplxCount *= 0.5;
2238
0
            m_shortTermCplxSum += m_currentSatd / (CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION);
2239
0
            m_shortTermCplxCount++;
2240
            /* coeffBits to be used in 2-pass */
2241
0
            rce->coeffBits = (int)m_currentSatd;
2242
0
            rce->blurredComplexity = m_shortTermCplxSum / m_shortTermCplxCount;
2243
0
            rce->mvBits = 0;
2244
0
            rce->sliceType = m_sliceType;
2245
2246
0
            if (m_param->rc.rateControlMode == X265_RC_CRF)
2247
0
            {
2248
0
                if (m_param->bEnableSBRC)
2249
0
                {
2250
0
                    double rfConstant = m_param->rc.rfConstant;
2251
0
                    if (m_currentSatd < rce->movingAvgSum)
2252
0
                        rfConstant += 2;
2253
0
                    double ipOffset = (curFrame->m_lowres.bScenecut ? m_ipOffset : m_ipOffset / 2.0);
2254
0
                    rfConstant = (rce->sliceType == I_SLICE ? rfConstant - ipOffset :
2255
0
                        (rce->sliceType == B_SLICE ? rfConstant + m_pbOffset : rfConstant));
2256
0
                    double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;
2257
0
                    double qComp = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 0.99 : m_param->rc.qCompress;
2258
0
                    m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /
2259
0
                        x265_qp2qScale(rfConstant + mbtree_offset);
2260
0
                }
2261
0
                q = getQScale(rce, m_rateFactorConstant);
2262
0
                x265_zone* zone = getZone();
2263
0
                if (zone)
2264
0
                {
2265
0
                    if (zone->bForceQp)
2266
0
                        q = x265_qp2qScale(zone->qp);
2267
0
                    else
2268
0
                        q /= zone->bitrateFactor;
2269
0
                }
2270
0
            }
2271
0
            else
2272
0
            {
2273
0
                if (!m_param->rc.bStatRead)
2274
0
                    checkAndResetABR(rce, false);
2275
0
                double initialQScale = getQScale(rce, m_wantedBitsWindow / m_cplxrSum);
2276
0
                x265_zone* zone = getZone();
2277
0
                if (zone)
2278
0
                {
2279
0
                    if (zone->bForceQp)
2280
0
                        initialQScale = x265_qp2qScale(zone->qp);
2281
0
                    else
2282
0
                        initialQScale /= zone->bitrateFactor;
2283
0
                }
2284
0
                double tunedQScale = tuneAbrQScaleFromFeedback(initialQScale);
2285
0
                overflow = tunedQScale / initialQScale;
2286
0
                q = (!m_partialResidualFrames) ? tunedQScale : initialQScale;
2287
0
                bool isEncodeEnd = (m_param->totalFrames &&
2288
0
                    m_framesDone > 0.75 * m_param->totalFrames) ? 1 : 0;
2289
0
                bool isEncodeBeg = m_framesDone < (int)(m_fps + 0.5);
2290
0
                if (m_isGrainEnabled)
2291
0
                {
2292
0
                    if(m_sliceType!= I_SLICE && m_framesDone && !isEncodeEnd &&
2293
0
                        ((overflow < 1.05 && overflow > 0.95) || isEncodeBeg))
2294
0
                    {
2295
0
                        q = tuneQScaleForGrain(overflow);
2296
0
                    }
2297
0
                }
2298
0
            }
2299
0
            if ((m_sliceType == I_SLICE && m_param->keyframeMax > 1
2300
0
                && m_lastNonBPictType != I_SLICE && !m_isAbrReset) || (m_isNextGop && !m_framesDone))
2301
0
            {
2302
0
                if (!m_param->rc.bStrictCbr)
2303
0
                    q = x265_qp2qScale(m_accumPQp / m_accumPNorm);
2304
0
                q /= fabs(m_param->rc.ipFactor);
2305
0
                m_avgPFrameQp = 0;
2306
0
            }
2307
0
            else if (m_framesDone > 0)
2308
0
            {
2309
0
                if (m_param->rc.rateControlMode != X265_RC_CRF)
2310
0
                {
2311
0
                    lqmin = m_lastQScaleFor[m_sliceType] / m_lstep;
2312
0
                    lqmax = m_lastQScaleFor[m_sliceType] * m_lstep;
2313
0
                    if (!m_partialResidualFrames || m_isGrainEnabled)
2314
0
                    {
2315
0
                        if (overflow > 1.1 && m_framesDone > 3)
2316
0
                            lqmax *= m_lstep;
2317
0
                        else if (overflow < 0.9)
2318
0
                            lqmin /= m_lstep;
2319
0
                    }
2320
0
                    q = x265_clip3(lqmin, lqmax, q);
2321
0
                }
2322
0
            }
2323
0
            else if (m_qCompress != 1 && m_param->rc.rateControlMode == X265_RC_CRF)
2324
0
            {
2325
0
                q = x265_qp2qScale(CRF_INIT_QP) / fabs(m_param->rc.ipFactor);
2326
0
            }
2327
0
            else if (m_framesDone == 0 && !m_isVbv && m_param->rc.rateControlMode == X265_RC_ABR)
2328
0
            {
2329
                /* for ABR alone, clip the first I frame qp */
2330
0
                lqmax = (m_isGrainEnabled && m_lstep) ? x265_qp2qScale(ABR_INIT_QP_GRAIN_MAX) :
2331
0
                        x265_qp2qScale(ABR_INIT_QP_MAX);
2332
0
                q = X265_MIN(lqmax, q);
2333
0
            }
2334
0
            q = x265_clip3(lqmin, lqmax, q);
2335
            /* Set a min qp at scenechanges and transitions */
2336
0
            if (m_isSceneTransition)
2337
0
            {
2338
0
                double minScenecutQscale = x265_qp2qScale(ABR_SCENECUT_INIT_QP_MIN);
2339
0
                q = X265_MAX(minScenecutQscale, q);
2340
0
                m_lastQScaleFor[P_SLICE] = X265_MAX(minScenecutQscale, m_lastQScaleFor[P_SLICE]);
2341
0
            }
2342
0
            if (m_param->bEnableSBRC)
2343
0
                q = tuneQscaleForSBRC(curFrame, q);
2344
2345
0
            rce->qpNoVbv = x265_qScale2qp(q);
2346
0
            if (m_sliceType == P_SLICE)
2347
0
            {
2348
0
                m_avgPFrameQp = m_avgPFrameQp == 0 ? rce->qpNoVbv : m_avgPFrameQp;
2349
0
                m_avgPFrameQp = (m_avgPFrameQp + rce->qpNoVbv) / 2;
2350
0
            }
2351
2352
0
            if (!m_param->bResetZoneConfig)
2353
0
            {
2354
0
                q = tuneQScaleForZone(rce, q);
2355
0
                q = x265_clip3(lqmin, lqmax, q);
2356
0
            }
2357
            /* Scenecut Aware QP offsets*/
2358
0
            if (m_param->bEnableSceneCutAwareQp)
2359
0
            {
2360
0
                double qmin = m_lmin[m_sliceType];
2361
0
                double qmax = m_lmax[m_sliceType];
2362
2363
0
                if (m_param->bEnableSceneCutAwareQp & FORWARD)
2364
0
                    q = forwardMasking(curFrame, q);
2365
0
                if (m_param->bEnableSceneCutAwareQp & BACKWARD)
2366
0
                    q = backwardMasking(curFrame, q);
2367
2368
0
                q = x265_clip3(qmin, qmax, q);
2369
0
                rce->qpNoVbv = x265_qScale2qp(q);
2370
0
            }
2371
0
            q = clipQscale(curFrame, rce, q);
2372
0
            if (m_2pass)
2373
0
                rce->frameSizePlanned = qScale2bits(rce, q);
2374
0
            else
2375
0
                rce->frameSizePlanned = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2376
2377
            /*  clip qp to permissible range after vbv-lookahead estimation to avoid possible
2378
             * mispredictions by initial frame size predictors, after each scenecut */
2379
0
            bool isFrameAfterScenecut = m_sliceType!= I_SLICE && m_curSlice->m_refFrameList[0][0]->m_lowres.bScenecut;
2380
0
            if (!m_2pass && m_isVbv && isFrameAfterScenecut)
2381
0
                q = x265_clip3(lqmin, lqmax, q);
2382
0
        }
2383
0
        m_lastQScaleFor[m_sliceType] = q;
2384
0
        if ((m_curSlice->m_poc == 0 || m_lastQScaleFor[P_SLICE] < q) && !(m_2pass && !m_isVbv))
2385
0
            m_lastQScaleFor[P_SLICE] = q * fabs(m_param->rc.ipFactor);
2386
2387
0
        if (m_2pass)
2388
0
            rce->frameSizePlanned = qScale2bits(rce, q);
2389
0
        else
2390
0
            rce->frameSizePlanned = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2391
2392
        /* Always use up the whole VBV in this case. */
2393
0
        if (m_singleFrameVbv)
2394
0
            rce->frameSizePlanned = m_bufferRate;
2395
        /* Limit planned size by MinCR */
2396
0
        if (m_isVbv)
2397
0
            rce->frameSizePlanned = X265_MIN(rce->frameSizePlanned, rce->frameSizeMaximum);
2398
0
        rce->frameSizeEstimated = rce->frameSizePlanned;
2399
0
        rce->newQScale = q;
2400
0
        return q;
2401
0
    }
2402
0
}
2403
2404
void RateControl::rateControlUpdateStats(RateControlEntry* rce)
2405
0
{
2406
0
    if (!m_param->rc.bStatWrite && !m_param->rc.bStatRead)
2407
0
    {
2408
0
        if (rce->sliceType == I_SLICE)
2409
0
        {
2410
            /* previous I still had a residual; roll it into the new loan */
2411
0
            if (m_partialResidualFrames)
2412
0
                rce->rowTotalBits += m_partialResidualCost * m_partialResidualFrames;
2413
0
            if ((m_param->totalFrames != 0) && (m_amortizeFrames > (m_param->totalFrames - m_framesDone)))
2414
0
            {
2415
0
                m_amortizeFrames = 0;
2416
0
                m_amortizeFraction = 0;
2417
0
            }
2418
0
            else
2419
0
            {
2420
0
                double depreciateRate = 1.1;
2421
0
                m_amortizeFrames = (int)(m_amortizeFrames / depreciateRate);
2422
0
                m_amortizeFraction /= depreciateRate;
2423
0
                m_amortizeFrames = X265_MAX(m_amortizeFrames, MIN_AMORTIZE_FRAME);
2424
0
                m_amortizeFraction = X265_MAX(m_amortizeFraction, MIN_AMORTIZE_FRACTION);
2425
0
            }
2426
0
            rce->amortizeFrames = m_amortizeFrames;
2427
0
            rce->amortizeFraction = m_amortizeFraction;
2428
0
            m_partialResidualFrames = X265_MIN((int)rce->amortizeFrames, m_param->keyframeMax);
2429
0
            m_partialResidualCost = (int)((rce->rowTotalBits * rce->amortizeFraction) / m_partialResidualFrames);
2430
0
            rce->rowTotalBits -= m_partialResidualCost * m_partialResidualFrames;
2431
0
        }
2432
0
        else if (m_partialResidualFrames)
2433
0
        {
2434
0
             rce->rowTotalBits += m_partialResidualCost;
2435
0
             m_partialResidualFrames--;
2436
0
        }
2437
0
    }
2438
0
    if (rce->sliceType != B_SLICE)
2439
0
        rce->rowCplxrSum = rce->rowTotalBits * x265_qp2qScale(rce->qpaRc) / rce->qRceq;
2440
0
    else
2441
0
        rce->rowCplxrSum = rce->rowTotalBits * x265_qp2qScale(rce->qpaRc) / (rce->qRceq * fabs(m_param->rc.pbFactor));
2442
2443
0
    m_cplxrSum += rce->rowCplxrSum;
2444
0
    m_totalBits += rce->rowTotalBits;
2445
2446
    /* do not allow the next frame to enter rateControlStart() until this
2447
     * frame has updated its mid-frame statistics */
2448
0
    if (m_param->rc.rateControlMode == X265_RC_ABR || m_isVbv)
2449
0
    {
2450
0
        m_startEndOrder.incr();
2451
2452
0
        if (rce->encodeOrder < m_param->frameNumThreads - 1)
2453
0
            m_startEndOrder.incr(); // faked rateControlEnd calls for negative frames
2454
0
    }
2455
0
}
2456
2457
void RateControl::checkAndResetABR(RateControlEntry* rce, bool isFrameDone)
2458
0
{
2459
0
    double abrBuffer = 2 * m_rateTolerance * m_bitrate;
2460
2461
    // Check if current Slice is a scene cut that follows low detailed/blank frames
2462
0
    if (rce->lastSatd > 4 * rce->movingAvgSum || rce->scenecut || rce->isFadeEnd)
2463
0
    {
2464
0
        if (!m_isAbrReset && rce->movingAvgSum > 0
2465
0
            && (m_isPatternPresent || !m_param->bframes))
2466
0
        {
2467
0
            int pos = X265_MAX(m_sliderPos - m_param->frameNumThreads, 0);
2468
0
            int64_t shrtTermWantedBits = (int64_t) (X265_MIN(pos, s_slidingWindowFrames) * m_bitrate * m_frameDuration);
2469
0
            int64_t shrtTermTotalBitsSum = 0;
2470
            // Reset ABR if prev frames are blank to prevent further sudden overflows/ high bit rate spikes.
2471
0
            for (int i = 0; i < s_slidingWindowFrames ; i++)
2472
0
                shrtTermTotalBitsSum += m_encodedBitsWindow[i];
2473
0
            double underflow = (shrtTermTotalBitsSum - shrtTermWantedBits) / abrBuffer;
2474
0
            const double epsilon = 0.0001f;
2475
0
            if ((underflow < epsilon || rce->isFadeEnd) && !isFrameDone)
2476
0
            {
2477
0
                init(*m_curSlice->m_sps);
2478
                // Reduce tune complexity factor for scenes that follow blank frames
2479
0
                double tuneCplxFactor = (m_ncu > 3600 && m_param->rc.cuTree && !m_param->rc.hevcAq) ? 2.5 : m_param->rc.hevcAq ? 1.5 : m_isGrainEnabled ? 1.9 : 1.0;
2480
0
                m_cplxrSum /= tuneCplxFactor;
2481
0
                m_shortTermCplxSum = rce->lastSatd / (CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION);
2482
0
                m_shortTermCplxCount = 1;
2483
0
                m_isAbrReset = true;
2484
0
                m_lastAbrResetPoc = rce->poc;
2485
0
            }
2486
0
        }
2487
0
        else if (m_isAbrReset && isFrameDone)
2488
0
        {
2489
            // Clear flag to reset ABR and continue as usual.
2490
0
            m_isAbrReset = false;
2491
0
        }
2492
0
    }
2493
0
}
2494
2495
void RateControl::hrdFullness(SEIBufferingPeriod *seiBP)
2496
0
{
2497
0
    const VUI* vui = &m_curSlice->m_sps->vuiParameters;
2498
0
    const HRDInfo* hrd = &vui->hrdParameters;
2499
0
    int num = 90000;
2500
0
    int denom = hrd->bitRateValue << (hrd->bitRateScale + BR_SHIFT);
2501
0
    int64_t cpbState = (int64_t)m_bufferFillFinal;
2502
0
    int64_t cpbSize = (int64_t)hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
2503
2504
0
    if (cpbState < 0 || cpbState > cpbSize)
2505
0
    {
2506
0
        x265_log(m_param, X265_LOG_WARNING, "CPB %s: %.0lf bits in a %.0lf-bit buffer\n",
2507
0
                 cpbState < 0 ? "underflow" : "overflow", (float)cpbState, (float)cpbSize);
2508
0
    }
2509
2510
0
    seiBP->m_initialCpbRemovalDelay = (uint32_t)(num * cpbState / denom);
2511
0
    seiBP->m_initialCpbRemovalDelayOffset = (uint32_t)(num * cpbSize / denom - seiBP->m_initialCpbRemovalDelay);
2512
0
}
2513
2514
void RateControl::updateVbvPlan(Encoder* enc)
2515
0
{
2516
0
    m_bufferFill = m_bufferFillFinal;
2517
0
    enc->updateVbvPlan(this);
2518
0
}
2519
2520
double RateControl::predictSize(Predictor *p, double q, double var)
2521
0
{
2522
0
    return (p->coeff * var + p->offset) / (q * p->count);
2523
0
}
2524
2525
double RateControl::tuneQscaleForSBRC(Frame* curFrame, double q)
2526
0
{
2527
0
    int depth = 0;
2528
0
    int framesDoneInSeg = m_framesDone % m_param->keyframeMax;
2529
0
    if (framesDoneInSeg + m_param->lookaheadDepth <= m_param->keyframeMax)
2530
0
        depth = m_param->lookaheadDepth;
2531
0
    else
2532
0
        depth = m_param->keyframeMax - framesDoneInSeg;
2533
0
    for (int iterations = 0; iterations < 1000; iterations++)
2534
0
    {
2535
0
        double totalDuration = m_segDur;
2536
0
        double frameBitsTotal = m_encodedSegmentBits + predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2537
0
        for (int i = 0; i < depth; i++)
2538
0
        {
2539
0
            int type = curFrame->m_lowres.plannedType[i];
2540
0
            if (type == X265_TYPE_AUTO)
2541
0
                break;
2542
0
            int64_t satd = curFrame->m_lowres.plannedSatd[i] >> (X265_DEPTH - 8);
2543
0
            type = IS_X265_TYPE_I(curFrame->m_lowres.plannedType[i]) ? I_SLICE : IS_X265_TYPE_B(curFrame->m_lowres.plannedType[i]) ? B_SLICE : P_SLICE;
2544
0
            int predType = getPredictorType(curFrame->m_lowres.plannedType[i], type);
2545
0
            double curBits = predictSize(&m_pred[predType], q, (double)satd);
2546
0
            frameBitsTotal += curBits;
2547
0
            totalDuration += m_frameDuration;
2548
0
        }
2549
        //Check for segment buffer overflow and adjust QP accordingly
2550
0
        double segDur = m_param->keyframeMax / m_fps;
2551
0
        double allowedSize = m_vbvMaxRate * segDur;
2552
0
        double remDur = segDur - totalDuration;
2553
0
        double remainingBits = frameBitsTotal / totalDuration * remDur;
2554
0
        if (frameBitsTotal + remainingBits > 0.9 * allowedSize)
2555
0
            q = q * 1.01;
2556
0
        else
2557
0
            break;
2558
0
    }
2559
0
    return q;
2560
0
}
2561
2562
double RateControl::clipQscale(Frame* curFrame, RateControlEntry* rce, double q)
2563
0
{
2564
    // B-frames are not directly subject to VBV,
2565
    // since they are controlled by referenced P-frames' QPs.
2566
0
    double lmin = m_lmin[rce->sliceType];
2567
0
    double lmax = m_lmax[rce->sliceType];
2568
0
    double q0 = q;
2569
0
    if (m_isVbv && m_currentSatd > 0 && curFrame)
2570
0
    {
2571
0
        if (m_param->lookaheadDepth || m_param->rc.cuTree ||
2572
0
            (m_param->scenecutThreshold || m_param->bHistBasedSceneCut) ||
2573
0
            (m_param->bFrameAdaptive && m_param->bframes))
2574
0
        {
2575
           /* Lookahead VBV: If lookahead is done, raise the quantizer as necessary
2576
            * such that no frames in the lookahead overflow and such that the buffer
2577
            * is in a reasonable state by the end of the lookahead. */
2578
0
            int loopTerminate = 0;
2579
            /* Avoid an infinite loop. */
2580
0
            for (int iterations = 0; iterations < 1000 && loopTerminate != 3; iterations++)
2581
0
            {
2582
0
                double frameQ[3];
2583
0
                double curBits;
2584
0
                curBits = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2585
0
                double bufferFillCur = m_bufferFill - curBits;
2586
0
                double targetFill;
2587
0
                double totalDuration = m_frameDuration;
2588
0
                frameQ[P_SLICE] = m_sliceType == I_SLICE ? q * m_param->rc.ipFactor : (m_sliceType == B_SLICE ? q / m_param->rc.pbFactor : q);
2589
0
                frameQ[B_SLICE] = frameQ[P_SLICE] * m_param->rc.pbFactor;
2590
0
                frameQ[I_SLICE] = frameQ[P_SLICE] / m_param->rc.ipFactor;
2591
                /* Loop over the planned future frames. */
2592
0
                bool iter = true;
2593
0
                for (int j = 0; bufferFillCur >= 0 && iter ; j++)
2594
0
                {
2595
0
                    int type = curFrame->m_lowres.plannedType[j];
2596
0
                    if (type == X265_TYPE_AUTO || totalDuration >= 1.0)
2597
0
                        break;
2598
0
                    totalDuration += m_frameDuration;
2599
0
                    double wantedFrameSize = m_vbvMaxRate * m_frameDuration;
2600
0
                    if (bufferFillCur + wantedFrameSize <= m_bufferSize)
2601
0
                        bufferFillCur += wantedFrameSize;
2602
0
                    int64_t satd = curFrame->m_lowres.plannedSatd[j] >> (X265_DEPTH - 8);
2603
0
                    type = IS_X265_TYPE_I(type) ? I_SLICE : IS_X265_TYPE_B(type) ? B_SLICE : P_SLICE;
2604
0
                    int predType = getPredictorType(curFrame->m_lowres.plannedType[j], type);
2605
0
                    curBits = predictSize(&m_pred[predType], frameQ[type], (double)satd);
2606
0
                    bufferFillCur -= curBits;
2607
0
                    if (!m_param->bResetZoneConfig && ((uint64_t)j == (m_param->reconfigWindowSize - 1)))
2608
0
                        iter = false;
2609
0
                }
2610
0
                if (rce->vbvEndAdj)
2611
0
                {
2612
0
                    bool loopBreak = false;
2613
0
                    double bufferDiff = m_param->vbvBufferEnd - (m_bufferFill / m_bufferSize);
2614
0
                        if (rce->remainingVbvEndFrames > 0) {
2615
0
                             rce->targetFill = m_bufferFill + m_bufferSize * (bufferDiff / (double)(rce->remainingVbvEndFrames));
2616
0
                        }
2617
0
                        else
2618
0
                             rce->targetFill = m_bufferFill + m_bufferSize * bufferDiff;
2619
0
                        if (bufferFillCur < rce->targetFill)
2620
0
                    {
2621
0
                        q *= 1.01;
2622
0
                        loopTerminate |= 1;
2623
0
                        loopBreak = true;
2624
0
                    }
2625
0
                    if (bufferFillCur > m_param->vbvBufferEnd * m_bufferSize)
2626
0
                    {
2627
0
                        q /= 1.01;
2628
0
                        loopTerminate |= 2;
2629
0
                        loopBreak = true;
2630
0
                    }
2631
0
                    if (!loopBreak)
2632
0
                        break;
2633
0
                }
2634
0
                else
2635
0
                {
2636
                    /* Try to get the buffer at least 50% filled, but don't set an impossible goal. */
2637
0
                    double finalDur = 1;
2638
0
                    if (m_param->rc.bStrictCbr)
2639
0
                    {
2640
0
                        finalDur = x265_clip3(0.4, 1.0, totalDuration);
2641
0
                    }
2642
0
                    targetFill = X265_MIN(m_bufferFill + totalDuration * m_vbvMaxRate * 0.5, m_bufferSize * (m_minBufferFill * finalDur));
2643
0
                    if (bufferFillCur < targetFill)
2644
0
                    {
2645
0
                        q *= 1.01;
2646
0
                        loopTerminate |= 1;
2647
0
                        continue;
2648
0
                    }
2649
                    /* Try to get the buffer not more than 80% filled, but don't set an impossible goal. */
2650
2651
0
                    targetFill = x265_clip3(m_bufferSize * (1 - m_maxBufferFill * finalDur), m_bufferSize, m_bufferFill - totalDuration * m_vbvMaxRate * 0.5);
2652
0
                    if ((m_isCbr || m_2pass) && bufferFillCur > targetFill && !m_isSceneTransition)
2653
0
                    {
2654
0
                        q /= 1.01;
2655
0
                        loopTerminate |= 2;
2656
0
                        continue;
2657
0
                    }
2658
0
                    break;
2659
0
                }
2660
0
            }
2661
0
            q = X265_MAX(q0 / 2, q);
2662
0
        }
2663
0
        else
2664
0
        {
2665
            /* Fallback to old purely-reactive algorithm: no lookahead. */
2666
0
            if ((m_sliceType == P_SLICE || m_sliceType == B_SLICE ||
2667
0
                    (m_sliceType == I_SLICE && m_lastNonBPictType == I_SLICE)) &&
2668
0
                m_bufferFill / m_bufferSize < m_minBufferFill)
2669
0
            {
2670
0
                q /= x265_clip3(0.5, 1.0, 2.0 * m_bufferFill / m_bufferSize);
2671
0
            }
2672
            // Now a hard threshold to make sure the frame fits in VBV.
2673
            // This one is mostly for I-frames.
2674
0
            double bits = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2675
2676
            // For small VBVs, allow the frame to use up the entire VBV.
2677
0
            double maxFillFactor;
2678
0
            maxFillFactor = m_bufferSize >= 5 * m_bufferRate ? 2 : 1;
2679
            // For single-frame VBVs, request that the frame use up the entire VBV.
2680
0
            double minFillFactor = m_singleFrameVbv ? 1 : 2;
2681
2682
0
            for (int iterations = 0; iterations < 10; iterations++)
2683
0
            {
2684
0
                double qf = 1.0;
2685
0
                if (bits > m_bufferFill / maxFillFactor)
2686
0
                    qf = x265_clip3(0.2, 1.0, m_bufferFill / (maxFillFactor * bits));
2687
0
                q /= qf;
2688
0
                bits *= qf;
2689
0
                if (bits < m_bufferRate / minFillFactor)
2690
0
                    q *= bits * minFillFactor / m_bufferRate;
2691
0
                bits = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2692
0
            }
2693
2694
0
            q = X265_MAX(q0, q);
2695
0
        }
2696
2697
        /* Apply MinCR restrictions */
2698
0
        double pbits = predictSize(&m_pred[m_predType], q, (double)m_currentSatd);
2699
0
        if (pbits > rce->frameSizeMaximum)
2700
0
            q *= pbits / rce->frameSizeMaximum;
2701
        /* To detect frames that are more complex in SATD costs compared to prev window, yet 
2702
         * lookahead vbv reduces its qscale by half its value. Be on safer side and avoid drastic 
2703
         * qscale reductions for frames high in complexity */
2704
0
        bool mispredCheck = rce->movingAvgSum && m_currentSatd >= rce->movingAvgSum && q <= q0 / 2;
2705
0
        if (!m_isCbr || ((m_isAbr || m_2pass) && mispredCheck))
2706
0
            q = X265_MAX(q0, q);
2707
2708
0
        if (m_rateFactorMaxIncrement)
2709
0
        {
2710
0
            double qpNoVbv = x265_qScale2qp(q0);
2711
0
            double qmax = X265_MIN(lmax,x265_qp2qScale(qpNoVbv + m_rateFactorMaxIncrement));
2712
0
            return x265_clip3(lmin, qmax, q);
2713
0
        }
2714
0
    }
2715
0
    if (!curFrame && m_2pass)
2716
0
    {
2717
0
        double min = log(lmin);
2718
0
        double max = log(lmax);
2719
0
        q = (log(q) - min) / (max - min) - 0.5;
2720
0
        q = 1.0 / (1.0 + exp(-4 * q));
2721
0
        q = q*(max - min) + min;
2722
0
        return exp(q);
2723
0
    }
2724
0
    return x265_clip3(lmin, lmax, q);
2725
0
}
2726
2727
double RateControl::predictRowsSizeSum(Frame* curFrame, RateControlEntry* rce, double qpVbv, int32_t& encodedBitsSoFar)
2728
0
{
2729
0
    uint32_t rowSatdCostSoFar = 0, totalSatdBits = 0;
2730
0
    encodedBitsSoFar = 0;
2731
2732
0
    double qScale = x265_qp2qScale(qpVbv);
2733
0
    FrameData& curEncData = *curFrame->m_encData;
2734
0
    int picType = curEncData.m_slice->m_sliceType;
2735
0
    Frame* refFrame = curEncData.m_slice->m_refFrameList[0][0];
2736
2737
0
    uint32_t maxRows = curEncData.m_slice->m_sps->numCuInHeight;
2738
0
    uint32_t maxCols = curEncData.m_slice->m_sps->numCuInWidth;
2739
2740
0
    for (uint32_t row = 0; row < maxRows; row++)
2741
0
    {
2742
0
        encodedBitsSoFar += curEncData.m_rowStat[row].encodedBits;
2743
0
        rowSatdCostSoFar = curEncData.m_rowStat[row].rowSatd;
2744
0
        uint32_t satdCostForPendingCus = curEncData.m_rowStat[row].satdForVbv - rowSatdCostSoFar;
2745
0
        satdCostForPendingCus >>= X265_DEPTH - 8;
2746
0
        if (satdCostForPendingCus  > 0)
2747
0
        {
2748
0
            double pred_s = predictSize(rce->rowPred[0], qScale, satdCostForPendingCus);
2749
0
            uint32_t refRowSatdCost = 0, refRowBits = 0, intraCostForPendingCus = 0;
2750
0
            double refQScale = 0;
2751
2752
0
            if (picType != I_SLICE && !m_param->rc.bEnableConstVbv)
2753
0
            {
2754
0
                FrameData& refEncData = *refFrame->m_encData;
2755
0
                uint32_t endCuAddr = maxCols * (row + 1);
2756
0
                uint32_t startCuAddr = curEncData.m_rowStat[row].numEncodedCUs;
2757
0
                if (startCuAddr)
2758
0
                {
2759
0
                    for (uint32_t cuAddr = startCuAddr + 1 ; cuAddr < endCuAddr; cuAddr++)
2760
0
                    {
2761
0
                        refRowSatdCost += refEncData.m_cuStat[cuAddr].vbvCost;
2762
0
                        refRowBits += refEncData.m_cuStat[cuAddr].totalBits;
2763
0
                    }
2764
0
                }
2765
0
                else
2766
0
                {
2767
0
                    refRowBits = refEncData.m_rowStat[row].encodedBits;
2768
0
                    refRowSatdCost = refEncData.m_rowStat[row].satdForVbv;
2769
0
                }
2770
2771
0
                refRowSatdCost >>= X265_DEPTH - 8;
2772
0
                refQScale = refEncData.m_rowStat[row].rowQpScale;
2773
0
            }
2774
2775
0
            if (picType == I_SLICE || qScale >= refQScale)
2776
0
            {
2777
0
                if (picType == P_SLICE 
2778
0
                    && refFrame 
2779
0
                    && refFrame->m_encData->m_slice->m_sliceType == picType
2780
0
                    && refQScale > 0
2781
0
                    && refRowBits > 0
2782
0
                    && !m_param->rc.bEnableConstVbv)
2783
0
                {
2784
0
                    if (abs((int32_t)(refRowSatdCost - satdCostForPendingCus)) < (int32_t)satdCostForPendingCus / 2)
2785
0
                    {
2786
0
                        double predTotal = refRowBits * satdCostForPendingCus / refRowSatdCost * refQScale / qScale;
2787
0
                        totalSatdBits += (int32_t)((pred_s + predTotal) * 0.5);
2788
0
                        continue;
2789
0
                    }
2790
0
                }
2791
0
                totalSatdBits += (int32_t)pred_s;
2792
0
            }
2793
0
            else if (picType == P_SLICE)
2794
0
            {
2795
0
                intraCostForPendingCus = curEncData.m_rowStat[row].intraSatdForVbv - curEncData.m_rowStat[row].rowIntraSatd;
2796
0
                intraCostForPendingCus >>= X265_DEPTH - 8;
2797
                /* Our QP is lower than the reference! */
2798
0
                double pred_intra = predictSize(rce->rowPred[1], qScale, intraCostForPendingCus);
2799
                /* Sum: better to overestimate than underestimate by using only one of the two predictors. */
2800
0
                totalSatdBits += (int32_t)(pred_intra + pred_s);
2801
0
            }
2802
0
            else
2803
0
                totalSatdBits += (int32_t)pred_s;
2804
0
        }
2805
0
    }
2806
2807
0
    return totalSatdBits + encodedBitsSoFar;
2808
0
}
2809
2810
int RateControl::rowVbvRateControl(Frame* curFrame, uint32_t row, RateControlEntry* rce, double& qpVbv, uint32_t* m_sliceBaseRow, uint32_t sliceId)
2811
0
{
2812
0
    FrameData& curEncData = *curFrame->m_encData;
2813
0
    double qScaleVbv = x265_qp2qScale(qpVbv);
2814
0
    uint64_t rowSatdCost = curEncData.m_rowStat[row].rowSatd;
2815
0
    double encodedBits = curEncData.m_rowStat[row].encodedBits;
2816
2817
0
    rowSatdCost >>= X265_DEPTH - 8;
2818
0
    updatePredictor(rce->rowPred[0], qScaleVbv, (double)rowSatdCost, encodedBits);
2819
0
    if (curEncData.m_slice->m_sliceType != I_SLICE && !m_param->rc.bEnableConstVbv)
2820
0
    {
2821
0
        Frame* refFrame = curEncData.m_slice->m_refFrameList[0][0];
2822
0
        if (qpVbv < refFrame->m_encData->m_rowStat[row].rowQp)
2823
0
        {
2824
0
            uint64_t intraRowSatdCost = curEncData.m_rowStat[row].rowIntraSatd;
2825
0
            intraRowSatdCost >>= X265_DEPTH - 8;
2826
0
            updatePredictor(rce->rowPred[1], qScaleVbv, (double)intraRowSatdCost, encodedBits);
2827
0
        }
2828
0
    }
2829
2830
0
    int canReencodeRow = 1;
2831
    /* tweak quality based on difference from predicted size */
2832
0
    double prevRowQp = qpVbv;
2833
0
    double qpAbsoluteMax = m_param->rc.qpMax;
2834
0
    double qpAbsoluteMin = m_param->rc.qpMin;
2835
0
    if (m_rateFactorMaxIncrement)
2836
0
        qpAbsoluteMax = X265_MIN(qpAbsoluteMax, rce->qpNoVbv + m_rateFactorMaxIncrement);
2837
2838
0
    if (m_rateFactorMaxDecrement)
2839
0
        qpAbsoluteMin = X265_MAX(qpAbsoluteMin, rce->qpNoVbv - m_rateFactorMaxDecrement);
2840
2841
0
    double qpMax = X265_MIN(prevRowQp + m_param->rc.qpStep, qpAbsoluteMax);
2842
0
    double qpMin = X265_MAX(prevRowQp - m_param->rc.qpStep, qpAbsoluteMin);
2843
0
    double stepSize = 0.5;
2844
0
    double bufferLeftPlanned = rce->bufferFill - rce->frameSizePlanned;
2845
2846
0
    const SPS& sps = *curEncData.m_slice->m_sps;
2847
0
    double maxFrameError = X265_MAX(0.05, 1.0 / sps.numCuInHeight);
2848
2849
0
    if (row < m_sliceBaseRow[sliceId + 1] - 1)
2850
0
    {
2851
        /* More threads means we have to be more cautious in letting ratecontrol use up extra bits. */
2852
0
        double rcTol = bufferLeftPlanned / m_param->frameNumThreads * m_rateTolerance;
2853
0
        int32_t encodedBitsSoFar = 0;
2854
0
        double accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2855
0
        double vbvEndBias = 0.95;
2856
2857
        /* * Don't increase the row QPs until a sufficent amount of the bits of
2858
         * the frame have been processed, in case a flat area at the top of the
2859
         * frame was measured inaccurately. */
2860
0
        if (encodedBitsSoFar < 0.05f * rce->frameSizePlanned)
2861
0
            qpMax = qpAbsoluteMax = prevRowQp;
2862
2863
0
        if (rce->sliceType != I_SLICE || (m_param->rc.bStrictCbr && rce->poc > 0))
2864
0
            rcTol *= 0.5;
2865
2866
0
        if (!m_isCbr)
2867
0
            qpMin = X265_MAX(qpMin, rce->qpNoVbv);
2868
2869
0
        double totalBitsNeeded = m_wantedBitsWindow;
2870
0
        if (m_param->totalFrames)
2871
0
            totalBitsNeeded = (m_param->totalFrames * m_bitrate) / m_fps;
2872
0
        double abrOvershoot = (accFrameBits + m_totalBits - m_wantedBitsWindow) / totalBitsNeeded;
2873
2874
0
        while (qpVbv < qpMax
2875
0
               && (((accFrameBits > rce->frameSizePlanned + rcTol) ||
2876
0
                   (rce->bufferFill - accFrameBits < bufferLeftPlanned * 0.5) ||
2877
0
                   (accFrameBits > rce->frameSizePlanned && qpVbv < rce->qpNoVbv) ||
2878
0
                   (rce->vbvEndAdj && ((rce->bufferFill - accFrameBits) < (rce->targetFill * vbvEndBias))))
2879
0
                   && (!m_param->rc.bStrictCbr ? 1 : abrOvershoot > 0.1)))
2880
0
        {
2881
0
            qpVbv += stepSize;
2882
0
            accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2883
0
            abrOvershoot = (accFrameBits + m_totalBits - m_wantedBitsWindow) / totalBitsNeeded;
2884
0
        }
2885
2886
0
        while (qpVbv > qpMin
2887
0
               && (qpVbv > curEncData.m_rowStat[0].rowQp || m_singleFrameVbv)
2888
0
               && (((accFrameBits < rce->frameSizePlanned * 0.8f && qpVbv <= prevRowQp)
2889
0
                   || accFrameBits < (rce->bufferFill - m_bufferSize + m_bufferRate) * 1.1
2890
0
                   || (rce->vbvEndAdj && ((rce->bufferFill - accFrameBits) > (rce->targetFill * vbvEndBias))))
2891
0
                   && (!m_param->rc.bStrictCbr ? 1 : abrOvershoot < 0)))
2892
0
        {
2893
0
            qpVbv -= stepSize;
2894
0
            accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2895
0
            abrOvershoot = (accFrameBits + m_totalBits - m_wantedBitsWindow) / totalBitsNeeded;
2896
0
        }
2897
2898
0
        if (m_param->rc.bStrictCbr && m_param->totalFrames)
2899
0
        {
2900
0
            double timeDone = (double)(m_framesDone) / m_param->totalFrames;
2901
0
            while (qpVbv < qpMax && (qpVbv < rce->qpNoVbv + (m_param->rc.qpStep * timeDone)) &&
2902
0
                   (timeDone > 0.75 && abrOvershoot > 0))
2903
0
            {
2904
0
                qpVbv += stepSize;
2905
0
                accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2906
0
                abrOvershoot = (accFrameBits + m_totalBits - m_wantedBitsWindow) / totalBitsNeeded;
2907
0
            }
2908
0
            if (qpVbv > curEncData.m_rowStat[0].rowQp &&
2909
0
                abrOvershoot < -0.1 && timeDone > 0.5 && accFrameBits < rce->frameSizePlanned - rcTol)
2910
0
            {
2911
0
                qpVbv -= stepSize;
2912
0
                accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2913
0
            }
2914
0
        }
2915
2916
        /* avoid VBV underflow or MinCr violation */
2917
0
        while ((qpVbv < qpAbsoluteMax)
2918
0
               && ((rce->bufferFill - accFrameBits < m_bufferRate * maxFrameError) ||
2919
0
                   (rce->frameSizeMaximum - accFrameBits < rce->frameSizeMaximum * maxFrameError)))
2920
0
        {
2921
0
            qpVbv += stepSize;
2922
0
            accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2923
0
        }
2924
2925
0
        rce->frameSizeEstimated = accFrameBits;
2926
2927
        /* If the current row was large enough to cause a large QP jump, try re-encoding it. */
2928
0
        if (qpVbv > qpMax && prevRowQp < qpMax && canReencodeRow)
2929
0
        {
2930
            /* Bump QP to halfway in between... close enough. */
2931
0
            qpVbv = x265_clip3(prevRowQp + 1.0f, qpMax, (prevRowQp + qpVbv) * 0.5);
2932
0
            return -1;
2933
0
        }
2934
2935
0
        if (m_param->rc.rfConstantMin)
2936
0
        {
2937
0
            if (qpVbv < qpMin && prevRowQp > qpMin && canReencodeRow)
2938
0
            {
2939
0
                qpVbv = x265_clip3(qpMin, prevRowQp, (prevRowQp + qpVbv) * 0.5);
2940
0
                return -1;
2941
0
            }
2942
0
        }
2943
0
    }
2944
0
    else
2945
0
    {
2946
0
        int32_t encodedBitsSoFar = 0;
2947
0
        rce->frameSizeEstimated = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
2948
2949
        /* Last-ditch attempt: if the last row of the frame underflowed the VBV,
2950
         * try again. */
2951
0
        if ((rce->frameSizeEstimated > (rce->bufferFill - m_bufferRate * maxFrameError) &&
2952
0
             qpVbv < qpMax && canReencodeRow))
2953
0
        {
2954
0
            qpVbv = qpMax;
2955
0
            return -1;
2956
0
        }
2957
0
    }
2958
0
    return 0;
2959
0
}
2960
2961
/* modify the bitrate curve from pass1 for one frame */
2962
double RateControl::getQScale(RateControlEntry *rce, double rateFactor)
2963
0
{
2964
0
    double q;
2965
2966
0
    if (m_param->rc.cuTree && !m_param->rc.hevcAq)
2967
0
    {
2968
        // Scale and units are obtained from rateNum and rateDenom for videos with fixed frame rates.
2969
0
        double timescale = (double)m_param->fpsDenom / (2 * m_param->fpsNum);
2970
0
        q = pow(BASE_FRAME_DURATION / CLIP_DURATION(2 * timescale), 1 - m_param->rc.qCompress);
2971
0
    }
2972
0
    else
2973
0
        q = pow(rce->blurredComplexity, 1 - m_param->rc.qCompress);
2974
2975
    // avoid NaN's in the Rceq
2976
0
    if (rce->coeffBits + rce->mvBits == 0)
2977
0
        q = m_lastQScaleFor[rce->sliceType];
2978
0
    else
2979
0
    {
2980
0
        m_lastRceq = q;
2981
0
        q /= rateFactor;
2982
0
    }
2983
2984
0
    return q;
2985
0
}
2986
2987
void RateControl::updatePredictor(Predictor *p, double q, double var, double bits)
2988
0
{
2989
0
    if (var < 10)
2990
0
        return;
2991
0
    const double range = 2;
2992
0
    double old_coeff = p->coeff / p->count;
2993
0
    double old_offset = p->offset / p->count;
2994
0
    double new_coeff = X265_MAX((bits * q - old_offset) / var, p->coeffMin );
2995
0
    double new_coeff_clipped = x265_clip3(old_coeff / range, old_coeff * range, new_coeff);
2996
0
    double new_offset = bits * q - new_coeff_clipped * var;
2997
0
    if (new_offset >= 0)
2998
0
        new_coeff = new_coeff_clipped;
2999
0
    else
3000
0
        new_offset = 0;
3001
0
    p->count  *= p->decay;
3002
0
    p->coeff  *= p->decay;
3003
0
    p->offset *= p->decay;
3004
0
    p->count++;
3005
0
    p->coeff  += new_coeff;
3006
0
    p->offset += new_offset;
3007
0
}
3008
3009
int RateControl::updateVbv(int64_t bits, RateControlEntry* rce)
3010
0
{
3011
0
    int predType = rce->sliceType;
3012
0
    int filler = 0;
3013
0
    double bufferBits;
3014
0
    predType = rce->sliceType == B_SLICE && rce->keptAsRef ? 3 : predType;
3015
0
    if (rce->lastSatd >= m_ncu && rce->encodeOrder >= m_lastPredictorReset)
3016
0
        updatePredictor(&m_pred[predType], x265_qp2qScale(rce->qpaRc), (double)rce->lastSatd, (double)bits);
3017
0
    if (!m_isVbv)
3018
0
        return 0;
3019
3020
0
    m_bufferFillFinal -= bits;
3021
3022
0
    if (m_bufferFillFinal < 0)
3023
0
        x265_log(m_param, X265_LOG_WARNING, "poc:%d, VBV underflow (%.0f bits)\n", rce->poc, m_bufferFillFinal);
3024
3025
0
    m_bufferFillFinal = X265_MAX(m_bufferFillFinal, 0);
3026
0
    m_bufferFillFinal += rce->bufferRate;
3027
0
    if (m_param->csvLogLevel >= 2)
3028
0
        m_unclippedBufferFillFinal = m_bufferFillFinal;
3029
3030
0
    if (m_param->rc.bStrictCbr)
3031
0
    {
3032
0
        if (m_bufferFillFinal > m_bufferSize)
3033
0
        {
3034
0
            filler = (int)(m_bufferFillFinal - m_bufferSize);
3035
0
            filler += FILLER_OVERHEAD * 8;
3036
0
        }
3037
0
        m_bufferFillFinal -= filler;
3038
0
        bufferBits = X265_MIN(bits + filler + m_bufferExcess, rce->bufferRate);
3039
0
        m_bufferExcess = X265_MAX(m_bufferExcess - bufferBits + bits + filler, 0);
3040
0
        m_bufferFillActual += bufferBits - bits - filler;
3041
0
    }
3042
0
    else
3043
0
    {
3044
0
        m_bufferFillFinal = X265_MIN(m_bufferFillFinal, m_bufferSize);
3045
0
        bufferBits = X265_MIN(bits + m_bufferExcess, rce->bufferRate);
3046
0
        m_bufferExcess = X265_MAX(m_bufferExcess - bufferBits + bits, 0);
3047
0
        m_bufferFillActual += bufferBits - bits;
3048
0
        m_bufferFillActual = X265_MIN(m_bufferFillActual, m_bufferSize);
3049
0
    }
3050
0
    return filler;
3051
0
}
3052
3053
/* After encoding one frame, update rate control state */
3054
int RateControl::rateControlEnd(Frame* curFrame, int64_t bits, RateControlEntry* rce, int *filler)
3055
0
{
3056
0
    int orderValue = m_startEndOrder.get();
3057
0
    int endOrdinal = (rce->encodeOrder + m_param->frameNumThreads) * 2 - 1;
3058
0
    while (orderValue < endOrdinal && !m_bTerminated)
3059
0
    {
3060
        /* no more frames are being encoded, so fake the start event if we would
3061
         * have blocked on it. Note that this does not enforce rateControlEnd()
3062
         * ordering during flush, but this has no impact on the outputs */
3063
0
        if (m_finalFrameCount && orderValue >= 2 * m_finalFrameCount)
3064
0
            break;
3065
0
        orderValue = m_startEndOrder.waitForChange(orderValue);
3066
0
    }
3067
3068
0
    FrameData& curEncData = *curFrame->m_encData;
3069
0
    int64_t actualBits = bits;
3070
0
    Slice *slice = curEncData.m_slice;
3071
0
    bool bEnableDistOffset = m_param->analysisMultiPassDistortion && m_param->rc.bStatRead;
3072
3073
0
    if (m_param->rc.aqMode || m_isVbv || m_param->bAQMotion || bEnableDistOffset)
3074
0
    {
3075
0
        if (m_isVbv && !(m_2pass && m_param->rc.rateControlMode == X265_RC_CRF && !m_param->rc.bEncFocusedFramesOnly))
3076
0
        {
3077
0
            double avgQpRc = 0;
3078
            /* determine avg QP decided by VBV rate control */
3079
0
            for (uint32_t i = 0; i < slice->m_sps->numCuInHeight; i++)
3080
0
                avgQpRc += curEncData.m_rowStat[i].sumQpRc;
3081
3082
0
            avgQpRc /= slice->m_sps->numCUsInFrame;
3083
0
            curEncData.m_avgQpRc = x265_clip3((double)m_param->rc.qpMin, (double)m_param->rc.qpMax, avgQpRc);
3084
0
            rce->qpaRc = curEncData.m_avgQpRc;
3085
0
        }
3086
3087
0
        if (m_param->rc.aqMode || m_param->bAQMotion || bEnableDistOffset)
3088
0
        {
3089
0
            double avgQpAq = 0;
3090
            /* determine actual avg encoded QP, after AQ/cutree/distortion adjustments */
3091
0
            for (uint32_t i = 0; i < slice->m_sps->numCuInHeight; i++)
3092
0
                avgQpAq += curEncData.m_rowStat[i].sumQpAq;
3093
3094
0
            avgQpAq /= (slice->m_sps->numCUsInFrame * m_param->num4x4Partitions);
3095
0
            curEncData.m_avgQpAq = avgQpAq;
3096
0
        }
3097
0
        else
3098
0
            curEncData.m_avgQpAq = curEncData.m_avgQpRc;
3099
0
    }
3100
3101
0
    if (m_isAbr)
3102
0
    {
3103
0
        if (m_param->rc.rateControlMode == X265_RC_ABR && !m_param->rc.bStatRead)
3104
0
            checkAndResetABR(rce, true);
3105
0
    }
3106
0
    if (m_param->rc.rateControlMode == X265_RC_CRF)
3107
0
    {
3108
0
        double crfVal, qpRef = curEncData.m_avgQpRc;
3109
3110
0
        bool is2passCrfChange = false;
3111
0
        if (m_2pass && !m_param->rc.bEncFocusedFramesOnly)
3112
0
        {
3113
0
            if (fabs(curEncData.m_avgQpRc - rce->qpPrev) > 0.1)
3114
0
            {
3115
0
                qpRef = rce->qpPrev;
3116
0
                is2passCrfChange = true;
3117
0
            }
3118
0
        }
3119
0
        if (is2passCrfChange || fabs(qpRef - rce->qpNoVbv) > 0.5)
3120
0
        {
3121
0
            double crfFactor = rce->qRceq /x265_qp2qScale(qpRef);
3122
0
            double baseCplx = m_ncu * (m_param->bframes ? 120 : 80);
3123
0
            double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;
3124
0
            crfVal = x265_qScale2qp(pow(baseCplx, 1 - m_qCompress) / crfFactor) - mbtree_offset;
3125
0
        }
3126
0
        else
3127
0
        {
3128
0
            if (m_bRcReConfig)
3129
0
                crfVal = curFrame->m_targetCrf;
3130
0
            else
3131
0
                crfVal = rce->sliceType == I_SLICE ? (m_param->rc.rfConstant - m_ipOffset) :
3132
0
                (rce->sliceType == B_SLICE ? (m_param->rc.rfConstant + m_pbOffset) : m_param->rc.rfConstant);
3133
0
        }
3134
3135
0
        curEncData.m_rateFactor = crfVal;
3136
0
    }
3137
3138
0
    if (m_isAbr && !m_isAbrReset)
3139
0
    {
3140
        /* amortize part of each I slice over the next several frames, up to
3141
         * keyint-max, to avoid over-compensating for the large I slice cost */
3142
0
        if (!m_param->rc.bStatWrite && !m_param->rc.bStatRead)
3143
0
        {
3144
0
            if (rce->sliceType == I_SLICE)
3145
0
            {
3146
                /* previous I still had a residual; roll it into the new loan */
3147
0
                if (m_residualFrames)
3148
0
                    bits += m_residualCost * m_residualFrames;
3149
0
                m_residualFrames = X265_MIN((int)rce->amortizeFrames, m_param->keyframeMax);
3150
0
                m_residualCost = (int)((bits * rce->amortizeFraction) / m_residualFrames);
3151
0
                bits -= m_residualCost * m_residualFrames;
3152
0
            }
3153
0
            else if (m_residualFrames)
3154
0
            {
3155
0
                bits += m_residualCost;
3156
0
                m_residualFrames--;
3157
0
            }
3158
0
        }
3159
0
        if (rce->sliceType != B_SLICE)
3160
0
        {
3161
            /* The factor 1.5 is to tune up the actual bits, otherwise the cplxrSum is scaled too low
3162
                * to improve short term compensation for next frame. */
3163
0
            m_cplxrSum += (bits * x265_qp2qScale(rce->qpaRc) / rce->qRceq) - (rce->rowCplxrSum);
3164
0
        }
3165
0
        else
3166
0
        {
3167
            /* Depends on the fact that B-frame's QP is an offset from the following P-frame's.
3168
                * Not perfectly accurate with B-refs, but good enough. */
3169
0
            m_cplxrSum += (bits * x265_qp2qScale(rce->qpaRc) / (rce->qRceq * fabs(m_param->rc.pbFactor))) - (rce->rowCplxrSum);
3170
0
        }
3171
0
        m_wantedBitsWindow += m_frameDuration * (m_bRcReConfig ? (curFrame->m_targetBitrate * 1000) : m_bitrate);
3172
0
        m_totalBits += bits - rce->rowTotalBits;
3173
0
        m_encodedBits += actualBits;
3174
0
        m_encodedSegmentBits += actualBits;
3175
0
        m_segDur += m_frameDuration;
3176
0
        int pos = m_sliderPos - m_param->frameNumThreads;
3177
0
        if (pos >= 0)
3178
0
            m_encodedBitsWindow[pos % s_slidingWindowFrames] = actualBits;
3179
0
        if(rce->sliceType != I_SLICE)
3180
0
        {
3181
0
            int qp = int (rce->qpaRc + 0.5);
3182
0
            m_qpToEncodedBits[qp] =  m_qpToEncodedBits[qp] == 0 ? actualBits : (m_qpToEncodedBits[qp] + actualBits) * 0.5;
3183
0
        }
3184
0
        curFrame->m_rcData->wantedBitsWindow = m_wantedBitsWindow;
3185
0
        curFrame->m_rcData->cplxrSum = m_cplxrSum;
3186
0
        curFrame->m_rcData->totalBits = m_totalBits;
3187
0
        curFrame->m_rcData->encodedBits = m_encodedBits;
3188
0
    }
3189
3190
0
    if (m_2pass)
3191
0
    {
3192
0
        m_expectedBitsSum += qScale2bits(rce, x265_qp2qScale(rce->newQp));
3193
0
        m_totalBits += bits - rce->rowTotalBits;
3194
0
    }
3195
3196
0
    if (m_isVbv)
3197
0
    {
3198
0
        *filler = updateVbv(actualBits, rce);
3199
3200
0
        curFrame->m_rcData->bufferFillFinal = m_bufferFillFinal;
3201
0
        for (int i = 0; i < 4; i++)
3202
0
        {
3203
0
            curFrame->m_rcData->coeff[i] = m_pred[i].coeff;
3204
0
            curFrame->m_rcData->count[i] = m_pred[i].count;
3205
0
            curFrame->m_rcData->offset[i] = m_pred[i].offset;
3206
0
        }
3207
0
        if (m_param->bEmitHRDSEI)
3208
0
        {
3209
0
            const VUI *vui = &curEncData.m_slice->m_sps->vuiParameters;
3210
0
            const HRDInfo *hrd = &vui->hrdParameters;
3211
0
            const TimingInfo *time = &vui->timingInfo;
3212
0
            if (!curFrame->m_poc)
3213
0
            {
3214
                // first access unit initializes the HRD
3215
0
                rce->hrdTiming->cpbInitialAT = 0;
3216
0
                rce->hrdTiming->cpbRemovalTime = m_nominalRemovalTime = (double)m_bufPeriodSEI.m_initialCpbRemovalDelay / 90000;
3217
0
            }
3218
0
            else
3219
0
            {
3220
0
                rce->hrdTiming->cpbRemovalTime = m_nominalRemovalTime + (double)rce->picTimingSEI->m_auCpbRemovalDelay * time->numUnitsInTick / time->timeScale;
3221
0
                double cpbEarliestAT = rce->hrdTiming->cpbRemovalTime - (double)m_bufPeriodSEI.m_initialCpbRemovalDelay / 90000;
3222
0
                if (!curFrame->m_lowres.bKeyframe)
3223
0
                    cpbEarliestAT -= (double)m_bufPeriodSEI.m_initialCpbRemovalDelayOffset / 90000;
3224
3225
0
                rce->hrdTiming->cpbInitialAT = hrd->cbrFlag ? m_prevCpbFinalAT : X265_MAX(m_prevCpbFinalAT, cpbEarliestAT);
3226
0
            }
3227
0
            int filler_bits = *filler ? (*filler - START_CODE_OVERHEAD * 8)  : 0; 
3228
0
            uint32_t cpbsizeUnscale = hrd->cpbSizeValue << (hrd->cpbSizeScale + CPB_SHIFT);
3229
0
            rce->hrdTiming->cpbFinalAT = m_prevCpbFinalAT = rce->hrdTiming->cpbInitialAT + (actualBits + filler_bits)/ cpbsizeUnscale;
3230
0
            rce->hrdTiming->dpbOutputTime = (double)rce->picTimingSEI->m_picDpbOutputDelay * time->numUnitsInTick / time->timeScale + rce->hrdTiming->cpbRemovalTime;
3231
0
        }
3232
0
    }
3233
0
    rce->isActive = false;
3234
    // Allow rateControlStart of next frame only when rateControlEnd of previous frame is over
3235
0
    m_startEndOrder.incr();
3236
0
    return 0;
3237
0
}
3238
3239
/* called to write out the rate control frame stats info in multipass encodes */
3240
int RateControl::writeRateControlFrameStats(Frame* curFrame, RateControlEntry* rce)
3241
0
{
3242
0
    FrameData& curEncData = *curFrame->m_encData;    
3243
0
    int ncu = (m_param->rc.qgSize == 8) ? m_ncu * 4 : m_ncu;
3244
0
    char cType = rce->sliceType == I_SLICE ? (curFrame->m_lowres.sliceType == X265_TYPE_IDR ? 'I' : 'i')
3245
0
        : rce->sliceType == P_SLICE ? 'P'
3246
0
        : IS_REFERENCED(curFrame) ? 'B' : 'b';
3247
    
3248
0
    if (!curEncData.m_param->bMultiPassOptRPS)
3249
0
    {
3250
0
        if (fprintf(m_statFileOut,
3251
0
            "in:%d out:%d type:%c q:%.2f q-aq:%.2f q-noVbv:%.2f q-Rceq:%.2f tex:%d mv:%d misc:%d icu:%.2f pcu:%.2f scu:%.2f sc:%d ;\n",
3252
0
            rce->poc, rce->encodeOrder,
3253
0
            cType, curEncData.m_avgQpRc, curEncData.m_avgQpAq,
3254
0
            rce->qpNoVbv, rce->qRceq,
3255
0
            curFrame->m_encData->m_frameStats.coeffBits,
3256
0
            curFrame->m_encData->m_frameStats.mvBits,
3257
0
            curFrame->m_encData->m_frameStats.miscBits,
3258
0
            curFrame->m_encData->m_frameStats.percent8x8Intra * m_ncu,
3259
0
            curFrame->m_encData->m_frameStats.percent8x8Inter * m_ncu,
3260
0
            curFrame->m_encData->m_frameStats.percent8x8Skip  * m_ncu,
3261
0
            curFrame->m_lowres.bScenecut) < 0)
3262
0
            goto writeFailure;
3263
0
    }
3264
0
    else
3265
0
    {
3266
0
        RPS* rpsWriter = &curFrame->m_encData->m_slice->m_rps;
3267
0
        int i, num = rpsWriter->numberOfPictures;
3268
0
        char deltaPOC[128];
3269
0
        char bUsed[40];
3270
0
        memset(deltaPOC, 0, sizeof(deltaPOC));
3271
0
        memset(bUsed, 0, sizeof(bUsed));
3272
0
        snprintf(deltaPOC, sizeof(deltaPOC), "deltapoc:~");
3273
0
        snprintf(bUsed, sizeof(bUsed), "bused:~");
3274
3275
0
        for (i = 0; i < num; i++)
3276
0
        {
3277
0
            snprintf(deltaPOC + strlen(deltaPOC), sizeof(deltaPOC) - strlen(deltaPOC), "%d~", rpsWriter->deltaPOC[i]);
3278
0
            snprintf(bUsed + strlen(bUsed), sizeof(bUsed) - strlen(bUsed), "%d~", rpsWriter->bUsed[i]);
3279
0
        }
3280
3281
0
        if (fprintf(m_statFileOut,
3282
0
            "in:%d out:%d type:%c q:%.2f q-aq:%.2f q-noVbv:%.2f q-Rceq:%.2f tex:%d mv:%d misc:%d icu:%.2f pcu:%.2f scu:%.2f nump:%d numnegp:%d numposp:%d %s %s ;\n",
3283
0
            rce->poc, rce->encodeOrder,
3284
0
            cType, curEncData.m_avgQpRc, curEncData.m_avgQpAq,
3285
0
            rce->qpNoVbv, rce->qRceq,
3286
0
            curFrame->m_encData->m_frameStats.coeffBits,
3287
0
            curFrame->m_encData->m_frameStats.mvBits,
3288
0
            curFrame->m_encData->m_frameStats.miscBits,
3289
0
            curFrame->m_encData->m_frameStats.percent8x8Intra * m_ncu,
3290
0
            curFrame->m_encData->m_frameStats.percent8x8Inter * m_ncu,
3291
0
            curFrame->m_encData->m_frameStats.percent8x8Skip  * m_ncu,
3292
0
            rpsWriter->numberOfPictures,
3293
0
            rpsWriter->numberOfNegativePictures,
3294
0
            rpsWriter->numberOfPositivePictures,
3295
0
            deltaPOC, bUsed) < 0)
3296
0
            goto writeFailure;
3297
0
    }
3298
    /* Don't re-write the data in multi-pass mode. */
3299
0
    if (m_param->rc.cuTree && IS_REFERENCED(curFrame) && !m_param->rc.bStatRead)
3300
0
    {
3301
0
        uint8_t sliceType = (uint8_t)rce->sliceType;
3302
0
        primitives.fix8Pack(m_cuTreeStats.qpBuffer[0], curFrame->m_lowres.qpCuTreeOffset, ncu);
3303
3304
0
        if (X265_SHARE_MODE_FILE == m_param->rc.dataShareMode)
3305
0
        {
3306
0
            if (fwrite(&sliceType, 1, 1, m_cutreeStatFileOut) < 1)
3307
0
                goto writeFailure;
3308
0
            if (fwrite(m_cuTreeStats.qpBuffer[0], sizeof(uint16_t), ncu, m_cutreeStatFileOut) < (size_t)ncu)
3309
0
                goto writeFailure;
3310
0
        }
3311
0
        else // X265_SHARE_MODE_SHAREDMEM == m_param->rc.dataShareMode
3312
0
        {
3313
0
            if (!m_cutreeShrMem)
3314
0
            {
3315
0
                goto writeFailure;
3316
0
            }
3317
3318
0
            CUTreeSharedDataItem shrItem;
3319
0
            shrItem.type = &sliceType;
3320
0
            shrItem.stats = m_cuTreeStats.qpBuffer[0];
3321
0
            m_cutreeShrMem->writeData(&shrItem, WriteSharedCUTreeData);
3322
0
        } 
3323
0
    }
3324
0
    return 0;
3325
3326
0
    writeFailure:
3327
0
    x265_log(m_param, X265_LOG_ERROR, "RatecontrolEnd: stats file write failure\n");
3328
0
    return 1;
3329
0
}
3330
#if defined(_MSC_VER)
3331
#pragma warning(disable: 4996) // POSIX function names are just fine, thank you
3332
#endif
3333
3334
/* called when the encoder is flushing, and thus the final frame count is
3335
 * unambiguously known */
3336
void RateControl::setFinalFrameCount(int count)
3337
0
{
3338
0
    m_finalFrameCount = count;
3339
    /* unblock waiting threads */
3340
0
    m_startEndOrder.poke();
3341
0
}
3342
3343
/* called when the encoder is closing, and no more frames will be output.
3344
 * all blocked functions must finish so the frame encoder threads can be
3345
 * closed */
3346
void RateControl::terminate()
3347
0
{
3348
0
    m_bTerminated = true;
3349
    /* unblock waiting threads */
3350
0
    m_startEndOrder.poke();
3351
0
}
3352
3353
void RateControl::destroy()
3354
0
{
3355
0
    const char *fileName = m_param->rc.statFileName;
3356
0
    if (!strlen(fileName))
3357
0
        fileName = s_defaultStatFileName;
3358
3359
0
    if (m_statFileOut)
3360
0
    {
3361
0
        fclose(m_statFileOut);
3362
0
        char *tmpFileName = strcatFilename(fileName, ".temp");
3363
0
        int bError = 1;
3364
0
        if (tmpFileName)
3365
0
        {
3366
0
            x265_unlink(fileName);
3367
0
            bError = x265_rename(tmpFileName, fileName);
3368
0
        }
3369
0
        if (bError)
3370
0
        {
3371
0
            x265_log_file(m_param, X265_LOG_ERROR, "failed to rename output stats file to \"%s\"\n", fileName);
3372
0
        }
3373
0
        X265_FREE(tmpFileName);
3374
0
    }
3375
3376
0
    if (m_cutreeStatFileOut)
3377
0
    {
3378
0
        fclose(m_cutreeStatFileOut);
3379
0
        char *tmpFileName = strcatFilename(fileName, ".cutree.temp");
3380
0
        char *newFileName = strcatFilename(fileName, ".cutree");
3381
0
        int bError = 1;
3382
0
        if (tmpFileName && newFileName)
3383
0
        {
3384
0
            x265_unlink(newFileName);
3385
0
            bError = x265_rename(tmpFileName, newFileName);
3386
0
        }
3387
0
        if (bError)
3388
0
        {
3389
0
            x265_log_file(m_param, X265_LOG_ERROR, "failed to rename cutree output stats file to \"%s\"\n", newFileName);
3390
0
        }
3391
0
        X265_FREE(tmpFileName);
3392
0
        X265_FREE(newFileName);
3393
0
    }
3394
3395
0
    if (m_cutreeStatFileIn)
3396
0
        fclose(m_cutreeStatFileIn);
3397
3398
0
    if (m_cutreeShrMem)
3399
0
    {
3400
0
        m_cutreeShrMem->release();
3401
0
        delete m_cutreeShrMem;
3402
0
        m_cutreeShrMem = NULL;
3403
0
    }
3404
3405
0
    X265_FREE(m_rce2Pass);
3406
0
    X265_FREE(m_encOrder);
3407
0
    for (int i = 0; i < 2; i++)
3408
0
        X265_FREE(m_cuTreeStats.qpBuffer[i]);
3409
    
3410
0
    if (m_relativeComplexity)
3411
0
        X265_FREE(m_relativeComplexity);
3412
3413
0
}
3414
3415
void RateControl::splitdeltaPOC(char deltapoc[], RateControlEntry *rce)
3416
0
{
3417
0
    int idx = 0, length = 0;
3418
0
    char tmpStr[128];
3419
0
    char* src = deltapoc;
3420
0
    char* buf = strstr(src, "~");
3421
0
    while (buf)
3422
0
    {
3423
0
        memset(tmpStr, 0, sizeof(tmpStr));
3424
0
        length = (int)(buf - src);
3425
0
        if (length != 0)
3426
0
        {
3427
0
            strncpy(tmpStr, src, length);
3428
0
            rce->rpsData.deltaPOC[idx] = atoi(tmpStr);
3429
0
            idx++;
3430
0
            if (idx == rce->rpsData.numberOfPictures)
3431
0
                break;
3432
0
        }
3433
0
        src += (length + 1);
3434
0
        buf = strstr(src, "~");
3435
0
    }
3436
0
}
3437
3438
void RateControl::splitbUsed(char bused[], RateControlEntry *rce)
3439
0
{
3440
0
    int idx = 0, length = 0;
3441
0
    char tmpStr[128];
3442
0
    char* src = bused;
3443
0
    char* buf = strstr(src, "~");
3444
0
    while (buf)
3445
0
    {
3446
0
        memset(tmpStr, 0, sizeof(tmpStr));
3447
0
        length = (int)(buf - src);
3448
0
        if (length != 0)
3449
0
        {
3450
0
            strncpy(tmpStr, src, length);
3451
0
            rce->rpsData.bUsed[idx] = atoi(tmpStr) > 0;
3452
0
            idx++;
3453
0
            if (idx == rce->rpsData.numberOfPictures)
3454
0
                break;
3455
0
        }
3456
0
        src += (length + 1);
3457
0
        buf = strstr(src, "~");
3458
0
    }
3459
0
}
3460
3461
double RateControl::forwardMasking(Frame* curFrame, double q)
3462
0
{
3463
0
    double qp = x265_qScale2qp(q);
3464
0
    uint32_t maxWindowSize = uint32_t((m_param->fwdMaxScenecutWindow / 1000.0) * (m_param->fpsNum / m_param->fpsDenom) + 0.5);
3465
0
    uint32_t windowSize[6], prevWindow = 0;
3466
0
    int lastScenecut = m_top->m_rateControl->m_lastScenecut;
3467
3468
0
    double fwdRefQpDelta[6], fwdNonRefQpDelta[6], sliceTypeDelta[6];
3469
0
    for (int i = 0; i < 6; i++)
3470
0
    {
3471
0
        windowSize[i] = prevWindow + (uint32_t((m_param->fwdScenecutWindow[i] / 1000.0) * (m_param->fpsNum / m_param->fpsDenom) + 0.5));
3472
0
        fwdRefQpDelta[i] = double(m_param->fwdRefQpDelta[i]);
3473
0
        fwdNonRefQpDelta[i] = double(m_param->fwdNonRefQpDelta[i]);
3474
0
        sliceTypeDelta[i] = SLICE_TYPE_DELTA * fwdRefQpDelta[i];
3475
0
        prevWindow = windowSize[i];
3476
0
    }
3477
3478
3479
    //Check whether the current frame is within the forward window
3480
0
    if (curFrame->m_poc > lastScenecut && curFrame->m_poc <= (lastScenecut + int(maxWindowSize)))
3481
0
        curFrame->m_isInsideWindow = FORWARD_WINDOW;
3482
0
    if (curFrame->m_isInsideWindow == FORWARD_WINDOW)
3483
0
    {
3484
0
        if (IS_X265_TYPE_I(curFrame->m_lowres.sliceType) || curFrame->m_lowres.bScenecut)
3485
0
        {
3486
0
            m_top->m_rateControl->m_lastScenecutAwareIFrame = curFrame->m_poc;
3487
0
        }
3488
0
        else if (curFrame->m_lowres.sliceType == X265_TYPE_P)
3489
0
        {
3490
            //Add offsets corresponding to the window in which the P-frame occurs
3491
0
            if (curFrame->m_poc <= (lastScenecut + int(windowSize[0])))
3492
0
                qp += fwdRefQpDelta[0] - sliceTypeDelta[0];
3493
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[0]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[1]))))
3494
0
                qp += fwdRefQpDelta[1] - sliceTypeDelta[1];
3495
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[1]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[2]))))
3496
0
                qp += fwdRefQpDelta[2] - sliceTypeDelta[2];
3497
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[2]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[3]))))
3498
0
                qp += fwdRefQpDelta[3] - sliceTypeDelta[3];
3499
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[3]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[4]))))
3500
0
                qp += fwdRefQpDelta[4] - sliceTypeDelta[4];
3501
0
            else if (curFrame->m_poc > lastScenecut + int(windowSize[4]))
3502
0
                qp += fwdRefQpDelta[5] - sliceTypeDelta[5];
3503
0
        }
3504
0
        else if (curFrame->m_lowres.sliceType == X265_TYPE_BREF)
3505
0
        {
3506
            //Add offsets corresponding to the window in which the B-frame occurs
3507
0
            if (curFrame->m_poc <= (lastScenecut + int(windowSize[0])))
3508
0
                qp += fwdRefQpDelta[0];
3509
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[0]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[1]))))
3510
0
                qp += fwdRefQpDelta[1];
3511
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[1]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[2]))))
3512
0
                qp += fwdRefQpDelta[2];
3513
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[2]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[3]))))
3514
0
                qp += fwdRefQpDelta[3];
3515
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[3]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[4]))))
3516
0
                qp += fwdRefQpDelta[4];
3517
0
            else if (curFrame->m_poc > lastScenecut + int(windowSize[4]))
3518
0
                qp += fwdRefQpDelta[5];
3519
0
        }
3520
0
        else if (curFrame->m_lowres.sliceType == X265_TYPE_B)
3521
0
        {
3522
            //Add offsets corresponding to the window in which the b-frame occurs
3523
0
            if (curFrame->m_poc <= (lastScenecut + int(windowSize[0])))
3524
0
                qp += fwdNonRefQpDelta[0];
3525
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[0]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[1]))))
3526
0
                qp += fwdNonRefQpDelta[1];
3527
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[1]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[2]))))
3528
0
                qp += fwdNonRefQpDelta[2];
3529
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[2]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[3]))))
3530
0
                qp += fwdNonRefQpDelta[3];
3531
0
            else if (((curFrame->m_poc) > (lastScenecut + int(windowSize[3]))) && ((curFrame->m_poc) <= (lastScenecut + int(windowSize[4]))))
3532
0
                qp += fwdNonRefQpDelta[4];
3533
0
            else if (curFrame->m_poc > lastScenecut + int(windowSize[4]))
3534
0
                qp += fwdNonRefQpDelta[5];
3535
0
        }
3536
0
    }
3537
3538
0
    return x265_qp2qScale(qp);
3539
0
}
3540
double RateControl::backwardMasking(Frame* curFrame, double q)
3541
0
{
3542
0
    double qp = x265_qScale2qp(q);
3543
0
    uint32_t windowSize[6], prevWindow = 0;
3544
0
    int lastScenecut = m_top->m_rateControl->m_lastScenecut;
3545
3546
0
    double bwdRefQpDelta[6], bwdNonRefQpDelta[6], sliceTypeDelta[6];
3547
0
    for (int i = 0; i < 6; i++)
3548
0
    {
3549
0
        windowSize[i] = prevWindow + (uint32_t((m_param->bwdScenecutWindow[i] / 1000.0) * (m_param->fpsNum / m_param->fpsDenom) + 0.5));
3550
0
        prevWindow = windowSize[i];
3551
0
        bwdRefQpDelta[i] = double(m_param->bwdRefQpDelta[i]);
3552
0
        bwdNonRefQpDelta[i] = double(m_param->bwdNonRefQpDelta[i]);
3553
3554
0
        if (bwdRefQpDelta[i] < 0)
3555
0
            bwdRefQpDelta[i] = BWD_WINDOW_DELTA * m_param->fwdRefQpDelta[i];
3556
0
        sliceTypeDelta[i] = SLICE_TYPE_DELTA * bwdRefQpDelta[i];
3557
3558
0
        if (bwdNonRefQpDelta[i] < 0)
3559
0
            bwdNonRefQpDelta[i] = bwdRefQpDelta[i] + sliceTypeDelta[i];
3560
0
    }
3561
3562
0
    if (curFrame->m_isInsideWindow == BACKWARD_WINDOW)
3563
0
    {
3564
0
        if (curFrame->m_lowres.sliceType == X265_TYPE_P)
3565
0
        {
3566
            //Add offsets corresponding to the window in which the P-frame occurs
3567
0
            if (curFrame->m_poc >= (lastScenecut - int(windowSize[0])))
3568
0
                qp += bwdRefQpDelta[0] - sliceTypeDelta[0];
3569
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[0]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[1]))))
3570
0
                qp += bwdRefQpDelta[1] - sliceTypeDelta[1];
3571
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[1]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[2]))))
3572
0
                qp += bwdRefQpDelta[2] - sliceTypeDelta[2];
3573
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[2]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[3]))))
3574
0
                qp += bwdRefQpDelta[3] - sliceTypeDelta[3];
3575
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[3]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[4]))))
3576
0
                qp += bwdRefQpDelta[4] - sliceTypeDelta[4];
3577
0
            else if (curFrame->m_poc < lastScenecut - int(windowSize[4]))
3578
0
                qp += bwdRefQpDelta[5] - sliceTypeDelta[5];
3579
0
        }
3580
0
        else if (curFrame->m_lowres.sliceType == X265_TYPE_BREF)
3581
0
        {
3582
            //Add offsets corresponding to the window in which the B-frame occurs
3583
0
            if (curFrame->m_poc >= (lastScenecut - int(windowSize[0])))
3584
0
                qp += bwdRefQpDelta[0];
3585
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[0]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[1]))))
3586
0
                qp += bwdRefQpDelta[1];
3587
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[1]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[2]))))
3588
0
                qp += bwdRefQpDelta[2];
3589
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[2]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[3]))))
3590
0
                qp += bwdRefQpDelta[3];
3591
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[3]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[4]))))
3592
0
                qp += bwdRefQpDelta[4];
3593
0
            else if (curFrame->m_poc < lastScenecut - int(windowSize[4]))
3594
0
                qp += bwdRefQpDelta[5];
3595
0
        }
3596
0
        else if (curFrame->m_lowres.sliceType == X265_TYPE_B)
3597
0
        {
3598
            //Add offsets corresponding to the window in which the b-frame occurs
3599
0
            if (curFrame->m_poc >= (lastScenecut - int(windowSize[0])))
3600
0
                qp += bwdNonRefQpDelta[0];
3601
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[0]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[1]))))
3602
0
                qp += bwdNonRefQpDelta[1];
3603
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[1]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[2]))))
3604
0
                qp += bwdNonRefQpDelta[2];
3605
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[2]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[3]))))
3606
0
                qp += bwdNonRefQpDelta[3];
3607
0
            else if (((curFrame->m_poc) < (lastScenecut - int(windowSize[3]))) && ((curFrame->m_poc) >= (lastScenecut - int(windowSize[4]))))
3608
0
                qp += bwdNonRefQpDelta[4];
3609
0
            else if (curFrame->m_poc < lastScenecut - int(windowSize[4]))
3610
0
                qp += bwdNonRefQpDelta[5];
3611
0
        }
3612
0
    }
3613
3614
0
    return x265_qp2qScale(qp);
3615
0
}