This path can be hit when there are missing references while decoding
progressive stream and would completely break the DPB contents.
---
 libavcodec/vaapi_h264.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c
index b47531ce1c..ca0076f57a 100644
--- a/libavcodec/vaapi_h264.c
+++ b/libavcodec/vaapi_h264.c
@@ -98,22 +98,24 @@ static int dpb_add(DPB *dpb, const H264Picture *pic)
     if (dpb->size >= dpb->max_size)
         return -1;
 
-    for (i = 0; i < dpb->size; i++) {
-        VAPictureH264 * const va_pic = &dpb->va_pics[i];
-        if (va_pic->picture_id == ff_vaapi_get_surface_id(pic->f)) {
-            VAPictureH264 temp_va_pic;
-            fill_vaapi_pic(&temp_va_pic, pic, 0);
-
-            if ((temp_va_pic.flags ^ va_pic->flags) & 
(VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD)) {
-                va_pic->flags |= temp_va_pic.flags & 
(VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD);
-                /* Merge second field */
-                if (temp_va_pic.flags & VA_PICTURE_H264_TOP_FIELD) {
-                    va_pic->TopFieldOrderCnt    = temp_va_pic.TopFieldOrderCnt;
-                } else {
-                    va_pic->BottomFieldOrderCnt = 
temp_va_pic.BottomFieldOrderCnt;
+    if (pic->field_picture) {
+        for (i = 0; i < dpb->size; i++) {
+            VAPictureH264 * const va_pic = &dpb->va_pics[i];
+            if (va_pic->picture_id == ff_vaapi_get_surface_id(pic->f)) {
+                VAPictureH264 temp_va_pic;
+                fill_vaapi_pic(&temp_va_pic, pic, 0);
+
+                if ((temp_va_pic.flags ^ va_pic->flags) & 
(VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD)) {
+                    va_pic->flags |= temp_va_pic.flags & 
(VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD);
+                    /* Merge second field */
+                    if (temp_va_pic.flags & VA_PICTURE_H264_TOP_FIELD) {
+                        va_pic->TopFieldOrderCnt    = 
temp_va_pic.TopFieldOrderCnt;
+                    } else {
+                        va_pic->BottomFieldOrderCnt = 
temp_va_pic.BottomFieldOrderCnt;
+                    }
                 }
+                return 0;
             }
-            return 0;
         }
     }
 
-- 
2.45.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to