avcodec/mediacodecdec: refactor to take advantage of new decoding api
authorAman Gupta <aman@tmm1.net>
Fri, 16 Feb 2018 03:52:14 +0000 (19:52 -0800)
committerMatthieu Bouron <matthieu.bouron@gmail.com>
Mon, 19 Feb 2018 14:27:34 +0000 (15:27 +0100)
commitf611fef37cca44b89d0d7e6dfd1ac257736b5f7a
tree27a8862aabc93c9510ec58133514b5d6a3a0fbc7
parent56f77b0f678de74404ae3a64f6ba664ea4449348
avcodec/mediacodecdec: refactor to take advantage of new decoding api

This refactor splits up the main mediacodec decode loop into two
send/receive helpers, which are then used to rewrite the receive_frame
callback and take full advantage of the new decoding api. Since we
can now request packets on demand with ff_decode_get_packet(), the
fifo buffer is no longer necessary and has been removed.

This change was motivated by behavior observed on certain Android TV
devices, featuring hardware mpeg2/h264 decoders which also deinterlace
content (to produce multiple frames per field). Previously, this code
caused buffering issues because queueInputBuffer() was always invoked
before each dequeueOutputBuffer(), even though twice as many output
buffers were being generated.

With this patch, the decoder will always attempt to drain new frames
first before sending more data into the underlying codec.

Signed-off-by: Matthieu Bouron <matthieu.bouron@gmail.com>
libavcodec/mediacodecdec.c
libavcodec/mediacodecdec_common.c
libavcodec/mediacodecdec_common.h