X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcuviddec.c;h=acee78cf2cb74b8c93e01ea01c1936dc8b045eff;hb=9f6a06d9271a11781717fd0b134db2bcd716508e;hp=291bb93dbc682ebcf385374aed92e0b838d32116;hpb=bec3b2041dcc20ab4b06a6b31d09130e1a7166c3;p=ffmpeg diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index 291bb93dbc6..acee78cf2cb 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -77,6 +77,7 @@ typedef struct CuvidContext int deint_mode; int deint_mode_current; int64_t prev_pts; + int progressive_sequence; int internal_error; int decoder_flushing; @@ -216,6 +217,8 @@ static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* form ? cudaVideoDeinterlaceMode_Weave : ctx->deint_mode; + ctx->progressive_sequence = format->progressive_sequence; + if (!format->progressive_sequence && ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) avctx->flags |= AV_CODEC_FLAG_INTERLACED_DCT; else @@ -349,6 +352,9 @@ static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINF parsed_frame.dispinfo = *dispinfo; ctx->internal_error = 0; + // For some reason, dispinfo->progressive_frame is sometimes wrong. + parsed_frame.dispinfo.progressive_frame = ctx->progressive_sequence; + if (ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) { av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL); } else { @@ -553,10 +559,6 @@ static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame) offset += 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 || @@ -803,6 +805,12 @@ static int cuvid_test_capabilities(AVCodecContext *avctx, return AVERROR(EINVAL); } + if ((probed_width * probed_height) / 256 > caps->nMaxMBCount) { + av_log(avctx, AV_LOG_ERROR, "Video macroblock count %d exceeds maximum of %d\n", + (int)(probed_width * probed_height) / 256, caps->nMaxMBCount); + return AVERROR(EINVAL); + } + return 0; }