• wm4's avatar
    mmaldec: be more tolerant against MMAL not returning decoded output · 39f01e34
    wm4 authored
    In some situations, MMAL won't return a decoded frame for certain input
    frames. This can happen if a frame fails to decode, or if a packet does
    not actually contain a complete frame. In these situations, we would
    deadlock (or actually timeout) waiting for an expected output frame,
    which is not ideal. On the other hand, there are situations where we
    definitely have to block to avoid deadlocks. (This mess is a
    consequence of trying to map MMAL's asynchronous and flexible
    dataflow to libavcodec, which is more static and rigid.)
    
    Solve this by doing a blocking wait only if the amount of buffered data
    is too big. The whole purpose of the blocking wait is to avoid excessive
    buffering of input data, so we can skip it if it appears to be low. The
    consequence is that libavcodec can gracefully return no frame to the
    API user.
    
    We want to track the number of full packets to make our heuristic work.
    But MMAL buffers are fixed-size, requiring splitting large packets. This
    is why the previous commit is needed. We use the ..._FRAME_END flag to
    remember packet boundaries, but MMAL does not preserve these buffer
    flags when returning buffers to the user.
    Signed-off-by: 's avatarLuca Barbato <lu_zero@gentoo.org>
    39f01e34
mmaldec.c 25 KB