Andreas Rheinhardt (12020-08-21): > If adding the list of input formats to its AVFilterLink fails, the list > of output formats (which has not been attached to permanent storage yet) > leaks. This has been fixed by not creating the lists of in- and output > formats simultaneously. Instead creating said lists is relegated to > ff_formats_pixdesc_filter() (this also avoids the reallocations implicit > in using ff_add_format()) and the second list is only created after (and > if) the first list has been permanently attached to ist AVFilterLink. > > Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> > --- > ff_formats_pixdesc_filter() uses av_pix_fmt_desc_get() under the hood; > but both av_pix_fmt_desc_get() and av_pix_fmt_desc_next() lead > (currently) to the same order of pixel formats (it coincides with the > natural order) and given that this filter doesn't seem to have any > preferred order at all, it wouldn't even matter if these two methods > yielded different results one day.
The order of formats should not matter, the API does not mean them to matter. > > libavfilter/vf_hwdownload.c | 23 +++++------------------ > 1 file changed, 5 insertions(+), 18 deletions(-) > > diff --git a/libavfilter/vf_hwdownload.c b/libavfilter/vf_hwdownload.c > index 33af30cf40..faf2ea8c0e 100644 > --- a/libavfilter/vf_hwdownload.c > +++ b/libavfilter/vf_hwdownload.c > @@ -37,26 +37,13 @@ typedef struct HWDownloadContext { > > static int hwdownload_query_formats(AVFilterContext *avctx) > { > - AVFilterFormats *infmts = NULL; > - AVFilterFormats *outfmts = NULL; > - const AVPixFmtDescriptor *desc; > + AVFilterFormats *fmts; > int err; > > - for (desc = av_pix_fmt_desc_next(NULL); desc; > - desc = av_pix_fmt_desc_next(desc)) { > - if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) > - err = ff_add_format(&infmts, av_pix_fmt_desc_get_id(desc)); > - else > - err = ff_add_format(&outfmts, av_pix_fmt_desc_get_id(desc)); > - if (err) { > - ff_formats_unref(&infmts); > - ff_formats_unref(&outfmts); > - return err; > - } > - } > - > - if ((err = ff_formats_ref(infmts, &avctx->inputs[0]->out_formats)) < 0 > || > - (err = ff_formats_ref(outfmts, &avctx->outputs[0]->in_formats)) < 0) > + if ((err = ff_formats_pixdesc_filter(&fmts, AV_PIX_FMT_FLAG_HWACCEL, 0)) > || > + (err = ff_formats_ref(fmts, &avctx->inputs[0]->out_formats)) > || > + (err = ff_formats_pixdesc_filter(&fmts, 0, AV_PIX_FMT_FLAG_HWACCEL)) > || > + (err = ff_formats_ref(fmts, &avctx->outputs[0]->in_formats))) > return err; > > return 0; It looks ok, but I do not maintain this code. Regards, -- Nicolas George
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".