X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbsf.c;h=508130760335fa6d285e7262053d7a2cfc08681c;hb=fe1ccc1e91168c855a2720d0a195377f4638cc70;hp=05a44e2e31cc0455f1637240d49706a265302bbe;hpb=05a1ec3374c670c4823e8bb883fcc1e0773108a5;p=ffmpeg diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c index 05a44e2e31c..50813076033 100644 --- a/libavcodec/bsf.c +++ b/libavcodec/bsf.c @@ -172,8 +172,20 @@ int av_bsf_init(AVBSFContext *ctx) return 0; } +void av_bsf_flush(AVBSFContext *ctx) +{ + ctx->internal->eof = 0; + + av_packet_unref(ctx->internal->buffer_pkt); + + if (ctx->filter->flush) + ctx->filter->flush(ctx); +} + int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt) { + int ret; + if (!pkt || (!pkt->data && !pkt->side_data_elems)) { ctx->internal->eof = 1; return 0; @@ -188,15 +200,10 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt) ctx->internal->buffer_pkt->side_data_elems) return AVERROR(EAGAIN); - if (pkt->buf) { - av_packet_move_ref(ctx->internal->buffer_pkt, pkt); - } else { - int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt); - - if (ret < 0) - return ret; - av_packet_unref(pkt); - } + ret = av_packet_make_refcounted(pkt); + if (ret < 0) + return ret; + av_packet_move_ref(ctx->internal->buffer_pkt, pkt); return 0; } @@ -343,6 +350,15 @@ static int bsf_list_filter(AVBSFContext *bsf, AVPacket *out) return ret; } +static void bsf_list_flush(AVBSFContext *bsf) +{ + BSFListContext *lst = bsf->priv_data; + + for (int i = 0; i < lst->nb_bsfs; i++) + av_bsf_flush(lst->bsfs[i]); + lst->idx = lst->flushed_idx = 0; +} + static void bsf_list_close(AVBSFContext *bsf) { BSFListContext *lst = bsf->priv_data; @@ -391,6 +407,7 @@ const AVBitStreamFilter ff_list_bsf = { .priv_class = &bsf_list_class, .init = bsf_list_init, .filter = bsf_list_filter, + .flush = bsf_list_flush, .close = bsf_list_close, };