aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2015-10-07 21:24:40 -0500
committerRodger Combs <rodger.combs@gmail.com>2015-12-28 08:34:30 -0600
commita5fd3a1a2bd2e8ac28434919e462cf61ce831eb2 (patch)
tree2afc15bf8cf90ea7705965f72f8ba6d48c388704
parent4caa3e1c6cf452154e811fea3685b2dea50d3a7a (diff)
downloadffmpeg-a5fd3a1a2bd2e8ac28434919e462cf61ce831eb2.tar.gz
ffmpeg: use lavf API for applying bitstream filters
-rw-r--r--ffmpeg.c46
-rw-r--r--ffmpeg.h1
-rw-r--r--ffmpeg_opt.c6
3 files changed, 9 insertions, 44 deletions
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;