diff options
Diffstat (limited to 'libavcodec/bitstream_filter.c')
-rw-r--r-- | libavcodec/bitstream_filter.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/libavcodec/bitstream_filter.c b/libavcodec/bitstream_filter.c index ab608a9..ca11ed3 100644 --- a/libavcodec/bitstream_filter.c +++ b/libavcodec/bitstream_filter.c @@ -1,42 +1,42 @@ /* * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include <string.h> #include "avcodec.h" - #include "libavutil/internal.h" #include "libavutil/mem.h" +#include "libavutil/opt.h" #if FF_API_OLD_BSF FF_DISABLE_DEPRECATION_WARNINGS -AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f) +const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f) { const AVBitStreamFilter *filter = NULL; void *opaque = NULL; while (filter != f) - filter = av_bsf_next(&opaque); + filter = av_bsf_iterate(&opaque); - return av_bsf_next(&opaque); + return av_bsf_iterate(&opaque); } void av_register_bitstream_filter(AVBitStreamFilter *bsf) @@ -45,6 +45,7 @@ void av_register_bitstream_filter(AVBitStreamFilter *bsf) typedef struct BSFCompatContext { AVBSFContext *ctx; + int extradata_updated; } BSFCompatContext; AVBitStreamFilterContext *av_bitstream_filter_init(const char *name) @@ -81,7 +82,12 @@ fail: void av_bitstream_filter_close(AVBitStreamFilterContext *bsfc) { - BSFCompatContext *priv = bsfc->priv_data; + BSFCompatContext *priv; + + if (!bsfc) + return; + + priv = bsfc->priv_data; av_bsf_free(&priv->ctx); av_freep(&bsfc->priv_data); @@ -108,23 +114,24 @@ int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, priv->ctx->time_base_in = avctx->time_base; + if (bsfc->args && bsfc->filter->priv_class) { + const AVOption *opt = av_opt_next(priv->ctx->priv_data, NULL); + const char * shorthand[2] = {NULL}; + + if (opt) + shorthand[0] = opt->name; + + ret = av_opt_set_from_string(priv->ctx->priv_data, bsfc->args, shorthand, "=", ":"); + if (ret < 0) + return ret; + } + ret = av_bsf_init(priv->ctx); if (ret < 0) return ret; - - if (priv->ctx->par_out->extradata_size) { - av_freep(&avctx->extradata); - avctx->extradata_size = 0; - avctx->extradata = av_mallocz(priv->ctx->par_out->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); - if (!avctx->extradata) - return AVERROR(ENOMEM); - memcpy(avctx->extradata, priv->ctx->par_out->extradata, - priv->ctx->par_out->extradata_size); - avctx->extradata_size = priv->ctx->par_out->extradata_size; - } } - pkt.data = buf; + pkt.data = (uint8_t *)buf; pkt.size = buf_size; ret = av_bsf_send_packet(priv->ctx, &pkt); @@ -157,6 +164,21 @@ int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, av_packet_unref(&pkt); } + if (!priv->extradata_updated) { + /* update extradata in avctx from the output codec parameters */ + if (priv->ctx->par_out->extradata_size && (!args || !strstr(args, "private_spspps_buf"))) { + av_freep(&avctx->extradata); + avctx->extradata_size = 0; + avctx->extradata = av_mallocz(priv->ctx->par_out->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!avctx->extradata) + return AVERROR(ENOMEM); + memcpy(avctx->extradata, priv->ctx->par_out->extradata, priv->ctx->par_out->extradata_size); + avctx->extradata_size = priv->ctx->par_out->extradata_size; + } + + priv->extradata_updated = 1; + } + return 1; } FF_ENABLE_DEPRECATION_WARNINGS |