Le nonidi 9 floréal, an CCXXIV, Rodger Combs a écrit : > --- > libavformat/internal.h | 5 +++-- > libavformat/mux.c | 40 +++++++++++++++++++++++++--------- > libavformat/segment.c | 6 +++-- > libavformat/utils.c | 59 > +++++++++++++++++++++++++++++++++++++++++--------- > 4 files changed, 86 insertions(+), 24 deletions(-) > > diff --git a/libavformat/internal.h b/libavformat/internal.h > index 40ba089..52f9eb6 100644 > --- a/libavformat/internal.h > +++ b/libavformat/internal.h > @@ -134,11 +134,12 @@ struct AVStreamInternal { > int reorder; > > /** > - * bitstream filter to run on stream > + * bitstream filters to run on stream > * - encoding: Set by muxer using ff_stream_add_bitstream_filter > * - decoding: unused > */ > - AVBitStreamFilterContext *bsfc; > + AVBSFContext **bsfcs; > + int nb_bsfcs; > > /** > * Whether or not check_bitstream should still be run on each packet > diff --git a/libavformat/mux.c b/libavformat/mux.c > index 91388e3..72e284a 100644 > --- a/libavformat/mux.c > +++ b/libavformat/mux.c > @@ -1043,7 +1043,7 @@ static int interleave_packet(AVFormatContext *s, > AVPacket *out, AVPacket *in, in > > int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) > { > - int ret, flush = 0; > + int ret, flush = 0, i; > > ret = prepare_input_packet(s, pkt); > if (ret < 0) > @@ -1061,15 +1061,35 @@ int av_interleaved_write_frame(AVFormatContext *s, > AVPacket *pkt) > } > } > > - av_apply_bitstream_filters(st->internal->avctx, pkt, > st->internal->bsfc); > - if (pkt->size == 0 && pkt->side_data_elems == 0) > - return 0; > - if (!st->codecpar->extradata && st->internal->avctx->extradata) { > - int eret = ff_alloc_extradata(st->codecpar, > st->internal->avctx->extradata_size); > - if (eret < 0) > - return AVERROR(ENOMEM); > - st->codecpar->extradata_size = > st->internal->avctx->extradata_size; > - memcpy(st->codecpar->extradata, st->internal->avctx->extradata, > st->internal->avctx->extradata_size);
> + for (i = 0; i < st->internal->nb_bsfcs; i++) { > + AVBSFContext* ctx = st->internal->bsfcs[i]; Style nit: the pointer mark is part of the variable, not the type. And: Unless I am mistaken, for now, we only ever add a single bitstream filter. The new API is tricky with several filters. I suggest you write the code for a single filter and leave implementing several until we actually need it, and therefore have a test case for it. > + if (i > 0) { > + AVBSFContext* prev_ctx = st->internal->bsfcs[i - 1]; > + if (prev_ctx->par_out->extradata_size != > ctx->par_in->extradata_size) { > + if ((ret = avcodec_parameters_copy(ctx->par_in, > prev_ctx->par_out)) < 0) > + goto fail; > + } > + } > + if ((ret = av_bsf_send_packet(ctx, pkt)) < 0) { I notice this is the only use of this function. Can pkg be NULL? Otherwise, flushing the filter is missing. > + av_log(ctx, AV_LOG_ERROR, > + "Failed to send packet to filter %s for stream %d", > + ctx->filter->name, pkt->stream_index); > + goto fail; > + } > + if ((ret = av_bsf_receive_packet(ctx, pkt)) < 0) { > + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) > + return 0; > + av_log(ctx, AV_LOG_ERROR, > + "Failed to send packet to filter %s for stream %d", > + ctx->filter->name, pkt->stream_index); > + goto fail; > + } This is not correct, there must be a loop because a single send can cause several receive. > + if (i == st->internal->nb_bsfcs - 1) { > + if (ctx->par_out->extradata_size != > st->codecpar->extradata_size) { > + if ((ret = avcodec_parameters_copy(st->codecpar, > ctx->par_out)) < 0) > + goto fail; > + } > + } > } > > if (s->debug & FF_FDEBUG_TS) Regards, -- Nicolas George
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel