[x265] [PATCH 1 of 2] Computing RPS from a fixed GOP
shazeb at multicorewareinc.com
shazeb at multicorewareinc.com
Thu Aug 22 14:54:41 CEST 2013
# HG changeset patch
# User Shazeb N Khan
# Date 1377173041 -19800
# Thu Aug 22 17:34:01 2013 +0530
# Node ID 34c63b8389c6f688cec7ac869943df32577fb28e
# Parent 9f38435eee26dfc31d7fbd81ca5357f4a5b4d5b8
Computing RPS from a fixed GOP
diff -r 9f38435eee26 -r 34c63b8389c6 source/Lib/TLibCommon/TComSlice.h
--- a/source/Lib/TLibCommon/TComSlice.h Thu Aug 22 15:17:49 2013 +0800
+++ b/source/Lib/TLibCommon/TComSlice.h Thu Aug 22 17:34:01 2013 +0530
@@ -66,18 +66,13 @@
{
private:
- Int m_numberOfPictures;
- Int m_numberOfNegativePictures;
- Int m_numberOfPositivePictures;
- Int m_numberOfLongtermPictures;
- Int m_deltaPOC[MAX_NUM_REF_PICS];
- Int m_POC[MAX_NUM_REF_PICS];
- Bool m_used[MAX_NUM_REF_PICS];
- Bool m_interRPSPrediction;
+ // Parameters for inter RPS prediction
Int m_deltaRIdxMinus1;
Int m_deltaRPS;
Int m_numRefIdc;
Int m_refIdc[MAX_NUM_REF_PICS + 1];
+
+ // Parameters for long term references
Bool m_bCheckLTMSB[MAX_NUM_REF_PICS];
Int m_pocLSBLT[MAX_NUM_REF_PICS];
Int m_deltaPOCMSBCycleLT[MAX_NUM_REF_PICS];
@@ -85,6 +80,17 @@
public:
+ Int m_numberOfPictures;
+ Int m_numberOfNegativePictures;
+ Int m_numberOfPositivePictures;
+ Int m_deltaPOC[MAX_NUM_REF_PICS];
+ Bool m_used[MAX_NUM_REF_PICS];
+ Int m_POC[MAX_NUM_REF_PICS];
+
+ Bool m_interRPSPrediction;
+ Int m_numberOfLongtermPictures; // Zero when disabled
+
+
TComReferencePictureSet();
virtual ~TComReferencePictureSet();
Int getPocLSBLT(Int i) { return m_pocLSBLT[i]; }
diff -r 9f38435eee26 -r 34c63b8389c6 source/encoder/dpb.cpp
--- a/source/encoder/dpb.cpp Thu Aug 22 15:17:49 2013 +0800
+++ b/source/encoder/dpb.cpp Thu Aug 22 17:34:01 2013 +0530
@@ -31,6 +31,8 @@
using namespace x265;
+#define MAX_REFD_BY_CUR 8
+
DPB::~DPB()
{
while (!m_picList.empty())
@@ -44,7 +46,6 @@
void DPB::recycleUnreferenced(TComList<TComPic*> freeList)
{
// move unreferenced pictures from picList to freeList for recycle
- TComSlice::sortPicList(m_picList);
TComList<TComPic*>::iterator iterPic = m_picList.begin();
while (iterPic != m_picList.end())
{
@@ -71,7 +72,7 @@
int pocCurr = pic->getSlice()->getPOC();
Bool forceIntra = m_cfg->param.keyframeMax == 1 || (pocCurr % m_cfg->param.keyframeMax == 0) || pocCurr == 0;
- m_picList.pushBack(pic);
+ m_picList.pushFront(pic);
frameEncoder->initSlice(pic, forceIntra, gopIdx);
TComSlice* slice = pic->getSlice();
@@ -90,10 +91,14 @@
{
slice->setTemporalLayerNonReferenceFlag(false);
}
+ else if(slice->getSliceType() == B_SLICE)
+ {
+ slice->setReferenced(false); // Disallowing B frame from being referenced, unless the 'lookahead' intends to
+ slice->setTemporalLayerNonReferenceFlag(true);
+ }
else
{
- // m_refPic is true if this frame is used as a motion reference
- slice->setTemporalLayerNonReferenceFlag(!m_cfg->getGOPEntry(gopIdx).m_refPic);
+ slice->setTemporalLayerNonReferenceFlag(false);
}
// Set the nal unit type
@@ -118,21 +123,19 @@
// Do decoding refresh marking if any
slice->decodingRefreshMarking(m_pocCRA, m_bRefreshPending, m_picList);
- selectReferencePictureSet(slice, frameEncoder, pocCurr, gopIdx);
- slice->getRPS()->setNumberOfLongtermPictures(0);
+
+ computeRPS(pocCurr, slice->isIRAP(), slice->getLocalRPS());
+ slice->setRPS(slice->getLocalRPS());
+ slice->setRPSidx(-1); // To force using RPS from slice, rather than from SPS
- if ((slice->checkThatAllRefPicsAreAvailable(m_picList, slice->getRPS(), false) != 0) || (slice->isIRAP()))
- {
- slice->createExplicitReferencePictureSetFromReference(m_picList, slice->getRPS(), slice->isIRAP());
- }
slice->applyReferencePictureSet(m_picList, slice->getRPS());
arrangeLongtermPicturesInRPS(slice, frameEncoder);
TComRefPicListModification* refPicListModification = slice->getRefPicListModification();
refPicListModification->setRefPicListModificationFlagL0(false);
refPicListModification->setRefPicListModificationFlagL1(false);
- slice->setNumRefIdx(REF_PIC_LIST_0, min(m_cfg->getGOPEntry(gopIdx).m_numRefPicsActive, slice->getRPS()->getNumberOfPictures()));
- slice->setNumRefIdx(REF_PIC_LIST_1, min(m_cfg->getGOPEntry(gopIdx).m_numRefPicsActive, slice->getRPS()->getNumberOfPictures()));
+ slice->setNumRefIdx(REF_PIC_LIST_0, slice->getRPS()->getNumberOfPictures() / 2 + 1); // TO DO: how to decide the number of references to be included in each list
+ slice->setNumRefIdx(REF_PIC_LIST_1, slice->getRPS()->getNumberOfPictures() / 2 + 1);
slice->setRefPicList(m_picList);
@@ -148,11 +151,13 @@
// what is setColFromL0Flag() for?
// select colDir
+ TComReferencePictureSet *rps = slice->getRPS();
+
UInt colDir = 1;
int closeLeft = 1, closeRight = -1;
- for (int i = 0; i < m_cfg->getGOPEntry(gopIdx).m_numRefPics; i++)
+ for (int i = 0; i < rps->m_numberOfPictures; i++)
{
- int ref = m_cfg->getGOPEntry(gopIdx).m_referencePics[i];
+ int ref = rps->m_deltaPOC[i];
if (ref > 0 && (ref < closeRight || closeRight == -1))
{
closeRight = ref;
@@ -246,6 +251,36 @@
slice->setNextSlice(false);
}
+void DPB::computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps)
+{
+ curPoc;
+ TComPic * refPic;
+ int poci=0, numNeg=0, numPos=0;
+
+ TComList<TComPic*>::iterator iterPic = m_picList.begin();
+ while ((iterPic != m_picList.end())&&(poci<MAX_REFD_BY_CUR))
+ {
+ refPic = *(iterPic);
+ if ((refPic->getPOC() != curPoc)&&(refPic->getSlice()->isReferenced()))
+ {
+ 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] = true && (!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(); // TO DO: check whether entire process of sorting is needed here
+}
+
// 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)
@@ -514,7 +549,7 @@
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 = 'B';
+ m_gopList[i].m_sliceType = (i!=4)? '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;
diff -r 9f38435eee26 -r 34c63b8389c6 source/encoder/dpb.h
--- a/source/encoder/dpb.h Thu Aug 22 15:17:49 2013 +0800
+++ b/source/encoder/dpb.h Thu Aug 22 17:34:01 2013 +0530
@@ -62,6 +62,8 @@
void selectReferencePictureSet(TComSlice* slice, x265::FrameEncoder*, int curPoc, int gopID);
+ void computeRPS(int curPoc, bool isRAP, TComReferencePictureSet * rps);
+
int getReferencePictureSetIdxForSOP(int pocCur, int GOPid);
void arrangeLongtermPicturesInRPS(TComSlice *, x265::FrameEncoder *frameEncoder);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-1.patch
Type: text/x-patch
Size: 7797 bytes
Desc: not available
URL: <https://mailman.videolan.org/private/x265-devel/attachments/20130822/4caf10fa/attachment.bin>
More information about the x265-devel
mailing list