[mythtv] FFmpeg mediacodec problem
David Engel
david at istwok.net
Thu Jun 14 20:08:16 UTC 2018
On Thu, Jun 14, 2018 at 03:42:14PM -0400, Peter Bennett wrote:
>
>
> On 06/14/2018 03:04 PM, Aman Gupta wrote:
> >
> >
> > On Thu, Jun 14, 2018 at 11:59 AM Peter Bennett <pb.mythtv at gmail.com
> > <mailto:pb.mythtv at gmail.com>> wrote:
> >
> > Hi Aman
> >
> > mediacodec playback is working quite well now in mythfrontend, but I
> > have a problem with ffmpeg as follows:
> >
> > When decoding 3840x2160 content, there is pixellation caused by
> > dropped
> > frames. The frames are being dropped because of apparent inconsistent
> > behavior in ffmpeg.
> >
> > MythTV calls avcodec_send_packet to send the next packet. It receives
> > -11 return code (EAGAIN) indicating it must call
> > avcodec_receive_frame
> > and then try to send again. We call avcodec_receive_frame and it
> > is also
> > getting a -11 return code indicating it must send a packet before
> > it can
> > receive. According to the documentation this will never happen.
> > MythTV
> > then reports an error, drops the packet and moves on to the next one.
> > This is happening many times. eventually the avcodec_receive_frame
> > works
> > and we receive a frame, but later the pattern repeats.
> >
> >
> > This is a known issue, cause by an incompatibility between how
> > MediaCodec's APIs work vs how FFmpeg's abstraction works.
> >
> > Ideally MediaCodec would provide a way for us to know whether it needs
> > to wait on input or output. But no reliable way to do this exists, so
> > the FFmpeg wrapper has to make a guess. And sometimes that guess is
> > wrong. I'm aware that we're breaking the API contract as defined by
> > libavcodec, but I haven't been able to find a solution.
> >
> > The only workaround for now is to retry sending the original packet
> > instead of dropping it. The second time you call avcodec_send_packet it
> > should block instead of returning EAGAIN.
> >
> > Aman
> >
> >
> > I tried turning on ffmpeg debug logging but I did not see any message
> > from that.
> >
> > Please advise what should be done. Let me know if you need more
> > information.
> >
> > Peter
> >
>
> Hi Aman
>
> Thanks for the info. I tried it and the second call to avcodec_send_packet
> does not block, it also returns -11.
>
> So what I have done is, sleep 10 milliseconds, then try the receive and the
> send again. Continue like this until it works. Now the video is perfect :).
>
> FYI - what I see is - at the start of playback:
> 10 packets sent
> 9 fails and retries to send next packet (above condition)
> 4 packets sent
> 1 frame received
>
> After this it sends and receives ok, with one fail and retry every 10 frames
> or so.
Whateve you wind up with, you probably want to add some overall
timeout. For example, if returns EAGAIN for 10 seconds, it's probably
time to give up.
> So I think I have a working solution.
I'm looking forward to trying this this weekend. :)
David
> Thank you.
>
> Peter
>
--
David Engel
david at istwok.net
More information about the mythtv-dev
mailing list