[FFmpeg-trac] #10611(undetermined:new): ff_g723_1_gen_dirac_train function enters dead loop
FFmpeg
trac at avcodec.org
Mon Oct 9 14:02:14 EEST 2023
#10611: ff_g723_1_gen_dirac_train function enters dead loop
-------------------------------------+-------------------------------------
Reporter: songtao | Type: defect
Status: new | Priority: normal
Component: | Version: 5.1.3
undetermined |
Keywords: G723_1, | Blocked By:
dead loop |
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
How to reproduce:
i create 5 threads to encode/decode G723_1 from different rtp session,
when there's a high concurrent, it enters died loop.
pstack output, `pitch_lag=0` cases the died loop
```
Thread 1 (Thread 0x7f70ab7fe700 (LWP 640449)):
#0 ff_g723_1_gen_dirac_train (buf=buf at entry=0x7f70ab7fc850, pitch_lag=0)
at src/libavcodec/g723_1.c:1154
#1 0x0000000000642096 in get_fcb_param (optim=optim at entry=0x7f70ab7fd2b0,
impulse_resp=impulse_resp at entry=0x7f70ab7fcf50,
buf=buf at entry=0x7f709401d238, pulse_cnt=pulse_cnt at entry=5,
pitch_lag=<optimized out>) at src/libavcodec/g723_1enc.c:840
#2 0x0000000000646489 in fcb_search (index=1, buf=0x7f709401d238,
impulse_resp=0x7f70ab7fcf50, p=<optimized out>) at
src/libavcodec/g723_1enc.c:1022
#3 g723_1_encode_frame (avctx=<optimized out>, avpkt=<optimized out>,
frame=<optimized out>, got_packet_ptr=<optimized out>) at
src/libavcodec/g723_1enc.c:1198
#4 0x00000000005ea2e1 in encode_simple_internal (avpkt=0x7f70a420c980,
avctx=0x7f70a44534c0) at src/libavcodec/encode.c:214
#5 encode_simple_receive_packet (avpkt=<optimized out>, avctx=<optimized
out>) at src/libavcodec/encode.c:269
#6 encode_receive_packet_internal (avctx=avctx at entry=0x7f70a44534c0,
avpkt=0x7f70a420c980) at src/libavcodec/encode.c:303
#7 0x00000000005ea727 in avcodec_send_frame
(avctx=avctx at entry=0x7f70a44534c0, frame=frame at entry=0x7f70a40cee00) at
src/libavcodec/encode.c:380
```
my code, it reads 160 samples from rtp, resamples to 240 samples, then
send samples to G723_1 encoder
```
static void encode(AVCodecContext *ctx, AVAudioFifo *fifo, AVFrame *frame,
AVPacket *pkt, uint8_t *out, size_t *out_size) {
int ret;
*out_size = 0;
// need resample to 240
if (fifo != NULL) {
add_samples_to_fifo(fifo, &frame->data[0], frame->nb_samples);
if (av_audio_fifo_size(fifo) < 240) {
return;
}
// read out 240
if (av_audio_fifo_read(fifo, (void **)&frame->data, 240) < 240) {
log_error("Could not read data from FIFO");
return;
}
frame->nb_samples = 240;
}
/* send the frame for encoding */
ret = avcodec_send_frame(ctx, frame);
if (ret < 0) {
log_error("Error sending the frame to the encoder");
exit(1);
}
/* read all the available output packets (in general there may be any
* number of them */
while (ret >= 0) {
ret = avcodec_receive_packet(ctx, pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
return;
} else if (ret < 0) {
log_error("Error encoding audio frame");
exit(1);
}
memcpy(out, pkt->data, pkt->size);
*out_size = pkt->size;
av_packet_unref(pkt);
}
}
int ff_encoder_input(ff_encoder_ctx *ff_ctx, uint16_t *data, size_t
data_size,
uint8_t *out, size_t *out_size) {
int ret = av_frame_make_writable(ff_ctx->frame);
if (ret < 0) {
exit(1);
}
uint16_t *samples = (uint16_t *)ff_ctx->frame->data[0];
memcpy(samples, data, data_size * sizeof(uint16_t));
ff_ctx->frame->nb_samples = data_size;
encode(ff_ctx->c, ff_ctx->fifo, ff_ctx->frame, ff_ctx->pkt, out,
out_size);
return 0;
}
```
{{{
% git status
HEAD detached at n5.1
}}}
Patches should be submitted to the ffmpeg-devel mailing list and not this
bug tracker.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10611>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list