[FFmpeg-devel] [PATCH 3/4] avdevice/dshow: implement capabilities API
Diederick C. Niehorster
dcnieho at gmail.com
Sat Jun 5 23:24:21 EEST 2021
On Sat, Jun 5, 2021 at 2:25 PM Andreas Rheinhardt
<andreas.rheinhardt at outlook.com> wrote:
> Diederick Niehorster:
> > This implements avdevice_capabilities_create and avdevice_capabilities_free for the dshow device.> > +
> > + if (ranges) {
> > + if (query_type == CAP_QUERY_FRAME_SIZE) {
> > + for (int j = 0; j < 3; j++) {
> > + range = av_mallocz(sizeof(AVOptionRange));
>
> It seems that you are allocating individual AVOptionRange structures.
> This is bad, because that is not how av_opt_freep_ranges() treats them:
> They are supposed to be pointers into one big array of AVOptionRange
> structures.
av_opt_freep_ranges() does this (NB: ranges->range is an AVOptionRange **):
for (i = 0; i < ranges->nb_ranges * ranges->nb_components; i++) {
AVOptionRange *range = ranges->range[i];
if (range) {
av_freep(&range->str);
av_freep(&ranges->range[i]); // <--
}
}
av_freep(&ranges->range);
Note line highlighted by <--:
it frees each individual element, one at a time, and only after that
deletes the whole array. So i think it is correct that i am allocating
them one at a time? Am i misreading/-understanding this?
> > + const AVFormatContext *avctx = caps->device_context;
>
> avctx is only used for AVCodecContexts by convention.
the dshow device (almost) consistently uses avctx as name for the
AVFormatContext. Should i change that everywhere (what is the
convention name for a AVFormatContext?), or is it ok if i remain
consistent with that here?
> > + if (ctx->device_name[0]) {
> > + av_log(avctx, AV_LOG_ERROR, "You cannot query device capabilities on an opened device\n");
>
> Is this supposed to be a limitation of the capabilities API in general
> or only of the implementation here in for dshow?
See other mails: the bit of documentation in avdevice.h (lines
334--402) suggest the capabilities API is supposed to be used on an
unopened device. It would make sense: probe the device for what it can
do, decide what settings you want to use, then open device). In case
of the dshow device, I think i cannot avoid potential false positives
(entries in the query output that shouldn't be there) if the device is
already opened. I'll experiment, perhaps this is only a theoretical
worry.
Thanks!
Dee
More information about the ffmpeg-devel
mailing list