Commit 6b652c02 authored by wm4's avatar wm4 Committed by Luca Barbato

mmaldec: fix problems with flush logic

Don't try to do a blocking wait for MMAL output if we haven't even sent
a single real packet, but only flush packets. Obviously we can't expect
to get anything back.

Additionally, don't send a flush packet to MMAL in the same case. It
appears the MMAL decoder will sometimes hang in mmal_vc_port_disable()
(called from ffmmal_close_decoder()), waiting for a reply from the GPU
which never arrives. Either MMAL disallows sending flush packets without
preceding real data, or it's a MMAL bug.
Signed-off-by: 's avatarLuca Barbato <lu_zero@gentoo.org>
parent b84675d6
...@@ -447,8 +447,6 @@ static int ffmmal_add_packet(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -447,8 +447,6 @@ static int ffmmal_add_packet(AVCodecContext *avctx, AVPacket *avpkt)
uint8_t *start; uint8_t *start;
int ret = 0; int ret = 0;
ctx->packets_sent++;
if (avpkt->size) { if (avpkt->size) {
if (ctx->bsfc) { if (ctx->bsfc) {
uint8_t *tmp_data; uint8_t *tmp_data;
...@@ -474,6 +472,14 @@ static int ffmmal_add_packet(AVCodecContext *avctx, AVPacket *avpkt) ...@@ -474,6 +472,14 @@ static int ffmmal_add_packet(AVCodecContext *avctx, AVPacket *avpkt)
} }
size = buf->size; size = buf->size;
data = buf->data; data = buf->data;
ctx->packets_sent++;
} else {
if (!ctx->packets_sent) {
// Short-cut the flush logic to avoid upsetting MMAL.
ctx->eos_sent = 1;
ctx->eos_received = 1;
goto done;
}
} }
start = data; start = data;
...@@ -643,7 +649,8 @@ static int ffmmal_read_frame(AVCodecContext *avctx, AVFrame *frame, int *got_fra ...@@ -643,7 +649,8 @@ static int ffmmal_read_frame(AVCodecContext *avctx, AVFrame *frame, int *got_fra
// excessive buffering. // excessive buffering.
// We also wait if we sent eos, but didn't receive it yet (think of decoding // We also wait if we sent eos, but didn't receive it yet (think of decoding
// stream with a very low number of frames). // stream with a very low number of frames).
if (ctx->frames_output || ctx->packets_sent > MAX_DELAYED_FRAMES || ctx->eos_sent) { if (ctx->frames_output || ctx->packets_sent > MAX_DELAYED_FRAMES ||
(ctx->packets_sent && ctx->eos_sent)) {
// MMAL will ignore broken input packets, which means the frame we // MMAL will ignore broken input packets, which means the frame we
// expect here may never arrive. Dealing with this correctly is // expect here may never arrive. Dealing with this correctly is
// complicated, so here's a hack to avoid that it freezes forever // complicated, so here's a hack to avoid that it freezes forever
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment