[FFmpeg-cvslog] avcodec/h264: Seperate SEI and IDR recovery handling
Michael Niedermayer
git at videolan.org
Mon Nov 20 02:12:45 EET 2023
ffmpeg | branch: master | Michael Niedermayer <michael at niedermayer.cc> | Mon Oct 2 02:07:09 2023 +0200| [3f4a1a24a5f74784c182ef3e1a59b85119749472] | committer: Michael Niedermayer
avcodec/h264: Seperate SEI and IDR recovery handling
This avoids SEI and IDR recovery flags affecting each other
Also eliminate litteral numbers from recovery handling
This should make the code clearer
Improves: tickets/4738/tickets_cut.ts
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3f4a1a24a5f74784c182ef3e1a59b85119749472
---
libavcodec/h264_refs.c | 2 +-
libavcodec/h264_slice.c | 30 ++++++++++++++++--------------
2 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c
index a11597745c..25e521dafc 100644
--- a/libavcodec/h264_refs.c
+++ b/libavcodec/h264_refs.c
@@ -822,7 +822,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h)
|| 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;
+ h->cur_pic_ptr->recovered |= FRAME_RECOVERED_IDR;
if(!h->avctx->has_b_frames)
h->frame_recovered |= FRAME_RECOVERED_SEI;
}
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 07cc1b094f..4861a2cabb 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1356,12 +1356,11 @@ static int h264_select_output_frame(H264Context *h)
} else
h->next_outputed_poc = out->poc;
- if (out->recovered) {
- // We have reached an recovery point and all frames after it in
- // display order are "recovered".
- h->frame_recovered |= FRAME_RECOVERED_SEI;
- }
- out->recovered |= !!(h->frame_recovered & FRAME_RECOVERED_SEI);
+ // We have reached an recovery point and all frames after it in
+ // display order are "recovered".
+ h->frame_recovered |= out->recovered;
+
+ out->recovered |= h->frame_recovered & FRAME_RECOVERED_SEI;
if (!out->recovered) {
if (!(h->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) &&
@@ -1643,15 +1642,18 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl,
h->cur_pic_ptr->f->flags |= AV_FRAME_FLAG_KEY * !!(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)
+ if (nal->type == H264_NAL_IDR_SLICE) {
+ h->cur_pic_ptr->recovered |= FRAME_RECOVERED_IDR;
+ // If we have an IDR, all frames after it in decoded order are
+ // "recovered".
h->frame_recovered |= FRAME_RECOVERED_IDR;
+ }
+
+ if (h->recovery_frame == h->poc.frame_num && nal->ref_idc) {
+ h->recovery_frame = -1;
+ h->cur_pic_ptr->recovered |= FRAME_RECOVERED_SEI;
+ }
+
#if 1
h->cur_pic_ptr->recovered |= h->frame_recovered;
#else
More information about the ffmpeg-cvslog
mailing list