[FFmpeg-devel] [PATCH] avcodec/cuvid: Use a dummy packet to flush cuvid.

Philip Langdale philipl at overt.org
Tue May 16 16:41:43 EEST 2017


On May 16, 2017, at 01:32, Timo Rothenpieler <timo at rothenpieler.org> wrote:
> 
>> Am 16.05.2017 um 10:27 schrieb Wiki Wang:
>> ---
>> libavcodec/cuvid.c | 13 +++----------
>> 1 file changed, 3 insertions(+), 10 deletions(-)
>> 
>> diff --git a/libavcodec/cuvid.c b/libavcodec/cuvid.c
>> index 218be8495d..0b1710bd46 100644
>> --- a/libavcodec/cuvid.c
>> +++ b/libavcodec/cuvid.c
>> @@ -1029,20 +1029,13 @@ static void cuvid_flush(AVCodecContext *avctx)
>>         return;
>>     }
>> 
>> -    if (ctx->cudecoder) {
>> -        ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder);
>> -        ctx->cudecoder = NULL;
>> -    }
>> +    seq_pkt.flags = CUVID_PKT_ENDOFSTREAM;
>> 
>> -    if (ctx->cuparser) {
>> -        ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
>> -        ctx->cuparser = NULL;
>> -    }
>> -
>> -    ret = CHECK_CU(ctx->cvdl->cuvidCreateVideoParser(&ctx->cuparser, &ctx->cuparseinfo));
>> +    ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &seq_pkt));
>>     if (ret < 0)
>>         goto error;
>> 
>> +    seq_pkt.flags = 0;
>>     seq_pkt.payload = ctx->cuparse_ext.raw_seqhdr_data;
>>     seq_pkt.payload_size = ctx->cuparse_ext.format.seqhdr_data_length;
>> 
>> 
> 
> I'm not exactly sure what was the issue for this to be done this way,
> but I remember there being some issue with just flushing the decoder,
> hence the re-creation.
> 
The issue is that when flushing for a media player, you need to drop all
frames in the pipeline too. Inserting EOS means you still have n frames
that will come out after the flush which breaks interactive seeking.

--phil


More information about the ffmpeg-devel mailing list