Coverage Report

Created: 2026-03-08 06:41

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