avconv: fix parsing bitstream filters

The current code modifies the user-supplied string, which is shared for
the whole output file. So a bitstream filter specification applied to
multiple streams would not work correctly.
This commit is contained in:
Anton Khirnov 2016-05-24 16:49:19 +02:00
parent 80fb19bc23
commit fe7b21c8f1

View File

@ -941,7 +941,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
OutputStream *ost; OutputStream *ost;
AVStream *st = avformat_new_stream(oc, NULL); AVStream *st = avformat_new_stream(oc, NULL);
int idx = oc->nb_streams - 1, ret = 0; int idx = oc->nb_streams - 1, ret = 0;
char *bsf = NULL, *next, *codec_tag = NULL; const char *bsfs = NULL;
char *next, *codec_tag = NULL;
double qscale = -1; double qscale = -1;
if (!st) { if (!st) {
@ -1007,18 +1008,21 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->max_frames = INT64_MAX; ost->max_frames = INT64_MAX;
MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st); MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st); MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
while (bsf) { while (bsfs && *bsfs) {
const AVBitStreamFilter *filter; const AVBitStreamFilter *filter;
char *bsf;
if (next = strchr(bsf, ',')) bsf = av_get_token(&bsfs, ",");
*next++ = 0; if (!bsf)
exit_program(1);
filter = av_bsf_get_by_name(bsf); filter = av_bsf_get_by_name(bsf);
if (!filter) { if (!filter) {
av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf); av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
exit_program(1); exit_program(1);
} }
av_freep(&bsf);
ost->bitstream_filters = av_realloc_array(ost->bitstream_filters, ost->bitstream_filters = av_realloc_array(ost->bitstream_filters,
ost->nb_bitstream_filters + 1, ost->nb_bitstream_filters + 1,
@ -1027,8 +1031,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
exit_program(1); exit_program(1);
ost->bitstream_filters[ost->nb_bitstream_filters++] = filter; ost->bitstream_filters[ost->nb_bitstream_filters++] = filter;
if (*bsfs)
bsf = next; bsfs++;
} }
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st); MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);