Skip to content

Commit ac47437

Browse files
committed
Improve error handling in encode_buffer()
If an unrecoverable error is encountered writing the headers for a chained stream, do not continue writing audio packets. If the close callback is called and returns an error, do not call it again in ope_encoder_destroy(). Consolidate advance to next chained stream.
1 parent cd081a3 commit ac47437

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/opusenc.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -658,19 +658,20 @@ static void encode_buffer(OggOpusEnc *enc) {
658658
}
659659
if (e_o_s) {
660660
EncStream *tmp;
661-
tmp = enc->streams->next;
662661
if (enc->streams->close_at_end && !enc->pull_api) {
662+
enc->streams->close_at_end = 0;
663663
ret = enc->callbacks.close(enc->streams->user_data);
664664
if (ret) {
665665
enc->unrecoverable = OPE_CLOSE_FAIL;
666666
free(packet_copy);
667667
return;
668668
}
669669
}
670+
tmp = enc->streams->next;
670671
stream_destroy(enc->streams);
671672
enc->streams = tmp;
672-
if (!tmp) enc->last_stream = NULL;
673-
if (enc->last_stream == NULL) {
673+
if (!tmp) {
674+
enc->last_stream = NULL;
674675
free(packet_copy);
675676
return;
676677
}
@@ -682,6 +683,10 @@ static void encode_buffer(OggOpusEnc *enc) {
682683
enc->streams->granule_offset -= enc->frame_size;
683684
}
684685
init_stream(enc);
686+
if (enc->unrecoverable) {
687+
free(packet_copy);
688+
return;
689+
}
685690
if (enc->chaining_keyframe) {
686691
unsigned char *p;
687692
opus_int64 granulepos2=enc->curr_granule - enc->streams->granule_offset - enc->frame_size;

0 commit comments

Comments
 (0)