Fix rav1e sample packet pumping
diff --git a/src/codec_rav1e.c b/src/codec_rav1e.c
index 1afacff..d78ee25 100644
--- a/src/codec_rav1e.c
+++ b/src/codec_rav1e.c
@@ -153,13 +153,17 @@
}
RaPacket * pkt = NULL;
- encoderStatus = rav1e_receive_packet(codec->internal->rav1eContext, &pkt);
- if ((encoderStatus != 0) && (encoderStatus != RA_ENCODER_STATUS_NEED_MORE_DATA)) {
- goto cleanup;
- } else if (pkt && pkt->data && (pkt->len > 0)) {
- avifCodecEncodeOutputAddSample(output, pkt->data, pkt->len, (pkt->frame_type == RA_FRAME_TYPE_KEY));
- rav1e_packet_unref(pkt);
- pkt = NULL;
+ for (;;) {
+ encoderStatus = rav1e_receive_packet(codec->internal->rav1eContext, &pkt);
+ if ((encoderStatus != 0) && (encoderStatus != RA_ENCODER_STATUS_NEED_MORE_DATA)) {
+ goto cleanup;
+ } else if (pkt && pkt->data && (pkt->len > 0)) {
+ avifCodecEncodeOutputAddSample(output, pkt->data, pkt->len, (pkt->frame_type == RA_FRAME_TYPE_KEY));
+ rav1e_packet_unref(pkt);
+ pkt = NULL;
+ } else {
+ break;
+ }
}
success = AVIF_TRUE;
cleanup:
@@ -182,14 +186,18 @@
}
RaPacket * pkt = NULL;
- encoderStatus = rav1e_receive_packet(codec->internal->rav1eContext, &pkt);
- if (encoderStatus != 0) {
- return AVIF_FALSE;
- }
- if (pkt && pkt->data && (pkt->len > 0)) {
- avifCodecEncodeOutputAddSample(output, pkt->data, pkt->len, (pkt->frame_type == RA_FRAME_TYPE_KEY));
- rav1e_packet_unref(pkt);
- pkt = NULL;
+ for (;;) {
+ encoderStatus = rav1e_receive_packet(codec->internal->rav1eContext, &pkt);
+ if ((encoderStatus != 0) && (encoderStatus != RA_ENCODER_STATUS_LIMIT_REACHED)) {
+ return AVIF_FALSE;
+ }
+ if (pkt && pkt->data && (pkt->len > 0)) {
+ avifCodecEncodeOutputAddSample(output, pkt->data, pkt->len, (pkt->frame_type == RA_FRAME_TYPE_KEY));
+ rav1e_packet_unref(pkt);
+ pkt = NULL;
+ } else {
+ break;
+ }
}
return AVIF_TRUE;
}