diff --git a/ffmpeg.c b/ffmpeg.c index 10d0f25703..c533785f15 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -683,47 +683,10 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) if (bsfc) av_packet_split_side_data(pkt); - while (bsfc) { - AVPacket new_pkt = *pkt; - 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); - 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) { - memcpy(t, new_pkt.data, new_pkt.size); - memset(t + new_pkt.size, 0, AV_INPUT_BUFFER_PADDING_SIZE); - new_pkt.data = t; - new_pkt.buf = NULL; - a = 1; - } else - a = AVERROR(ENOMEM); - } - if (a > 0) { - pkt->side_data = NULL; - pkt->side_data_elems = 0; - av_packet_unref(pkt); - new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size, - av_buffer_default_free, NULL, 0); - if (!new_pkt.buf) - exit_program(1); - } else if (a < 0) { - new_pkt = *pkt; - av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s", - bsfc->filter->name, pkt->stream_index, - avctx->codec ? avctx->codec->name : "copy"); - print_error("", a); - if (exit_on_error) - exit_program(1); - } - *pkt = new_pkt; - - bsfc = bsfc->next; + if ((ret = av_apply_bitstream_filters(avctx, pkt, bsfc)) < 0) { + print_error("", ret); + if (exit_on_error) + exit_program(1); } if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) { @@ -4244,7 +4207,6 @@ static int transcode(void) av_dict_free(&ost->sws_dict); 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 fa249102d2..20322b0422 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -454,7 +454,6 @@ typedef struct OutputStream { AVDictionary *sws_dict; 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 3df46da15e..9b341cfa98 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1255,7 +1255,11 @@ 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); + if (arg) + if (!(bsfc->args = av_strdup(arg))) { + av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n"); + exit_program(1); + } bsfc_prev = bsfc; bsf = next;