[FFmpeg-cvslog] lavc/hevc_refs: exclude current frame from long term refs

Xu Guangxin git at videolan.org
Wed Jul 27 08:35:24 EEST 2022


ffmpeg | branch: master | Xu Guangxin <guangxin.xu at intel.com> | Fri Jul 15 13:06:43 2022 +0800| [2191f9a6affadb530cd3e96f543cfdb175092a85] | committer: Haihao Xiang

lavc/hevc_refs: exclude current frame from long term refs

suppose
a. You have 3 frames, 0, 1, 4096.
b. The ltMask is 0xfff and use_msb is 0.
c. The 0, 1 are lt refs for 4096.
d. you are decoding frame 4096, and get the 0 frame.
Since 4096 & ltMask is 0 too, even you want get 0, find_ref_idx may give you 4096.
add_candidate_ref will report an error for this

Tested-by: Fei Wang <fei.w.wang at intel.com>
Signed-off-by: Xu Guangxin <guangxin.xu at intel.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2191f9a6affadb530cd3e96f543cfdb175092a85
---

 libavcodec/hevc_refs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c
index 5282716a61..811e8feff8 100644
--- a/libavcodec/hevc_refs.c
+++ b/libavcodec/hevc_refs.c
@@ -387,7 +387,7 @@ static HEVCFrame *find_ref_idx(HEVCContext *s, int poc, uint8_t use_msb)
     for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
         HEVCFrame *ref = &s->DPB[i];
         if (ref->frame->buf[0] && ref->sequence == s->seq_decode) {
-            if ((ref->poc & mask) == poc)
+            if ((ref->poc & mask) == poc && (use_msb || ref->poc != s->poc))
                 return ref;
         }
     }



More information about the ffmpeg-cvslog mailing list