aboutsummaryrefslogtreecommitdiffstats
path: root/fftools
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2020-04-17 23:55:55 +0200
committerMarton Balint <cus@passwd.hu>2020-05-02 19:14:08 +0200
commitf821ae8591add999ce717d932a80673fc29b00f6 (patch)
treea6722a17ac5dcd7d88ca454ff5f6819c5989fb0b /fftools
parent425e08d571ea46d627bcd3dcbd75b056c98c5084 (diff)
downloadffmpeg-f821ae8591add999ce717d932a80673fc29b00f6.tar.gz
fftools/ffmpeg: use a bsf list instead of individual bsfs
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'fftools')
-rw-r--r--fftools/ffmpeg.c74
-rw-r--r--fftools/ffmpeg.h3
-rw-r--r--fftools/ffmpeg_opt.c48
3 files changed, 24 insertions, 101 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index cf64837b8a..96ea7d5c52 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -558,9 +558,7 @@ static void ffmpeg_cleanup(int ret)
if (!ost)
continue;
- for (j = 0; j < ost->nb_bitstream_filters; j++)
- av_bsf_free(&ost->bsf_ctx[j]);
- av_freep(&ost->bsf_ctx);
+ av_bsf_free(&ost->bsf_ctx);
av_frame_free(&ost->filtered_frame);
av_frame_free(&ost->last_frame);
@@ -859,40 +857,15 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
{
int ret = 0;
- /* apply the output bitstream filters, if any */
- if (ost->nb_bitstream_filters) {
- int idx;
-
- ret = av_bsf_send_packet(ost->bsf_ctx[0], eof ? NULL : pkt);
+ /* apply the output bitstream filters */
+ if (ost->bsf_ctx) {
+ ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
if (ret < 0)
goto finish;
-
- eof = 0;
- idx = 1;
- while (idx) {
- /* get a packet from the previous filter up the chain */
- ret = av_bsf_receive_packet(ost->bsf_ctx[idx - 1], pkt);
- if (ret == AVERROR(EAGAIN)) {
- ret = 0;
- idx--;
- continue;
- } else if (ret == AVERROR_EOF) {
- eof = 1;
- } else if (ret < 0)
- goto finish;
-
- /* send it to the next filter down the chain or to the muxer */
- if (idx < ost->nb_bitstream_filters) {
- ret = av_bsf_send_packet(ost->bsf_ctx[idx], eof ? NULL : pkt);
- if (ret < 0)
- goto finish;
- idx++;
- eof = 0;
- } else if (eof)
- goto finish;
- else
- write_packet(of, pkt, ost, 0);
- }
+ while ((ret = av_bsf_receive_packet(ost->bsf_ctx, pkt)) >= 0)
+ write_packet(of, pkt, ost, 0);
+ if (ret == AVERROR(EAGAIN))
+ ret = 0;
} else if (!eof)
write_packet(of, pkt, ost, 0);
@@ -3015,35 +2988,28 @@ static int check_init_output_file(OutputFile *of, int file_index)
static int init_output_bsfs(OutputStream *ost)
{
- AVBSFContext *ctx;
- int i, ret;
+ AVBSFContext *ctx = ost->bsf_ctx;
+ int ret;
- if (!ost->nb_bitstream_filters)
+ if (!ctx)
return 0;
- for (i = 0; i < ost->nb_bitstream_filters; i++) {
- ctx = ost->bsf_ctx[i];
-
- ret = avcodec_parameters_copy(ctx->par_in,
- i ? ost->bsf_ctx[i - 1]->par_out : ost->st->codecpar);
- if (ret < 0)
- return ret;
+ ret = avcodec_parameters_copy(ctx->par_in, ost->st->codecpar);
+ if (ret < 0)
+ return ret;
- ctx->time_base_in = i ? ost->bsf_ctx[i - 1]->time_base_out : ost->st->time_base;
+ ctx->time_base_in = ost->st->time_base;
- ret = av_bsf_init(ctx);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error initializing bitstream filter: %s\n",
- ost->bsf_ctx[i]->filter->name);
- return ret;
- }
+ ret = av_bsf_init(ctx);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error initializing bitstream filter: %s\n",
+ ctx->filter->name);
+ return ret;
}
- ctx = ost->bsf_ctx[ost->nb_bitstream_filters - 1];
ret = avcodec_parameters_copy(ost->st->codecpar, ctx->par_out);
if (ret < 0)
return ret;
-
ost->st->time_base = ctx->time_base_out;
return 0;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 98700f24e5..38205a1a13 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -459,8 +459,7 @@ typedef struct OutputStream {
AVRational mux_timebase;
AVRational enc_timebase;
- int nb_bitstream_filters;
- AVBSFContext **bsf_ctx;
+ AVBSFContext *bsf_ctx;
AVCodecContext *enc_ctx;
AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 16e321b5a3..60bb437ea7 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -1528,54 +1528,12 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
- while (bsfs && *bsfs) {
- const AVBitStreamFilter *filter;
- char *bsf, *bsf_options_str, *bsf_name;
-
- bsf = av_get_token(&bsfs, ",");
- if (!bsf)
- exit_program(1);
- bsf_name = av_strtok(bsf, "=", &bsf_options_str);
- if (!bsf_name)
- exit_program(1);
-
- filter = av_bsf_get_by_name(bsf_name);
- if (!filter) {
- av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
- exit_program(1);
- }
-
- ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
- ost->nb_bitstream_filters + 1,
- sizeof(*ost->bsf_ctx));
- if (!ost->bsf_ctx)
- exit_program(1);
-
- ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
+ if (bsfs && *bsfs) {
+ ret = av_bsf_list_parse_str(bsfs, &ost->bsf_ctx);
if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
+ av_log(NULL, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
exit_program(1);
}
-
- ost->nb_bitstream_filters++;
-
- if (bsf_options_str && filter->priv_class) {
- const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
- const char * shorthand[2] = {NULL};
-
- if (opt)
- shorthand[0] = opt->name;
-
- ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
- exit_program(1);
- }
- }
- av_freep(&bsf);
-
- if (*bsfs)
- bsfs++;
}
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);