| @@ -125,6 +125,23 @@ static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| static int send_delayed_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame) | |||||
| { | |||||
| DAVS2Context *cad = avctx->priv_data; | |||||
| int ret = DAVS2_DEFAULT; | |||||
| ret = davs2_decoder_flush(cad->decoder, &cad->headerset, &cad->out_frame); | |||||
| if (ret == DAVS2_ERROR) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Decoder error: can't flush delayed frame\n"); | |||||
| return AVERROR_EXTERNAL; | |||||
| } | |||||
| if (ret == DAVS2_GOT_FRAME) { | |||||
| *got_frame = davs2_dump_frames(avctx, &cad->out_frame, &cad->headerset, ret, frame); | |||||
| davs2_decoder_frame_unref(cad->decoder, &cad->out_frame); | |||||
| } | |||||
| return ret; | |||||
| } | |||||
| static av_cold int davs2_end(AVCodecContext *avctx) | static av_cold int davs2_end(AVCodecContext *avctx) | ||||
| { | { | ||||
| DAVS2Context *cad = avctx->priv_data; | DAVS2Context *cad = avctx->priv_data; | ||||
| @@ -147,8 +164,9 @@ static int davs2_decode_frame(AVCodecContext *avctx, void *data, | |||||
| AVFrame *frame = data; | AVFrame *frame = data; | ||||
| int ret = DAVS2_DEFAULT; | int ret = DAVS2_DEFAULT; | ||||
| /* end of stream, output what is still in the buffers */ | |||||
| if (!buf_size) { | if (!buf_size) { | ||||
| return 0; | |||||
| return send_delayed_frame(avctx, frame, got_frame); | |||||
| } | } | ||||
| cad->packet.data = buf_ptr; | cad->packet.data = buf_ptr; | ||||