X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbitstream_filter.c;h=1a6ba396d2e794b42fdd696216a34063a582fe5e;hb=99cc7f8a02a8203d0654eeae7e2f05e947876edd;hp=c055ea867d7f9199761be6b7da893a371e9958f8;hpb=cd7105e6a0e10f5ff759e98147c2aeb05b0238a0;p=ffmpeg diff --git a/libavcodec/bitstream_filter.c b/libavcodec/bitstream_filter.c index c055ea867d7..1a6ba396d2e 100644 --- a/libavcodec/bitstream_filter.c +++ b/libavcodec/bitstream_filter.c @@ -20,7 +20,12 @@ #include "avcodec.h" -AVBitStreamFilter *first_bitstream_filter= NULL; +static AVBitStreamFilter *first_bitstream_filter= NULL; + +AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f){ + if(f) return f->next; + else return first_bitstream_filter; +} void av_register_bitstream_filter(AVBitStreamFilter *bsf){ bsf->next = first_bitstream_filter; @@ -43,6 +48,8 @@ AVBitStreamFilterContext *av_bitstream_filter_init(const char *name){ } void av_bitstream_filter_close(AVBitStreamFilterContext *bsfc){ + if(bsfc->filter->close) + bsfc->filter->close(bsfc); av_freep(&bsfc->priv_data); av_parser_close(bsfc->parser); av_free(bsfc); @@ -56,68 +63,3 @@ int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, *poutbuf_size= buf_size; return bsfc->filter->filter(bsfc, avctx, args, poutbuf, poutbuf_size, buf, buf_size, keyframe); } - -static int dump_extradata(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, - uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, int keyframe){ - int cmd= args ? *args : 0; - /* cast to avoid warning about discarding qualifiers */ - if(avctx->extradata){ - if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER) && cmd=='a') - ||(keyframe && (cmd=='k' || !cmd)) - ||(cmd=='e') - /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){ - int size= buf_size + avctx->extradata_size; - *poutbuf_size= size; - *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); - - memcpy(*poutbuf, avctx->extradata, avctx->extradata_size); - memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); - return 1; - } - } - return 0; -} - -static int remove_extradata(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, - uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, int keyframe){ - int cmd= args ? *args : 0; - AVCodecParserContext *s; - - if(!bsfc->parser){ - bsfc->parser= av_parser_init(avctx->codec_id); - } - s= bsfc->parser; - - if(s && s->parser->split){ - if( (((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)) && cmd=='a') - ||(!keyframe && cmd=='k') - ||(cmd=='e' || !cmd) - ){ - int i= s->parser->split(avctx, buf, buf_size); - buf += i; - buf_size -= i; - } - } - *poutbuf= (uint8_t *) buf; - *poutbuf_size= buf_size; - - return 0; -} - -#ifdef CONFIG_DUMP_EXTRADATA_BSF -AVBitStreamFilter dump_extradata_bsf={ - "dump_extra", - 0, - dump_extradata, -}; -#endif - -#ifdef CONFIG_REMOVE_EXTRADATA_BSF -AVBitStreamFilter remove_extradata_bsf={ - "remove_extra", - 0, - remove_extradata, -}; -#endif