From 726add2a982bfdf4cffef3cc95395c9a4b49385b Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 28 Jan 2025 20:25:17 +0100 Subject: [PATCH] [codec,h264] ignore EAGAIN for FFMPEG --- channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c | 22 +++++++++++++--------- libfreerdp/codec/h264_ffmpeg.c | 12 +++++++----- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c index 4136ab7ba..bda0fba76 100644 --- a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c +++ b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c @@ -398,10 +398,9 @@ static BOOL tsmf_ffmpeg_decode_video(ITSMFDecoder* decoder, const BYTE* data, UI len = avcodec_send_packet(mdecoder->codec_context, &pkt); if (len > 0) { - do - { - len = avcodec_receive_frame(mdecoder->codec_context, mdecoder->frame); - } while (len == AVERROR(EAGAIN)); + len = avcodec_receive_frame(mdecoder->codec_context, mdecoder->frame); + if (len == AVERROR(EAGAIN)) + return TRUE; } #endif } @@ -541,10 +540,9 @@ static BOOL tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const BYTE* data, UI len = avcodec_send_packet(mdecoder->codec_context, &pkt); if (len > 0) { - do - { - len = avcodec_receive_frame(mdecoder->codec_context, decoded_frame); - } while (len == AVERROR(EAGAIN)); + len = avcodec_receive_frame(mdecoder->codec_context, decoded_frame); + if (len == AVERROR(EAGAIN)) + return TRUE; } #endif @@ -677,11 +675,17 @@ static void tsmf_ffmpeg_free(ITSMFDecoder* decoder) if (mdecoder->codec_context) { + free(mdecoder->codec_context->extradata); + mdecoder->codec_context->extradata = NULL; + +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 69, 100) + avcodec_free_context(&mdecoder->codec_context); +#else if (mdecoder->prepared) avcodec_close(mdecoder->codec_context); - free(mdecoder->codec_context->extradata); av_free(mdecoder->codec_context); +#endif } free(decoder); diff --git a/libfreerdp/codec/h264_ffmpeg.c b/libfreerdp/codec/h264_ffmpeg.c index a58c2b5e3..60ea30de9 100644 --- a/libfreerdp/codec/h264_ffmpeg.c +++ b/libfreerdp/codec/h264_ffmpeg.c @@ -102,10 +102,10 @@ static void libavcodec_destroy_encoder_context(H264_CONTEXT* WINPR_RESTRICT h264 if (sys->codecEncoderContext) { - avcodec_close(sys->codecEncoderContext); #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 69, 100) avcodec_free_context(&sys->codecEncoderContext); #else + avcodec_close(sys->codecEncoderContext); av_free(sys->codecEncoderContext); #endif } @@ -293,15 +293,17 @@ static int libavcodec_decompress(H264_CONTEXT* WINPR_RESTRICT h264, sys->videoFrame->format = AV_PIX_FMT_YUV420P; - do - { #ifdef WITH_VAAPI status = avcodec_receive_frame(sys->codecDecoderContext, sys->hwctx ? sys->hwVideoFrame : sys->videoFrame); #else status = avcodec_receive_frame(sys->codecDecoderContext, sys->videoFrame); #endif - } while (status == AVERROR(EAGAIN)); + if (status == AVERROR(EAGAIN)) + { + rc = 0; + goto fail; + } gotFrame = (status == 0); #else @@ -594,10 +596,10 @@ static void libavcodec_uninit(H264_CONTEXT* h264) if (sys->codecDecoderContext) { - avcodec_close(sys->codecDecoderContext); #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 69, 100) avcodec_free_context(&sys->codecDecoderContext); #else + avcodec_close(sys->codecDecoderContext); av_free(sys->codecDecoderContext); #endif }