This is an automated email from the ASF dual-hosted git repository. GUIDINGLI pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 53e46f4b2fe6c1d8cd230cfa350897bdb1a1c7b2 Author: yaojingwei <[email protected]> AuthorDate: Wed Apr 29 20:47:56 2026 +0800 arch/sim: fix encoder/decoder CAPTURE buffer leak on empty frame When x264 encoder accepts input but produces no output yet (due to lookahead delay), or when the decoder has no frame ready, the CAPTURE buffer was not returned to the DONE queue, causing buffer starvation. Fix by returning the buffer with bytesused=0 via codec_capture_put_buf() so DQBUF delivers it back to userspace. Also cancel pending HPWORK in sim_encoder/sim_decoder close to prevent use-after-free callback. Signed-off-by: yaojingwei <[email protected]> --- arch/sim/src/sim/sim_decoder.c | 2 ++ arch/sim/src/sim/sim_encoder.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/arch/sim/src/sim/sim_decoder.c b/arch/sim/src/sim/sim_decoder.c index fec73d63b74..30a7d6e7441 100644 --- a/arch/sim/src/sim/sim_decoder.c +++ b/arch/sim/src/sim/sim_decoder.c @@ -162,6 +162,7 @@ static int sim_decoder_close(void *priv) { sim_decoder_t *sim_decoder = priv; + work_cancel_sync(HPWORK, &sim_decoder->work); openh264_decoder_close(sim_decoder->decoder); kmm_free(sim_decoder); @@ -419,6 +420,7 @@ static int sim_decoder_process(sim_decoder_t *sim_decoder, if (ret < 1) { + codec_capture_put_buf(sim_decoder->cookie, dst_buf); return ret; } diff --git a/arch/sim/src/sim/sim_encoder.c b/arch/sim/src/sim/sim_encoder.c index 34018da0d5c..3a8a8f8edc4 100644 --- a/arch/sim/src/sim/sim_encoder.c +++ b/arch/sim/src/sim/sim_encoder.c @@ -169,6 +169,7 @@ static int sim_encoder_close(void *priv) { sim_encoder_t *sim_encoder = priv; + work_cancel_sync(HPWORK, &sim_encoder->work); x264_wrapper_close(sim_encoder->encoder); kmm_free(sim_encoder); @@ -487,6 +488,13 @@ static int sim_encoder_process(sim_encoder_t *sim_encoder, if (ret < 1) { + /* x264 accepted input but has no output yet (lookahead delay). + * Return dst_buf to DONE queue with bytesused=0 so DQBUF + * returns it and the application can re-QBUF it. + */ + + dst_buf->bytesused = 0; + codec_capture_put_buf(sim_encoder->cookie, dst_buf); return ret; }
