int internal_error;
int decoder_flushing;
+ int *key_frame;
+
cudaVideoCodec codec_type;
cudaVideoChromaFormat chroma_format;
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;
.Height = avctx->height >> (i ? 1 : 0),
};
- ret = CHECK_CU(ctx->cudl->cuMemcpy2D(&cpy));
+ ret = CHECK_CU(ctx->cudl->cuMemcpy2DAsync(&cpy, device_hwctx->stream));
if (ret < 0)
goto error;
offset += avctx->height;
}
+
+ ret = CHECK_CU(ctx->cudl->cuStreamSynchronize(device_hwctx->stream));
+ if (ret < 0)
+ goto error;
} else if (avctx->pix_fmt == AV_PIX_FMT_NV12 ||
avctx->pix_fmt == AV_PIX_FMT_P010 ||
avctx->pix_fmt == AV_PIX_FMT_P016) {
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)
av_buffer_unref(&ctx->hwframe);
av_buffer_unref(&ctx->hwdevice);
+ av_freep(&ctx->key_frame);
+
cuvid_free_functions(&ctx->cvdl);
return 0;
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;