decode: flush the internal bsfs instead of constantly reinitalizing them

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2018-07-27 13:27:45 -03:00
parent 0e27e27670
commit ad99cbc9b3
3 changed files with 19 additions and 10 deletions

View File

@ -156,7 +156,7 @@ static int unrefcount_frame(AVCodecInternal *avci, AVFrame *frame)
return 0;
}
static int bsfs_init(AVCodecContext *avctx)
int ff_decode_bsfs_init(AVCodecContext *avctx)
{
AVCodecInternal *avci = avctx->internal;
DecodeFilterContext *s = &avci->filter;
@ -449,10 +449,6 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
if (avctx->internal->draining)
return AVERROR_EOF;
ret = bsfs_init(avctx);
if (ret < 0)
return ret;
av_packet_unref(avci->buffer_pkt);
if (avpkt && (avpkt->data || avpkt->side_data_elems)) {
ret = av_packet_ref(avci->buffer_pkt, avpkt);
@ -511,10 +507,6 @@ int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
return AVERROR(EINVAL);
ret = bsfs_init(avctx);
if (ret < 0)
return ret;
if (avci->buffer_frame->buf[0]) {
av_frame_move_ref(frame, avci->buffer_frame);
} else {
@ -1394,6 +1386,14 @@ int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
return 0;
}
static void bsfs_flush(AVCodecContext *avctx)
{
DecodeFilterContext *s = &avctx->internal->filter;
for (int i = 0; i < s->nb_bsfs; i++)
av_bsf_flush(s->bsfs[i]);
}
void avcodec_flush_buffers(AVCodecContext *avctx)
{
avctx->internal->draining = 0;
@ -1410,7 +1410,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
else if (avctx->codec->flush)
avctx->codec->flush(avctx);
ff_decode_bsfs_uninit(avctx);
bsfs_flush(avctx);
if (!avctx->refcounted_frames)
av_frame_unref(avctx->internal->to_free);

View File

@ -69,6 +69,8 @@ typedef struct FrameDecodeData {
*/
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt);
int ff_decode_bsfs_init(AVCodecContext *avctx);
void ff_decode_bsfs_uninit(AVCodecContext *avctx);
/**

View File

@ -512,6 +512,12 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
avctx->time_base.den = avctx->sample_rate;
}
if (av_codec_is_decoder(avctx->codec)) {
ret = ff_decode_bsfs_init(avctx);
if (ret < 0)
goto free_and_end;
}
if (HAVE_THREADS) {
ret = ff_thread_init(avctx);
if (ret < 0) {
@ -706,6 +712,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
av_packet_free(&avctx->internal->last_pkt_props);
av_packet_free(&avctx->internal->ds.in_pkt);
ff_decode_bsfs_uninit(avctx);
av_freep(&avctx->internal->pool);
}