[FFmpeg-devel] [PATCH] libavfilter/vf_overlay_cuda: Pass the main frame to the output if secondary frame is not available. now filter fails if secondary frame is not available due to e.g secondary source delay.

Alex Pokotilo support at wmspanel.com
Mon Aug 24 07:25:48 EEST 2020


>
> What are the timestamps (and corresponding time bases) of the first
> frame you send on each input?

this frame is sent the first
fs->in[0]
 pts = 0;
 timscale=1/1000 but it doesn't matter as pts is 0

this frame is sent the second
fs->in[1]
 pts =140
 timscale=1/25

When I call av_buffersink_get_frame after sending the frame into fs->in[1]
 i see only the main_frame in overlay_cuda_blend function.
So in my case I send the main frame with pts < pts of the second frame.

> If you are willing to make a quick test, this would be interesting: in
> libavfilter/framesync.c, in the function ff_framesync_init_dualinput,
> replace fs->in[1].before = EXT_NULL; with EXT_INFINITY and see if it
> changes something.
When I change code as proposed I always see a main frame with input_overlay.
I was able to find why it works after the fix checking
framesync_advance function code.


One observation not related to vf_overlay_cude fix if you don't mind:
even with the fix you proposed if I don't send a single frame into
fs->in[1](i.e secondary stream) I cannot get any output.
This is because consume_from_fifos doesn't honor .before ==
EXT_INFINITY and .state == STATE_BOF

and requires at least one frame for each input.
I cannot say is it WAD or not - just my observation.
When I read a description about EXT_INFINITY I guessed this flag
should force processing other inputs ignoring this one. But again if I
am wrong(and most probably I missed something) just ignore this.


More information about the ffmpeg-devel mailing list