mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
Revert "avcodec/mediacodecdec: wait on first frame after input buffers are full"
@xyz reported a regression on his Sony Xperia Z3 Tablet Compact where
playback would intermittently fail to start, essentially deadlocking in
the decoder. Bisecting narrowed down the issue to this commit, which was
meant as an optimization but is not necessary.
This reverts commit a75bb5496a
.
Signed-off-by: Aman Gupta <aman@tmm1.net>
This commit is contained in:
parent
513e6a30fb
commit
37c2cb6a68
@ -443,6 +443,8 @@ static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContex
|
|||||||
FFAMediaCodec *codec = s->codec;
|
FFAMediaCodec *codec = s->codec;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
s->output_buffer_count = 0;
|
||||||
|
|
||||||
s->draining = 0;
|
s->draining = 0;
|
||||||
s->flushing = 0;
|
s->flushing = 0;
|
||||||
s->eos = 0;
|
s->eos = 0;
|
||||||
@ -670,7 +672,10 @@ int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s,
|
|||||||
/* If the codec is flushing or need to be flushed, block for a fair
|
/* If the codec is flushing or need to be flushed, block for a fair
|
||||||
* amount of time to ensure we got a frame */
|
* amount of time to ensure we got a frame */
|
||||||
output_dequeue_timeout_us = OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US;
|
output_dequeue_timeout_us = OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US;
|
||||||
} else if (!wait) {
|
} else if (s->output_buffer_count == 0 || !wait) {
|
||||||
|
/* If the codec hasn't produced any frames, do not block so we
|
||||||
|
* can push data to it as fast as possible, and get the first
|
||||||
|
* frame */
|
||||||
output_dequeue_timeout_us = 0;
|
output_dequeue_timeout_us = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,6 +709,7 @@ int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->output_buffer_count++;
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
status = ff_AMediaCodec_releaseOutputBuffer(codec, index, 0);
|
status = ff_AMediaCodec_releaseOutputBuffer(codec, index, 0);
|
||||||
|
@ -64,6 +64,7 @@ typedef struct MediaCodecDecContext {
|
|||||||
int display_width;
|
int display_width;
|
||||||
int display_height;
|
int display_height;
|
||||||
|
|
||||||
|
uint64_t output_buffer_count;
|
||||||
ssize_t current_input_buffer;
|
ssize_t current_input_buffer;
|
||||||
|
|
||||||
bool delay_flush;
|
bool delay_flush;
|
||||||
|
Loading…
Reference in New Issue
Block a user