[x265] [PATCH] Using best reference from Lookahead in RPS (for non-B frames only)

shazeb at multicorewareinc.com shazeb at multicorewareinc.com
Wed Sep 4 12:44:48 CEST 2013


# HG changeset patch
# User Shazeb N Khan
# Date 1378290786 -19800
#      Wed Sep 04 16:03:06 2013 +0530
# Node ID e06a76856565bcb120c497d3695340dd17044ebf
# Parent  a4cec6558ccc149e34492852152d214da9d9d2f5
Using best reference from Lookahead in RPS (for non-B frames only)

diff -r a4cec6558ccc -r e06a76856565 source/Lib/TLibCommon/TComPic.h
--- a/source/Lib/TLibCommon/TComPic.h	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/Lib/TLibCommon/TComPic.h	Wed Sep 04 16:03:06 2013 +0530
@@ -73,6 +73,8 @@
 
 public:
 
+    int                   m_predRefPOC[MAX_NUM_REF];
+    int                   m_predRefCount;
     volatile uint32_t*    m_complete_enc;       // Array of Col number that was finished stage encode
 
     //** Frame Parallelism - notification between FrameEncoders of available motion reference rows **
diff -r a4cec6558ccc -r e06a76856565 source/common/lowres.cpp
--- a/source/common/lowres.cpp	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/common/lowres.cpp	Wed Sep 04 16:03:06 2013 +0530
@@ -57,16 +57,16 @@
 
     intraCost = (int*)X265_MALLOC(int, cuCount);
 
-    for (int i = 0; i < bframes + 2; i++)
+    for (int i = 0; i < X265_BFRAME_MAX + 2; i++)
     {
-        for (int j = 0; j < bframes + 2; j++)
+        for (int j = 0; j < X265_BFRAME_MAX + 2; j++)
         {   
             rowSatds[i][j] = (int*)X265_MALLOC(int, cuHeight);
             lowresCosts[i][j] = (uint16_t*)X265_MALLOC(uint16_t, cuCount);
         }
     }
 
-    for (int i = 0; i < bframes + 1; i++)
+    for (int i = 0; i < X265_BFRAME_MAX + 1; i++)
     {
         lowresMvs[0][i] = (MV*)X265_MALLOC(MV, cuCount);
         lowresMvs[1][i] = (MV*)X265_MALLOC(MV, cuCount);
diff -r a4cec6558ccc -r e06a76856565 source/encoder/dpb.cpp
--- a/source/encoder/dpb.cpp	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/encoder/dpb.cpp	Wed Sep 04 16:03:06 2013 +0530
@@ -111,7 +111,19 @@
     // Do decoding refresh marking if any
     decodingRefreshMarking(pocCurr, slice->getNalUnitType());
 
-    computeRPS(pocCurr, slice->isIRAP(), slice->getLocalRPS(), slice->getSPS()->getMaxDecPicBuffering(0));
+#if 0
+    if(m_cfg->param.bframes)  // Lookahead references for B frames not in place yet
+    {
+        computeRPS(pocCurr, slice->isIRAP(), slice->getLocalRPS(), slice->getSPS()->getMaxDecPicBuffering(0));
+    }
+    else
+    {
+        computeRPS(pocCurr, slice->isIRAP(), slice->getLocalRPS(), slice->getSPS()->getMaxDecPicBuffering(0), pic->m_predRefPOC, pic->m_predRefCount);
+    }
+#else if
+        computeRPS(pocCurr, slice->isIRAP(), slice->getLocalRPS(), slice->getSPS()->getMaxDecPicBuffering(0));
+#endif
+
     slice->setRPS(slice->getLocalRPS());
     slice->setRPSidx(-1);              //   To force using RPS from slice, rather than from SPS
 
@@ -281,6 +293,43 @@
     rps->sortDeltaPOC();
 }
 
