diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index c23033c7e3..122c28f6e8 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -74,6 +74,8 @@ typedef struct CuvidContext int internal_error; int decoder_flushing; + int *key_frame; + cudaVideoCodec codec_type; cudaVideoChromaFormat chroma_format; @@ -340,6 +342,8 @@ 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; + ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidDecodePicture(ctx->cudecoder, picparams)); if (ctx->internal_error < 0) return 0; @@ -590,6 +594,7 @@ static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame) goto error; } + frame->key_frame = ctx->key_frame[parsed_frame.dispinfo.picture_index]; frame->width = avctx->width; frame->height = avctx->height; if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) @@ -693,6 +698,8 @@ static av_cold int cuvid_decode_end(AVCodecContext *avctx) av_buffer_unref(&ctx->hwframe); av_buffer_unref(&ctx->hwdevice); + av_freep(&ctx->key_frame); + cuvid_free_functions(&ctx->cvdl); return 0; @@ -977,6 +984,12 @@ static av_cold int cuvid_decode_init(AVCodecContext *avctx) FFMIN(sizeof(ctx->cuparse_ext.raw_seqhdr_data), avctx->extradata_size)); } + ctx->key_frame = av_mallocz(ctx->nb_surfaces * sizeof(int)); + if (!ctx->key_frame) { + ret = AVERROR(ENOMEM); + goto error; + } + ctx->cuparseinfo.ulMaxNumDecodeSurfaces = ctx->nb_surfaces; ctx->cuparseinfo.ulMaxDisplayDelay = 4; ctx->cuparseinfo.pUserData = avctx;