#11466: FIFO Muxer: restart_with_keyframe does not work when 
drop_pkts_on_overflow
false
------------------------------------+----------------------------------
             Reporter:  Wallboy     |                     Type:  defect
               Status:  new         |                 Priority:  normal
            Component:  avformat    |                  Version:  7.1
             Keywords:  fifo muxer  |               Blocked By:
             Blocking:              |  Reproduced by developer:  0
Analyzed by developer:  0           |
------------------------------------+----------------------------------
 Summary of the bug:

 When using the FIFO pseudo-muxer with restart_with_keyframe enabled and
 drop_pkts_on_overflow disabled, when FIFO recovers, it does not drop until
 the next keyframe and immediately begins sending whatever frametype it
 left off on.

 How to reproduce:

 Start a local RTMP server with ffmpeg so we can mock a disconnect:

 {{{
 ffmpeg -f flv -listen 1 -i rtmp://127.0.0.1/app/path -f null /dev/null
 }}}

 Create a test source and output to local RTMP server:

 {{{
 ffmpeg -loglevel repeat+verbose -re -f lavfi -i
 "testsrc=duration=600:size=640x360:rate=30" -c:v libx264 -pix_fmt yuv420p
 -f fifo -fifo_format flv -attempt_recovery 1 -restart_with_keyframe 1
 -drop_pkts_on_overflow 0 -map 0 -flags +global_header
 rtmp://127.0.0.1/app/path
 }}}

 Then stop the RTMP server (Ctrl+C) so that the FIFO muxer goes into
 recovery mode. Then start the RTMP server up again.

 When FIFO is able to reconnect, you expect to see "Dropping non-keyframe
 packet" messages, but it just ends up sending whatever frame it stopped
 on. You'll also see likely see h264 errors at the server side, since it
 can't decode these B/P frames it's now receiving.

 Of course if you enable drop_pkts_on_overflow, the packets are dropped
 until keyframe. However, the documentation seems to imply
 restart_with_keyframe doesn't depend on drop_pkts_on_overflow.

 It should be allowed to block the encoder while we wait for a reconnect,
 and then once resumed, drop until we hit a keyframe, so that RTMP servers
 do not receive B/P frames that can't be decoded.

 This following line keeps FifoThreadContext->drop_until_keyframe from
 being set unless drop_pkts_on_overflow was also set:

 
https://github.com/FFmpeg/FFmpeg/blob/dc7964a862890d58072ee9ca711b4b38eda5a209/libavformat/fifo.c#L374
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/11466>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac

To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to