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>
libavcodec/h264_slice.c
libavcodec/h264dec.c

index c6f40e59c599f90016edfab5ebe7e4495e2b188d..25a5890aa89c7ecbc96e1097ad93ce55b4136404 100644 (file)
@@ -1499,6 +1499,38 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl,
 
     h->picture_idr = nal->type == H264_NAL_IDR_SLICE;
 
+    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);
+
+    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. */
index c72a7fcc163327804ac52c9c0cbf8b09b6796558..931330188462b3aa38314d23752f89721fc03e1b 100644 (file)
@@ -802,38 +802,6 @@ again:
             if (sl->redundant_pic_count > 0)
                 break;
 
-            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);
-
-            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
-
             if (h->current_slice == 1) {
                 if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS))
                     decode_postinit(h, i >= nals_needed);