[mythtv-commits] Ticket #9511: [patch] avformat decoder buffer underrun (DVB livetv)

MythTV noreply at mythtv.org
Mon Jan 24 17:31:49 UTC 2011


#9511: [patch] avformat decoder buffer underrun (DVB livetv)
-------------------------------------------------+-------------------------
     Reporter:  Jiri Fojtasek <jiri.fojtasek@…>  |      Owner:  janne
         Type:  Bug Report                       |     Status:  new
     Priority:  critical                         |  Milestone:  unknown
    Component:  MythTV - Video Playback          |    Version:  Trunk Head
     Severity:  high                             |   Keywords:
Ticket locked:  0                                |
-------------------------------------------------+-------------------------
 Since i updated to 0.24 i experienced lots of "Video buffer failed many
 times" during livetv playback. Then i updated to trunk to and the same
 issues happening to me. This problem happened for me with 90% chance when
 livetv switching to new program. I using an old computer whish is combined
 FE/BE.

 Long story short:
 - New program coming in to place and switchtoprogram is called
 - Switch to program took long time and after resuming playback ring buffer
 is drained
 - ringbuffer:read() return negative value because no new data is available
 - This tell avfdecoder than EOF happening and the decoder is closed. Then
 jumptoprogram is issued. this fail too because EOF is unrecoverable state
 to the avformat decoder without reopening played file or other hacks.
 - Then poof and playback is over.

 I sending two patches:
 - Firts patch add "-EAGAIN" handling support in to mpegts decoder (it is
 supported in ffmpeg high level API), ringbuffer:read() during livetv
 playback return -EAGAIN when the buffer is drained (this force ffmpeg and
 then avformatdecoder deal with this issue itself), return -EIO when no
 livetv media is played.
 - Second patch optimizing decoder state handling during switch to program
 and fixing "Waited 100ms for decoder to pause" error messages. Simply,
 when we pause audio, video processing thread first, decoder will stop
 sooner because is not blocked by those threads.

 To apply this new functionality for other playback contexts is required
 add timeout handling when av_read_frame return -EAGAIN (in nuppel the same
 in to required places) and return -EAGAIN from ringbuffer:read() when
 underrun happen. For livetv it is not required timeout handling because
 its endless stream.

 I have few gigabytes of logs (-v all) and spent few weeks with debuging
 this issue. If you like i can grep and post parts of those logs here, but
 the changes are self explaining and simplest as posible.

 Jiri

-- 
Ticket URL: <http://code.mythtv.org/trac/ticket/9511>
MythTV <http://code.mythtv.org/trac>
MythTV Media Center


More information about the mythtv-commits mailing list