aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--video/decode/vd_lavc.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 1aaca6b335..b306e57ffa 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -976,18 +976,24 @@ static bool do_send_packet(struct mp_filter *vd, struct demux_packet *pkt)
return true;
}
-static bool send_packet(struct mp_filter *vd, struct demux_packet *pkt)
+static bool send_queued(struct mp_filter *vd)
{
vd_ffmpeg_ctx *ctx = vd->priv;
- if (ctx->num_requeue_packets) {
- if (do_send_packet(vd, ctx->requeue_packets[0])) {
- talloc_free(ctx->requeue_packets[0]);
- MP_TARRAY_REMOVE_AT(ctx->requeue_packets, ctx->num_requeue_packets, 0);
- }
- return false;
+ while (ctx->num_requeue_packets && do_send_packet(vd, ctx->requeue_packets[0]))
+ {
+ talloc_free(ctx->requeue_packets[0]);
+ MP_TARRAY_REMOVE_AT(ctx->requeue_packets, ctx->num_requeue_packets, 0);
}
+ return ctx->num_requeue_packets == 0;
+}
+
+static bool send_packet(struct mp_filter *vd, struct demux_packet *pkt)
+{
+ if (!send_queued(vd))
+ return false;
+
return do_send_packet(vd, pkt);
}
@@ -1052,6 +1058,9 @@ static bool receive_frame(struct mp_filter *vd, struct mp_frame *out_frame)
ctx->requeue_packets = pkts;
ctx->num_requeue_packets = num_pkts;
+
+ send_queued(vd);
+ progress = decode_frame(vd);
}
if (!ctx->num_delay_queue)