diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index 926610ca7b..2dffe021f9 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -220,19 +220,27 @@ ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi @section noise -Damages the contents of packets without damaging the container. Can be -used for fuzzing or testing error resilience/concealment. +Damages the contents of packets or simply drops them without damaging the +container. Can be used for fuzzing or testing error resilience/concealment. Parameters: +@table @option +@item amount A numeral string, whose value is related to how often output bytes will be modified. Therefore, values below or equal to 0 are forbidden, and the lower the more frequent bytes will be modified, with 1 meaning every byte is modified. +@item dropamount +A numeral string, whose value is related to how often packets will be dropped. +Therefore, values below or equal to 0 are forbidden, and the lower the more +frequent packets will be dropped, with 1 meaning every packet is dropped. +@end table +The following example applies the modification to every byte but does not drop +any packets. @example ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv @end example -applies the modification to every byte. @section null This bitstream filter passes the packets through unchanged. diff --git a/libavcodec/noise_bsf.c b/libavcodec/noise_bsf.c index 0aebee1ad6..84b94032ad 100644 --- a/libavcodec/noise_bsf.c +++ b/libavcodec/noise_bsf.c @@ -31,6 +31,7 @@ typedef struct NoiseContext { const AVClass *class; int amount; + int dropamount; unsigned int state; } NoiseContext; @@ -48,6 +49,12 @@ static int noise(AVBSFContext *ctx, AVPacket *out) if (ret < 0) return ret; + if (s->dropamount > 0 && s->state % s->dropamount == 0) { + s->state++; + av_packet_free(&in); + return AVERROR(EAGAIN); + } + ret = av_new_packet(out, in->size); if (ret < 0) goto fail; @@ -73,6 +80,7 @@ fail: #define OFFSET(x) offsetof(NoiseContext, x) static const AVOption options[] = { { "amount", NULL, OFFSET(amount), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX }, + { "dropamount", NULL, OFFSET(dropamount), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX }, { NULL }, }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 3c5fea9327..096b062e97 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #define LIBAVCODEC_VERSION_MAJOR 57 #define LIBAVCODEC_VERSION_MINOR 100 -#define LIBAVCODEC_VERSION_MICRO 103 +#define LIBAVCODEC_VERSION_MICRO 104 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \