summaryrefslogtreecommitdiff
path: root/libavcodec/cuviddec.c
diff options
context:
space:
mode:
authorYogender Gupta <ygupta@nvidia.com>2018-01-18 12:16:19 +0530
committerTimo Rothenpieler <timo@rothenpieler.org>2018-01-19 23:30:14 +0100
commit07a96b6251f0d55d370e14d661301ced0cd03c24 (patch)
tree04c39df2d21137aa0f0974027b9f899c74c783af /libavcodec/cuviddec.c
parente07649e618caedc07eaf2f4d09253de7f77d14f0 (diff)
avcodec/cuviddec: set key frame for decoded frames
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
Diffstat (limited to 'libavcodec/cuviddec.c')
-rw-r--r--libavcodec/cuviddec.c13
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;