X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibdavs2.c;h=0f18353c93eb65875c0e03207eb37475d123312a;hb=7c4287b27628346321981b2529bff028f119c870;hp=080872195a0ccfdb59a22224408ba53cb4d4920b;hpb=a024c3ce9a502849013a4aa2c0a6de0c9270261c;p=ffmpeg diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c index 080872195a0..0f18353c93e 100644 --- a/libavcodec/libdavs2.c +++ b/libavcodec/libdavs2.c @@ -23,6 +23,7 @@ */ #include "avcodec.h" +#include "internal.h" #include "davs2.h" typedef struct DAVS2Context { @@ -107,7 +108,7 @@ static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, int *g frame->buf[plane] = av_buffer_alloc(size_line * pic->lines[plane]); if (!frame->buf[plane]){ - av_log(avctx, AV_LOG_ERROR, "dump error: alloc failed.\n"); + av_log(avctx, AV_LOG_ERROR, "Decoder error: allocation failure, can't dump frames.\n"); return AVERROR(ENOMEM); } @@ -129,6 +130,21 @@ static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, int *g return 0; } +static void davs2_flush(AVCodecContext *avctx) +{ + DAVS2Context *cad = avctx->priv_data; + int ret = DAVS2_GOT_FRAME; + + while (ret == DAVS2_GOT_FRAME) { + ret = davs2_decoder_flush(cad->decoder, &cad->headerset, &cad->out_frame); + davs2_decoder_frame_unref(cad->decoder, &cad->out_frame); + } + + if (ret == DAVS2_ERROR) { + av_log(avctx, AV_LOG_WARNING, "Decoder flushing failed.\n"); + } +} + static int send_delayed_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame) { DAVS2Context *cad = avctx->priv_data; @@ -205,7 +221,9 @@ AVCodec ff_libdavs2_decoder = { .init = davs2_init, .close = davs2_end, .decode = davs2_decode_frame, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, + .flush = davs2_flush, + .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS, + .caps_internal = FF_CODEC_CAP_AUTO_THREADS, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .wrapper_name = "libdavs2",