changeset 3733:cb3521c28879

Remove unused code related to dpb and rps
author Deepthi Devaki <deepthidevaki@multicorewareinc.com>
date Wed, 28 Aug 2013 18:05:53 +0530
parents eab25d12ece9
children 5fded61de5e8
files source/Lib/TLibEncoder/TEncTop.cpp source/encoder/dpb.cpp source/encoder/dpb.h
diffstat 3 files changed, 6 insertions(+-), 433 deletions(-) [+]
line wrap: on
line diff
--- a/source/Lib/TLibEncoder/TEncTop.cpp	Wed Aug 28 17:58:24 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncTop.cpp	Wed Aug 28 18:05:53 2013 +0530
@@ -840,140 +840,6 @@ Void TEncTop::xInitPPS(TComPPS *pcPPS)
     pcPPS->setLoopFilterAcrossTilesEnabledFlag(m_loopFilterAcrossTilesEnabledFlag);
 }
 
-//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.
-Void TEncTop::xInitRPS(TComSPS *pcSPS)
-{
-    TComReferencePictureSet* rps;
-
-    pcSPS->createRPSList(getGOPSize() + m_extraRPSs);
-    TComRPSList* rpsList = pcSPS->getRPSList();
-
-    for (Int i = 0; i < getGOPSize() + m_extraRPSs; i++)
-    {
-        GOPEntry ge = getGOPEntry(i);
-        rps = rpsList->getReferencePictureSet(i);
-        rps->setNumberOfPictures(ge.m_numRefPics);
-        rps->setNumRefIdc(ge.m_numRefIdc);
-        Int numNeg = 0;
-        Int numPos = 0;
-        for (Int j = 0; j < ge.m_numRefPics; j++)
-        {
-            rps->setDeltaPOC(j, ge.m_referencePics[j]);
-            rps->setUsed(j, ge.m_usedByCurrPic[j]);
-            if (ge.m_referencePics[j] > 0)
-            {
-                numPos++;
-            }
-            else
-            {
-                numNeg++;
-            }
-        }
-
-        rps->setNumberOfNegativePictures(numNeg);
-        rps->setNumberOfPositivePictures(numPos);
-
-        // handle inter RPS initialization from the config file.
-        rps->setInterRPSPrediction(ge.m_interRPSPrediction > 0); // not very clean, converting anything > 0 to true.
-        rps->setDeltaRIdxMinus1(0);                              // index to the Reference RPS is always the previous one.
-        TComReferencePictureSet* RPSRef = rpsList->getReferencePictureSet(i - 1); // get the reference RPS
-
-        if (ge.m_interRPSPrediction == 2) // Automatic generation of the inter RPS idc based on the RIdx provided.
-        {
-            Int deltaRPS = getGOPEntry(i - 1).m_POC - ge.m_POC; // the ref POC - current POC
-            Int numRefDeltaPOC = RPSRef->getNumberOfPictures();
-
-            rps->setDeltaRPS(deltaRPS);     // set delta RPS
-            rps->setNumRefIdc(numRefDeltaPOC + 1); // set the numRefIdc to the number of pictures in the reference RPS + 1.
-            Int count = 0;
-            for (Int j = 0; j <= numRefDeltaPOC; j++) // cycle through pics in reference RPS.
-            {
-                Int RefDeltaPOC = (j < numRefDeltaPOC) ? RPSRef->getDeltaPOC(j) : 0; // if it is the last decoded picture, set RefDeltaPOC = 0
-                rps->setRefIdc(j, 0);
-                for (Int k = 0; k < rps->getNumberOfPictures(); k++) // cycle through pics in current RPS.
-                {
-                    if (rps->getDeltaPOC(k) == (RefDeltaPOC + deltaRPS)) // if the current RPS has a same picture as the reference RPS.
-                    {
-                        rps->setRefIdc(j, (rps->getUsed(k) ? 1 : 2));
-                        count++;
-                        break;
-                    }
-                }
-            }
-
-            if (count != rps->getNumberOfPictures())
-            {
-                printf("Warning: Unable fully predict all delta POCs using the reference RPS index given in the config file.  Setting Inter RPS to false for this RPS.\n");
-                rps->setInterRPSPrediction(0);
-            }
-        }
-        else if (ge.m_interRPSPrediction == 1) // inter RPS idc based on the RefIdc values provided in config file.
-        {
-            rps->setDeltaRPS(ge.m_deltaRPS);
-            rps->setNumRefIdc(ge.m_numRefIdc);
-            for (Int j = 0; j < ge.m_numRefIdc; j++)
-            {
-                rps->setRefIdc(j, ge.m_refIdc[j]);
-            }
-
-            // the following code overwrite the deltaPOC and Used by current values read from the config file with the ones
-            // computed from the RefIdc.  A warning is printed if they are not identical.
-            numNeg = 0;
-            numPos = 0;
-            TComReferencePictureSet RPSTemp; // temporary variable
-
-            for (Int j = 0; j < ge.m_numRefIdc; j++)
-            {
-                if (ge.m_refIdc[j])
-                {
-                    Int deltaPOC = ge.m_deltaRPS + ((j < RPSRef->getNumberOfPictures()) ? RPSRef->getDeltaPOC(j) : 0);
-                    RPSTemp.setDeltaPOC((numNeg + numPos), deltaPOC);
-                    RPSTemp.setUsed((numNeg + numPos), ge.m_refIdc[j] == 1 ? 1 : 0);
-                    if (deltaPOC < 0)
-                    {
-                        numNeg++;
-                    }
-                    else
-                    {
-                        numPos++;
-                    }
-                }
-            }
-
-            if (numNeg != rps->getNumberOfNegativePictures())
-            {
-                printf("Warning: number of negative pictures in RPS is different between intra and inter RPS specified in the config file.\n");
-                rps->setNumberOfNegativePictures(numNeg);
-                rps->setNumberOfPositivePictures(numNeg + numPos);
-            }
-            if (numPos != rps->getNumberOfPositivePictures())
-            {
-                printf("Warning: number of positive pictures in RPS is different between intra and inter RPS specified in the config file.\n");
-                rps->setNumberOfPositivePictures(numPos);
-                rps->setNumberOfPositivePictures(numNeg + numPos);
-            }
-            RPSTemp.setNumberOfPictures(numNeg + numPos);
-            RPSTemp.setNumberOfNegativePictures(numNeg);
-            RPSTemp.sortDeltaPOC(); // sort the created delta POC before comparing
-            // check if Delta POC and Used are the same
-            // print warning if they are not.
-            for (Int j = 0; j < ge.m_numRefIdc; j++)
-            {
-                if (RPSTemp.getDeltaPOC(j) != rps->getDeltaPOC(j))
-                {
-                    printf("Warning: delta POC is different between intra RPS and inter RPS specified in the config file.\n");
-                    rps->setDeltaPOC(j, RPSTemp.getDeltaPOC(j));
-                }
-                if (RPSTemp.getUsed(j) != rps->getUsed(j))
-                {
-                    printf("Warning: Used by Current in RPS is different between intra and inter RPS specified in the config file.\n");
-                    rps->setUsed(j, RPSTemp.getUsed(j));
-                }
-            }
-        }
-    }
-}
-
 Void TEncTop::computeLambdaForQp(TComSlice* slice)
 {
     FrameEncoder *curEncoder = &m_frameEncoder[m_curEncoder];
--- a/source/encoder/dpb.cpp	Wed Aug 28 17:58:24 2013 +0530
+++ b/source/encoder/dpb.cpp	Wed Aug 28 18:05:53 2013 +0530
@@ -123,7 +123,7 @@ void DPB::prepareEncode(TComPic *pic, Fr
     refPicListModification->setRefPicListModificationFlagL1(false);
     slice->setNumRefIdx(REF_PIC_LIST_0, X265_MIN(m_maxRefL0, slice->getRPS()->getNumberOfNegativePictures()));   // Ensuring L0 contains just the -ve POC
     slice->setNumRefIdx(REF_PIC_LIST_1, X265_MIN(m_maxRefL1, slice->getRPS()->getNumberOfPositivePictures()));
-      
+
     slice->setRefPicList(m_picList);
 
     // Slice type refinement
@@ -294,7 +294,7 @@ Void DPB::decodingRefreshMarking(Int poc
         || nalUnitType == NAL_UNIT_CODED_SLICE_BLA_N_LP
         || nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL
         || nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP) // IDR or BLA picture
-    {        
+    {
         // mark all pictures as not used for reference
         TComList<TComPic*>::iterator iterPic = m_picList.begin();
         while (iterPic != m_picList.end())
@@ -405,73 +405,6 @@ Void DPB::applyReferencePictureSet(TComR
     }
 }
 
-// This is a function that determines what Reference Picture Set to use for a
-// specific slice (with POC = POCCurr)
-void DPB::selectReferencePictureSet(TComSlice* slice, FrameEncoder *frameEncoder, int curPOC, int gopID)
-{
-    slice->setRPSidx(gopID);
-    UInt intraPeriod = m_cfg->param.keyframeMax;
-    int gopSize = m_cfg->getGOPSize();
-
-    for (int extraNum = gopSize; extraNum < m_cfg->getExtraRPSs() + gopSize; extraNum++)
-    {
-        if (intraPeriod > 0 && m_cfg->param.decodingRefreshType > 0)
-        {
-            int POCIndex = curPOC % intraPeriod;
-            if (POCIndex == 0)
-            {
-                POCIndex = intraPeriod;
-            }
-            if (POCIndex == m_cfg->getGOPEntry(extraNum).m_POC)
-            {
-                slice->setRPSidx(extraNum);
-            }
-        }
-        else
-        {
-            if (curPOC == m_cfg->getGOPEntry(extraNum).m_POC)
-            {
-                slice->setRPSidx(extraNum);
-            }
-        }
-    }
-
-    slice->setRPS(frameEncoder->m_sps.getRPSList()->getReferencePictureSet(slice->getRPSidx()));
-    slice->getRPS()->setNumberOfPictures(slice->getRPS()->getNumberOfNegativePictures() + slice->getRPS()->getNumberOfPositivePictures());
-}
-
-int DPB::getReferencePictureSetIdxForSOP(int curPOC, int gopID)
-{
-    int rpsIdx = gopID;
-    int gopSize = m_cfg->getGOPSize();
-    UInt intraPeriod = m_cfg->param.keyframeMax;
-
-    for (int extraNum = gopSize; extraNum < m_cfg->getExtraRPSs() + gopSize; extraNum++)
-    {
-        if (intraPeriod > 0 && m_cfg->param.decodingRefreshType > 0)
-        {
-            int POCIndex = curPOC % intraPeriod;
-            if (POCIndex == 0)
-            {
-                POCIndex = intraPeriod;
-            }
-            if (POCIndex == m_cfg->getGOPEntry(extraNum).m_POC)
-            {
-                rpsIdx = extraNum;
-            }
-        }
-        else
-        {
-            if (curPOC == m_cfg->getGOPEntry(extraNum).m_POC)
-            {
-                rpsIdx = extraNum;
-            }
-        }
-    }
-
-    return rpsIdx;
-}
-
 /** Function for deciding the nal_unit_type.
  * \param pocCurr POC of the current picture
  * \returns the nal unit type of the picture
@@ -665,19 +598,15 @@ bool TEncCfg::initializeGOP(x265_param_t
         /* encoder_randomaccess_main */
         int offsets[] = { 1, 2, 3, 4, 4, 3, 4, 4 };
         double factors[] = { 0, 0.442, 0.3536, 0.3536, 0.68 };
-        int pocs[] = { 1, 3, 2, 5, 4, 7, 6, 8};     //For alternate P/B frames
-        int rps[] = { 0, 4, 2, 1, -2, -3, 1, -2 };
+        int pocs[] = { 1, 3, 2, 5, 4, 7, 6, 8 };     //For alternate P/B frames
         for (int i = 0; i < 8; i++)
         {
             m_gopList[i].m_POC = pocs[i];
             m_gopList[i].m_QPFactor = factors[offsets[i]];
             m_gopList[i].m_QPOffset = offsets[i];
-            m_gopList[i].m_deltaRPS = rps[i];
-            m_gopList[i].m_sliceType = (pocs[i]%2)? 'P': 'B';
-            m_gopList[i].m_numRefPicsActive = i ? 2 : 4;
-            m_gopList[i].m_numRefPics = i == 1 ? 3 : 4;
-            m_gopList[i].m_interRPSPrediction = i ? 1 : 0;
-            m_gopList[i].m_numRefIdc = i == 2 ? 4 : 5;
+            m_gopList[i].m_sliceType = (pocs[i] % 2) ? 'P' : 'B';
+            m_gopList[i].m_numRefPicsActive = 1;
+            m_gopList[i].m_numRefPics = 2;
         }
 
 #define SET4(id, VAR, a, b, c, d) \
@@ -766,226 +695,8 @@ bool TEncCfg::initializeGOP(x265_param_t
         // this check goes away when we have a real lookahead
         x265_log(_param, X265_LOG_WARNING, "Lookahead depth must be at least one GOP\n");
         _param->lookaheadDepth = m_gopSize;
-    }    
-
-    bool verifiedGOP = false;
-    bool errorGOP = false;
-    int checkGOP = 1;
-    int numRefs = 1;
-
-    int refList[MAX_NUM_REF_PICS + 1];
-    refList[0] = 0;
-    bool isOK[MAX_GOP];
-    for (Int i = 0; i < MAX_GOP; i++)
-    {
-        isOK[i] = false;
     }
 
-    int numOK = 0;
-    if (_param->bOpenGOP == false)
-        CONFIRM(_param->keyframeMax % m_gopSize != 0, "Intra period must be a multiple of GOPSize");
-
-    m_extraRPSs = 0;
-    // start looping through frames in coding order until we can verify that the GOP structure is correct.
-    while (!verifiedGOP && !errorGOP)
-    {
-        Int curGOP = (checkGOP - 1) % m_gopSize;
-        Int curPOC = ((checkGOP - 1) / m_gopSize) * m_gopSize + m_gopList[curGOP].m_POC;
-        if (m_gopList[curGOP].m_POC < 0)
-        {
-            printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
-            errorGOP = true;
-        }
-        else
-        {
-            //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
-            Bool beforeI = false;
-            for (Int i = 0; i < m_gopList[curGOP].m_numRefPics; i++)
-            {
-                Int absPOC = curPOC + m_gopList[curGOP].m_referencePics[i];
-                if (absPOC < 0)
-                {
-                    beforeI = true;
-                }
-                else
-                {
-                    Bool found = false;
-                    for (Int j = 0; j < numRefs; j++)
-                    {
-                        if (refList[j] == absPOC)
-                        {
-                            found = true;
-                            for (Int k = 0; k < m_gopSize; k++)
-                            {
-                                if (absPOC % m_gopSize == m_gopList[k].m_POC % m_gopSize)
-                                {
-                                    m_gopList[k].m_refPic = true;
-                                    m_gopList[curGOP].m_usedByCurrPic[i] = 1;
-                                }
-                            }
-                        }
-                    }
-
-                    if (!found)
-                    {
-                        printf("\nError: ref pic %d is not available for GOP frame %d\n", m_gopList[curGOP].m_referencePics[i], curGOP + 1);
-                        errorGOP = true;
-                    }
-                }
-            }
-
-            if (!beforeI && !errorGOP)
-            {
-                //all ref frames were present
-                if (!isOK[curGOP])
-                {
-                    numOK++;
-                    isOK[curGOP] = true;
-                    if (numOK == m_gopSize)
-                    {
-                        verifiedGOP = true;
-                    }
-                }
-            }
-            else
-            {
-                //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
-                m_gopList[m_gopSize + m_extraRPSs] = m_gopList[curGOP];
-                Int newRefs = 0;
-                for (Int i = 0; i < m_gopList[curGOP].m_numRefPics; i++)
-                {
-                    Int absPOC = curPOC + m_gopList[curGOP].m_referencePics[i];
-                    if (absPOC >= 0)
-                    {
-                        m_gopList[m_gopSize + m_extraRPSs].m_referencePics[newRefs] = m_gopList[curGOP].m_referencePics[i];
-                        m_gopList[m_gopSize + m_extraRPSs].m_usedByCurrPic[newRefs] = m_gopList[curGOP].m_usedByCurrPic[i];
-                        newRefs++;
-                    }
-                }
-
-                Int numPrefRefs = m_gopList[curGOP].m_numRefPicsActive;
-
-                for (Int offset = -1; offset > -checkGOP; offset--)
-                {
-                    //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
-                    Int offGOP = (checkGOP - 1 + offset) % m_gopSize;
-                    Int offPOC = ((checkGOP - 1 + offset) / m_gopSize) * m_gopSize + m_gopList[offGOP].m_POC;
-                    if (offPOC >= 0)
-                    {
-                        Bool newRef = false;
-                        for (Int i = 0; i < numRefs; i++)
-                        {
-                            if (refList[i] == offPOC)
-                            {
-                                newRef = true;
-                            }
-                        }
-
-                        for (Int i = 0; i < newRefs; i++)
-                        {
-                            if (m_gopList[m_gopSize + m_extraRPSs].m_referencePics[i] == offPOC - curPOC)
-                            {
-                                newRef = false;
-                            }
-                        }
-
-                        if (newRef)
-                        {
-                            Int insertPoint = newRefs;
-                            //this picture can be added, find appropriate place in list and insert it.
-                            m_gopList[offGOP].m_refPic = true;
-                            for (Int j = 0; j < newRefs; j++)
-                            {
-                                if (m_gopList[m_gopSize + m_extraRPSs].m_referencePics[j] < offPOC - curPOC || m_gopList[m_gopSize + m_extraRPSs].m_referencePics[j] > 0)
-                                {
-                                    insertPoint = j;
-                                    break;
-                                }
-                            }
-
-                            Int prev = offPOC - curPOC;
-                            Int prevUsed = 1;
-                            for (Int j = insertPoint; j < newRefs + 1; j++)
-                            {
-                                Int newPrev = m_gopList[m_gopSize + m_extraRPSs].m_referencePics[j];
-                                Int newUsed = m_gopList[m_gopSize + m_extraRPSs].m_usedByCurrPic[j];
-                                m_gopList[m_gopSize + m_extraRPSs].m_referencePics[j] = prev;
-                                m_gopList[m_gopSize + m_extraRPSs].m_usedByCurrPic[j] = prevUsed;
-                                prevUsed = newUsed;
-                                prev = newPrev;
-                            }
-
-                            newRefs++;
-                        }
-                    }
-                    if (newRefs >= numPrefRefs)
-                    {
-                        break;
-                    }
-                }
-
-                m_gopList[m_gopSize + m_extraRPSs].m_numRefPics = newRefs;
-                m_gopList[m_gopSize + m_extraRPSs].m_POC = curPOC;
-                if (m_extraRPSs == 0)
-                {
-                    m_gopList[m_gopSize + m_extraRPSs].m_interRPSPrediction = 0;
-                    m_gopList[m_gopSize + m_extraRPSs].m_numRefIdc = 0;
-                }
-                else
-                {
-                    Int rIdx =  m_gopSize + m_extraRPSs - 1;
-                    Int refPOC = m_gopList[rIdx].m_POC;
-                    Int refPics = m_gopList[rIdx].m_numRefPics;
-                    Int newIdc = 0;
-                    for (Int i = 0; i <= refPics; i++)
-                    {
-                        Int deltaPOC = ((i != refPics) ? m_gopList[rIdx].m_referencePics[i] : 0); // check if the reference abs POC is >= 0
-                        Int absPOCref = refPOC + deltaPOC;
-                        Int refIdc = 0;
-                        for (Int j = 0; j < m_gopList[m_gopSize + m_extraRPSs].m_numRefPics; j++)
-                        {
-                            if ((absPOCref - curPOC) == m_gopList[m_gopSize + m_extraRPSs].m_referencePics[j])
-                            {
-                                if (m_gopList[m_gopSize + m_extraRPSs].m_usedByCurrPic[j])
-                                {
-                                    refIdc = 1;
-                                }
-                                else
-                                {
-                                    refIdc = 2;
-                                }
-                            }
-                        }
-
-                        m_gopList[m_gopSize + m_extraRPSs].m_refIdc[newIdc] = refIdc;
-                        newIdc++;
-                    }
-
-                    m_gopList[m_gopSize + m_extraRPSs].m_interRPSPrediction = 1;
-                    m_gopList[m_gopSize + m_extraRPSs].m_numRefIdc = newIdc;
-                    m_gopList[m_gopSize + m_extraRPSs].m_deltaRPS = refPOC - m_gopList[m_gopSize + m_extraRPSs].m_POC;
-                }
-                curGOP = m_gopSize + m_extraRPSs;
-                m_extraRPSs++;
-            }
-            numRefs = 0;
-            for (Int i = 0; i < m_gopList[curGOP].m_numRefPics; i++)
-            {
-                Int absPOC = curPOC + m_gopList[curGOP].m_referencePics[i];
-                if (absPOC >= 0)
-                {
-                    refList[numRefs] = absPOC;
-                    numRefs++;
-                }
-            }
-
-            refList[numRefs] = curPOC;
-            numRefs++;
-        }
-        checkGOP++;
-    }
-
-    CONFIRM(errorGOP, "Invalid GOP structure given");
     for (Int i = 0; i < m_gopSize; i++)
     {
         CONFIRM(m_gopList[i].m_sliceType != 'B' && m_gopList[i].m_sliceType != 'P', "Slice type must be equal to B or P");
--- a/source/encoder/dpb.h	Wed Aug 28 17:58:24 2013 +0530
+++ b/source/encoder/dpb.h	Wed Aug 28 18:05:53 2013 +0530
@@ -64,15 +64,11 @@ public:
 
 protected:
 
-    void selectReferencePictureSet(TComSlice* slice, x265::FrameEncoder*, int curPoc, int gopID);
-
     void computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps, unsigned int maxDecPicBuffer);
 
     Void applyReferencePictureSet(TComReferencePictureSet *rps, int curPoc);
     Void decodingRefreshMarking(Int pocCurr, NalUnitType nalUnitType);
 
-    int getReferencePictureSetIdxForSOP(int pocCur, int GOPid);
-
     void arrangeLongtermPicturesInRPS(TComSlice *, x265::FrameEncoder *frameEncoder);
 
     NalUnitType getNalUnitType(int curPoc, int lastIdr);