diff options
author | bohu <bohu@google.com> | 2021-06-01 02:23:13 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-06-01 02:23:13 +0000 |
commit | a613afd86c0bb28c702899bddfc19c8e3019e3a4 (patch) | |
tree | d4ad54d81b4660eaf65c48cbea1e4360f161ec5b | |
parent | 120225d7b6bdffb09969a8e7addd0eb650205087 (diff) | |
parent | 63f9a3291e6d2b9a85e14f467f7328aba7e4ac70 (diff) | |
download | goldfish-opengl-a613afd86c0bb28c702899bddfc19c8e3019e3a4.tar.gz |
c2-codecs: handle duplicate in pts am: 63f9a3291e
Original change: https://googleplex-android-review.googlesource.com/c/device/generic/goldfish-opengl/+/14772082
Change-Id: I55b1c2b4c85aac7ab044b5c382b577290aefd137
-rw-r--r-- | system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp | 69 | ||||
-rw-r--r-- | system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h | 5 |
2 files changed, 64 insertions, 10 deletions
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp index 7f955355..13d36f23 100644 --- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp +++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp @@ -503,8 +503,7 @@ bool C2GoldfishAvcDec::setDecodeArgs(C2ReadView *inBuffer, mInPBuffer = const_cast<uint8_t *>(inBuffer->data() + inOffset); mInPBufferSize = inSize; mInTsMarker = tsMarker; - mIndex2Pts[mInTsMarker] = mPts; - mPts2Index[mPts] = mInTsMarker; + insertPts(tsMarker, mPts); } // uint32_t displayHeight = mHeight; @@ -760,13 +759,61 @@ void C2GoldfishAvcDec::copyImageData(h264_image_t &img) { } } -void C2GoldfishAvcDec::removePts(uint64_t pts) { +uint64_t C2GoldfishAvcDec::getWorkIndex(uint64_t pts) { + if (!mOldPts2Index.empty()) { + auto iter = mOldPts2Index.find(pts); + if (iter != mOldPts2Index.end()) { + auto index = iter->second; + DDD("found index %d for pts %" PRIu64, (int)index, pts); + return index; + } + } + auto iter = mPts2Index.find(pts); + if (iter != mPts2Index.end()) { + auto index = iter->second; + DDD("found index %d for pts %" PRIu64, (int)index, pts); + return index; + } + DDD("not found index for pts %" PRIu64, pts); + return 0; +} + +void C2GoldfishAvcDec::insertPts(uint32_t work_index, uint64_t pts) { auto iter = mPts2Index.find(pts); - if (iter == mPts2Index.end()) return; + if (iter != mPts2Index.end()) { + // we have a collision here: + // apparently, older session is not done yet, + // lets save them + DDD("inserted to old pts %" PRIu64 " with index %d", pts, (int)iter->second); + mOldPts2Index[iter->first] = iter->second; + } + DDD("inserted pts %" PRIu64 " with index %d", pts, (int)work_index); + mIndex2Pts[work_index] = pts; + mPts2Index[pts] = work_index; +} - auto index = iter->second; +void C2GoldfishAvcDec::removePts(uint64_t pts) { + bool found = false; + uint64_t index = 0; + // note: check old pts first to see + // if we have some left over, check them + if (!mOldPts2Index.empty()) { + auto iter = mOldPts2Index.find(pts); + if (iter != mOldPts2Index.end()) { + mOldPts2Index.erase(iter); + index = iter->second; + found = true; + } + } else { + auto iter = mPts2Index.find(pts); + if (iter != mPts2Index.end()) { + mPts2Index.erase(iter); + index = iter->second; + found = true; + } + } - mPts2Index.erase(iter); + if (!found) return; auto iter2 = mIndex2Pts.find(index); if (iter2 == mIndex2Pts.end()) return; @@ -859,6 +906,8 @@ void C2GoldfishAvcDec::process(const std::unique_ptr<C2Work> &work, mCsd1.assign(mInPBuffer, mInPBuffer + mInPBufferSize); DDD("assign to csd1 with %d bytpes", mInPBufferSize); } + // this is not really a valid pts from config + removePts(mPts); } uint32_t delay; @@ -918,10 +967,10 @@ void C2GoldfishAvcDec::process(const std::unique_ptr<C2Work> &work, } } - DDD("got data %" PRIu64 " with pts %" PRIu64, mPts2Index[mImg.pts], mImg.pts); + DDD("got data %" PRIu64 " with pts %" PRIu64, getWorkIndex(mImg.pts), mImg.pts); mHeaderDecoded = true; copyImageData(mImg); - finishWork(mPts2Index[mImg.pts], work); + finishWork(getWorkIndex(mImg.pts), work); removePts(mImg.pts); } else { work->workletsProcessed = 0u; @@ -986,9 +1035,9 @@ C2GoldfishAvcDec::drainInternal(uint32_t drainMode, // TODO: maybe keep rendering to screen // mImg = mContext->getImage(); if (mImg.data != nullptr) { - DDD("got data in drain mode %" PRIu64 " with pts %" PRIu64, mPts2Index[mImg.pts], mImg.pts); + DDD("got data in drain mode %" PRIu64 " with pts %" PRIu64, getWorkIndex(mImg.pts), mImg.pts); copyImageData(mImg); - finishWork(mPts2Index[mImg.pts], work); + finishWork(getWorkIndex(mImg.pts), work); removePts(mImg.pts); } else { fillEmptyWork(work); diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h index d906d025..3c5be7f9 100644 --- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h +++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h @@ -79,7 +79,12 @@ class C2GoldfishAvcDec : public SimpleC2Component { std::shared_ptr<IntfImpl> mIntf; void removePts(uint64_t pts); + void insertPts(uint32_t work_index, uint64_t pts); + uint64_t getWorkIndex(uint64_t pts); + // there are same pts matching to different work indices + // this happen during csd0/csd1 switching + std::map<uint64_t, uint64_t> mOldPts2Index; std::map<uint64_t, uint64_t> mPts2Index; std::map<uint64_t, uint64_t> mIndex2Pts; uint64_t mPts {0}; |