Merge commit '58640fe89ec4f2a3d67c0a2585fca8de34440857'
authorTimothy Gu <timothygu99@gmail.com>
Thu, 4 Aug 2016 03:07:21 +0000 (20:07 -0700)
committerTimothy Gu <timothygu99@gmail.com>
Thu, 4 Aug 2016 03:07:21 +0000 (20:07 -0700)
* commit '58640fe89ec4f2a3d67c0a2585fca8de34440857':
  h264: handle frame recovery in h264_field_start()

Conflicts:
libavcodec/h264dec.c

Merged-by: Timothy Gu <timothygu99@gmail.com>
1  2 
libavcodec/h264_slice.c
libavcodec/h264dec.c

@@@ -1499,6 -1335,24 +1499,38 @@@ static int h264_field_start(H264Contex
  
      h->picture_idr = nal->type == H264_NAL_IDR_SLICE;
  
 -    if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
 -        h->recovery_frame = (h->poc.frame_num + h->sei.recovery_point.recovery_frame_cnt) &
 -                            ((1 << h->ps.sps->log2_max_frame_num) - 1);
++    if (h->sei.recovery_point.recovery_frame_cnt >= 0) {
++        const int sei_recovery_frame_cnt = h->sei.recovery_point.recovery_frame_cnt;
++
++        if (h->poc.frame_num != sei_recovery_frame_cnt || sl->slice_type_nos != AV_PICTURE_TYPE_I)
++            h->valid_recovery_point = 1;
++
++        if (   h->recovery_frame < 0
++            || av_mod_uintp2(h->recovery_frame - h->poc.frame_num, h->ps.sps->log2_max_frame_num) > sei_recovery_frame_cnt) {
++            h->recovery_frame = av_mod_uintp2(h->poc.frame_num + sei_recovery_frame_cnt, h->ps.sps->log2_max_frame_num);
++
++            if (!h->valid_recovery_point)
++                h->recovery_frame = h->poc.frame_num;
++        }
+     }
 -    h->cur_pic_ptr->f->key_frame |= (nal->type == H264_NAL_IDR_SLICE) ||
 -                                    (h->sei.recovery_point.recovery_frame_cnt >= 0);
++    h->cur_pic_ptr->f->key_frame |= (nal->type == H264_NAL_IDR_SLICE);
 -    if (nal->type == H264_NAL_IDR_SLICE || h->recovery_frame == h->poc.frame_num) {
++    if (nal->type == H264_NAL_IDR_SLICE ||
++        (h->recovery_frame == h->poc.frame_num && nal->ref_idc)) {
+         h->recovery_frame         = -1;
+         h->cur_pic_ptr->recovered = 1;
+     }
+     // If we have an IDR, all frames after it in decoded order are
+     // "recovered".
+     if (nal->type == H264_NAL_IDR_SLICE)
+         h->frame_recovered |= FRAME_RECOVERED_IDR;
++#if 1
++    h->cur_pic_ptr->recovered |= h->frame_recovered;
++#else
+     h->cur_pic_ptr->recovered |= !!(h->frame_recovered & FRAME_RECOVERED_IDR);
++#endif
      /* Set the frame properties/side data. Only done for the second field in
       * field coded frames, since some SEI information is present for each field
       * and is merged by the SEI parsing code. */
Simple merge