[x265] [PATCH] Fix build warnings for MV-HEVC, Alpha & SCC and Code cleanup

Anusuya Kumarasamy anusuya.kumarasamy at multicorewareinc.com
Wed Oct 9 12:01:42 UTC 2024


>From bac40495e1159c4d857105318021fb75faadac0b Mon Sep 17 00:00:00 2001
From: AnusuyaKumarasamy <anusuya.kumarasamy at multicorewareinc.com>
Date: Mon, 30 Sep 2024 11:01:08 +0530
Subject: [PATCH] Fix build warnings for MV-HEVC, Alpha & SCC and Code
cleanup

---
 source/abrEncApp.cpp            | 18 ++++----
 source/abrEncApp.h              |  2 +-
 source/common/cudata.cpp        | 11 ++++-
 source/common/cudata.h          | 10 ++++-
 source/common/lowpassdct.cpp    |  6 ++-
 source/common/param.cpp         | 53 +++++++++++++++++++++++-
 source/common/slice.cpp         | 10 +++--
 source/common/slice.h           |  4 +-
 source/encoder/analysis.cpp     | 16 +++++++-
 source/encoder/analysis.h       |  7 +++-
 source/encoder/dpb.cpp          |  8 +++-
 source/encoder/encoder.cpp      | 28 +++++++------
 source/encoder/entropy.cpp      | 10 +++--
 source/encoder/entropy.h        |  4 ++
 source/encoder/frameencoder.cpp |  7 ++--
 source/encoder/level.cpp        | 45 --------------------
 source/encoder/nal.cpp          |  2 +-
 source/encoder/search.cpp       | 32 ++++++++++-----
 source/encoder/search.h         |  5 ++-
 source/encoder/sei.h            | 73 ++++++++++++++++++++++++++-------
 source/x265.h                   |  7 ++--
 source/x265cli.cpp              |  3 +-
 22 files changed, 240 insertions(+), 121 deletions(-)

diff --git a/source/abrEncApp.cpp b/source/abrEncApp.cpp
index c5dcf3559..4c433122b 100644
--- a/source/abrEncApp.cpp
+++ b/source/abrEncApp.cpp
@@ -63,7 +63,7 @@ namespace X265_NS {
             m_passEnc[i]->init(ret);
         }

