fix vorbis & opus never ending - release

This commit is contained in:
philippe44
2023-04-20 00:23:23 +02:00
parent f0527f70ac
commit e0e7e718ba
2 changed files with 26 additions and 20 deletions

View File

@@ -54,7 +54,6 @@ struct opus {
size_t overframes;
u8_t *overbuf;
int channels;
bool eos;
};
#if !LINKALL
@@ -133,7 +132,7 @@ static opus_uint32 parse_uint32(const unsigned char* _data) {
}
static int get_opus_packet(void) {
int status = 0;
int status, packet = -1;
LOCK_S;
size_t bytes = min(_buf_used(streambuf), _buf_cont_read(streambuf));
@@ -153,8 +152,12 @@ static int get_opus_packet(void) {
if (status) OG(&go, stream_pagein, &u->state, &u->page);
}
// only return a negative value when end of streaming is reached
if (status > 0) packet = status;
else if (stream.state > DISCONNECT) packet = 0;
UNLOCK_S;
return status;
return packet;
}
static int read_opus_header(void) {
@@ -219,7 +222,6 @@ static int read_opus_header(void) {
static decode_state opus_decompress(void) {
frames_t frames;
int n;
u8_t *write_buf;
if (decode.new_stream) {
@@ -258,6 +260,8 @@ static decode_state opus_decompress(void) {
write_buf = process.inbuf;
);
int packet, n = 0;
// get some packets and decode them, or use the leftover from previous pass
if (u->overframes) {
/* use potential leftover from previous encoding. We know that it will fit this time
@@ -265,7 +269,7 @@ static decode_state opus_decompress(void) {
memcpy(write_buf, u->overbuf, u->overframes * BYTES_PER_FRAME);
n = u->overframes;
u->overframes = 0;
} else if (get_opus_packet() > 0) {
} else if ((packet = get_opus_packet()) > 0) {
if (frames < MAX_OPUS_FRAMES) {
// don't have enough contiguous space, use the overflow buffer
n = OP(&gu, decode, u->decoder, u->packet.packet, u->packet.bytes, (opus_int16*) u->overbuf, MAX_OPUS_FRAMES, 0);
@@ -280,10 +284,10 @@ static decode_state opus_decompress(void) {
* outputbuf and streambuf for maybe a long time while we process it all, so don't do that */
n = OP(&gu, decode, u->decoder, u->packet.packet, u->packet.bytes, (opus_int16*) write_buf, frames, 0);
}
} else if (!OG(&go, page_eos, &u->page)) {
} else if (!packet && !OG(&go, page_eos, &u->page)) {
UNLOCK_O_direct;
return DECODE_RUNNING;
} else u->eos = true;
}
if (n > 0) {
frames_t count;
@@ -326,7 +330,7 @@ static decode_state opus_decompress(void) {
} else if (n == 0) {
if (stream.state <= DISCONNECT && u->eos) {
if (packet < 0) {
LOG_INFO("end of decode");
UNLOCK_O_direct;
return DECODE_COMPLETE;
@@ -351,7 +355,6 @@ static void opus_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
if (!u->overbuf) u->overbuf = malloc(MAX_OPUS_FRAMES * BYTES_PER_FRAME);
u->eos = false;
u->status = OGG_SYNC;
u->overframes = 0;

View File

@@ -65,7 +65,6 @@ struct vorbis {
};
int rate, channels;
uint32_t overflow;
bool eos;
};
#if !LINKALL
@@ -133,7 +132,7 @@ extern struct processstate process;
#endif
static int get_ogg_packet(void) {
int status = 0;
int status, packet = -1;
LOCK_S;
size_t bytes = min(_buf_used(streambuf), _buf_cont_read(streambuf));
@@ -153,8 +152,12 @@ static int get_ogg_packet(void) {
if (status) OG(&go, stream_pagein, &v->state, &v->page);
}
// only return a negative value when end of streaming is reached
if (status > 0) packet = status;
else if (stream.state > DISCONNECT) packet = 0;
UNLOCK_S;
return status;
return packet;
}
static int read_vorbis_header(void) {
@@ -261,9 +264,7 @@ inline int pcm_out(vorbis_dsp_state* decoder, void*** pcm) {
static decode_state vorbis_decode(void) {
frames_t frames;
int n = 0;
u8_t *write_buf;
void** pcm = NULL;
if (decode.new_stream) {
int status = read_vorbis_header();
@@ -301,18 +302,21 @@ static decode_state vorbis_decode(void) {
write_buf = process.inbuf;
);
void** pcm = NULL;
int packet, n = 0;
if (v->overflow) {
n = pcm_out(&v->decoder, &pcm);
v->overflow = n - min(n, frames);
} else if (get_ogg_packet() > 0) {
} else if ((packet = get_ogg_packet()) > 0) {
n = OV(&gv, synthesis, &v->block, &v->packet);
if (n == 0) n = OV(&gv, synthesis_blockin, &v->decoder, &v->block);
if (n == 0) n = pcm_out(&v->decoder, &pcm);
v->overflow = n - min(n, frames);
} else if (!OG(&go, page_eos, &v->page)) {
} else if (!packet && !OG(&go, page_eos, &v->page)) {
UNLOCK_O_direct;
return DECODE_RUNNING;
} else v->eos = true;
}
if (n > 0) {
ISAMPLE_T *optr = (ISAMPLE_T*) write_buf;
@@ -370,7 +374,7 @@ static decode_state vorbis_decode(void) {
} else if (n == 0) {
if (stream.state <= DISCONNECT && v->eos) {
if (packet < 0) {
LOG_INFO("end of decode");
UNLOCK_O_direct;
return DECODE_COMPLETE;
@@ -397,7 +401,6 @@ static void vorbis_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
OV(&go, dsp_clear, &v->decoder);
}
v->eos = false;
v->opened = false;
v->status = OGG_SYNC;
v->overflow = 0;