diff --git a/source/Lib/CommonLib/ProfileLevelTier.cpp b/source/Lib/CommonLib/ProfileLevelTier.cpp
index a739eeedaac9a53539cf8be132ba777c3235dbfd..de2cc87ca3020e09bc5145414259a0a8901d5ef3 100644
--- a/source/Lib/CommonLib/ProfileLevelTier.cpp
+++ b/source/Lib/CommonLib/ProfileLevelTier.cpp
@@ -152,19 +152,24 @@ uint64_t ProfileLevelTierFeatures::getCpbSizeInBits() const
 uint32_t ProfileLevelTierFeatures::getMaxDpbSize( uint32_t picSizeMaxInSamplesY ) const
 {
   const uint32_t maxDpbPicBuf = 8;
-  uint32_t maxDpbSize = maxDpbPicBuf;
+  uint32_t       maxDpbSize;
 
-  if( picSizeMaxInSamplesY <= ( m_pLevelTier->maxLumaPs >> 2 ) )
+  if (m_pLevelTier->level == Level::LEVEL15_5)
   {
-    maxDpbSize = std::min<uint32_t>( 4 * maxDpbPicBuf, 16 );
+    // maxDpbSize is unconstrained in this case
+    maxDpbSize = std::numeric_limits<uint32_t>::max();
   }
-  else if( picSizeMaxInSamplesY <= ( m_pLevelTier->maxLumaPs >> 1 ) )
+  else if (2 * picSizeMaxInSamplesY <= m_pLevelTier->maxLumaPs)
   {
-    maxDpbSize = std::min<uint32_t>( 2 * maxDpbPicBuf, 16 );
+    maxDpbSize = 2 * maxDpbPicBuf;
   }
-  else if( picSizeMaxInSamplesY <= ( ( 3 * m_pLevelTier->maxLumaPs ) >> 2 ) )
+  else if (3 * picSizeMaxInSamplesY <= 2 * m_pLevelTier->maxLumaPs)
   {
-    maxDpbSize = std::min<uint32_t>( ( 4 * maxDpbPicBuf ) / 3, 16 );
+    maxDpbSize = 3 * maxDpbPicBuf / 2;
+  }
+  else
+  {
+    maxDpbSize = maxDpbPicBuf;
   }
 
   return maxDpbSize;