[FFmpeg-cvslog] Merge commit 'cb167f2947f1a2c446bd8db196d0e64ef4a6d06b'

James Almer git at videolan.org
Tue Oct 31 01:54:03 EET 2017


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Mon Oct 30 20:40:28 2017 -0300| [0e5a47693c4b2e77b3951c209e842b8a72b7b36b] | committer: James Almer

Merge commit 'cb167f2947f1a2c446bd8db196d0e64ef4a6d06b'

* commit 'cb167f2947f1a2c446bd8db196d0e64ef4a6d06b':
  h264_refs: validate the SPS pointer in ff_h264_execute_ref_pic_marking()

Merged-by: James Almer <jamrial at gmail.com>

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

 libavcodec/h264_refs.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c
index af70829594..976044ce2c 100644
--- a/libavcodec/h264_refs.c
+++ b/libavcodec/h264_refs.c
@@ -614,6 +614,12 @@ int ff_h264_execute_ref_pic_marking(H264Context *h)
     int current_ref_assigned = 0, err = 0;
     H264Picture *av_uninit(pic);
 
+    if (!h->ps.sps) {
+        av_log(h->avctx, AV_LOG_ERROR, "SPS is unset\n");
+        err = AVERROR_INVALIDDATA;
+        goto out;
+    }
+
     if (!h->explicit_ref_marking)
         generate_sliding_window_mmcos(h);
     mmco_count = h->nb_mmco;
@@ -817,6 +823,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h)
             h->frame_recovered |= FRAME_RECOVERED_SEI;
     }
 
+out:
     return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
 }
 


======================================================================

diff --cc libavcodec/h264_refs.c
index af70829594,9536c4beaa..976044ce2c
--- a/libavcodec/h264_refs.c
+++ b/libavcodec/h264_refs.c
@@@ -786,37 -729,9 +792,38 @@@ int ff_h264_execute_ref_pic_marking(H26
          }
      }
  
 +    for (i = 0; i<h->short_ref_count; i++) {
 +        pic = h->short_ref[i];
 +        if (pic->invalid_gap) {
 +            int d = av_mod_uintp2(h->cur_pic_ptr->frame_num - pic->frame_num, h->ps.sps->log2_max_frame_num);
 +            if (d > h->ps.sps->ref_frame_count)
 +                remove_short(h, pic->frame_num, 0);
 +        }
 +    }
 +
      print_short_term(h);
      print_long_term(h);
 +
 +    for (i = 0; i < FF_ARRAY_ELEMS(h->ps.pps_list); i++) {
 +        if (h->ps.pps_list[i]) {
 +            const PPS *pps = (const PPS *)h->ps.pps_list[i]->data;
 +            pps_ref_count[0] = FFMAX(pps_ref_count[0], pps->ref_count[0]);
 +            pps_ref_count[1] = FFMAX(pps_ref_count[1], pps->ref_count[1]);
 +        }
 +    }
 +
 +    if (   err >= 0
 +        && h->long_ref_count==0
 +        && (   h->short_ref_count<=2
 +            || pps_ref_count[0] <= 1 + (h->picture_structure != PICT_FRAME) && pps_ref_count[1] <= 1)
 +        && pps_ref_count[0]<=2 + (h->picture_structure != PICT_FRAME) + (2*!h->has_recovery_point)
 +        && h->cur_pic_ptr->f->pict_type == AV_PICTURE_TYPE_I){
 +        h->cur_pic_ptr->recovered |= 1;
 +        if(!h->avctx->has_b_frames)
 +            h->frame_recovered |= FRAME_RECOVERED_SEI;
 +    }
 +
+ out:
      return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
  }
  



More information about the ffmpeg-cvslog mailing list