+bool isInArray(int *arr, int size, int num)
+{
+    for(int i=0;i<size;i++) 
+        if(arr[i]==num) 
+        {return(true);}
+    return(false);
+}
+
+void DPB::computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps, unsigned int maxDecPicBuffer, int *predRefPOC, int predRefCount)
+{
+    TComPic * refPic;
+    unsigned int poci = 0, numNeg = 0, numPos = 0;
+
+    TComList<TComPic*>::iterator iterPic = m_picList.begin();
+    while ((iterPic != m_picList.end()) && (poci < (maxDecPicBuffer)))
+    {
+        refPic = *(iterPic);
+        if ((refPic->getPOC() != curPoc) && (refPic->getSlice()->isReferenced()) && isInArray(predRefPOC, predRefCount, refPic->getPOC()))
+        {
+            rps->m_POC[poci] = refPic->getPOC();
+            rps->m_deltaPOC[poci] = rps->m_POC[poci] - curPoc;
+            (rps->m_deltaPOC[poci] < 0) ? numNeg++ : numPos++;
+            rps->m_used[poci] = !isRAP;
+            poci++;
+        }
+        iterPic++;
+    }
+
+    rps->m_numberOfPictures = poci;
+    rps->m_numberOfPositivePictures = numPos;
+    rps->m_numberOfNegativePictures = numNeg;
+    rps->m_numberOfLongtermPictures = 0;
+    rps->m_interRPSPrediction = false;          // To be changed later when needed
+
+    rps->sortDeltaPOC();
+}
+
 /** Function for marking the reference pictures when an IDR/CRA/CRANT/BLA/BLANT is encountered.
  * \param pocCRA POC of the CRA/CRANT/BLA/BLANT picture
  * \param bRefreshPending flag indicating if a deferred decoding refresh is pending
diff -r a4cec6558ccc -r e06a76856565 source/encoder/dpb.h
--- a/source/encoder/dpb.h	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/encoder/dpb.h	Wed Sep 04 16:03:06 2013 +0530
@@ -66,10 +66,13 @@
 
     void computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps, unsigned int maxDecPicBuffer);
 
+    // Taking references from lookahead; not tested for B frames
+    void computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps, unsigned int maxDecPicBuffer, int *predRefPOC, int predRefCount);
+
     void applyReferencePictureSet(TComReferencePictureSet *rps, int curPoc);
     void decodingRefreshMarking(int pocCurr, NalUnitType nalUnitType);
 
-    void arrangeLongtermPicturesInRPS(TComSlice *, FrameEncoder *frameEncoder);
+    void arrangeLongtermPicturesInRPS(TComSlice *, x265::FrameEncoder *frameEncoder);
 
     NalUnitType getNalUnitType(int curPoc, int lastIdr);
 };
diff -r a4cec6558ccc -r e06a76856565 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/encoder/slicetype.cpp	Wed Sep 04 16:03:06 2013 +0530
@@ -72,6 +72,7 @@
     merange = 16;
     widthInCU = ((cfg->param.sourceWidth / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;
     heightInCU = ((cfg->param.sourceHeight / 2) + X265_LOWRES_CU_SIZE - 1) >> X265_LOWRES_CU_BITS;
+    picPrev = NULL;
 }
 
 Lookahead::~Lookahead()
@@ -106,6 +107,9 @@
         outputQueue.pushBack(pic);
         numDecided++;
         lastKeyframe = 0;
+        picPrev = pic;
+        prevRef = NULL;   // best reference of previous
+
         return;
     }
 
@@ -113,20 +117,56 @@
     slicetypeAnalyse(false);
 
     // This will work only in all-P config
-    int dframes;
+    int dframes, d0;
+    int costRef, costPrev;
+    int thresh = X265_BFRAME_MAX;
     for (dframes = 0; (frames[dframes + 1] != NULL) && (frames[dframes + 1]->sliceType != X265_TYPE_AUTO); dframes++)
     {}
-
+    
     TComPic *pic;
     for (int i = 1; i <= dframes && i <= inputQueue.size(); i++)
     {
         pic = inputQueue.popFront();
+        pic->m_predRefCount=0;
         pic->m_lowres.gopIdx = (pic->getPOC() - 1) % (cfg->getGOPSizeMin());
-        outputQueue.pushBack(pic);
         if (pic->m_lowres.sliceType == X265_TYPE_I)
         {
+            picPrev = pic;
+            prevRef = NULL;       // best reference of previous
             lastKeyframe = pic->getPOC();
         }
+        else if((pic->m_lowres.sliceType == X265_TYPE_P))
+        {
+            if((prevRef!=NULL)&&((d0 = pic->getPOC() - prevRef->getPOC()) < thresh))
+            {
+                    frames[0] = &(prevRef->m_lowres);
+                    frames[d0]= &(pic->m_lowres);
+                    costRef = estimateFrameCost(0, d0, d0, false);
+
+                    d0 = 1;
+                    frames[0] = &(picPrev->m_lowres);
+                    frames[d0]= &(pic->m_lowres);
+                    costPrev = estimateFrameCost(0, d0, d0, false);
+
+                    if(costRef < costPrev)
+                    {
+                        pic->m_predRefPOC[0] = prevRef->getPOC();      
+                    }
+                    else
+                    {
+                        pic->m_predRefPOC[0] = picPrev->getPOC();
+                        prevRef = picPrev;
+                    }
+            }
+            else
+            {
+                pic->m_predRefPOC[0] = picPrev->getPOC();
+                prevRef = picPrev;
+            }
+            pic->m_predRefCount=1;
+            picPrev = pic;
+        }
+        outputQueue.pushBack(pic);
     }
 
 #else // if 0
diff -r a4cec6558ccc -r e06a76856565 source/encoder/slicetype.h
--- a/source/encoder/slicetype.h	Wed Sep 04 15:38:29 2013 +0530
+++ b/source/encoder/slicetype.h	Wed Sep 04 16:03:06 2013 +0530
@@ -47,6 +47,7 @@
     int              merange;
     int              numDecided;
     int              lastKeyframe;
+    TComPic         *picPrev, *prevRef;
     int              widthInCU;       // width of lowres frame in downscale CUs
     int              heightInCU;      // height of lowres frame in downscale CUs
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.patch
Type: text/x-patch
Size: 8446 bytes
Desc: not available
URL: <https://mailman.videolan.org/private/x265-devel/attachments/20130904/55b2dcec/attachment-0001.bin>


More information about the x265-devel mailing list