[FFmpeg-devel] [DISCUSSION] New iteration APIs, lavf and lavd
Josh de Kock
josh at itanimul.li
Mon Mar 19 04:59:54 EET 2018
The new iteration API to replace the old _next() is nearing the end of
it's completion with the lavfi patch on the mailing list and only one
AVOptions would not be found for devices as there is no AVClass for
lavd. At the moment it would work if you were to still call
avdevice_register_all() because then devices get registered as formats
in the old API (which the child_class_next function still uses). When
the format_child_class_next() function switches to the iterate() API
it would no longer have access to devices and thus there would be no way
for av_opt_find() to find an option for devices. The fix for this is
simple, add an AVClass for lavd--fairly clean and unobjectionable.
This leaves the new iteration API in an odd limbo of both being now
consistent with the newer BSF API, and using static lav* components, but
also lying to the user that lavf and lavd are separate libraries. We
have a few options in regards to this:
1) Agree that both lavf and lavd are fine in their current state
This requires no further discussion, and is the easiest to implement but
leaves ffmpeg with a questionable ecosystem of dependent libraries. It
also would require another iteration API change if lavf and lavd were to
be separated in the future (luckily only return types due to the usage
of an opaque state i.e. `const AVInputFormat *av_indev_iterate(void
**opaque)` -> `const AVInputDevice *av_indev_iterate(void **opaque)`)
2) Disagree that both lavf and lavd are fine in their current state and
move towards defining lavd as its own separate library immediately at
the same time as the new iteration APIs.
This is possibly the hardest and most annoying option, as it would
require designing a new API for essentially a new library, and
converting the current library's components (also doing it immediately).
This could range from being simple-ish to being quite tough depending on
how much the new library API just copies the lavf API directly (though a
disadvantage of this is that it wouldn't be able to take good use of
designing the API around how devices should be, it has to design around
how they currently are).
3) Disagree that both lavf and lavd are fine in their current state and
merge lavd into lavd to allow redesigning of lavd to happen slowly at
its own pace.
This may require a fair amount of work, but not too much upfront. It
takes the fact that lavf and lavd aren't really separate libraries to
'delete' lavd to give space for a new library to be designed from scratch.
4) Scrap the entire API
This is super easy, just figure out which commits are related to the new
API using `git log`, then revert. We can then have a whole new
discussion on how we'd rather do things entirely instead, though this
sounds like a lot of work that people would agree to and then it'd just
not get done.
There may be other options I haven't described, I'd love to hear them.
As for the ones I did, 2 will impede the new ffmpeg release the most
(something I think no one wants), and 4 just moves backwards. I think 1
or 3 are preferred, and I lean towards 3 (and obviously this is just my
opinion, you are entitled to your own).
What are your thoughts on how to proceed with the new iteration APIs,
and lavf & lavd being separated?
More information about the ffmpeg-devel