Ejemplo n.º 1
0
void TComSPS::setHrdParameters(uint32_t fpsNum, uint32_t fpsDenom, uint32_t numDU, uint32_t bitRate, bool randomAccess)
{
    if (!getVuiParametersPresentFlag())
    {
        return;
    }

    TComVUI *vui = getVuiParameters();
    TComHRD *hrd = vui->getHrdParameters();

    TimingInfo *timingInfo = vui->getTimingInfo();
    timingInfo->setTimingInfoPresentFlag(true);
    timingInfo->setNumUnitsInTick(fpsDenom);
    timingInfo->setTimeScale(fpsNum);

    bool rateCnt = (bitRate > 0);
    hrd->setVclHrdParametersPresentFlag(rateCnt);

    if (hrd->getSubPicHrdParamsPresentFlag())
    {
        hrd->setTickDivisorMinus2(100 - 2);
        hrd->setDuCpbRemovalDelayLengthMinus1(7);                  // 8-bit precision ( plus 1 for last DU in AU )
        hrd->setSubPicCpbParamsInPicTimingSEIFlag(true);
        hrd->setDpbOutputDelayDuLengthMinus1(5 + 7);               // With sub-clock tick factor of 100, at least 7 bits to have the same value as AU dpb delay
    }
    else
    {
        hrd->setSubPicCpbParamsInPicTimingSEIFlag(false);
    }

    hrd->setBitRateScale(4);                                       // in units of 2~( 6 + 4 ) = 1,024 bps
    hrd->setCpbSizeScale(6);                                       // in units of 2~( 4 + 4 ) = 1,024 bit
    hrd->setDuCpbSizeScale(6);                                     // in units of 2~( 4 + 4 ) = 1,024 bit

    hrd->setInitialCpbRemovalDelayLengthMinus1(15);                // assuming 0.5 sec, log2( 90,000 * 0.5 ) = 16-bit
    if (randomAccess)
    {
        hrd->setCpbRemovalDelayLengthMinus1(5);                    // 32 = 2^5 (plus 1)
        hrd->setDpbOutputDelayLengthMinus1(5);                     // 32 + 3 = 2^6
    }
    else
    {
        hrd->setCpbRemovalDelayLengthMinus1(9);                    // max. 2^10
        hrd->setDpbOutputDelayLengthMinus1(9);                     // max. 2^10
    }

/*
   Note: only the case of "vps_max_temporal_layers_minus1 = 0" is supported.
*/
    int i, j;
    uint32_t birateValue, cpbSizeValue;
    uint32_t ducpbSizeValue;
    uint32_t duBitRateValue = 0;

    for (i = 0; i < MAX_TLAYER; i++)
    {
        hrd->setFixedPicRateFlag(i, 1);
        hrd->setPicDurationInTcMinus1(i, 0);
        hrd->setLowDelayHrdFlag(i, 0);
        hrd->setCpbCntMinus1(i, 0);

        birateValue  = bitRate;
        cpbSizeValue = bitRate;                                 // 1 second
        ducpbSizeValue = bitRate / numDU;
        duBitRateValue = bitRate;
        for (j = 0; j < (hrd->getCpbCntMinus1(i) + 1); j++)
        {
            hrd->setBitRateValueMinus1(i, j, 0, (birateValue  - 1));
            hrd->setCpbSizeValueMinus1(i, j, 0, (cpbSizeValue - 1));
            hrd->setDuCpbSizeValueMinus1(i, j, 0, (ducpbSizeValue - 1));
            hrd->setCbrFlag(i, j, 0, (j == 0));

            hrd->setBitRateValueMinus1(i, j, 1, (birateValue  - 1));
            hrd->setCpbSizeValueMinus1(i, j, 1, (cpbSizeValue - 1));
            hrd->setDuCpbSizeValueMinus1(i, j, 1, (ducpbSizeValue - 1));
            hrd->setDuBitRateValueMinus1(i, j, 1, (duBitRateValue - 1));
            hrd->setCbrFlag(i, j, 1, (j == 0));
        }
    }
}