If pkt->size == 0 && pkt->side_data_elems == 0 after bsf->filter() returns, the packet is considered dropped. --- ffmpeg.c | 2 ++ libavcodec/avcodec.h | 3 ++- libavformat/avformat.h | 4 +++- libavformat/mux.c | 24 +++++++++++++----------- libavformat/utils.c | 5 +++++ 5 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/ffmpeg.c b/ffmpeg.c index a5ec3c3..8fec1e7 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -694,6 +694,8 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) if (exit_on_error) exit_program(1); } + if (pkt->size == 0 && pkt->side_data_elems == 0) + return; if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) { if (pkt->dts != AV_NOPTS_VALUE && diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index d849765..516d236 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -5208,7 +5208,8 @@ AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); * If the return value is 0, the output buffer is not allocated and * should be considered identical to the input buffer, or in case * *poutbuf was set it points to the input buffer (not necessarily to - * its starting address). + * its starting address). A special case is if *poutbuf was set to NULL and + * *poutbuf_size was set to 0, which indicates the packet should be dropped. */ int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 34bad43..a929d96 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -2844,7 +2844,9 @@ int avformat_queue_attached_pictures(AVFormatContext *s); * Apply a list of bitstream filters to a packet. * * @param codec AVCodecContext, usually from an AVStream - * @param pkt the packet to apply filters to + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped * @param bsfc a NULL-terminated list of filters to apply * @return >=0 on success; * AVERROR code on failure diff --git a/libavformat/mux.c b/libavformat/mux.c index 789c811..5100aa3 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -1024,6 +1024,19 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) if (pkt) { AVStream *st = s->streams[pkt->stream_index]; + if (s->oformat->check_bitstream) { + if (!st->internal->bitstream_checked) { + if ((ret = s->oformat->check_bitstream(s, pkt)) < 0) + goto fail; + else if (ret == 1) + st->internal->bitstream_checked = 1; + } + } + + av_apply_bitstream_filters(st->codec, pkt, st->internal->bsfc); + if (pkt->size == 0 && pkt->side_data_elems == 0) + return 0; + if (s->debug & FF_FDEBUG_TS) av_log(s, AV_LOG_TRACE, "av_interleaved_write_frame size:%d dts:%s pts:%s\n", pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts)); @@ -1037,17 +1050,6 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) ret = AVERROR(EINVAL); goto fail; } - - if (s->oformat->check_bitstream) { - if (!st->internal->bitstream_checked) { - if ((ret = s->oformat->check_bitstream(s, pkt)) < 0) - goto fail; - else if (ret == 1) - st->internal->bitstream_checked = 1; - } - } - - av_apply_bitstream_filters(st->codec, pkt, st->internal->bsfc); } else { av_log(s, AV_LOG_TRACE, "av_interleaved_write_frame FLUSH\n"); flush = 1; diff --git a/libavformat/utils.c b/libavformat/utils.c index 129a49d..af4695e 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4694,6 +4694,11 @@ int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, &new_pkt.data, &new_pkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY); + if (a == 0 && new_pkt.size == 0 && new_pkt.side_data_elems == 0) { + av_packet_unref(pkt); + memset(pkt, 0, sizeof(*pkt)); + return 0; + } if(a == 0 && new_pkt.data != pkt->data) { uint8_t *t = av_malloc(new_pkt.size + AV_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow if (t) { -- 2.1.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel