[FFmpeg-devel] [PATCH 2/6] ffmpeg: use lavf API for applying bitstream filters
Rodger Combs
rodger.combs at gmail.com
Thu Nov 19 00:28:18 CET 2015
---
ffmpeg.c | 46 ++++------------------------------------------
ffmpeg.h | 1 -
ffmpeg_opt.c | 6 +++++-
3 files changed, 9 insertions(+), 44 deletions(-)
diff --git a/ffmpeg.c b/ffmpeg.c
index c4e9280..cae680d 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(s, pkt, bsfc)) < 0) {
+ print_error("", ret);
+ if (exit_on_error)
+ exit_program(1);
}
if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
@@ -4190,7 +4153,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 82ab1ee..6eeb152 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -452,7 +452,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 131dd89..ca1640c 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;
--
2.6.3
More information about the ffmpeg-devel
mailing list