Index: branches/HTM-9.3-dev1-Samsung/source/App/TAppEncoder/TAppEncCfg.cpp
===================================================================
--- branches/HTM-9.3-dev1-Samsung/source/App/TAppEncoder/TAppEncCfg.cpp	(revision 784)
+++ branches/HTM-9.3-dev1-Samsung/source/App/TAppEncoder/TAppEncCfg.cpp	(revision 786)
@@ -1515,5 +1515,9 @@
 #endif
 #if H_3D_SPIVMP
+#if SEC_SPIVMP_MCP_SIZE_G0077
+  xConfirmPara( m_iSubPULog2Size < 3,                                        "SubPULog2Size must be 3 or greater.");
+#else
   xConfirmPara( m_iSubPULog2Size < 2,                                        "SubPULog2Size must be 2 or greater.");
+#endif
   xConfirmPara( m_iSubPULog2Size > 6,                                        "SubPULog2Size must be 6 or smaller.");
   xConfirmPara( (1<<m_iSubPULog2Size) > m_uiMaxCUWidth,                      "SubPULog2Size must be log2(maxCUSize) or smaller.");
Index: branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TComDataCU.cpp
===================================================================
--- branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TComDataCU.cpp	(revision 784)
+++ branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TComDataCU.cpp	(revision 786)
@@ -4461,5 +4461,10 @@
       if(!m_pcSlice->getIsDepth())
 #endif
+#if SEC_SPIVMP_MCP_SIZE_G0077
+        if(getPartitionSize(0) == SIZE_2Nx2N)
+          pbSPIVMPFlag[iCount] = true;
+#else
       pbSPIVMPFlag[iCount] = true;
+#endif
       if( ( ivCandDir[0] & 1 ) == 1 )
       {
@@ -7177,4 +7182,8 @@
   {
 #endif  
+#if SEC_SPIVMP_MCP_SIZE_G0077
+  if( getPartitionSize(0) == SIZE_2Nx2N )
+  {
+#endif
   Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight;
   getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight);
@@ -7293,4 +7302,7 @@
     }
   }  
+#if SEC_SPIVMP_MCP_SIZE_G0077
+  }
+#endif
 
   iCurrPosX  += ( iWidth  >> 1 );
@@ -7313,10 +7325,22 @@
  }
 #if QC_DEPTH_MERGE_SIMP_G0127
+#if SEC_SPIVMP_MCP_SIZE_G0077
+  for(Int iLoopCan = ( (m_pcSlice->getIsDepth() || getPartitionSize(uiPartAddr) != SIZE_2Nx2N) ? 0 : 1 ); iLoopCan < ( 2 - m_pcSlice->getIsDepth() ); iLoopCan ++) 
+#else
  for(Int iLoopCan = ( 1 - m_pcSlice->getIsDepth() ); iLoopCan < ( 2 - m_pcSlice->getIsDepth() ); iLoopCan ++) 
+#endif
+#else
+#if SEC_SPIVMP_MCP_SIZE_G0077
+ for(Int iLoopCan = ( (m_pcSlice->getIsDepth() || getPartitionSize(uiPartAddr) != SIZE_2Nx2N) ? 0 : 1 ); iLoopCan < 2; iLoopCan ++) 
 #else
  for(Int iLoopCan = ( 1 - m_pcSlice->getIsDepth() ); iLoopCan < 2; iLoopCan ++) 
 #endif
+#endif
+#else
+#if SEC_SPIVMP_MCP_SIZE_G0077
+ for(Int iLoopCan = (getPartitionSize(uiPartAddr) == SIZE_2Nx2N ? 1 : 0); iLoopCan < 2; iLoopCan ++) 
 #else
   for(Int iLoopCan = 1; iLoopCan < 2; iLoopCan ++) 
+#endif
 #endif
 #else
Index: branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TypeDef.h
===================================================================
--- branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TypeDef.h	(revision 784)
+++ branches/HTM-9.3-dev1-Samsung/source/Lib/TLibCommon/TypeDef.h	(revision 786)
@@ -203,4 +203,6 @@
 ///////////////////////////////////   DERIVED DEFINES ///////////////////////////////////  
 /////////////////////////////////////////////////////////////////////////////////////////
+
+#define SEC_SPIVMP_MCP_SIZE_G0077         1  // Apply SPIVMP only to 2Nx2N partition, JCT3V-G0077
 
 ///// ***** VIEW SYNTHESIS OPTIMIZAION *********
Index: branches/HTM-9.3-dev1-Samsung/source/Lib/TLibDecoder/TDecCAVLC.cpp
===================================================================
--- branches/HTM-9.3-dev1-Samsung/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 784)
+++ branches/HTM-9.3-dev1-Samsung/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 786)
@@ -1697,5 +1697,9 @@
         READ_FLAG( uiCode, "iv_mv_pred_flag[i]");          pcVPS->setIvMvPredFlag         ( i, uiCode == 1 ? true : false );
 #if H_3D_SPIVMP
+#if SEC_SPIVMP_MCP_SIZE_G0077
+        READ_UVLC (uiCode, "log2_sub_PU_size_minus3");     pcVPS->setSubPULog2Size(i, uiCode+3); 
+#else
         READ_UVLC (uiCode, "log2_sub_PU_size_minus2");     pcVPS->setSubPULog2Size(i, uiCode+2); 
+#endif
 #endif
 #endif
@@ -1722,5 +1726,9 @@
         if (i!=1)
         {
+#if SEC_SPIVMP_MCP_SIZE_G0077
+          READ_UVLC (uiCode, "log2_sub_PU_size_minus3[i]");     pcVPS->setSubPULog2Size(i, uiCode+3); 
+#else
           READ_UVLC (uiCode, "log2_sub_PU_size_minus2[i]");     pcVPS->setSubPULog2Size(i, uiCode+2); 
+#endif
         }
 #endif
Index: branches/HTM-9.3-dev1-Samsung/source/Lib/TLibEncoder/TEncCavlc.cpp
===================================================================
--- branches/HTM-9.3-dev1-Samsung/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 784)
+++ branches/HTM-9.3-dev1-Samsung/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 786)
@@ -1500,5 +1500,9 @@
         WRITE_FLAG( pcVPS->getIvMvPredFlag         ( i ) ? 1 : 0 , "iv_mv_pred_flag[i]");
 #if H_3D_SPIVMP
+#if SEC_SPIVMP_MCP_SIZE_G0077
+        WRITE_UVLC( pcVPS->getSubPULog2Size(i)-3, "log2_sub_PU_size_minus3[i]");
+#else
         WRITE_UVLC( pcVPS->getSubPULog2Size(i)-2, "log2_sub_PU_size_minus2[i]");
+#endif
 #endif
 #endif
@@ -1522,5 +1526,9 @@
         if (i!=1)
         {
+#if SEC_SPIVMP_MCP_SIZE_G0077
+          WRITE_UVLC( pcVPS->getSubPULog2Size(i)-3, "log2_sub_PU_size_minus3[i]");
+#else
           WRITE_UVLC( pcVPS->getSubPULog2Size(i)-2, "log2_sub_PU_size_minus2[i]");
+#endif
         }
 #endif
