summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-11-03 17:24:05 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-05-03 16:01:45 +0200
commit7ef01a7878149de43aa49e676a343ca67b24c6b2 (patch)
treeb8c02a321d99ea3a448d3e9c3cac29d8da96af3d
parenta75349d0c833da6828c8a8261516d94e705633d6 (diff)
avcodec/h264: mark recovery_cnt==0 frames as keyframes
Fixes Ticket3063 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/h264.c2
-rw-r--r--libavcodec/h264.h1
-rw-r--r--libavcodec/h264_picture.c1
-rw-r--r--libavcodec/h264_slice.c1
4 files changed, 5 insertions, 0 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index dd70af32e1..942ba7f20a 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1781,6 +1781,8 @@ static int output_frame(H264Context *h, AVFrame *dst, H264Picture *srcp)
av_dict_set(&dst->metadata, "stereo_mode", ff_h264_sei_stereo_mode(h), 0);
+ if (srcp->sei_recovery_frame_cnt == 0)
+ dst->key_frame = 1;
if (!srcp->crop)
return 0;
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 70539bbd58..76f111ba78 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -324,6 +324,7 @@ typedef struct H264Picture {
int reference;
int recovered; ///< picture at IDR or recovery point + recovery count
int invalid_gap;
+ int sei_recovery_frame_cnt;
int crop;
int crop_left;
diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c
index 36028dc45a..61ff862a7a 100644
--- a/libavcodec/h264_picture.c
+++ b/libavcodec/h264_picture.c
@@ -122,6 +122,7 @@ int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src)
dst->crop_top = src->crop_top;
dst->recovered = src->recovered;
dst->invalid_gap = src->invalid_gap;
+ dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt;
return 0;
fail:
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 65e8c73b52..c70814f0c3 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -744,6 +744,7 @@ static int h264_frame_start(H264Context *h)
pic->mmco_reset = 0;
pic->recovered = 0;
pic->invalid_gap = 0;
+ pic->sei_recovery_frame_cnt = h->sei_recovery_frame_cnt;
if ((ret = alloc_picture(h, pic)) < 0)
return ret;