aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2016-09-14 19:56:07 -0700
committerTimo Rothenpieler <timo@rothenpieler.org>2016-09-17 14:08:53 +0200
commit8a066697023e3eab3fc6c2bccc5bd0adb07f4579 (patch)
treefb3b5bc449fb0b321e1cf7bb99f2482532cca8a1
parent4096bb176b3971a26d1dedd62a05bcea68eb24d6 (diff)
downloadffmpeg-8a066697023e3eab3fc6c2bccc5bd0adb07f4579.tar.gz
avcodec/cuvid: Fully re-initialize the parser after a flush.
I'm not really sure how this worked at all before, but we do need to reinitalize the parser with the stream extradata. Signed-off-by: Philip Langdale <philipl@overt.org> Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
-rw-r--r--libavcodec/cuvid.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libavcodec/cuvid.c b/libavcodec/cuvid.c
index 19a7772258..131000591e 100644
--- a/libavcodec/cuvid.c
+++ b/libavcodec/cuvid.c
@@ -706,6 +706,7 @@ static void cuvid_flush(AVCodecContext *avctx)
AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
+ CUVIDSOURCEDATAPACKET seq_pkt = { 0 };
int ret;
ctx->ever_flushed = 1;
@@ -736,6 +737,15 @@ static void cuvid_flush(AVCodecContext *avctx)
if (ret < 0)
goto error;
+ seq_pkt.payload = ctx->cuparse_ext.raw_seqhdr_data;
+ seq_pkt.payload_size = ctx->cuparse_ext.format.seqhdr_data_length;
+
+ if (seq_pkt.payload && seq_pkt.payload_size) {
+ ret = CHECK_CU(cuvidParseVideoData(ctx->cuparser, &seq_pkt));
+ if (ret < 0)
+ goto error;
+ }
+
ret = CHECK_CU(cuCtxPopCurrent(&dummy));
if (ret < 0)
goto error;