[FFmpeg-cvslog] h264: Workaround invalid MPEG-TS broadcasts

Michael Niedermayer git at videolan.org
Mon Aug 20 05:48:13 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Mon Aug 20 05:36:52 2012 +0200| [76c3fff2f37c5d8ad0e2fb0b403ec2625a198694] | committer: Michael Niedermayer

h264: Workaround invalid MPEG-TS broadcasts

Fixes seeking to the first keyframe
Fixes Ticket1029

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

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

 libavcodec/h264.c |    6 ++++++
 libavcodec/h264.h |    5 +++++
 2 files changed, 11 insertions(+)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 42de033..5d9758b 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3867,11 +3867,17 @@ again:
                 if ((err = decode_slice_header(hx, h)))
                     break;
 
+                if (h->sei_recovery_frame_cnt >= 0 && (h->frame_num != h->sei_recovery_frame_cnt || hx->slice_type_nos != AV_PICTURE_TYPE_I))
+                    h->valid_recovery_point++;
+
                 if (   h->sei_recovery_frame_cnt >= 0
                     && (   h->recovery_frame<0
                         || ((h->recovery_frame - h->frame_num) & ((1 << h->sps.log2_max_frame_num)-1)) > h->sei_recovery_frame_cnt)) {
                     h->recovery_frame = (h->frame_num + h->sei_recovery_frame_cnt) %
                                         (1 << h->sps.log2_max_frame_num);
+
+                    if (!h->valid_recovery_point)
+                        h->recovery_frame = h->frame_num;
                 }
 
                 s->current_picture_ptr->f.key_frame |=
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 23dcccf..4d07a8a 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -580,6 +580,11 @@ typedef struct H264Context {
      */
     int recovery_frame;
 
+    /**
+     * Are the SEI recovery points looking valid.
+     */
+    int valid_recovery_point;
+
     int luma_weight_flag[2];    ///< 7.4.3.2 luma_weight_lX_flag
     int chroma_weight_flag[2];  ///< 7.4.3.2 chroma_weight_lX_flag
 



More information about the ffmpeg-cvslog mailing list