summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/bitstream_filters.texi8
-rw-r--r--ffmpeg.c7
-rw-r--r--ffmpeg.h1
-rw-r--r--ffmpeg_opt.c4
4 files changed, 19 insertions, 1 deletions
diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
index 58ebddd42a..8124238465 100644
--- a/doc/bitstream_filters.texi
+++ b/doc/bitstream_filters.texi
@@ -13,6 +13,14 @@ bitstream filter using the option @code{--disable-bsf=BSF}.
The option @code{-bsfs} of the ff* tools will display the list of
all the supported bitstream filters included in your build.
+The ff* tools have a -bsf option applied per stream, taking a
+comma-separated list of filters, whose parameters follow the filter
+name after a '='.
+
+@example
+ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT
+@end example
+
Below is a description of the currently available bitstream filters.
@section aac_adtstoasc
diff --git a/ffmpeg.c b/ffmpeg.c
index 57abd301d9..b44401f670 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -623,7 +623,11 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
while (bsfc) {
AVPacket new_pkt = *pkt;
- int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
+ AVDictionaryEntry *bsf_arg = av_dict_get(ost->bsf_args,
+ bsfc->filter->name,
+ NULL, 0);
+ int a = av_bitstream_filter_filter(bsfc, avctx,
+ bsf_arg ? bsf_arg->value : NULL,
&new_pkt.data, &new_pkt.size,
pkt->data, pkt->size,
pkt->flags & AV_PKT_FLAG_KEY);
@@ -3834,6 +3838,7 @@ static int transcode(void)
av_dict_free(&ost->encoder_opts);
av_dict_free(&ost->swr_opts);
av_dict_free(&ost->resample_opts);
+ av_dict_free(&ost->bsf_args);
}
}
}
diff --git a/ffmpeg.h b/ffmpeg.h
index 8107fe7388..117a35ce87 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -422,6 +422,7 @@ typedef struct OutputStream {
AVDictionary *encoder_opts;
AVDictionary *swr_opts;
AVDictionary *resample_opts;
+ AVDictionary *bsf_args;
char *apad;
OSTFinished finished; /* no more packets should be written for this stream */
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 03e049bd8d..1f281f605a 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -1138,8 +1138,11 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
while (bsf) {
+ char *arg = NULL;
if (next = strchr(bsf, ','))
*next++ = 0;
+ if (arg = strchr(bsf, '='))
+ *arg++ = 0;
if (!(bsfc = av_bitstream_filter_init(bsf))) {
av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
exit_program(1);
@@ -1148,6 +1151,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
bsfc_prev->next = bsfc;
else
ost->bitstream_filters = bsfc;
+ av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
bsfc_prev = bsfc;
bsf = next;