From: stuhlo <[email protected]>
This fixes setting of `key_frame` flag in AVFrame when input h264 packets
represents individual fields of interlaced video.
In this case, pairs of two consecutive fields represents a single decoded
picture and have identical `CurrPicIdx`, however, only
the first field is entirely intra-coded and has the flag `intra_pic_flag` set
and the second field was resetting the flag before
it was even read in the function `cuvid_output_frame`.
---
libavcodec/cuviddec.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index a5f33e6..f1cc9aa 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -336,7 +336,9 @@ static int CUDAAPI cuvid_handle_picture_decode(void
*opaque, CUVIDPICPARAMS* pic
av_log(avctx, AV_LOG_TRACE, "pfnDecodePicture\n");
- ctx->key_frame[picparams->CurrPicIdx] = picparams->intra_pic_flag;
+ if(picparams->intra_pic_flag) {
+ ctx->key_frame[picparams->CurrPicIdx] = picparams->intra_pic_flag;
+ }
ctx->internal_error =
CHECK_CU(ctx->cvdl->cuvidDecodePicture(ctx->cudecoder, picparams));
if (ctx->internal_error < 0)
@@ -593,6 +595,7 @@ static int cuvid_output_frame(AVCodecContext *avctx,
AVFrame *frame)
}
frame->key_frame = ctx->key_frame[parsed_frame.dispinfo.picture_index];
+ ctx->key_frame[parsed_frame.dispinfo.picture_index] = 0;
frame->width = avctx->width;
frame->height = avctx->height;
if (avctx->pkt_timebase.num && avctx->pkt_timebase.den)
--
1.8.3.1
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".