-        m_numInputViews = m_passEnc[0]->m_param->numViews;
+        m_numInputViews = m_passEnc[0]->m_param->numViews -
!!m_passEnc[0]->m_param->format;
         if (!allocBuffers())
         {
             x265_log(NULL, X265_LOG_ERROR, "Unable to allocate memory for
buffers\n");
@@ -207,7 +207,7 @@ namespace X265_NS {
         m_parent = parent;
         if (!(m_cliopt.enableScaler && m_id))
         {
-            for (int view = 0; view < m_cliopt.param->numViews; view++)
+            for (int view = 0; view < m_cliopt.param->numViews -
!!m_cliopt.param->format; view++)
                 m_input[view] = m_cliopt.input[view];
         }
         m_param = cliopt.param;
@@ -592,14 +592,14 @@ ret:

             x265_picture pic_orig[MAX_VIEWS];
             x265_picture *pic_in[MAX_VIEWS];
-            for (int view = 0; view < m_param->numViews; view++)
+            for (int view = 0; view < m_param->numViews -
!!m_param->format; view++)
                 pic_in[view] = &pic_orig[view];
             /* Allocate recon picture if analysis save/load is enabled */
             std::priority_queue<int64_t>* pts_queue =
m_cliopt.output->needPTS() ? new std::priority_queue<int64_t>() : NULL;
             x265_picture* pic_recon;
             x265_picture pic_out[MAX_LAYERS];

-            pic_recon = (m_cliopt.recon || m_param->analysisSave ||
m_param->analysisLoad || pts_queue || reconPlay || m_param->csvLogLevel) ?
pic_out : NULL;
+            pic_recon = (m_cliopt.recon[0] || m_param->analysisSave ||
m_param->analysisLoad || pts_queue || reconPlay || m_param->csvLogLevel) ?
pic_out : NULL;
             uint32_t inFrameCount = 0;
             uint32_t outFrameCount = 0;
             x265_nal *p_nal;
@@ -625,7 +625,7 @@ ret:
                     m_cliopt.totalbytes +=
m_cliopt.output->writeHeaders(p_nal, nal);
             }

-            for (int view = 0; view < m_param->numViews; view++)
+            for (int view = 0; view < m_param->numViews -
!!m_param->format; view++)
             {
                 if (m_param->bField && m_param->interlaceMode)
                 {
@@ -639,7 +639,7 @@ ret:
                     api->picture_init(m_param, &pic_orig[view]);
             }

-            if (m_param->dolbyProfile && m_cliopt.dolbyVisionRpu)
+            if (m_param->dolbyProfile && m_cliopt.dolbyVisionRpu &&
pic_in[0])
             {
                 rpuPayload = X265_MALLOC(uint8_t, 1024);
                 pic_in[0]->rpu.payload = rpuPayload;
@@ -659,7 +659,7 @@ ret:
             // main encoder loop
             while (pic_in[0] && !b_ctrl_c)
             {
-                for (int view = 0; view < m_param->numViews; view++)
+                for (int view = 0; view < m_param->numViews -
!!m_param->format; view++)
                 {
                     pic_orig[view].poc = (m_param->bField &&
m_param->interlaceMode) ? inFrameCount * 2 : inFrameCount;
                     if (m_cliopt.qpfile)
@@ -676,7 +676,7 @@ ret:
                     if (m_cliopt.framesToBeEncoded && inFrameCount >=
m_cliopt.framesToBeEncoded)
                         pic_in[view] = NULL;
                     else if (readPicture(pic_in[view], view)){
-                        if(view == m_param->numViews - 1)
+                        if(view == m_param->numViews - !!m_param->format -
1)
                             inFrameCount++;
                     }
                     else
@@ -785,7 +785,7 @@ ret:
                 {
                     x265_picture* picInput = NULL;
                     if (inputPicNum == 2)
-                        picInput = pic_in ? (inputNum ? &picField2 :
&picField1) : NULL;
+                        picInput = *pic_in ? (inputNum ? &picField2 :
&picField1) : NULL;
                     else
                         picInput = *pic_in;

diff --git a/source/abrEncApp.h b/source/abrEncApp.h
index fab694656..7c1142baf 100644
--- a/source/abrEncApp.h
+++ b/source/abrEncApp.h
@@ -42,7 +42,7 @@ namespace X265_NS {
     {
     public:
         uint8_t           m_numEncodes;
-        uint8_t           m_numInputViews; // Number of inputs for
multiview-extension
+        int               m_numInputViews; // Number of inputs for
multiview-extension
         PassEncoder        **m_passEnc;
         uint32_t           m_queueSize;
         ThreadSafeInteger  m_numActiveEncodes;
diff --git a/source/common/cudata.cpp b/source/common/cudata.cpp
index ae1fb4694..6ea6048b7 100644
--- a/source/common/cudata.cpp
+++ b/source/common/cudata.cpp
@@ -327,7 +327,11 @@ void CUData::initCTU(const Frame& frame, uint32_t
cuAddr, int qp, uint32_t first
 }

 // initialize Sub partition
+#if ENABLE_SCC_EXT
 void CUData::initSubCU(const CUData& ctu, const CUGeom& cuGeom, int qp, MV
lastIntraBCMv[2])
+#else
+void CUData::initSubCU(const CUData& ctu, const CUGeom& cuGeom, int qp)
+#endif
 {
     m_absIdxInCTU   = cuGeom.absPartIdx;
     m_encData       = ctu.m_encData;
@@ -1737,7 +1741,11 @@ uint32_t CUData::getInterMergeCandidates(uint32_t
absPartIdx, uint32_t puIdx, MV
 }

 // Create the PMV list. Called for each reference index.
+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
 int CUData::getPMV(InterNeighbourMV* neighbours, uint32_t picList,
uint32_t refIdx, MV* amvpCand, MV* pmv, uint32_t puIdx, uint32_t
absPartIdx) const
+#else
+int CUData::getPMV(InterNeighbourMV* neighbours, uint32_t picList,
uint32_t refIdx, MV* amvpCand, MV* pmv) const
+#endif
 {
     MV directMV[MD_ABOVE_LEFT + 1];
     MV indirectMV[MD_ABOVE_LEFT + 1];
@@ -1847,7 +1855,6 @@ int CUData::getPMV(InterNeighbourMV* neighbours,
uint32_t picList, uint32_t refI
             int refId = refIdx;
             uint32_t absPartAddr = m_absIdxInCTU + absPartIdx;
             uint32_t partIdxRB = deriveRightBottomIdx(puIdx);
-            bool isValid;

             // co-located RightBottom temporal predictor (H)
             int ctuIdx = -1;
@@ -2128,7 +2135,7 @@ bool CUData::getColMVP(MV& outMV, int& outRefIdx, int
picList, int cuAddr, int p
         outMV = scaleMvByPOCDist(colmv, curPOC, curRefPOC, colPOC,
colRefPOC);
 #else
     outMV = scaleMvByPOCDist(colmv, curPOC, curRefPOC, colPOC, colRefPOC);
-#endif;
+#endif
     return true;
 }

diff --git a/source/common/cudata.h b/source/common/cudata.h
index 2b669a802..7c25a4e07 100644
--- a/source/common/cudata.h
+++ b/source/common/cudata.h
@@ -253,7 +253,9 @@ public:
     static void calcCTUGeoms(uint32_t ctuWidth, uint32_t ctuHeight,
uint32_t maxCUSize, uint32_t minCUSize, CUGeom
cuDataArray[CUGeom::MAX_GEOMS]);

     void     initCTU(const Frame& frame, uint32_t cuAddr, int qp, uint32_t
firstRowInSlice, uint32_t lastRowInSlice, uint32_t lastCUInSlice);
-    void     initSubCU(const CUData& ctu, const CUGeom& cuGeom, int qp, MV
lastIntraBCMv[2] = 0);
+#if !ENABLE_SCC_EXT
+    void     initSubCU(const CUData& ctu, const CUGeom& cuGeom, int qp);
+#endif
     void     initLosslessCU(const CUData& cu, const CUGeom& cuGeom);

     void     copyPartFrom(const CUData& cu, const CUGeom& childGeom,
uint32_t subPartIdx);
@@ -289,7 +291,11 @@ public:
     int8_t   getRefQP(uint32_t currAbsIdxInCTU) const;
     uint32_t getInterMergeCandidates(uint32_t absPartIdx, uint32_t puIdx,
MVField (*candMvField)[2], uint8_t* candDir) const;
     void     clipMv(MV& outMV) const;
+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
     int      getPMV(InterNeighbourMV* neighbours, uint32_t reference_list,
uint32_t refIdx, MV* amvpCand, MV* pmv, uint32_t puIdx = 0, uint32_t
absPartIdx = 0) const;
+#else
+    int      getPMV(InterNeighbourMV* neighbours, uint32_t reference_list,
uint32_t refIdx, MV* amvpCand, MV* pmv) const;
+#endif
     void     getNeighbourMV(uint32_t puIdx, uint32_t absPartIdx,
InterNeighbourMV* neighbours) const;
     void     getIntraTUQtDepthRange(uint32_t tuDepthRange[2], uint32_t
absPartIdx) const;
     void     getInterTUQtDepthRange(uint32_t tuDepthRange[2], uint32_t
absPartIdx) const;
@@ -327,6 +333,8 @@ public:
     const CUData* getPUBelowLeftAdi(uint32_t& blPartUnitIdx, uint32_t
curPartUnitIdx, uint32_t partUnitOffset) const;

 #if ENABLE_SCC_EXT
+    void     initSubCU(const CUData& ctu, const CUGeom& cuGeom, int qp, MV
lastIntraBCMv[2] = 0);
+
     void getIntraBCMVPsEncOnly(uint32_t absPartIdx, MV* MvPred, int&
nbPred, int puIdx);
     bool getDerivedBV(uint32_t absPartIdx, const MV& currentMv, MV&
derivedMv, uint32_t width, uint32_t height);
     bool isIntraBC(const CUData* cu, uint32_t absPartIdx) const;
diff --git a/source/common/lowpassdct.cpp b/source/common/lowpassdct.cpp
index f9922980f..e0f9c1ab7 100644
--- a/source/common/lowpassdct.cpp
+++ b/source/common/lowpassdct.cpp
@@ -58,7 +58,11 @@ static void lowPassDct8_c(const int16_t* src, int16_t*
dst, intptr_t srcStride)
     }

     // replace first coef with total block average
-    dst[0] = (X265_DEPTH == 8) ? (totalSum << 1) : (totalSum >>
((X265_DEPTH - 9)));
+#if X265_DEPTH == 8
+    dst[0] = totalSum << 1;
+#else
+    dst[0] = totalSum >> (X265_DEPTH - 9);
+#endif
 }

 static void lowPassDct16_c(const int16_t* src, int16_t* dst, intptr_t
srcStride)
diff --git a/source/common/param.cpp b/source/common/param.cpp
index 833edb767..71437aa98 100755
--- a/source/common/param.cpp
+++ b/source/common/param.cpp
@@ -109,6 +109,33 @@ void x265_param_free(x265_param* p)
     x265_free(p);
 }

+#if ENABLE_SCC_EXT
+enum SCCProfileName
+{
+    NONE = 0,
+    // The following are SCC profiles, which would map to the MAINSCC
profile idc.
+    // The enumeration indicates the bit-depth constraint in the bottom 2
digits
+    //                           the chroma format in the next digit
+    //                           the intra constraint in the next digit
+    //                           If it is a SCC profile there is a '2' for
the next digit.
+    //                           If it is a highthroughput , there is a
'2' for the top digit else '1' for the top digit
+    SCC_MAIN = 121108,
+    SCC_MAIN_10 = 121110,
+    SCC_MAIN_444 = 121308,
+    SCC_MAIN_444_10 = 121310,
+};
+
+static const SCCProfileName validSCCProfileNames[1][4/* bit depth
constraint 8=0, 10=1, 12=2, 14=3*/][4/*chroma format*/] =
+{
+   {
+        { NONE,         SCC_MAIN,      NONE,      SCC_MAIN_444
        }, // 8-bit  intra for 400, 420, 422 and 444
+        { NONE,         SCC_MAIN_10,   NONE,      SCC_MAIN_444_10
         }, // 10-bit intra for 400, 420, 422 and 444
+        { NONE,         NONE,          NONE,      NONE
        }, // 12-bit intra for 400, 420, 422 and 444
+        { NONE,         NONE,          NONE,      NONE
        }  // 16-bit intra for 400, 420, 422 and 444
+    },
+};
+#endif
+
 void x265_param_default(x265_param* param)
 {
 #ifdef SVT_HEVC
@@ -1959,17 +1986,39 @@ int x265_check_params(x265_param* param)
     if (param->bEnableAlpha)
     {
         CHECK((param->internalCsp != X265_CSP_I420), "Alpha encode
supported only with i420a colorspace");
+        CHECK((param->internalBitDepth > 10), "BitDepthConstraint must be
8 and 10  for Scalable main profile");
         CHECK((param->analysisMultiPassDistortion ||
param->analysisMultiPassRefine), "Alpha encode doesnot support multipass
feature");
+        CHECK((param->analysisSave || param->analysisLoad), "Alpha encode
doesnot support analysis save and load  feature");
     }
 #endif
 #if ENABLE_MULTIVIEW
     CHECK((param->numViews > 2), "Multi-View Encoding currently support
only 2 views");
-    CHECK((param->numViews > 1) && (param->internalBitDepth != 8),
"BitDepthConstraint must be 8 for Multiview main profile");
-    CHECK((param->numViews > 1) && (param->analysisMultiPassDistortion ||
param->analysisMultiPassRefine), "Multiview encode doesnot support
multipass feature");
+    if (param->numViews > 1)
+    {
+        CHECK(param->internalBitDepth != 8, "BitDepthConstraint must be 8
for Multiview main profile");
+        CHECK(param->analysisMultiPassDistortion ||
param->analysisMultiPassRefine, "Multiview encode doesnot support multipass
feature");
+        CHECK(param->analysisSave || param->analysisLoad, "Multiview
encode doesnot support analysis save and load feature");
+    }
 #endif
 #if ENABLE_SCC_EXT
+    bool checkValid = false;
+
+    if (!!param->bEnableSCC)
+    {
+        checkValid = param->keyframeMax <= 1 || param->totalFrames == 1;
+        if (checkValid)     x265_log(param, X265_LOG_WARNING, "intra
constraint flag must be 0 for SCC profiles. Disabling SCC  \n");
+        checkValid = param->totalFrames == 1;
+        if (checkValid)     x265_log(param, X265_LOG_WARNING,
"one-picture-only constraint flag shall be 0 for SCC profiles. Disabling
SCC  \n");
+        const uint32_t bitDepthIdx = (param->internalBitDepth == 8 ? 0 :
(param->internalBitDepth == 10 ? 1 : (param->internalBitDepth == 12 ? 2 :
(param->internalBitDepth == 16 ? 3 : 4))));
+        const uint32_t chromaFormatIdx = uint32_t(param->internalCsp);
+        checkValid = !((bitDepthIdx > 2 || chromaFormatIdx > 3) ? false :
(validSCCProfileNames[0][bitDepthIdx][chromaFormatIdx] != NONE));
+        if (checkValid)     x265_log(param, X265_LOG_WARNING, "Invalid
intra constraint flag, bit depth constraint flag and chroma format
constraint flag combination for a RExt profile. Disabling SCC \n");
+        if (checkValid)
+            param->bEnableSCC = 0;
+    }
     CHECK(!!param->bEnableSCC&& param->rdLevel != 6, "Enabling scc
extension in x265 requires rdlevel of 6 ");
 #endif
+
     return check_failed;
 }

diff --git a/source/common/slice.cpp b/source/common/slice.cpp
index 0c09df21b..5e5ad8a92 100644
--- a/source/common/slice.cpp
+++ b/source/common/slice.cpp
@@ -35,7 +35,6 @@ void Slice::createInterLayerReferencePictureSet(PicList&
picList, PicList& refPi

     for (int i = 0; i < 1; i++)
     {
-        int layerIdRef = 0;// getRefPicLayerId(i);
         Frame* refPic = picList.getPOC(m_poc, 0);
         int viewIdCur = 0;
         int viewIdZero = 1;
@@ -53,9 +52,12 @@ void Slice::createInterLayerReferencePictureSet(PicList&
picList, PicList& refPi
 }
 #endif

-void Slice::setRefPicList(PicList& picList, PicList& refPicSetInterLayer0,
PicList& refPicSetInterLayer1, int sLayerId)
+#if ENABLE_MULTIVIEW
+void Slice::setRefPicList(PicList& picList, int sLayerId, PicList&
refPicSetInterLayer0, PicList& refPicSetInterLayer1)
+#else
+void Slice::setRefPicList(PicList& picList, int sLayerId)
+#endif
 {
-    bool checkNumPocTotalCurr = m_param->bEnableSCC ? false : true;
     if (m_sliceType == I_SLICE)
     {
         memset(m_refFrameList, 0, sizeof(m_refFrameList));
@@ -64,6 +66,7 @@ void Slice::setRefPicList(PicList& picList, PicList&
refPicSetInterLayer0, PicLi
         m_numRefIdx[1] = m_numRefIdx[0] = 0;

 #if ENABLE_SCC_EXT
+        bool checkNumPocTotalCurr = m_param->bEnableSCC ? false : true;
         if (!checkNumPocTotalCurr)
         {
             if (m_rps.numberOfPictures == 0)
@@ -94,6 +97,7 @@ void Slice::setRefPicList(PicList& picList, PicList&
refPicSetInterLayer0, PicLi
 #endif

 #if ENABLE_SCC_EXT
+    bool checkNumPocTotalCurr = m_param->bEnableSCC ? false : true;
     if (!checkNumPocTotalCurr && m_rps.numberOfPictures == 0)
     {
         Frame* prevPic = picList.getPOC(X265_MAX(0, m_poc - 1));
diff --git a/source/common/slice.h b/source/common/slice.h
index 041bc451e..0d0b2efb4 100644
--- a/source/common/slice.h
+++ b/source/common/slice.h
@@ -434,9 +434,11 @@ public:

     void disableWeights();

-    void setRefPicList(PicList& picList, PicList& refPicSetInterLayer0,
PicList& refPicSetInterLayer1, int viewId);
 #if ENABLE_MULTIVIEW
+    void setRefPicList(PicList& picList, int viewId, PicList&
refPicSetInterLayer0, PicList& refPicSetInterLayer1);
     void createInterLayerReferencePictureSet(PicList& picList, PicList&
refPicSetInterLayer0, PicList& refPicSetInterLayer1);
+#else
+    void setRefPicList(PicList& picList, int viewId);
 #endif

 #if  ENABLE_SCC_EXT
diff --git a/source/encoder/analysis.cpp b/source/encoder/analysis.cpp
index d60747cc0..c99c796af 100644
--- a/source/encoder/analysis.cpp
+++ b/source/encoder/analysis.cpp
@@ -2870,7 +2870,11 @@ void Analysis::recodeCU(const CUData& parentCTU,
const CUGeom& cuGeom, int32_t q
                                 continue;
                             MV mvp;

+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
                             int numMvc =
mode.cu.getPMV(mode.interNeighbours, list, ref, mode.amvpCand[list][ref],
mvc, part, pu.puAbsPartIdx);
+#else
+                            int numMvc =
mode.cu.getPMV(mode.interNeighbours, list, ref, mode.amvpCand[list][ref],
mvc);
+#endif
                             mvp =
mode.amvpCand[list][ref][mode.cu.m_mvpIdx[list][pu.puAbsPartIdx]];
                             if (m_param->interRefine == 1)
                             {
@@ -3413,7 +3417,7 @@ void Analysis::checkRDCostIntraBCMerge2Nx2N(Mode&
mergeIBC, const CUGeom& cuGeom
     {
         interDirNeighbours[ui] = 0;
     }
-    int org_qp;
+    int8_t org_qp;
     int xPos = cu.m_cuPelX;
     int yPos = cu.m_cuPelY;
     int width = 1 << cu.m_log2CUSize[0];
@@ -3426,7 +3430,7 @@ void Analysis::checkRDCostIntraBCMerge2Nx2N(Mode&
mergeIBC, const CUGeom& cuGeom
     cu.roundMergeCandidates(cMvFieldNeighbours, numValidMergeCand);
     restrictBipredMergeCand(&cu, 0, cMvFieldNeighbours,
interDirNeighbours, numValidMergeCand);

-    for (uint32_t mergeCand = 0; mergeCand < numValidMergeCand;
++mergeCand)
+    for (uint8_t mergeCand = 0; mergeCand < numValidMergeCand; ++mergeCand)
     {
         if (interDirNeighbours[mergeCand] != 1)
         {
@@ -3533,7 +3537,11 @@ void Analysis::checkInter_rd0_4(Mode& interMode,
const CUGeom& cuGeom, PartSize
     }
 }

+#if ENABLE_SCC_EXT
 void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom,
PartSize partSize, uint32_t refMask[2], MV* iMVCandList)
+#else
+void Analysis::checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom,
PartSize partSize, uint32_t refMask[2])
+#endif
 {
     interMode.initCosts();
     interMode.cu.setPartSizeSubParts(partSize);
@@ -3570,7 +3578,11 @@ void Analysis::checkInter_rd5_6(Mode& interMode,
const CUGeom& cuGeom, PartSize
         }
     }

+#if ENABLE_SCC_EXT
     predInterSearch(interMode, cuGeom, m_csp != X265_CSP_I400 &&
m_frame->m_fencPic->m_picCsp != X265_CSP_I400, refMask, iMVCandList);
+#else
+    predInterSearch(interMode, cuGeom, m_csp != X265_CSP_I400 &&
m_frame->m_fencPic->m_picCsp != X265_CSP_I400, refMask);
+#endif

     /* predInterSearch sets interMode.sa8dBits, but this is ignored */
     encodeResAndCalcRdInterCU(interMode, cuGeom);
diff --git a/source/encoder/analysis.h b/source/encoder/analysis.h
index 586e50ef0..e5fa57367 100644
--- a/source/encoder/analysis.h
+++ b/source/encoder/analysis.h
@@ -195,11 +195,14 @@ protected:

     /* measure inter options */
     void checkInter_rd0_4(Mode& interMode, const CUGeom& cuGeom, PartSize
partSize, uint32_t refmask[2]);
-    void checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize
partSize, uint32_t refmask[2], MV* iMVCandList = NULL);
-
+#if !ENABLE_SCC_EXT
+    void checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize
partSize, uint32_t refmask[2]);
+#endif
     void checkBidir2Nx2N(Mode& inter2Nx2N, Mode& bidir2Nx2N, const CUGeom&
cuGeom);

 #if ENABLE_SCC_EXT
+    void checkInter_rd5_6(Mode& interMode, const CUGeom& cuGeom, PartSize
partSize, uint32_t refmask[2], MV* iMVCandList = NULL);
+
     void checkRDCostIntraBCMerge2Nx2N(Mode& merge, const CUGeom& cuGeom);
     void checkIntraBC_rd5_6(Mode& intraBCMode, const CUGeom& cuGeom,
PartSize ePartSize, bool testOnlyPred, bool bUse1DSearchFor8x8, IBC& ibc,
MV* iMVCandList = NULL);
 #endif
diff --git a/source/encoder/dpb.cpp b/source/encoder/dpb.cpp
index caf73ad6d..ae26c5518 100644
--- a/source/encoder/dpb.cpp
+++ b/source/encoder/dpb.cpp
@@ -295,7 +295,11 @@ void DPB::prepareEncode(Frame *newFrame)
     else
 #endif
         slice->m_numRefIdx[1] = X265_MIN(newFrame->m_param->bBPyramid ? 2
: 1, slice->m_rps.numberOfPositivePictures);
-    slice->setRefPicList(m_picList, newFrame->refPicSetInterLayer0,
newFrame->refPicSetInterLayer1, layer);
+#if ENABLE_MULTIVIEW
+    slice->setRefPicList(m_picList, layer, newFrame->refPicSetInterLayer0,
newFrame->refPicSetInterLayer1);
+#else
+    slice->setRefPicList(m_picList, layer);
+#endif

     X265_CHECK(slice->m_sliceType != B_SLICE || slice->m_numRefIdx[1], "B
slice without L1 references (non-fatal)\n");

@@ -419,7 +423,7 @@ void DPB::computeRPS(int curPoc, int tempId, bool
isRAP, RPS * rps, unsigned int
             if ((!m_bTemporalSublayer || (iterPic->m_tempLayer <= tempId))
&& ((m_lastIDR >= curPoc) || (m_lastIDR <= iterPic->m_poc)))
             {
 #if ENABLE_MULTIVIEW
-                    if (iterPic->m_param->numViews > 1 && layer && numNeg
== iterPic->m_param->maxNumReferences - 1 && (iterPic->m_poc - curPoc) < 0)
+                    if (iterPic->m_param->numViews > 1 && layer && numNeg
== (uint8_t)(iterPic->m_param->maxNumReferences - 1) && (iterPic->m_poc -
curPoc) < 0)
                     {
                         iterPic = iterPic->m_next;
                         continue;
diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
index 6533fc3c6..f5de400a4 100644
--- a/source/encoder/encoder.cpp
+++ b/source/encoder/encoder.cpp
@@ -1986,7 +1986,7 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture* pic_out)
                 /* Free up inputPic->analysisData since it has already
been used */
                 if ((m_param->analysisLoad && !m_param->analysisSave) ||
((m_param->bAnalysisType == AVC_INFO) && slice->m_sliceType != I_SLICE))
                     x265_free_analysis_data(m_param,
&outFrame->m_analysisData);
-                if (pic_out && (&pic_out[sLayer]))
+                if (pic_out)
                 {
                     PicYuv* recpic = outFrame->m_reconPic[0];
                     pic_out[sLayer].poc = slice->m_poc;
@@ -2069,7 +2069,7 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture* pic_out)
                 }
                 if (m_param->rc.bStatWrite &&
(m_param->analysisMultiPassRefine || m_param->analysisMultiPassDistortion))
                 {
-                    if (pic_out && (&pic_out[sLayer]))
+                    if (pic_out)
                     {
                         pic_out[sLayer].analysisData.poc =
pic_out[sLayer].poc;
                         pic_out[sLayer].analysisData.interData =
outFrame->m_analysisData.interData;
@@ -2163,7 +2163,7 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture* pic_out)
                 if (m_param->rc.bStatWrite)
                     if
(m_rateControl->writeRateControlFrameStats(outFrame, &curEncoder->m_rce))
                         m_aborted = true;
-                if (pic_out && (&pic_out[sLayer]))
+                if (pic_out)
                 {
                     /* m_rcData is allocated for every frame */
                     pic_out[sLayer].rcData = outFrame->m_rcData;
@@ -2197,7 +2197,7 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture* pic_out)
                 }

                 /* Allow this frame to be recycled if no frame encoders
are using it for reference */
-                if (!pic_out || !(&pic_out[sLayer]))
+                if (!pic_out)
                 {
                     ATOMIC_DEC(&outFrame->m_countRefEncoders);
                     m_dpb->recycleUnreferenced();
@@ -2473,14 +2473,14 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture* pic_out)
                     switch (m_param->selectiveSAO)
                     {
                     case 3: if (!IS_REFERENCED(frameEnc[layer]))
-                        slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
-                        break;
+                                slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
+                            break;
                     case 2: if (!!m_param->bframes && slice->m_sliceType
== B_SLICE)
-                        slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
-                        break;
+                                slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
+                            break;
                     case 1: if (slice->m_sliceType != I_SLICE)
-                        slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
-                        break;
+                                slice->m_bUseSao =
curEncoder->m_frameFilter.m_useSao = 0;
+                            break;
                     }
                 }
                 else
@@ -3369,7 +3369,11 @@ void Encoder::getStreamHeaders(NALList& list,
Entropy& sbacCoder, Bitstream& bs)

     /* headers for start of bitstream */
     bs.resetBits();
+#if ENABLE_ALPHA || ENABLE_MULTIVIEW
     sbacCoder.codeVPS(m_vps, m_sps);
+#else
+    sbacCoder.codeVPS(m_vps);
+#endif
     bs.writeByteAlignment();
     list.serialize(NAL_UNIT_VPS, bs);

@@ -3503,7 +3507,7 @@ void Encoder::initVPS(VPS *vps)
     if (m_param->numScalableLayers > 1)
     {
         vps->vps_extension_flag = true;
-        int dimIdLen = 0, auxDimIdLen = 0, maxAuxId = 1, auxId[2] = { 0,1
};
+        uint8_t dimIdLen = 0, auxDimIdLen = 0, maxAuxId = 1, auxId[2] = {
0,1 };
         vps->splitting_flag = false;
         memset(vps->m_scalabilityMask, 0, sizeof(vps->m_scalabilityMask));
         memset(vps->m_layerIdInNuh, 0, sizeof(vps->m_layerIdInNuh));
@@ -3524,7 +3528,7 @@ void Encoder::initVPS(VPS *vps)
         }
         vps->m_dimensionIdLen[0] = dimIdLen;

-        for (int i = 1; i < m_param->numScalableLayers; i++)
+        for (uint8_t i = 1; i < m_param->numScalableLayers; i++)
         {
             vps->m_layerIdInNuh[i] = i;
             vps->m_dimensionId[i][0] = i;
diff --git a/source/encoder/entropy.cpp b/source/encoder/entropy.cpp
index 834d0014b..18978f26e 100644
--- a/source/encoder/entropy.cpp
+++ b/source/encoder/entropy.cpp
@@ -230,7 +230,11 @@ Entropy::Entropy()
     X265_CHECK(sizeof(m_contextState) >= sizeof(m_contextState[0]) *
MAX_OFF_CTX_MOD, "context state table is too small\n");
 }

+#if ENABLE_ALPHA || ENABLE_MULTIVIEW
 void Entropy::codeVPS(const VPS& vps, const SPS& sps)
+#else
+void Entropy::codeVPS(const VPS& vps)
+#endif
 {
     int maxLayers = (vps.m_numLayers > 1 || vps.m_numViews > 1) + 1;
     WRITE_CODE(0,       4, "vps_video_parameter_set_id");
@@ -305,7 +309,7 @@ void Entropy::codeVPS(const VPS& vps, const SPS& sps)
             WRITE_CODE(vps.ptl.levelIdc, 8, "general_level_idc");
             if (vps.maxTempSubLayers > 1)
             {
-                for (int i = 0; i < vps.maxTempSubLayers - 1; i++)
+                for (uint32_t i = 0; i < vps.maxTempSubLayers - 1; i++)
                 {
                     WRITE_FLAG(0, "sub_layer_profile_present_flag[i]");
                     WRITE_FLAG(0, "sub_layer_level_present_flag[i]");
@@ -389,7 +393,7 @@ void Entropy::codeVPS(const VPS& vps, const SPS& sps)
                 for (int i = 1; i < vps.m_vpsNumLayerSetsMinus1 + 1; i++)
                 {
                     WRITE_FLAG(vps.maxTempSubLayers > 1,
"sub_layer_flag_info_present_flag");
-                    for (int j = 0; j < vps.maxTempSubLayers ; j++)
+                    for (uint32_t j = 0; j < vps.maxTempSubLayers ; j++)
                     {
                         if(j > 0)
                         WRITE_FLAG(vps.maxTempSubLayers > 1,
"sub_layer_dpb_info_present_flag");
@@ -474,7 +478,7 @@ void Entropy::codeVPS(const VPS& vps, const SPS& sps)
                 for (int i = 1; i < vps.m_vpsNumLayerSetsMinus1 + 1; i++)
                 {
                     WRITE_FLAG(vps.maxTempSubLayers > 1,
"sub_layer_flag_info_present_flag");
-                    for (int j = 0; j < vps.maxTempSubLayers; j++)
+                    for (uint32_t j = 0; j < vps.maxTempSubLayers; j++)
                     {
                         if (j > 0)
                             WRITE_FLAG(vps.maxTempSubLayers > 1,
"sub_layer_dpb_info_present_flag");
diff --git a/source/encoder/entropy.h b/source/encoder/entropy.h
index 4271701c7..fd6fa8999 100644
--- a/source/encoder/entropy.h
+++ b/source/encoder/entropy.h
@@ -141,7 +141,11 @@ public:
     void loadIntraDirModeLuma(const Entropy& src);
     void copyState(const Entropy& other);

+#if ENABLE_ALPHA || ENABLE_MULTIVIEW
     void codeVPS(const VPS& vps, const SPS& sps);
+#else
+    void codeVPS(const VPS& vps);
+#endif
     void codeSPS(const SPS& sps, const ScalingList& scalingList, const
ProfileTierLevel& ptl, int layer = 0);
     void codePPS( const PPS& pps, bool filerAcross, int iPPSInitQpMinus26,
int layer = 0);
     void codeVUI(const VUI& vui, int maxSubTLayers, bool
bEmitVUITimingInfo, bool bEmitVUIHRDInfo, int layer = 0);
diff --git a/source/encoder/frameencoder.cpp
b/source/encoder/frameencoder.cpp
index e21dbfa85..b6f2d6ed1 100644
--- a/source/encoder/frameencoder.cpp
+++ b/source/encoder/frameencoder.cpp
@@ -668,8 +668,8 @@ void FrameEncoder::compressFrame(int layer)
                 {
                     int numAQPartInWidth =
(m_frame[0]->m_fencPic->m_picWidth + aqPartWidth - 1) / aqPartWidth;
                     int numAQPartInHeight =
(m_frame[0]->m_fencPic->m_picHeight + aqPartHeight - 1) / aqPartHeight;
-                    memset(m_frame[layer]->m_lowres.pAQLayer[d].dQpOffset,
0.0, sizeof(double)*numAQPartInWidth* numAQPartInHeight);
-
 memset(m_frame[layer]->m_lowres.pAQLayer[d].dCuTreeOffset, 0.0,
sizeof(double)* numAQPartInWidth* numAQPartInHeight);
+                    memset(m_frame[layer]->m_lowres.pAQLayer[d].dQpOffset,
0, sizeof(double)*numAQPartInWidth* numAQPartInHeight);
+
 memset(m_frame[layer]->m_lowres.pAQLayer[d].dCuTreeOffset, 0,
sizeof(double)* numAQPartInWidth* numAQPartInHeight);
                 }
             }
         }
@@ -2348,6 +2348,7 @@ void
FrameEncoder::readAomModel(AomFilmGrainCharacteristics* m_aomFilmGrain, FIL
 {
     char const* errorMessage = "Error reading Aom FilmGrain
characteristics\n";
     AomFilmGrain m_afg;
+    m_afg.m_chroma_scaling_from_luma = 0;
     x265_fread((char*)&m_aomFilmGrain->m_apply_grain, sizeof(int32_t), 1,
Aomfilmgrain, errorMessage);
     x265_fread((char*)&m_aomFilmGrain->m_grain_seed, sizeof(uint16_t), 1,
Aomfilmgrain, errorMessage);
     x265_fread((char*)&m_aomFilmGrain->m_update_grain, sizeof(int32_t), 1,
Aomfilmgrain, errorMessage);
@@ -2454,7 +2455,7 @@ void FrameEncoder::vmafFrameLevelScore()

 Frame** FrameEncoder::getEncodedPicture(NALList& output)
 {
-    if (m_frame && m_frame[0])
+    if (m_frame[0] && (m_param->numLayers <= 1 || m_frame[1]))
     {
         /* block here until worker thread completes */
         m_done.wait();
diff --git a/source/encoder/level.cpp b/source/encoder/level.cpp
index defcc7950..c2f840325 100644
--- a/source/encoder/level.cpp
+++ b/source/encoder/level.cpp
@@ -60,33 +60,6 @@ LevelSpec levels[] =
     { MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, 1,
Level::LEVEL8_5, "8.5", 85 },
 };

-#if ENABLE_SCC_EXT
-enum SCCProfileName
-{
-    NONE = 0,
-    // The following are SCC profiles, which would map to the MAINSCC
profile idc.
-    // The enumeration indicates the bit-depth constraint in the bottom 2
digits
-    //                           the chroma format in the next digit
-    //                           the intra constraint in the next digit
-    //                           If it is a SCC profile there is a '2' for
the next digit.
-    //                           If it is a highthroughput , there is a
'2' for the top digit else '1' for the top digit
-    SCC_MAIN = 121108,
-    SCC_MAIN_10 = 121110,
-    SCC_MAIN_444 = 121308,
-    SCC_MAIN_444_10 = 121310,
-};
-
-static const SCCProfileName validSCCProfileNames[1][4/* bit depth
constraint 8=0, 10=1, 12=2, 14=3*/][4/*chroma format*/] =
-{
-   {
-        { NONE,         SCC_MAIN,      NONE,      SCC_MAIN_444
        }, // 8-bit  intra for 400, 420, 422 and 444
-        { NONE,         SCC_MAIN_10,   NONE,      SCC_MAIN_444_10
         }, // 10-bit intra for 400, 420, 422 and 444
-        { NONE,         NONE,          NONE,      NONE
        }, // 12-bit intra for 400, 420, 422 and 444
-        { NONE,         NONE,          NONE,      NONE
        }  // 16-bit intra for 400, 420, 422 and 444
-    },
-};
-#endif
-
 static inline int _confirm(x265_param* param, bool bflag, const char*
message)
 {
     if (!bflag)
@@ -282,24 +255,6 @@ void determineLevel(const x265_param &param, VPS& vps)
         break;
     }

-#if ENABLE_SCC_EXT
-    x265_param m_param = param;
-#define CHECK(expr, msg) check_failed |= _confirm(&m_param, expr, msg)
-    int check_failed = 0; /* abort if there is a fatal configuration
problem */
-
-    if (vps.ptl.profileIdc[0] == Profile::MAINSCC)
-    {
-        CHECK(vps.ptl.lowerBitRateConstraintFlag == false &&
vps.ptl.intraConstraintFlag == false, "The lowerBitRateConstraint flag
cannot be false when intraConstraintFlag is false");
-        CHECK(param.bEnableSCC && !(vps.ptl.profileIdc[0] ==
Profile::MAINSCC), "UseIntraBlockCopy must not be enabled unless the SCC
profile is being used.");
-        CHECK(vps.ptl.intraConstraintFlag, "intra constraint flag must be
0 for SCC profiles");
-        CHECK(vps.ptl.onePictureOnlyConstraintFlag, "one-picture-only
constraint flag shall be 0 for SCC profiles");
-        const uint32_t bitDepthIdx = (vps.ptl.bitDepthConstraint == 8 ? 0
: (vps.ptl.bitDepthConstraint == 10 ? 1 : (vps.ptl.bitDepthConstraint == 12
? 2 : (vps.ptl.bitDepthConstraint == 16 ? 3 : 4))));
-        const uint32_t chromaFormatIdx =
uint32_t(vps.ptl.chromaFormatConstraint);
-        const bool bValidProfile = (bitDepthIdx > 2 || chromaFormatIdx >
3) ? false : (validSCCProfileNames[0][bitDepthIdx][chromaFormatIdx] !=
NONE);
-        CHECK(!bValidProfile, "Invalid intra constraint flag, bit depth
constraint flag and chroma format constraint flag combination for a RExt
profile");
-    }
-#endif
-
     static const char* profiles[] = { "None", "Main", "Main 10", "Main
Still Picture", "RExt", "", "", "", "", "Main Scc" };
     static const char *tiers[]    = { "Main", "High" };

diff --git a/source/encoder/nal.cpp b/source/encoder/nal.cpp
index 093c91016..fe9bb9086 100644
--- a/source/encoder/nal.cpp
+++ b/source/encoder/nal.cpp
@@ -114,7 +114,7 @@ void NALList::serialize(NalUnitType nalUnitType, const
Bitstream& bs, int layerI
      * nuh_reserved_zero_6bits  6-bits
      * nuh_temporal_id_plus1    3-bits */
     out[bytes++] = (uint8_t)nalUnitType << 1;
-    out[bytes++] = (layerId << 3) | (temporalID);
+    out[bytes++] = (uint8_t)((layerId << 3) | (temporalID));

     /* 7.4.1 ...
      * Within the NAL unit, the following three-byte sequences shall not
occur at
diff --git a/source/encoder/search.cpp b/source/encoder/search.cpp
index ebd85dd52..e398843a8 100644
--- a/source/encoder/search.cpp
+++ b/source/encoder/search.cpp
@@ -2124,7 +2124,11 @@ void Search::singleMotionEstimation(Search& master,
Mode& interMode, const Predi

     // 12 mv candidates including lowresMV
     MV  mvc[(MD_ABOVE_LEFT + 1) * 2 + 2];
+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
     int numMvc = interMode.cu.getPMV(interMode.interNeighbours, list, ref,
interMode.amvpCand[list][ref], mvc, 0, pu.puAbsPartIdx);
+#else
+    int numMvc = interMode.cu.getPMV(interMode.interNeighbours, list, ref,
interMode.amvpCand[list][ref], mvc);
+#endif

     const MV* amvp = interMode.amvpCand[list][ref];
     int mvpIdx = selectMVP(interMode.cu, pu, amvp, list, ref);
@@ -2213,7 +2217,11 @@ void Search::searchMV(Mode& interMode, int list, int
ref, MV& outmv, MV mvp[3],
     }
 }
 /* find the best inter prediction for each PU of specified mode */
+#if ENABLE_SCC_EXT
 void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool
bChromaMC, uint32_t refMasks[2], MV* iMVCandList)
+#else
+void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool
bChromaMC, uint32_t refMasks[2])
+#endif
 {
     ProfileCUScope(interMode.cu, motionEstimationElapsedTime,
countMotionEstimate);

@@ -2285,7 +2293,11 @@ void Search::predInterSearch(Mode& interMode, const
CUGeom& cuGeom, bool bChroma
 #endif
                 bits += getTUBits(ref, numIdx);

+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
                 int numMvc = cu.getPMV(interMode.interNeighbours, list,
ref, interMode.amvpCand[list][ref], mvc, puIdx, pu.puAbsPartIdx);
+#else
+                int numMvc = cu.getPMV(interMode.interNeighbours, list,
ref, interMode.amvpCand[list][ref], mvc);
+#endif
                 const MV* amvp = interMode.amvpCand[list][ref];
                 int mvpIdx = selectMVP(cu, pu, amvp, list, ref);
                 MV mvmin, mvmax, outmv, mvp;
@@ -2453,7 +2465,11 @@ void Search::predInterSearch(Mode& interMode, const
CUGeom& cuGeom, bool bChroma
                     uint32_t bits = m_listSelBits[list] + MVP_IDX_BITS;
                     bits += getTUBits(ref, numIdx);

+#if (ENABLE_MULTIVIEW || ENABLE_SCC_EXT)
                     int numMvc = cu.getPMV(interMode.interNeighbours,
list, ref, interMode.amvpCand[list][ref], mvc, puIdx, pu.puAbsPartIdx);
+#else
+                    int numMvc = cu.getPMV(interMode.interNeighbours,
list, ref, interMode.amvpCand[list][ref], mvc);
+#endif

                     const MV* amvp = interMode.amvpCand[list][ref];
                     int mvpIdx = selectMVP(cu, pu, amvp, list, ref);
@@ -3490,10 +3506,10 @@ void Search::setIntraSearchRange(Mode& intraBCMode,
MV& pred, int puIdx, int roi
     CUData& cu = intraBCMode.cu;
     cu.clipMv(mvPred);
     int srLeft, srRight, srTop, srBottom;
-    int width, height;
+    int puWidth, puHeight;
     uint32_t partAddr;

-    cu.getPartIndexAndSize(puIdx, partAddr, width, height);
+    cu.getPartIndexAndSize(puIdx, partAddr, puWidth, puHeight);

     const uint32_t lcuWidth = m_param->maxCUSize;
     const uint32_t lcuHeight = m_param->maxCUSize;
@@ -3520,8 +3536,8 @@ void Search::setIntraSearchRange(Mode& intraBCMode,
MV& pred, int puIdx, int roi
             pTestCU = pTestCU->m_cuLeft, width += lcuWidth)
         {
         }
-        uint32_t maxXsr = (cuPelX % lcuWidth) + X265_MIN(maxWidth, width);
-        uint32_t maxYsr = cuPelY % lcuHeight;
+        int maxXsr = (cuPelX % lcuWidth) + X265_MIN(maxWidth, width);
+        int maxYsr = cuPelY % lcuHeight;

         if (cu.m_chromaFormat == X265_CSP_I420 || cu.m_chromaFormat ==
X265_CSP_I422) maxXsr &= ~0x4;
         if (cu.m_chromaFormat == X265_CSP_I420)
            maxYsr &= ~0x4;
@@ -3638,7 +3654,7 @@ bool Search::predIntraBCSearch(Mode& intraBCMode,
const CUGeom& cuGeom, bool bCh
         int mrgIdxTemp = -1;
         int xCUStart = cu.m_cuPelX;
         int yCUStart = cu.m_cuPelY;
-        int xStartInCU, yStartInCU;
+        int xStartInCU = 0, yStartInCU = 0;
         if (ePartSize == SIZE_2Nx2N)
             xStartInCU = yStartInCU = 0;
         else if (ePartSize == SIZE_2NxN)
@@ -3664,7 +3680,6 @@ bool Search::predIntraBCSearch(Mode& intraBCMode,
const CUGeom& cuGeom, bool bCh
         cu.setPURefIdx(1, REF_NOT_VALID, pu.puAbsPartIdx, puIdx);
         cu.setPUInterDir(1, pu.puAbsPartIdx, puIdx);
         motionCompensation(cu, pu, tmpPredYuv, 1, 1);
-        int temp;
         for (uint32_t ch = TEXT_LUMA; ch < MAX_NUM_COMPONENT; ch++)
         {
             int tempHeight, tempWidth;
@@ -3816,9 +3831,6 @@ bool Search::predIntraBCSearch(Mode& intraBCMode,
const CUGeom& cuGeom, bool bCh

             cu.m_mvd[0][pu.puAbsPartIdx] = mvd;
             cu.m_mvpIdx[0][pu.puAbsPartIdx] = (uint8_t)mvpIdxBest;
-
-            cu.m_mvd[1][pu.puAbsPartIdx] = zeroMv;
-            cu.m_mvpIdx[1][pu.puAbsPartIdx] = REF_NOT_VALID;
         }
         else
         {
@@ -3939,7 +3951,7 @@ bool Search::predMixedIntraBCInterSearch(Mode&
intraBCMixedMode, const CUGeom& c
                 int mrgIdxTemp = -1;
                 int xCUStart = cu.m_cuPelX;
                 int yCUStart = cu.m_cuPelY;
-                int xStartInCU, yStartInCU;
+                int xStartInCU = 0, yStartInCU = 0;
                 if (ePartSize == SIZE_2Nx2N)
                     xStartInCU = yStartInCU = 0;
                 else if (ePartSize == SIZE_2NxN)
diff --git a/source/encoder/search.h b/source/encoder/search.h
index f12ac02e0..df7ad90dd 100644
--- a/source/encoder/search.h
+++ b/source/encoder/search.h
@@ -319,7 +319,9 @@ public:
     void     encodeIntraInInter(Mode& intraMode, const CUGeom& cuGeom);

     // estimation inter prediction (non-skip)
-    void      predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool
bChromaMC, uint32_t masks[2], MV* iMVCandList = NULL);
+#if !ENABLE_SCC_EXT
+    void      predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool
bChromaMC, uint32_t masks[2]);
+#endif
     void     searchMV(Mode& interMode, int list, int ref, MV& outmv, MV
mvp[3], int numMvc, MV* mvc);
     // encode residual and compute rd-cost for inter mode
     void     encodeResAndCalcRdInterCU(Mode& interMode, const CUGeom&
cuGeom);
@@ -340,6 +342,7 @@ public:
     MV getLowresMV(const CUData& cu, const PredictionUnit& pu, int list,
int ref);

 #if ENABLE_SCC_EXT
+    void      predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool
bChromaMC, uint32_t masks[2], MV* iMVCandList = NULL);
     bool      predIntraBCSearch(Mode& intraBCMode, const CUGeom& cuGeom,
bool bChromaMC, PartSize ePartSize, bool testOnlyPred, bool
bUse1DSearchFor8x8, IBC& ibc);
     void      intraBlockCopyEstimate(Mode& intraBCMode, const CUGeom&
cuGeom, int puIdx, MV* pred, MV& mv, uint32_t& cost, bool testOnlyPred,
bool bUse1DSearchFor8x8, IBC& ibc);
     void      setIntraSearchRange(Mode& intraBCMode, MV& pred, int puIdx,
int roiWidth, int roiHeight, MV& searchRangeLT, MV& searchRangeRB);
diff --git a/source/encoder/sei.h b/source/encoder/sei.h
index 1fa4dc69b..a33cb94e9 100644
--- a/source/encoder/sei.h
+++ b/source/encoder/sei.h
@@ -360,14 +360,17 @@ class SEIThreeDimensionalReferenceDisplaysInfo :
public SEI
 {
 public:
     SEIThreeDimensionalReferenceDisplaysInfo()
+        : m_numRefDisplaysMinus1(0),
+        m_refViewingDistanceFlag(false),
+        m_additionalShiftPresentFlag(false)
     {
         m_payloadType = THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO;
         m_payloadSize = 0;
     }

-    int  m_numRefDisplaysMinus1 = 0;
-    bool m_refViewingDistanceFlag = false;
-    bool m_additionalShiftPresentFlag = false;
+    int m_numRefDisplaysMinus1;
+    bool m_refViewingDistanceFlag;
+    bool m_additionalShiftPresentFlag;
     void writeSEI(const SPS&)
     {
         WRITE_UVLC(31, "prec_ref_display_width");
@@ -432,26 +435,66 @@ public:
     }
 };

+static int temp_sign_r[3][3] = { {0,1,0},{1,0,0},{0,1,1} };
+static int temp_exponent_r[3][3] = { {10,20,11},{10,5,11},{2,20,11} };
+static int temp_mantissa_r[3][3] = { {4,9,1},{0,3,4},{3,3,7} };
+static int temp_sign_t[1][3] = { { 0,1,0  } };
+static int temp_exponent_t[1][3] = { { 0,10,5 } };
+static int temp_mantissa_t[1][3] = { { 1,8,9 } };
+static int temp_length_mantissa_r[3][3] = { {10,20,11},{10,5,11},{2,20,11}
};
+static int temp_length_mantissa_t[1][3] = { { 1,10,5 } };
+
 class SEIMultiviewAcquisitionInfo : public SEI
 {
 public:
     SEIMultiviewAcquisitionInfo()
+        :sign_r(),
+        exponent_r(),
+        mantissa_r(),
+        sign_t(),
+        exponent_t(),
+        mantissa_t(),
+        length_mantissa_r(),
+        length_mantissa_t(),
+        m_intrinsicParamFlag(true),
+        m_extrinsicParamFlag(true),
+        m_intrinsicParamsEqualFlag(true)
     {
         m_payloadType = MULTIVIEW_ACQUISITION_INFO;
         m_payloadSize = 0;
+
+        for (int i = 0; i <= 0; i++)
+        {
+            for (int j = 0; j <= 2; j++)  /* row */
+            {
+                for (int k = 0; k <= 2; k++)  /* column */
+                {
+                    temp_sign_r[j][k] = sign_r[j][k];
+                    temp_exponent_r[j][k] = exponent_r[j][k];
+                    temp_mantissa_r[j][k] = mantissa_r[j][k];
+                    temp_length_mantissa_r[j][k] = length_mantissa_r[j][k];
+                }
+                temp_sign_t[i][j] = sign_t[i][j];
+                temp_exponent_t[i][j] = exponent_t[i][j];
+                temp_mantissa_t[i][j] = mantissa_t[i][j];
+                temp_length_mantissa_t[i][j] = length_mantissa_t[i][j];
+            }
+        }
     }

-    int sign_r[3][3] = { {0,1,0},{1,0,0},{0,1,1} };
-    int exponent_r[3][3] = { {10,20,11},{10,5,11},{2,20,11} };
-    int mantissa_r[3][3] = { {4,9,1},{0,3,4},{3,3,7} };
-    int sign_t[1][3] = { 0,1,0 };
-    int exponent_t[1][3] = { 0,10,5 };
-    int mantissa_t[1][3] = { 1,8,9 };
-    int lenght_mantissa_r[3][3] = { {10,20,11},{10,5,11},{2,20,11} };
-    int length_mantissa_t[1][3] = { 1,10,5 };
-    bool m_intrinsicParamFlag = true;
-    bool m_extrinsicParamFlag = true;
-    bool m_intrinsicParamsEqualFlag = true;
+    int sign_r[3][3];
+    int exponent_r[3][3];
+    int mantissa_r[3][3];
+    int sign_t[1][3];
+    int exponent_t[1][3];
+    int mantissa_t[1][3];
+    int length_mantissa_r[3][3];
+    int length_mantissa_t[1][3];
+
+    bool m_intrinsicParamFlag;
+    bool m_extrinsicParamFlag;
+    bool m_intrinsicParamsEqualFlag;
+
     void writeSEI(const SPS& sps)
     {
         WRITE_FLAG(m_intrinsicParamFlag, "intrinsic_param_flag");
@@ -495,7 +538,7 @@ public:
                     {
                         WRITE_FLAG(sign_r[j][k], "sign_r");
                         WRITE_CODE(exponent_r[j][k], 6, "exponent_r");
-                        WRITE_CODE(mantissa_r[j][k],
lenght_mantissa_r[j][k], "mantissa_r");
+                        WRITE_CODE(mantissa_r[j][k],
length_mantissa_r[j][k], "mantissa_r");
                     }
                     WRITE_FLAG(sign_t[i][j], "sign_t");
                     WRITE_CODE(exponent_t[i][j], 6, "exponent_t");
diff --git a/source/x265.h b/source/x265.h
index c5082b6a9..13c4a47e2 100644
--- a/source/x265.h
+++ b/source/x265.h
@@ -637,8 +637,6 @@ typedef enum

 #if ENABLE_MULTIVIEW
 #define MAX_VIEWS 2
-#define MAX_VPS_NUM_SCALABILITY_TYPES     16
-#define MAX_VPS_LAYER_ID_PLUS1            MAX_VIEWS
 #define MULTIVIEW_SCALABILITY_IDX         1
 #else
 #define MAX_VIEWS 1
@@ -646,14 +644,15 @@ typedef enum

 #if ENABLE_ALPHA
 #define MAX_SCALABLE_LAYERS     2
-#define MAX_VPS_NUM_SCALABILITY_TYPES     16
-#define MAX_VPS_LAYER_ID_PLUS1            MAX_SCALABLE_LAYERS
 #else
 #define MAX_SCALABLE_LAYERS     1
 #endif

 #if ENABLE_ALPHA || ENABLE_MULTIVIEW
 #define MAX_LAYERS              2
+#define MAX_VPS_NUM_SCALABILITY_TYPES     16
+#define MAX_VPS_LAYER_ID_PLUS1            MAX_LAYERS
+
 #else
 #define MAX_LAYERS              1
 #endif
diff --git a/source/x265cli.cpp b/source/x265cli.cpp
index c6812459b..9f55b017d 100755
--- a/source/x265cli.cpp
+++ b/source/x265cli.cpp
@@ -1360,6 +1360,7 @@ namespace X265_NS {
             while (isspace((unsigned char)*argLine)) argLine++;
             char* start = strchr(argLine, '-');
             int argCount = 0;
+            char flag[] = "true";
             char** args = (char**)malloc(256 * sizeof(char*));
             //Adding a dummy string to avoid file parsing error
             args[argCount++] = (char*)"x265";
@@ -1427,7 +1428,7 @@ namespace X265_NS {
                         name = nameBuf;
                     }
                     if (!optarg)
-                        optarg = "true";
+                        optarg = flag;
                     else if (optarg[0] == '=')
                         optarg++;
 #define OPT(STR) else if (!strcmp(name, STR))
-- 
2.36.0.windows.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20241009/aa173185/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fix-build-warnings-for-MV-HEVC-Alpha-SCC-and-Code-cl.patch
Type: application/octet-stream
Size: 49415 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20241009/aa173185/attachment-0001.obj>


More information about the x265-devel mailing list