[FFmpeg-devel] [RFC] BSF list API

Marton Balint cus at passwd.hu
Sat Jun 11 23:33:37 CEST 2016


On Sat, 11 Jun 2016, Nicolas George wrote:

>> Instead of adding a totally new API, I suggest to use a "container"
>> bitstream filter called 'list', which will instantiate the "child" bitstream
>> filters and pump the packets through them.
>>
>> Thanks to the N:M nature of the new BSF api, this should be achievable, and
>> we can completely hide for the API user if we are using a single bitstream
>> filter, or a chain (list) of several bitstream filters.
>
> I had the same idea, and it is not without merits, but I no longer think it
> is the best course to go.
>
> The main merit of the idea is to keep the API identical, and it is mostly
> useful for compatibility with the fork. Since this is no longer a primary
> goal, other considerations must prevail.
>
> As I observed benchmarking the null bsf, the overhead of a dummy bsf is not
> entirely negligible, mostly due to a few mallocs. Better avoid it if
> possible.

Maybe I am missing something, but as far as I see the alloc is due to the 
alloc in ff_bsf_get_packet. We could create a similar function 
ff_bsf_get_packet2(AVBSFContext *ctx, AVPacket *pkt) which does not 
allocate a packet but simply moves the ref to pkt. Then this can be called 
with the output packet pointer, so no allocation will be requried. And 
this function can be used for performance sensitive places instead of the 
original.

>> The mentioned 'list' bitstream filter could have an AVOption string
>> parameter called list which it can parse on init to create the bitstream
>> filter chain. The list string would follow the ffmpeg bsf list syntax:
>> filter1[=opt1=str1/opt2=str2][,filter2]
>
> For that, I say no: it must have a proper API. We can have a parsing
> functions for user-provided strings describing list of filters, but nowadays
> most filter lists are created by applications or the library, and for that
> we do not want a round-trip to a string with all the problems that entails
> (quoting, memory allocation or arbitrary limits), this kind of madness is
> already present in too many places.
>
> The API itself could be only:
>
>    ret = av_bsf_list_append(list, filter, &ctx);
>
> The append functions returns the newly created filter, so we can set options
> on it if necessary. Then the filters are inited, either by calling
> av_bsf_init() on each of them or by having av_bsf_list_init_all(), either
> solutions has merits of its own.
>
> Note that this solution can work with a container filter too. I would prefer
> that list is its own dedicated type, maybe AVBSFList, but if it is an
> AVBSFContext, av_bsf_list_append() can assume it is a container filter and
> access its private structure.

I think we need to support both ways to configure the bsf list. What the 
tee muxer, or ffmpeg.c would use, is the text based configuration, 
therefore it's worth adding the capability of parsing such lists.

So what we need, on top of what I proposed, is an additional API what you 
proposed (av_bsf_list_append), and which can be used to add filters to the 
list, after we allocated the list filter, but before we initialized it.

This way the user can decide which configuration method - API based 
or text based - he will use.

Regards,
Marton


More information about the ffmpeg-devel mailing list