If pkt->size == 0 && pkt->side_data_elems == 0 after bsf->filter() returns, the packet is considered dropped. --- ffmpeg.c | 2 ++ libavformat/mux.c | 24 +++++++++++++----------- libavformat/utils.c | 5 +++++ 3 files changed, 20 insertions(+), 11 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/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