Commit 6b35819a for openh264

commit 6b35819a7fcec29083a052354e8f5492200fd4ed
Author: BenzhengZhang <140143892+BenzhengZhang@users.noreply.github.com>
Date:   Wed Sep 16 12:41:22 2026 +0800

    Revert PR4002 && PR4010 (#4015)

    * Revert "decoder: clear stale hand-off signals when the new-sequence chain is cut (#4010)"

    This reverts commit 4a0b5547f47eadafecffdaa05c33290c830a0163.

    * Revert "decoder: guard threaded DPB reallocation (#4002)"

    This reverts commit 0bab7fe805b6aa56a7886deb7de357e514268688.

    ---------

    Co-authored-by: benzzhan <benzzhan@cisco.com>

diff --git a/codec/decoder/core/inc/pic_queue.h b/codec/decoder/core/inc/pic_queue.h
index b41bb916..473f80ff 100644
--- a/codec/decoder/core/inc/pic_queue.h
+++ b/codec/decoder/core/inc/pic_queue.h
@@ -37,10 +37,6 @@

 #include "picture.h"

-namespace WelsCommon {
-class CMemoryAlign;
-}
-
 namespace WelsDec {

 #define   PICTURE_RESOLUTION_ALIGNMENT      32
@@ -50,7 +46,6 @@ typedef struct TagPicBuff {
   PPicture*      ppPic;
   int32_t        iCapacity;  // capacity size of queue
   int32_t        iCurrentIdx;
-  WelsCommon::CMemoryAlign* pMa;  // allocator that owns this buffer's memory; used to free it
 } SPicBuff, *PPicBuff;

 /*
diff --git a/codec/decoder/core/src/decoder.cpp b/codec/decoder/core/src/decoder.cpp
index 9d05a9b0..198b3e5a 100644
--- a/codec/decoder/core/src/decoder.cpp
+++ b/codec/decoder/core/src/decoder.cpp
@@ -76,7 +76,6 @@ static int32_t CreatePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, cons
   if (NULL == pPicBuf) {
     return ERR_INFO_OUT_OF_MEMORY;
   }
-  pPicBuf->pMa = pMa;

   pPicBuf->ppPic = (PPicture*)pMa->WelsMallocz (kiSize * sizeof (PPicture), "PPicture*");

@@ -115,13 +114,11 @@ static int32_t IncreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, co
   }

   CMemoryAlign* pMa = pCtx->pMemAlign;
-  CMemoryAlign* pOldMa = (pPicOldBuf != NULL && pPicOldBuf->pMa != NULL) ? pPicOldBuf->pMa : pMa;
   pPicNewBuf = (PPicBuff)pMa->WelsMallocz (sizeof (SPicBuff), "PPicBuff");

   if (NULL == pPicNewBuf) {
     return ERR_INFO_OUT_OF_MEMORY;
   }
-  pPicNewBuf->pMa = pMa;

   pPicNewBuf->ppPic = (PPicture*)pMa->WelsMallocz (kiNewSize * sizeof (PPicture), "PPicture*");

@@ -161,12 +158,12 @@ static int32_t IncreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, co
   }
 // remove old PicBuf
   if (pPicOldBuf->ppPic != NULL) {
-    pOldMa->WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
+    pMa->WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
     pPicOldBuf->ppPic = NULL;
   }
   pPicOldBuf->iCapacity = 0;
   pPicOldBuf->iCurrentIdx = 0;
-  pOldMa->WelsFree (pPicOldBuf, "pPicOldBuf");
+  pMa->WelsFree (pPicOldBuf, "pPicOldBuf");
   pPicOldBuf = NULL;
   return ERR_NONE;
 }
@@ -181,14 +178,12 @@ static int32_t DecreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, co
   }

   CMemoryAlign* pMa = pCtx->pMemAlign;
-  CMemoryAlign* pOldMa = (pPicOldBuf != NULL && pPicOldBuf->pMa != NULL) ? pPicOldBuf->pMa : pMa;

   pPicNewBuf = (PPicBuff)pMa->WelsMallocz (sizeof (SPicBuff), "PPicBuff");

   if (NULL == pPicNewBuf) {
     return ERR_INFO_OUT_OF_MEMORY;
   }
-  pPicNewBuf->pMa = pMa;

   pPicNewBuf->ppPic = (PPicture*)pMa->WelsMallocz (kiNewSize * sizeof (PPicture), "PPicture*");

@@ -233,7 +228,7 @@ static int32_t DecreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, co
   for (iPicIdx = iDelIdx; iPicIdx < kiOldSize; iPicIdx++) {
     if (iPrevPicIdx != iPicIdx) {
       if (pPicOldBuf->ppPic[iPicIdx] != NULL) {
-        FreePicture (pPicOldBuf->ppPic[iPicIdx], pOldMa);
+        FreePicture (pPicOldBuf->ppPic[iPicIdx], pMa);
         pPicOldBuf->ppPic[iPicIdx] = NULL;
       }
     }
@@ -252,12 +247,12 @@ static int32_t DecreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, co
   }
   // remove old PicBuf
   if (pPicOldBuf->ppPic != NULL) {
-    pOldMa->WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
+    pMa->WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue");
     pPicOldBuf->ppPic = NULL;
   }
   pPicOldBuf->iCapacity = 0;
   pPicOldBuf->iCurrentIdx = 0;
-  pOldMa->WelsFree (pPicOldBuf, "pPicOldBuf");
+  pMa->WelsFree (pPicOldBuf, "pPicOldBuf");
   pPicOldBuf = NULL;

   return ERR_NONE;
@@ -272,9 +267,6 @@ void DestroyPicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, CMemoryAlign*
     return;

   pPicBuf = *ppPicBuf;
-  // Free through the allocator that created this buffer.
-  if (pPicBuf->pMa != NULL)
-    pMa = pPicBuf->pMa;
   while (pPicBuf->ppPic != NULL) {
     int32_t iPicIdx = 0;
     while (iPicIdx < pPicBuf->iCapacity) {
diff --git a/codec/decoder/plus/src/welsDecoderExt.cpp b/codec/decoder/plus/src/welsDecoderExt.cpp
index 8f760eb8..73ead68d 100644
--- a/codec/decoder/plus/src/welsDecoderExt.cpp
+++ b/codec/decoder/plus/src/welsDecoderExt.cpp
@@ -1373,51 +1373,12 @@ DECODING_STATE CWelsDecoder::ParseAccessUnit (SWelsDecoderThreadCTX& sThreadCtx)
   int32_t iRet = DecodeFrame2WithCtx (sThreadCtx.pCtx, sThreadCtx.kpSrc, sThreadCtx.kiSrcLen, sThreadCtx.ppDst,
                                       &sThreadCtx.sDstInfo);

-  int32_t iErr = WelsDecodeInitAccessUnitStart (sThreadCtx.pCtx, &sThreadCtx.sDstInfo);
+  int32_t iErr = InitConstructAccessUnit (sThreadCtx.pCtx, &sThreadCtx.sDstInfo);
   if (ERR_NONE != iErr) {
     return (DECODING_STATE) (iRet | iErr);
   }
   if (sThreadCtx.pCtx->bNewSeqBegin) {
-    if (GetThreadCount (sThreadCtx.pCtx) > 1) {
-      // Wait for older workers before replacing shared DPB storage.
-      for (int32_t i = 0; i < m_DecCtxActiveCount; ++i) {
-        if (m_pDecThrCtxActive[i] != NULL && m_pDecThrCtxActive[i] != &sThreadCtx) {
-          WAIT_SEMAPHORE (&m_pDecThrCtxActive[i]->sThreadInfo.sIsIdle, WELS_DEC_THREAD_WAIT_INFINITE);
-          RELEASE_SEMAPHORE (&m_pDecThrCtxActive[i]->sThreadInfo.sIsIdle);
-        }
-      }
-      for (int32_t i = 0; i < m_iCtxCount; ++i) {
-        //Past the barrier nothing is decoding and the chain is cut for every context, so a
-        //hand-off signal still raised has lost the consumer that would have reset it. Left
-        //raised, the next frame that waits on that worker passes the wait at once and marks
-        //a picture that has not been decoded.
-        if (m_pDecThrCtx[i].pCtx != NULL)
-          RESET_EVENT (&m_pDecThrCtx[i].sSliceDecodeStart);
-      }
-      sThreadCtx.pCtx->pLastThreadCtx = NULL;
-    }
-    iErr = AllocPicBuffOnNewSeqBegin (sThreadCtx.pCtx);
-    if (ERR_NONE != iErr) {
-      return (DECODING_STATE) (iRet | iErr);
-    }
     m_pPicBuff = sThreadCtx.pCtx->pPicBuff;
-    // Keep sibling contexts from carrying stale DPB references.
-    for (int32_t i = 0; i < m_iCtxCount; ++i) {
-      if (&m_pDecThrCtx[i] != &sThreadCtx && m_pDecThrCtx[i].pCtx != NULL) {
-        m_pDecThrCtx[i].pCtx->pPicBuff = m_pPicBuff;
-        m_pDecThrCtx[i].pCtx->bHaveGotMemory = sThreadCtx.pCtx->bHaveGotMemory;
-        m_pDecThrCtx[i].pCtx->iPicQueueNumber = sThreadCtx.pCtx->iPicQueueNumber;
-        m_pDecThrCtx[i].pCtx->iImgWidthInPixel = sThreadCtx.pCtx->iImgWidthInPixel;
-        m_pDecThrCtx[i].pCtx->iImgHeightInPixel = sThreadCtx.pCtx->iImgHeightInPixel;
-        m_pDecThrCtx[i].pCtx->pDec = NULL;
-        m_pDecThrCtx[i].pCtx->pLastThreadCtx = NULL;
-        iErr = InitialDqLayersContext (m_pDecThrCtx[i].pCtx, sThreadCtx.pCtx->iImgWidthInPixel,
-                                       sThreadCtx.pCtx->iImgHeightInPixel);
-        if (ERR_NONE != iErr) {
-          return (DECODING_STATE) (iRet | iErr);
-        }
-      }
-    }
   } else if (bPicBuffChanged) {
     InitialDqLayersContext (sThreadCtx.pCtx, sThreadCtx.pCtx->pSps->iMbWidth << 4, sThreadCtx.pCtx->pSps->iMbHeight << 4);
   }
diff --git a/test/BaseThreadDecoderTest.h b/test/BaseThreadDecoderTest.h
index 7263b323..f9c317ea 100644
--- a/test/BaseThreadDecoderTest.h
+++ b/test/BaseThreadDecoderTest.h
@@ -38,8 +38,6 @@ class BaseThreadDecoderTest {
   int32_t SetUp();
   void TearDown();
   bool ThreadDecodeFile (const char* fileName, Callback* cbk);
-  // Decode alternating IDR frames from two streams to force repeated sequence changes.
-  bool ThreadDecodeResolutionSwitch (const char* fileName1, const char* fileName2, int32_t iterations, Callback* cbk);

   bool Open (const char* fileName);
   ISVCDecoder* decoder_;
diff --git a/test/api/BaseThreadDecoderTest.cpp b/test/api/BaseThreadDecoderTest.cpp
index 487de5c8..52403f7d 100644
--- a/test/api/BaseThreadDecoderTest.cpp
+++ b/test/api/BaseThreadDecoderTest.cpp
@@ -307,58 +307,6 @@ bool BaseThreadDecoderTest::ThreadDecodeFile (const char* fileName, Callback* cb
   return true;
 }

-static bool ReadFileToBuffer (const char* fileName, BufferedData& buf) {
-  std::ifstream file (fileName, std::ios::in | std::ios::binary);
-  if (!file.is_open())
-    return false;
-  char b;
-  for (;;) {
-    file.read (&b, 1);
-    if (file.gcount() != 1) // end of file
-      break;
-    if (!buf.PushBack (b))
-      return false;
-  }
-  return true;
-}
-
-bool BaseThreadDecoderTest::ThreadDecodeResolutionSwitch (const char* fileName1, const char* fileName2,
-    int32_t iterations, Callback* cbk) {
-  BufferedData buf1;
-  BufferedData buf2;
-  if (!ReadFileToBuffer (fileName1, buf1) || !ReadFileToBuffer (fileName2, buf2))
-    return false;
-
-  int32_t len1 = (int32_t) buf1.Length();
-  int32_t len2 = (int32_t) buf2.Length();
-  int32_t pos1 = 0;
-  int32_t pos2 = 0;
-  int32_t frameSize1 = ReadFrame (buf1.data(), len1, pos1);
-  int32_t frameSize2 = ReadFrame (buf2.data(), len2, pos2);
-  if (frameSize1 <= 0 || frameSize2 <= 0)
-    return false;
-
-  uiTimeStamp = 0;
-  memset (&sBufInfo, 0, sizeof (SBufferInfo));
-  for (int32_t i = 0; i < iterations; ++i) {
-    DecodeFrame (buf1.data(), frameSize1, cbk);
-    if (::testing::Test::HasFatalFailure())
-      return false;
-    DecodeFrame (buf2.data(), frameSize2, cbk);
-    if (::testing::Test::HasFatalFailure())
-      return false;
-  }
-
-  int32_t iEndOfStreamFlag = 1;
-  decoder_->SetOption (DECODER_OPTION_END_OF_STREAM, &iEndOfStreamFlag);
-  int32_t num_of_frames_in_buffer = 0;
-  decoder_->GetOption (DECODER_OPTION_NUM_OF_FRAMES_REMAINING_IN_BUFFER, &num_of_frames_in_buffer);
-  for (int32_t i = 0; i < num_of_frames_in_buffer; ++i) {
-    FlushFrame (cbk);
-  }
-  return true;
-}
-
 bool BaseThreadDecoderTest::Open (const char* fileName) {
   if (decodeStatus_ == OpenFile) {
     file_.open (fileName, std::ios_base::out | std::ios_base::binary);
diff --git a/test/api/thread_decoder_test.cpp b/test/api/thread_decoder_test.cpp
index 3e181b96..852acb42 100644
--- a/test/api/thread_decoder_test.cpp
+++ b/test/api/thread_decoder_test.cpp
@@ -119,329 +119,6 @@ static int32_t ReadFrameForHangRegression (uint8_t* pBuf, const int32_t& iFileSi
   return bytesAvailable;
 }

-struct SpsInfoForRefQueueSwitch {
-  int32_t iWidth;
-  int32_t iHeight;
-  int32_t iNumRefFrames;
-};
-
-class CBitReaderForRefQueueSwitch {
- public:
-  CBitReaderForRefQueueSwitch (const uint8_t* pData, const size_t iDataSize)
-    : pData_ (pData), iBitLength_ (iDataSize * 8), iBitPos_ (0) {
-  }
-
-  bool ReadBit (uint32_t* pBit) {
-    if (pBit == NULL || iBitPos_ >= iBitLength_) {
-      return false;
-    }
-
-    const size_t iByteOffset = iBitPos_ >> 3;
-    const int32_t iBitOffset = 7 - static_cast<int32_t> (iBitPos_ & 7);
-    *pBit = (pData_[iByteOffset] >> iBitOffset) & 1;
-    ++iBitPos_;
-    return true;
-  }
-
-  bool ReadBits (const int32_t iNumBits, uint32_t* pValue) {
-    if (pValue == NULL || iNumBits <= 0 || iNumBits > 32) {
-      return false;
-    }
-
-    uint32_t uiValue = 0;
-    for (int32_t i = 0; i < iNumBits; ++i) {
-      uint32_t uiBit = 0;
-      if (!ReadBit (&uiBit)) {
-        return false;
-      }
-      uiValue = (uiValue << 1) | uiBit;
-    }
-
-    *pValue = uiValue;
-    return true;
-  }
-
-  bool ReadUe (uint32_t* pValue) {
-    if (pValue == NULL) {
-      return false;
-    }
-
-    int32_t iLeadingZeros = 0;
-    uint32_t uiBit = 0;
-    while (true) {
-      if (!ReadBit (&uiBit)) {
-        return false;
-      }
-      if (uiBit == 1) {
-        break;
-      }
-      ++iLeadingZeros;
-      if (iLeadingZeros > 31) {
-        return false;
-      }
-    }
-
-    if (iLeadingZeros == 0) {
-      *pValue = 0;
-      return true;
-    }
-
-    uint32_t uiInfoBits = 0;
-    if (!ReadBits (iLeadingZeros, &uiInfoBits)) {
-      return false;
-    }
-
-    *pValue = ((1u << iLeadingZeros) - 1u) + uiInfoBits;
-    return true;
-  }
-
-  bool ReadSe (int32_t* pValue) {
-    if (pValue == NULL) {
-      return false;
-    }
-
-    uint32_t uiUeValue = 0;
-    if (!ReadUe (&uiUeValue)) {
-      return false;
-    }
-
-    if (uiUeValue & 1) {
-      *pValue = static_cast<int32_t> ((uiUeValue + 1) >> 1);
-    } else {
-      *pValue = -static_cast<int32_t> (uiUeValue >> 1);
-    }
-    return true;
-  }
-
- private:
-  const uint8_t* pData_;
-  size_t iBitLength_;
-  size_t iBitPos_;
-};
-
-static bool SkipScalingListForRefQueueSwitch (CBitReaderForRefQueueSwitch& sBitReader, const int32_t iListSize) {
-  int32_t iLastScale = 8;
-  int32_t iNextScale = 8;
-
-  for (int32_t i = 0; i < iListSize; ++i) {
-    if (iNextScale != 0) {
-      int32_t iDeltaScale = 0;
-      if (!sBitReader.ReadSe (&iDeltaScale)) {
-        return false;
-      }
-      iNextScale = (iLastScale + iDeltaScale + 256) % 256;
-    }
-    iLastScale = (iNextScale == 0) ? iLastScale : iNextScale;
-  }
-  return true;
-}
-
-static size_t GetStartCodeLengthForRefQueueSwitch (const uint8_t* pData, const size_t iDataSize) {
-  if (iDataSize >= 4 && pData[0] == 0 && pData[1] == 0 && pData[2] == 0 && pData[3] == 1) {
-    return 4;
-  }
-  if (iDataSize >= 3 && pData[0] == 0 && pData[1] == 0 && pData[2] == 1) {
-    return 3;
-  }
-  return 0;
-}
-
-static bool ExtractFirstSpsRbspForRefQueueSwitch (const std::vector<uint8_t>& bitstream, std::vector<uint8_t>* pRbsp) {
-  if (pRbsp == NULL || bitstream.empty()) {
-    return false;
-  }
-
-  const size_t iBitstreamSize = bitstream.size();
-  size_t i = 0;
-  while (i + 3 < iBitstreamSize) {
-    const size_t iStartCodeLength = GetStartCodeLengthForRefQueueSwitch (&bitstream[i], iBitstreamSize - i);
-    if (iStartCodeLength == 0) {
-      ++i;
-      continue;
-    }
-
-    const size_t iNalStart = i + iStartCodeLength;
-    size_t iNalEnd = iBitstreamSize;
-    for (size_t j = iNalStart; j + 3 < iBitstreamSize; ++j) {
-      if (GetStartCodeLengthForRefQueueSwitch (&bitstream[j], iBitstreamSize - j) != 0) {
-        iNalEnd = j;
-        break;
-      }
-    }
-
-    if (iNalStart < iNalEnd && (bitstream[iNalStart] & 0x1F) == 7) {
-      pRbsp->clear();
-      for (size_t k = iNalStart + 1; k < iNalEnd; ++k) {
-        if (k + 2 < iNalEnd && bitstream[k] == 0 && bitstream[k + 1] == 0 && bitstream[k + 2] == 3) {
-          pRbsp->push_back (0);
-          pRbsp->push_back (0);
-          k += 2;
-          continue;
-        }
-        pRbsp->push_back (bitstream[k]);
-      }
-      return !pRbsp->empty();
-    }
-
-    i = iNalEnd;
-  }
-
-  return false;
-}
-
-static bool ParseSpsForRefQueueSwitch (const std::vector<uint8_t>& rbsp, SpsInfoForRefQueueSwitch* pSpsInfo) {
-  if (pSpsInfo == NULL || rbsp.empty()) {
-    return false;
-  }
-
-  CBitReaderForRefQueueSwitch sBitReader (rbsp.data(), rbsp.size());
-
-  uint32_t uiProfileIdc = 0;
-  uint32_t uiTmp = 0;
-  if (!sBitReader.ReadBits (8, &uiProfileIdc) || !sBitReader.ReadBits (8, &uiTmp)
-      || !sBitReader.ReadBits (8, &uiTmp) || !sBitReader.ReadUe (&uiTmp)) {
-    return false;
-  }
-
-  uint32_t uiChromaFormatIdc = 1;
-  if (uiProfileIdc == 100 || uiProfileIdc == 110 || uiProfileIdc == 122 || uiProfileIdc == 244
-      || uiProfileIdc == 44 || uiProfileIdc == 83 || uiProfileIdc == 86 || uiProfileIdc == 118
-      || uiProfileIdc == 128 || uiProfileIdc == 138 || uiProfileIdc == 139 || uiProfileIdc == 134
-      || uiProfileIdc == 135) {
-    if (!sBitReader.ReadUe (&uiChromaFormatIdc)) {
-      return false;
-    }
-    if (uiChromaFormatIdc == 3 && !sBitReader.ReadBit (&uiTmp)) {
-      return false;
-    }
-    if (!sBitReader.ReadUe (&uiTmp) || !sBitReader.ReadUe (&uiTmp) || !sBitReader.ReadBit (&uiTmp)) {
-      return false;
-    }
-
-    uint32_t uiScalingMatrixPresent = 0;
-    if (!sBitReader.ReadBit (&uiScalingMatrixPresent)) {
-      return false;
-    }
-    if (uiScalingMatrixPresent != 0) {
-      const int32_t iScalingListCount = (uiChromaFormatIdc != 3) ? 8 : 12;
-      for (int32_t i = 0; i < iScalingListCount; ++i) {
-        uint32_t uiScalingListPresent = 0;
-        if (!sBitReader.ReadBit (&uiScalingListPresent)) {
-          return false;
-        }
-        if (uiScalingListPresent != 0 && !SkipScalingListForRefQueueSwitch (sBitReader, i < 6 ? 16 : 64)) {
-          return false;
-        }
-      }
-    }
-  }
-
-  uint32_t uiPicOrderCntType = 0;
-  if (!sBitReader.ReadUe (&uiTmp) || !sBitReader.ReadUe (&uiPicOrderCntType)) {
-    return false;
-  }
-  if (uiPicOrderCntType == 0) {
-    if (!sBitReader.ReadUe (&uiTmp)) {
-      return false;
-    }
-  } else if (uiPicOrderCntType == 1) {
-    int32_t iTmpSe = 0;
-    uint32_t uiCycleCount = 0;
-    if (!sBitReader.ReadBit (&uiTmp) || !sBitReader.ReadSe (&iTmpSe)
-        || !sBitReader.ReadSe (&iTmpSe) || !sBitReader.ReadUe (&uiCycleCount)) {
-      return false;
-    }
-    for (uint32_t i = 0; i < uiCycleCount; ++i) {
-      if (!sBitReader.ReadSe (&iTmpSe)) {
-        return false;
-      }
-    }
-  }
-
-  uint32_t uiNumRefFrames = 0;
-  if (!sBitReader.ReadUe (&uiNumRefFrames) || !sBitReader.ReadBit (&uiTmp)) {
-    return false;
-  }
-
-  uint32_t uiPicWidthInMbsMinus1 = 0;
-  uint32_t uiPicHeightInMapUnitsMinus1 = 0;
-  uint32_t uiFrameMbsOnlyFlag = 0;
-  if (!sBitReader.ReadUe (&uiPicWidthInMbsMinus1) || !sBitReader.ReadUe (&uiPicHeightInMapUnitsMinus1)
-      || !sBitReader.ReadBit (&uiFrameMbsOnlyFlag)) {
-    return false;
-  }
-
-  if (uiFrameMbsOnlyFlag == 0 && !sBitReader.ReadBit (&uiTmp)) {
-    return false;
-  }
-  if (!sBitReader.ReadBit (&uiTmp)) {
-    return false;
-  }
-
-  uint32_t uiFrameCroppingFlag = 0;
-  uint32_t uiCropLeft = 0;
-  uint32_t uiCropRight = 0;
-  uint32_t uiCropTop = 0;
-  uint32_t uiCropBottom = 0;
-  if (!sBitReader.ReadBit (&uiFrameCroppingFlag)) {
-    return false;
-  }
-  if (uiFrameCroppingFlag != 0) {
-    if (!sBitReader.ReadUe (&uiCropLeft) || !sBitReader.ReadUe (&uiCropRight)
-        || !sBitReader.ReadUe (&uiCropTop) || !sBitReader.ReadUe (&uiCropBottom)) {
-      return false;
-    }
-  }
-
-  const int32_t iFrameMbsFactor = 2 - static_cast<int32_t> (uiFrameMbsOnlyFlag);
-  int32_t iCropUnitX = 1;
-  int32_t iCropUnitY = iFrameMbsFactor;
-  if (uiChromaFormatIdc == 1) {
-    iCropUnitX = 2;
-    iCropUnitY = 2 * iFrameMbsFactor;
-  } else if (uiChromaFormatIdc == 2) {
-    iCropUnitX = 2;
-  } else if (uiChromaFormatIdc == 3) {
-    iCropUnitY = iFrameMbsFactor;
-  }
-
-  int32_t iWidth = static_cast<int32_t> ((uiPicWidthInMbsMinus1 + 1) * 16);
-  int32_t iHeight = static_cast<int32_t> (iFrameMbsFactor * (uiPicHeightInMapUnitsMinus1 + 1) * 16);
-  iWidth -= static_cast<int32_t> ((uiCropLeft + uiCropRight) * iCropUnitX);
-  iHeight -= static_cast<int32_t> ((uiCropTop + uiCropBottom) * iCropUnitY);
-  if (iWidth <= 0 || iHeight <= 0) {
-    return false;
-  }
-
-  pSpsInfo->iWidth = iWidth;
-  pSpsInfo->iHeight = iHeight;
-  pSpsInfo->iNumRefFrames = static_cast<int32_t> (uiNumRefFrames);
-  return true;
-}
-
-static bool ReadSpsInfoFromBitstreamForRefQueueSwitch (const char* pFileName, SpsInfoForRefQueueSwitch* pSpsInfo) {
-  if (pFileName == NULL || pSpsInfo == NULL) {
-    return false;
-  }
-
-  std::ifstream file (pFileName, std::ios::in | std::ios::binary);
-  if (!file.is_open()) {
-    return false;
-  }
-
-  std::vector<uint8_t> bitstream ((std::istreambuf_iterator<char> (file)), std::istreambuf_iterator<char> ());
-  if (bitstream.empty()) {
-    return false;
-  }
-
-  std::vector<uint8_t> spsRbsp;
-  if (!ExtractFirstSpsRbspForRefQueueSwitch (bitstream, &spsRbsp)) {
-    return false;
-  }
-
-  return ParseSpsForRefQueueSwitch (spsRbsp, pSpsInfo);
-}
-
 class ThreadDecoderHangRegressionTest : public ::testing::Test {
 };

@@ -543,43 +220,6 @@ class ThreadDecoderInitTest : public ::testing::Test, public BaseThreadDecoderTe
 };

 TEST_F (ThreadDecoderInitTest, JustInit) {}
-
-// Regression test for SPARK-801586: repeated threaded sequence changes must
-// not trigger use-after-free in DPB reallocation paths.
-TEST_F (ThreadDecoderInitTest, ThreadedResolutionSwitchNoUseAfterFree) {
-#if defined(ANDROID_NDK)
-  const std::string kPrefix ("/sdcard/");
-#else
-  const std::string kPrefix ("");
-#endif
-  ASSERT_TRUE (ThreadDecodeResolutionSwitch (
-                 (kPrefix + "res/VID_1920x1080_cabac_temporal_direct.264").c_str(),
-                 (kPrefix + "res/QCIF_2P_I_allIPCM.264").c_str(), 100, NULL));
-}
-
-// Regression guard for the same-resolution DPB queue resize path. The selected
-// streams are both 176x144 but have different SPS num_ref_frames values.
-TEST_F (ThreadDecoderInitTest, ThreadedSameResolutionRefQueueResizeNoUseAfterFree) {
-#if defined(ANDROID_NDK)
-  const std::string kPrefix ("/sdcard/");
-#else
-  const std::string kPrefix ("");
-#endif
-
-  const std::string kLowRefStream = kPrefix + "res/BA1_Sony_D.jsv";
-  const std::string kHighRefStream = kPrefix + "res/BA_MW_D.264";
-
-  SpsInfoForRefQueueSwitch sLowRef = {0, 0, 0};
-  SpsInfoForRefQueueSwitch sHighRef = {0, 0, 0};
-  ASSERT_TRUE (ReadSpsInfoFromBitstreamForRefQueueSwitch (kLowRefStream.c_str(), &sLowRef));
-  ASSERT_TRUE (ReadSpsInfoFromBitstreamForRefQueueSwitch (kHighRefStream.c_str(), &sHighRef));
-  ASSERT_EQ (sLowRef.iWidth, sHighRef.iWidth);
-  ASSERT_EQ (sLowRef.iHeight, sHighRef.iHeight);
-  ASSERT_NE (sLowRef.iNumRefFrames, sHighRef.iNumRefFrames);
-
-  ASSERT_TRUE (ThreadDecodeResolutionSwitch (kLowRefStream.c_str(), kHighRefStream.c_str(), 300, NULL));
-}
-
 struct FileParam {
   const char* fileName;
   const char* hashStr;