diff options
author | Yogender Gupta <ygupta@nvidia.com> | 2018-01-18 12:16:19 +0530 |
---|---|---|
committer | Timo Rothenpieler <timo@rothenpieler.org> | 2018-01-19 23:30:14 +0100 |
commit | 07a96b6251f0d55d370e14d661301ced0cd03c24 (patch) | |
tree | 04c39df2d21137aa0f0974027b9f899c74c783af | |
parent | e07649e618caedc07eaf2f4d09253de7f77d14f0 (diff) | |
download | ffmpeg-07a96b6251f0d55d370e14d661301ced0cd03c24.tar.gz |
avcodec/cuviddec: set key frame for decoded frames
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
-rw-r--r-- | libavcodec/cuviddec.c | 13 |
1 files changed, 13 insertions, 0 deletions
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; |